極性を逆にする


12

この課題の目的は、次の条件を満たすプログラムを作成することです。

  • プログラムはパリンドロームではなく、本質的にパリンドロームでもありません(プログラムの効果を変更せずに文字を削除してパリンドロームにすることができることを意味します)。

  • プログラムはインボリューションではありません(出力で実行されたときに元の入力を生成しないことを意味します)

  • 逆極性のプログラムは、通常のプログラムの逆です。そのため、反転したプログラムが通常のプログラムの出力で実行されると、元の入力が返されます。

何をしない逆極性はどういう意味ですか?まあ、それは言語によって異なります。

  • ほとんどの非エソランでは、これは単一の操作でサブ操作の順序を逆にし、引数の順序を逆にし、ハードコードされたリスト/配列/タプル/辞書/スタック/キュー/などのコンテンツも逆にすることを意味しますコードブロックとスタンドアロン行の順序を逆にする(ただし、ブロック内の行は逆にする)

例:

Haskellx`mod`y-> y`mod`x; zipWith ((*3).(+)) [1,2,3] [4,5,6]->zipWith ((+).(*3)) [6,5,4] [3,2,1]

Python2**3-> 3**2; for x,y in [(1,2),(3,4),(5,6)]->for y,x in [(6,5),(4,3),(2,1)]

  • 1文字の関数(Pyth、APLなど)がある言語の場合は、単に命令の文字列を逆にする

  • BFのような1次元のエソランの場合、指示を逆にする、極性を入れ替えます。極性のスワップは[]-> {}+-> ---> +>-> <<-> >.-> ,、および,-> .(両方ではない)

  • Befungeのような2次元のエソランの場合は、x軸またはy軸または対角線を横切る反射を実行するか、180度回転するか、反射と回転の組み合わせを行うことができます

可換演算は許可されますが、回文演算は許可されません。2*x問題ありませんが、x+x悪いです。極性反転の定義はかなり緩やかですが、何が理にかなっているのかを判断してください。オブジェクトは、最も賢い抜け穴を見つけることではなく、最も賢い解決策を見つけることです。

これは人気のあるコンテストなので、非常に巧妙な抜け穴が人気があるかもしれませんが、この挑戦​​の精神の範囲内に収まるようにしてください。少なくとも1つの賛成票を持つ少なくとも10のソリューションがあり、少なくとも1つの賛成票を持つ提出よりも多い少なくとも1つの解決策がある場合、勝者は発表されます。または1か月のうち、どちらか早い方。これは私の最初の課題です。したがって、公平で建設的なフィードバックを提供するようにしてください。また、これが不合理な課題であるか、何らかの方法で誤分類または曖昧であるかどうかもお知らせください。ここで説明した鳩の巣のいずれにも当てはまらない言語について質問がある場合は、コメントしてください。特定の明確化やルール変更に対する強い抗議がある場合は、コミュニティの意志に屈します。

更新

このコンテストが開始されてからちょうど1か月が経ちました(たまたま、実際に時間通りに行っていることを知らずに、偶然それを確認しました)。これは人気コンテストであるため、(地滑りによる)勝者は Pietu1998-Befungeです。下部のコンポーネント(テキストリバースと逆アルファベット)は両方ともインボリューションですが、エンコーダー/デコーダーはインボリューションではありませんので、問題はありません。真ん中に「BEFUNGE」を書くことに成功したことに対するボーナスポイント(私の考えでは)。私は個人的には、ZgarbのTheseusソリューションの斬新さが気に入りました。言語が(制限されていれば)クールに見えるからです。参加してくれたすべての人に感謝し、勝者が選ばれた間、私はこのコンテストを完全に公開したままにして、将来の提出を歓迎します。


1
逆極性プログラムは、通常のプログラムのであるとはどういう意味ですか?出力は何らかの方法で異なりますか?
Sp3000 14年

逆の操作を実行します。反転したプログラムが通常のプログラムの出力で実行されると、元の入力が返されます。
アーケフィリックス14年

エラーが発生して申し訳ありません。私はそれを聞いたことがありませんでした、そしてそれは私には少しグロテスクに見えたので、私はそれがエソランであると仮定したに違いありません。変更します。
archaephyrryx 14年

