ソースコードを逆にすると、入力が無効になります。


36

露骨なぼったくりぼったくり。それらに賛成票を投じてください!

受け入れたい場合、あなたのタスクは、整数の入力/引数を出力/返すプログラム/関数を書くことです。トリッキーな部分は、ソースコードを逆にする場合、出力は否定された元の整数でなければならないということです。

あなたのソースコードがでABC、その入力がであるとしましょう4CBA代わりに記述して実行すると、出力はでなければなりません-4

あなたのソースコードがでABC、その入力がであるとしましょう-2CBA代わりに記述して実行すると、出力はでなければなりません2

の入力は00またはを提供する-0場合がありますが、符号付きゼロをサポートする場合は、-0を提供する必要があります0


5
同じ質問のコピーが必要なのはなぜですか?
クリスチャン

5
@Christianこれは定数(およびその否定)を出力しますが、これは入力を受け取り、それを返す/否定する必要があります。多くの言語での非常に異なる仕事。
アダム

5
はい、違いがわかりました。非常に注意深く読む必要があります
クリスチャン

C#のような構造化言語を使用している場合、単に行を逆にしますか?
PerpetualJ

@PerpetualJいいえ、文字のリストのようなソースを見てください。その一部は改行です。
アダム

回答:





11

x86マシンコード、3バイト

C3 D8 F7

上記のコードのバイトは、何もしない関数を定義します。呼び出し元に制御を返すだけです。この関数の後には、復帰後に来るので実行されない2つのガベージバイトが続きます。これらは「人のいない土地」にあります。アセンブラーのニーモニックでは:

ret                     ; C3    
fdiv  st(0), st(7)      ; D8 F7

さて、今ではいくつかのトロールが来て、バイトの順序を逆にします:

F7 D8 C3

これらのバイトは、EAXレジスターで整数の引数を取り、それを否定し、呼び出し元に制御を返す関数を定義するようになりました。アセンブラーのニーモニックでは:

neg  eax     ; F7 D8
ret          ; C3

それで…それは簡単でした。:-)

「否定」命令は、「フォワード」方向で実行されることはなく、「リバース」方向でのみ実行されるため、必要なものにすることができます。したがって、同じパターンに従って、より複雑なことを任意に行うことができます。たとえば、ここでは、異なるレジスタで整数引数を取り(たとえば、EDI* nixシステムで一般的に使用されるSystem V呼び出し規約に従うため)、それを否定し、従来のEAXレジスタで返します。

C3      ret
D8 F7   fdiv  st(0), st(7)      ;  \ garbage bytes that
F8      clc                     ;  | never get executed,
89      .byte 0x89              ;  / so nobody cares

  ↓↓

89 F8   mov  eax, edi
F7 D8   neg  eax
C3      ret


7

Haskell、8バイト

匿名の恒等関数で、反転すると減算に変わり0ます。