1
おそらく指定されるべきもの- ()パリンドロームですか?技術的には、逆は)(です。
Sp3000 14年

1
Haskellの例で、関数の引数が最後までシャッフルされないのはなぜですか?型の安全性を保持するような方法でリバースが選択されていますか?極性反転操作の詳細を選択できますか?
ジョン・ドヴォルザーク

回答:


41

ベファンジ

おっと、それは私がこの挑戦のために作っ編集者でさえ、仕事でした。私が手に入れたのは、素敵な11x12ブロックです。

v$,g6<6g,$v
v,$ _^_ $,v
1W>v\B\v>L1
~T+:1E1:-O~
+F00-F-02L+
>:|6gUg6|:>
{a@>^N^>@z`
>1+|@G$| +>
:^9< E<  ^1
~>7^@_,#:>:
 xD>65 ^=P~
v,-\+**<  v

いくつかのことを行いますが、悲しいことに小文字のみです。

何をする

正常に実行されると、入力に対してシーザー暗号を実行します。

abcxyz      -> bcdyza
exampletext -> fybnqmfufyu

水平方向に反転すると、暗号が逆になります。これはチャレンジの要件ですが、これで終わりではありません。

bcdyza      -> abcxyz
fybnqmfufyu -> exampletext

垂直に反転すると、逆アルファベットで入力を暗号化します。これは、シーザー暗号に対する反対のアプローチと見なすことができます。

abcxyz      -> zyxcba
exampletext -> vcznkovgvcg

最後に、180度回転すると、入力が逆になります。何かの逆である必要があると感じています(ヒント:入力)。

abcxyz      -> zyxcba
exampletext -> txetelpmaxe

使い方

このブロックは、基本的に4つの半重複アルゴリズムで構成されています。

シーザー暗号エンコーダ

v$,g6<
v,$ _^
1 >v\
~ +:1
+ 00-
>:|6g
{a@>^

シーザー暗号デコーダー(水平反転)

v$,g6<
v,$ _^
1 >v\
~ -:1
+ 20-
>:|6g
`z@>^

逆アルファベット暗号(垂直に反転)

v,-\+**<
   >65 ^
~>7^
:^9<
>1+|@
   >^

テキスト反転(180度回転)

v  <
~      
:>:#,_@
1^  <
>+ |$
   >^

2
Befungeの利点はここにあると思います。なぜなら、常に左上の象限を使用して、残りのコードの内容を完全に無視できるからです。いい仕事だ!
マーティンエンダー14年

1
うわー!私はこれを支持する必要がありますが、それは3位に落ちたことを意味します。
レベルリバーセント14年

18

Brainfuck、5

,+.-,

おそらく初めて、Brainfuckはコードの長さで競争力のある答えを生成します。残念ですが、これはコードゴルフの質問ではありません。

バイト(文字)を入力してインクリメントし、結果を出力します。最後のコンマは別の入力を待機していますが、指定された場合は無視されます。適切な終了に関する仕様には何もありません:-)*

*(または両方向のすべてのコードで何か役に立つことをすることについて)

典型的な結果(指定された場合、2番目の文字は無視されます)。

転送:B->C

逆:B-> AまたはC->B


11

マーベラス

簡単に始めましょう。STDINから1文字を読み取り、インクリメントして出力します。

--
]]
00
]]
++

これを180度回転させる(ブラケットを交換しない)か、x軸にミラーリングすると、

++
]]
00
]]
--

STDINからバイトを読み取り、デクリメントします。

ここでテストできます

もっと複雑なMarbelousプログラムを調べるかもしれませんが、es1024が私に打ち負かされると確信しています。;)

説明

00(任意である)の値が0の大理石です。]]デバイスはSTDINからバイト読み-大理石がそれらを介して低下した場合、である、大理石の値は、読み取りバイトに変更されます。++そして--デバイス単に増減大理石の値を(MOD 256)と、それが通って落下しましょう。大理石がボードから落ちると、バイトはSTDOUTに書き込まれます。

したがって、上部の2つのデバイスは、制御フローが到達しないため、単に無視されます。


または、中央の3行を単一の入力デバイスに置き換えることもできます。
オーバーアクター14年

@overactorまたは}0サブボードとして使用しますか?
マーティンエンダー14年

}0正確にはコマンドライン入力として。
オーバーアクター14年

5

マーベラス

このボードは1つの引数(x)を受け取って戻ります(101 * x) mod 256

.. @5 .. }0 }0 @1 .. @0 .. @2 .. 
.. /\ Dp << \\ .. &0 >0 &1 .. .. 
!! @3 .. << }0 .. \/ -- \/ .. }0 
@4 .. .. &0 @1 /\ &0 65 &1 /\ @2 
/\ Dp .. @4 .. .. @3 @0 @5 !! \\

y軸に沿ってセルをミラーリングすると、1つの引数(y)を取り(101 * y + 8 * y) mod 256、最初のボードの逆であるを返すボードが作成されます。

.. @2 .. @0 .. @1 }0 }0 .. @5 ..
.. .. &1 >0 &0 .. \\ << Dp /\ ..
}0 .. \/ -- \/ .. }0 << .. @3 !!
@2 /\ &1 65 &0 /\ @1 &0 .. .. @4
\\ !! @5 @0 @3 .. .. @4 .. Dp /\

ここでテストしてください。円筒状ボードとインクルードライブラリの両方をチェックする必要があります。

入出力の例

Original Board:      Mirrored Board:
Input   Output       Input    Output
025     221          221      025
042     146          146      042
226     042          042      226

Marbelousでは引数として正の整数のみを渡すことができ、これらの整数はインタープリターによって256を法としてプログラムに渡されることに注意してください。

1012つの理由から選ばれました:それは素数であり(そしてこのプログラムへのすべての可能な入力はユニークな出力をもたらします)、そして逆の操作109は8からの便利な距離です101

簡単な説明

セルを含む列(上から下)@0 >0 -- 65 @0は両方のボードで同じ動作101をし、右に進む前に時間をループします。>0ブランチの両側には異なるシンクロナイザーがあります。どちらが選択されるかは、ボードがミラーリングされているかどうかによって異なります。

それぞれの側で、中央ループと同期して、入力が繰り返し合計されて、が得られ101*x mod 256ます。反転したボードでは、入力の2つのコピーも左に2回ビットシフト(input * 4)され、合計されてシンクロナイザーに残されます。

中央のループが終了すると、ボードの側面にある合計されたビー玉が印刷用に送信されます(元のボードの場合は左、ミラーの場合は右)。印刷後、!!セルに到達してボードを終了します。与え101 * xられたループは、ボードが終了するまで自動的に実行され続けることに注意してください。

Dp 単純に結果を10進数として出力します。


5

テセウス

これは抜け穴とみなされるかもしれませんが、私は言語が好きなので、ここに行きます。このプログラムは、nごとに3n3n + 1に3n + 13n + 2に、3n + 23nfマップする自然数の関数を定義します。

data Num = Zero | Succ Num

iso f :: Num <-> Num
  | n                          <-> iter $ Zero, n
  | iter $ m, Succ Succ Succ n <-> iter $ Succ m, n
  | iter $ m, Succ Succ Zero   <-> back $ m, Zero
  | iter $ m, Succ Zero        <-> back $ m, Succ Succ Zero
  | iter $ m, Zero             <-> back $ m, Succ Zero
  | back $ Succ m, n           <-> back $ m, Succ Succ Succ n
  | back $ Zero, n             <-> n
  where iter :: Num * Num
        back :: Num * Num