id--)-0(

オンラインでお試しください!

逆に:

(0-)--di

オンラインでお試しください!


2
逆バージョンでコードの強調表示を破ることができました!
ティム

@ティム・キュリアス。テストでは、右括弧の直後にコメントが始まると失敗することが示唆されています。
Ørjanヨハンセン

6

空白、48バイト

S S S N
S N
S T N
T   T   T   T   T   T   N
S T N
N
N
T   S N
T   N
S S T   N
T   T   S S T   T   T   T   T   N
T   S N
S N
S S S 

手紙 S強調表示としてのみ追加される(スペース)、T(タブ)、およびN(改行)。

のマイナー修正 ソースコードを逆にする、ホワイトスペースの答えが少し、出力が無効になります!挑戦する

オンラインで試すたり、それがオンライン逆転してみてください(生のスペース、タブ、改行のみで)。

説明:

短い回文であるExit Program builtin を利用するNNN
通常のプログラムは:

SSSN   # Push 0 to the stack
SNS    # Duplicate it
TNTT   # Read STDIN as integer, and store it at heap address 0
TTT    # Retrieve the input from heap address 0, and push it to the stack
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

リバースプログラムは次のことを行います。

SSSN   # Push 0 to the stack
SNS    # Duplicate it
TNTT   # Read STDIN as integer, and store it at heap address 0
TTT    # Retrieve the input from heap address 0, and push it to the stack
SSTTN  # Push -1 to the stack
TSSN   # Multiply the top two values on the stack together
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

数字をプッシュするための小さな追加説明:

  • 最初 S:スタック操作を有効にする
  • 第二 S:スタックに数値をプッシュします
  • S または T:それぞれ正/負
  • いくつかのS/のT後に続くN:バイナリの数、ここでS=0T=1

すなわちSSTTSTSNプッシュし-10ます。のために、0明示的なを必要としないので、S=0単にSSSNまたはSSTNで十分です。




5

Brain-Flak、7バイト

#)]}{[(

オンラインでお試しください!

逆に:

([{}])#

オンラインでお試しください!

注:コメントをサポートするインタープリターでのみ機能します(例:Rain-Flakでは機能しますが、BrainHackでは機能しません)


バイトを単に逆にするのではなく、開始/終了ブラケットも交換する場合、コメントを使用せずに8バイトでこれを行うことができます。

({}[{}])

オンラインでお試しください!
逆にしてみてください!


これは未定義の動作の乱用ですか?Brain-Flakの仕様では、このような括弧は許可されていません。
高放射能

@TwilightSparkle #はコメントを開始するため、元のバージョンの括弧は無視されます。
ライリー

ああ、忘れた!ただし、Rain-Flakでしか機能しません(ただし、公式の通訳者です)。おそらく言及する必要がありますか?
高放射能

@TwilightSparkleは、説明のためにメモを追加しました。ありがとう。
ライリー

楽しい小さな挑戦:単に逆にするのではなく、開始/終了ブラケットを交換する場合、コメントなしでこれを行うことはできますか?
DJMcMayhem




4

R、23バイト

コメントトリックなしで試してみることにしました。

進む

`+`=scan;""+-0;nacs=`+`

オンラインでお試しください!

`+`=scan;0-+"";nacs=`+`

オンラインでお試しください!

フォワードバージョンで+は、2項演算子として機能し-、単項演算子です。

逆に、+は単項になり、-はバイナリになります。そのため、スキャン関数は引数を取ります。file=""これはwhat=0、デフォルトでもあるstdinとを意味します。したがって、+が単項の場合、最初の引数は右側にあり、バイナリの場合、最初の引数は左側にあります。

;nacs=`+`

コードの一部は実際には役に立たないため、ある意味では、コメントトリックを使用するよりも私のコードはそれほど有効ではありません。


1
これは非常に賢い(+1)です。R演算子をゴルフバイトに再定義することはよくありますが、+単項とバイナリの両方として使用されるように再定義されたのはこれが初めてだと思います。これがどのように解析されるかを理解するのに少し時間がかかりました...他のオペレーター名は仕事をしなかったでしょう。
ロビンライダー


4

Perl 5(-p)、7 6バイト

-1 @primoに感謝

$_*=$#

TIO

コメントは入力を変更しません

#1-=*_$

入力を否定する

$_*=-1#

TIO


-1:$_*=$# TIO#は、プログラムの最後のバイトである必要があります。そうでない場合$#、<empty>という名前の配列の最後のインデックスではなく、変数として解釈されます。
primo

1
ただし、印刷しようとすると$#エラーが発生する(#が最後の文字でない場合)か、何も表示されないため、どのように機能するのかわかりません
Nahuel Fouilleul

-pまたはのみで動作するよう-nです。私は定型はそれとは何か...持っている疑いがある
プリモ

2
@primo コードの後に-p/-n追加するため、機能;します。つまり、$#実際に$#;は、配列のサイズです@;。サイズが@;変更された場合、結果はもう正しくありません(TIO)。とにかく、これは非常に巧妙で、よくできています!:)
ダダ

それは、改行を追加するperl -MO=Deparse -p <(echo -n '$_*=$#')ようだからです。perl -MO=Deparse -pe '$_*=$#'
ナウエルFouilleul


4

バックハンド 6 5バイト

I@-Ov

オンラインでお試しください! 倍にしてみてください!

バックハンドのポインターの性質により、少し複雑になりました。私はそれがより短いを得ることが可能であるとは思わない、私は間違っていたことが判明した。これは重複していません命令を、2つのプログラム間で入力、出力、終了コマンドの両方を再利用します。今、私はそれが最適であると思います、あなたがIO-@働くためにすべてのコマンドを必要とするので、そして4バイトのプログラムでそれらのコマンドの2つだけを実行することができます。

説明:

バックハンドのポインターは、3つのセルでティックごとに移動し、セルの境界から跳ね返ります。これは、一般的なロジックが重複していることを意味します。ただし、この速度はvand ^コマンドで操作できます。

元のプログラムは、IO-@数値として入力、数値として出力、減算、終了の命令を実行します。明らかに、減算は不要です。コードでは次のとおりです。

I@-Ov
^  ^    Reflect
  ^     Reflect again
 ^

反転したプログラムが実行されv-I-vO-@ます。vダニの間ポインター工程を低減し、-暗黙的にゼロであり、スタックの底部から減算します。追加の-コマンドは何もしません。プログラムは次のように実行されます

vO-@I
v       Reduce pointer speed to 2
  -     Subtract zero from zero
    I   Get input as number and reflect off boundary
  -     Subtract input from zero
v       Reduce pointer speed to 1
 O      Output as number
  -     Subtract zero from zero
   @    Terminate







2

APL(Dyalog Unicode)13 3バイト

-∘0

オンラインでお試しください!

些細な答え。返品argまたは¯arg

愚かではないことで10バイトを節約しました(Adámに感謝)。

結果の3バイトをより適切な関数に変更しました。


おっと、これは3バイトで簡単にできます!
アダム

興味深いことに、このサブストリングとして既に3バイトの回答が埋め込まれています。
アダム

@Adámええ、どこかに簡単な答えがあることは知っていました。ありがとう。
J.サレ


2

> <>5 4バイト

n-r0

-vオプションでスタック初期化を使用し、そこに入力変数を入れます。

オンラインでお試しください!

または反転を試してください

説明

n       Prints whatever is on the stack as a number
 -      Subtract the top 2 elements on the stack.
        There aren't 2 elements, so it crashes.
  r0    Never gets executed

or reversed:

0       Push a 0 onto the stack
 r      reverse the stack (now 0, -v)
  -     Subtract top 2 elements and push result (0-v, ie negated)
   n    Print as number
        The code wraps around and executes again. 
        It crashes on the - as there is only one
        item on the stack: 0.

2

スタック猫 -mn、2バイト

-X

オンラインでお試しください!

逆にしてみてください!

説明

実際、これは以前のStack Catsの課題よりもはるかに簡単です。完全なプログラム(適用後-m)はこちらです-X-Xは、テープヘッドの左右のスタックを交換するために使用されます。つまり、最初のスタックにはまったく影響しないため、無視できます。しかし、その後、プログラムは効果的にちょうど--(スタックのトップを2回無効にする)だけであり、何もしません。

逆プログラムの場合、適用すると-mが得られX-Xます。繰り返しますが、X何もしませんので、プログラムは事実上just -であり、スタックのトップを無効にします。

他の2バイトソリューションはのみですが-=、それは実質的に同じです。唯一の違いは、=スタック全体ではなく、隣接するスタックの最上部のみをスワップすることです。

しかし、繰り返しますが、使用-mは不正行為のように感じられるため、以下は完全にミラー化されたプログラムを使用するソリューションです。


スタック猫 -n、7バイト

:I<->I:

オンラインでお試しください!

逆にしてみてください!

説明

注意事項前の回答からは、まだ適用されます:任意の有効な解決策は、一対の文字を使用する必要があるとI。6つの可能なソリューション(TIOリンクに含まれる)はすべてほぼ同じです。-そして_、このプログラムでは同等であり、かつ:置き換えることができ|たりT(非ゼロ入力でも同じように機能し、偶然にもゼロ入力でも機能します)。これが最も簡単だから、説明のためにこれを選んだ。

したがって、最初のスタックは入力をaの上-1(無限に多くのゼロの上)に保持するのに対し、テープに沿った他のすべてのスタックはゼロのみを保持することに注意してください。Stack Catsには、偶数の長さのプログラムは何も実行しないという性質もあります(終了した場合は、このチャレンジにループを使用することはできません)。同じことが、中央の文字が何もしない奇数長のプログラムにも明らかに当てはまります...見てみましょう:

:    Swap the input with the -1 below.
I    Move the -1 one stack to the left and turn it into +1.
<    Move another stack left (without taking the value).
-    Negate the zero on top of that stack (i.e. do nothing).

したがって、プログラムの後半部分は前半部分を正確に元に戻し、最終的に-1再び入力が行われます。

逆プログラムは:I>-<I:です。それが物事をどのように変えるか見てみましょう:

:    Swap the input with the -1 below.
I    Move the -1 one stack to the left and turn it into +1.
>    Move one stack right, i.e. back onto the initial stack which still holds the input.
-    Negate the input.
<    Move back to the left where we've parked the 1.
I    Move that 1 back onto the initial stack and turn it back into a -1.
:    Swap the -1 below the negated input to act as an EOF marker.

2

バッチ、34バイト

@ECHO.%1 2>MER@
@REM>2 1%=-aa/TES@

ECHO.入力(%1)をエコー()します。最初の行の残りの部分は、STDERRというファイルに技術的にリダイレクトされますMER@が、これは影響はありません。
2行目はコメント化されています(REM...)。

逆転

@SET/aa-=%1 2>MER@
@REM>2 1%.OHCE@

setコマンド(SET /a)の算術モードを使用して、()と同等の未定義変数()から-=入力(%1)を引き算a0 - inputます。繰り返しますが、最初の行の残りの部分は技術的STDERRに、というファイルにリダイレクトしますMER@が、これは影響はありません。
2行目はコメント化されています(REM...)。


これは面白そうです。説明する気?
アダム

@Adámは説明を追加し、また私は後方にプログラムがあることに気づきました。
Οurous

2

Brachylog、2バイト

&ṅ

Brachylogは暗黙的に左から入力し、右から出力します。
&左にあるものはすべて無視し、入力を右に関数に渡します。
その両側を互いに否定されたバージョンに制限します。

オンラインで試す


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