テセウスは、Haskellに似た構文を持つ可逆言語であり、すべての関数は可逆です(非終了の問題を割引きます)。非常に実験的であり、研究目的のために設計されています。上記のコードは、自然数のデータ型と関数を定義していますf。入力番号が与えられると、左側でパターンマッチング(常に一致)し、左側でパターンマッチングに進み、再び右側で対応する値を取得します。これは、ラベルのない値が右側に表示されるまで繰り返され、それが出力になります。左側と右側のパターンは、網羅的で重複しないようにする必要があります(ラベルごとに別々に)。さて、の「極性を逆にする」ために、私は次のことを行います。n)。次に、右側のパターンを見てください。そのパターンにラベルがある場合(ここにiterf

  • すべてのラベルの2つの値を交換します。これはのセマンティクスを変更しませんf
  • 関数本体の右側と左側を交換します。これf により、の逆関数が定義されます

結果:

iso f :: Num <-> Num
  | iter $ n, Zero             <-> n
  | iter $ n, Succ m           <-> iter $ Succ Succ Succ n, m
  | back $ Zero, m             <-> iter $ Succ Succ Zero, m
  | back $ Succ Succ Zero, m   <-> iter $ Succ Zero, m
  | back $ Succ Zero, m        <-> iter $ Zero, m
  | back $ Succ Succ Succ n, m <-> back $ n, Succ m
  | n                          <-> back $ n, Zero
  where iter :: Num * Num
        back :: Num * Num

3

tr

a b

例:

$ echo "apple" | tr a b
bpple
$ echo "bpple" | tr b a
apple

「a」と「b」の両方を含まない文字列のドメインの真の逆行列のみ。


実際には、ドメインをそれ以上に制限する必要があります。たとえば、「bog」で始まる場合、プログラムとその逆は「bog」->「bog」->「aog」となります。したがって、「b」を含む文字列は問題になります(逆プログラムを最初に適用する場合は「a」を含む)。
user19057 14年

tr abc bca逆極性バージョンで使用できますtr acb cba
クリスチャンシーバーズ

2

別の驚異的な答え

元の右は、コマンドライン入力(8ビット値)をシフトし、シフトによって1が失われた場合、先頭の1を追加します。(0000 0001 -> 1000 0000

{0 ..
~~ ..
>> {0
-2 =0
.. ^0
\/ }0
}0 Sb
<< ..
\\ ..
:Sb
// ..
Sb >>
}0 ..
^7 }0
{0 \/

このボードを180°回転させる(ただし、各セルの内容は同じままにする)プログラムを変更して、左にシフトする(1000 0000 -> 0000 0001

\/ {0
}0 ^7
.. }0
>> Sb
.. //
:Sb
.. \\
.. <<
Sb }0
}0 \/
^0 ..
=0 -2
{0 >>
.. ~~
.. {0

ここでテストできます。(「出力を10進数として表示する」をオンにする必要があります)

説明

どちらのプログラムも、メインボード(コマンドライン入力を取得)との2つのボードで構成されていますSb。メインボードの両方のバージョンを見てみましょう。それぞれの方向に到達できるセルのみを見てみましょう(通常、大理石は上に移動できず、入力デバイスは上部にないため)。

original:      flipped:
   }0          }0
}0 Sb          .. }0
<< ..          >> Sb
\\ ..          .. //

これらは非常に単純なボードで、どちらも入力の2つのコピーを取ります(これは、 }0セルます。オリジナルは1つのバージョンを左シフトデバイスに送り<<、反転バージョンは右シフトデバイスに置きます。>>これらはビットシフトを実行しますが、Sbボードが入る場所で、供給された値をビットシフトするとビットが失われるかどうかを確認し、結果に追加する値を返して、失われたビットを打ち消します。

これがオリジナルの関連部分です Sbオリジナルプログラムのボードの次のとおりです。

}0
^7
{0

これは非常に簡単です。^ 7は最上位ビットの値をチェックします。これが1の場合、左シフトを実行するとこのビットが失われます。したがって、このボードはこのビットの値を8ビット値として出力し、ビットシフトの結果に追加します。

反転バージョンの場合、Sb最下位ビットを見て、128またはを返す必要が0ありますが、これはもう少し複雑です。

}0
^0 ..
=0 -2
{0 >>
.. ~~
.. {0

でテストされた最下位ビット^0が0の場合、0を返します。1の場合、^0出力します1。これにより、同等性テストに失敗0 =0し、右にプッシュされます。次に、2 -2を減算して255を取得し、左シフト>>して127 ~~を取得し、128を取得しないようにバイナリを実行します(++128を取得するために1 を追加することもできましたが、その面白さはどこにありますか?)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.