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


39

あなたがそれを受け入れたいのであれば、あなたの仕事は、非ゼロの数値を出力するプログラムを書くことです。トリッキーな部分は、ソースコードを逆にする場合、出力は否定された元の整数でなければならないということです。

ルール

  • 完全なプログラムを作成する必要があります。つまり、出力をSTDOUTに出力する必要があります。

  • 両方の数値は10を基数にする必要があります(他の基数または科学表記法で出力することは禁止されています)。

  • 数字の末尾/先頭にスペースを入れて出力できます。

  • これはコードゴルフなので、各言語で最も短い(元の)コードが優先されます。

  • デフォルトの抜け穴が適用されます。

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


6
バイトレベルではなくビットレベルで反転できる場合、1バイト-(0x45 = 0b00101101)はJellyで動作します- -リテラル-1を定義するため-1を生成しますが、(0xB4 = 0b10110100)は論理演算を実行しないため1を生成しますゼロの暗黙的な入力の。(もちろん同様に動作します:p)
ジョナサンアラン

@TwilightSparkle「未使用の空の入力がある」ということは、すぐにEOFに達する入力関数に依存できるということですか?
Borka223

1
@ Borka223いいえ、できません。
高放射能

@JoKingコピー。削除します。
高放射能

回答:



28

JavaScript(V8)、19バイト

print(1)//)1-(tnirp

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


とほぼ同じ...

C#(Visual C#Interactive Compiler)、19バイト

Print(1)//)1-(tnirP

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

(指摘してくれた@someoneに感謝)


まだほとんど同じ...

Lua、19バイト

print(1)--)1-(tnirp

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


しかし、より短い...

Python 2、15バイト

print 1#1-tnirp

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


この魔法の印刷ツールがあるため、PHPではさらに短くなります<?=

PHP、12バイト

<?=1;#;1-=?<

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


Rubyではさらに短くinspectなります。印刷するよりも

Ruby、8バイト

p 1#1- p

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


また、C#インタラクティブ、Print(1)//)-1(tnirP。(オンラインで試してみてください!
私の代名詞は

C#の場合、最短プログラムは些細なものもそうである:class A{static void Main(){System.Console.Write(1);}}//}};)1-(etirW.elosnoC.metsyS{)(niaM diov citats{A ssalc
LegionMammal978

プログラミング言語ではありませんが、1<!--!<1-HTML を使用して(9バイト)実行できます-1<!--!<1。それはあなたの答えとまったく同じです。
イスマエル・ミゲル

Luaでもほぼ同じ:print(1)--)1-(tnirp
valがモニカを復活させる



12

///、4バイト

9/9-

出力9

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

逆に:

-9/9

出力-9

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

の前のすべて/が印刷され、残りは無視されます(実際にはスラッシュはあまり使用されていないため、何が起こるか正確にはわかりませんが、何も出力しません)。


2
スラッシュを使用する場合は+1。/パターン読取処理を開始し、したがって、それはパターンにreadedされた後の文字は、出力されません。
高放射能

2
私は思いついて、/\-//1-私は賢いと思った。:D
タナースウェット


10

空白、21バイト

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

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

出力1/-1

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

説明:

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

SSSTN  # Push 1 to the stack
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

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

SSTTN  # Push -1 to the stack
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

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

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

すなわちSSTTSTSNプッシュし-10ます。



7

Japt、2 バイト

任意の単一の桁の整数>0の代わりに使用することができ2得るようにA-GHIJまたはL10-163264-1および100、それぞれ)。

n2

テストする | 逆転

nこれはデフォルトに渡された引数から、整数に減算その整数を適用する方法0。前方に実行すると、nメソッドは暗黙の最初の入力で実行されます。これもデフォルトで0ます。ます。

あるいは、gメソッドをの代わりに使用することもできます。このメソッドはn、適用されている整数から引数を減算した結果の符号を提供します。


7

Haskellコメントなし、41バイト

転送プリント1+改行:

main=print$!1
niam=main
"1-"!$rtStup=niam

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

-1改行なしの反転印刷(2バイトのコストで追加できます):

main=putStr$!"-1"
niam=main
1!$tnirp=niam

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

  • 各プログラムの最初の行に番号が表示されます。
    • 以下のため-1の文字列出力括弧を回避するために使用されます。
    • $!スペースの代わりに(厳密なアプリケーション)を使用すると、反転された行を演算子の有効な定義にすることができます!$$再定義により使用が中断されるため、実行しません)。
  • 中央の行によりniam、最後の行に確実に定義されます。
  • 最後の行は演算子の定義です!$。これは使用されませんが、正しく解析および型チェックする必要があります。

7

PHP15 13バイト

コメントの乱用のないPHPバージョン。ohceは未定義の定数であるため、その名前の文字列値と等しくなります。その結果、これは印刷しようとする+1-'ohce'-1+'ohce'、逆にされます。以来、'ohce'非数値であり、0は演算に代えて使用され、唯一の1または-1印刷されます。

;echo+1-ohce;

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

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


それは賢いです。いいね!
AdmBorkBork

1
男は、それは私はあなたが、3時間遅れて:(私のupvoteを持っているように同じ答えに到着したことが悲しいです。
イスマエルミゲル




6

Cubix, 7 6 5 bytes

@)O(@

Try it here
Reversed

Explanation

Cubified:

  @
) O ( @
  .

Unrolling the control flow, we execute )O(@, which increments, outputs, decrements, and exits.

Reversed and cubified:

  @
( O ) @
  .

Unrolling the control flow, we execute (O)@, which decrements, outputs, increments, and exits.

Previous version

@O(.)O@

Try it here
Reversed

Not as short, but aesthetically pleasing.


nice, way to put it on a size 1 cube!
Giuseppe

3
@)O(@ for 5 bytes and restoration of symmetry :)
MickyT



5

Stack Cats -mn, 4 bytes

:-:_

Try it online! In the footer I've included all other 4-byte solutions. (Stack Cats ignores everything after the first linefeed.)

Try the reverse!

Explanation

The -n flag turns on numeric output (and input, but we don't have any), and the -m flag is normally just a golfing convenience which lets you avoid the redundant part of the source code. This is because every Stack Cats program needs to have mirror symmetry. With the -m flag you only give it the first half (plus the central character). So the actual program here is:

:-:_:-:

As you can see in the first TIO link, there's a ton of 4-byte solutions, but I picked this one for its simplicity. Stack Cats is stack-based, and this program only uses the initial stack. Since we don't have any input, it contains a single -1 (an EOF marker) on top of an infinite well of zeros. The three commands in the program have the following meaning:

:   Swap the top two stack elements.
-   Negate the top stack element (i.e. multiply by -1).
_   Pop a. Peek b. Push b-a.

So here is how the program modifies the stack (states and commands are staggered to indicate how each command changes the stack from one state to the next):

   :   -   :   _   :   -   :

-1   0   0  -1   1   0   0   1
 0  -1  -1   0   0   1   1   0
 0   0   0   0   0   0   0   0
 …   …   …   …   …   …   …   …

As it turns out, the only command that really does anything here is _ which turns our EOF marker into a 1. Output at the end of the program is implicit, and the EOF marker is optional, so this just prints out the 1 we get.

Now if we reverse the source code, due to the implicit mirroring, the actual program becomes:

_:-:-:_

This does something very different:

   _   :   -   :   -   :   _

-1   1   0   0   1  -1   0  -1
 0   0   1   1   0   0  -1  -1
 0   0   0   0   0   0   0   0
 …   …   …   …   …   …   …   …

This time the bottom of the stack is still a -1 so it does act as the EOF marker and only the -1 on top of it gets printed.

...

Now with all of that said, since Stack Cats has such a unique relationship with reversing code, I feel that using -m is a little cheating. It's normally only meant to save bytes by omitting the redundant part of the source code, but here it actually makes the challenge a lot easier and even the full program shorter. This is because reversing a full program will only change the program if it contains any of <>[], which also means that the program ends up making use of multiple stacks (Stack Cats actually has a tape of stacks, where all but the initial one are only filled with zeros to begin with). Furthermore, reversing it then just swaps the <> and [] pairs, which still makes the execution symmetric. The only way to break that symmetry is to use I which does -] or -[スタックの最上部の符号に応じて、または何もありません。そう...


Stack Cats -n、11バイト

*|]I*:*I[|*

オンラインでお試しください! The footer again includes all other alternatives at the same byte count. Some of those output 1/-1 and some output 2/-2 as indicated after each program. I picked this one to explain kinda randomly as one of the ones that output 2.

逆にしてみてください!

説明

私が言ったように、これはもう少し長いです。使用したとしても-m notation for this, it would weigh in at 6 bytes instead of the above 4.

今回使用するコマンド:

*   Toggle the least significant bit of the top of the stack.
|   Reverse the longest non-zero of prefix on this stack.
[]  Move one stack to the left/right and take the top of the current stack with you.
I   If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
:   Swap the top two stack elements.

最初のプログラムは2つのスタックのみを使用します。ASCIIアートでやるのは少し面倒ですが、ベストを尽くします。角括弧は、テープヘッドがどのスタックにあるかを示し、スタック状態の各ペアの間にコマンドを配置します。

  [-1]
…   0   0   …
    0   0
    …   …

      *

  [-2]
…   0   0   …
    0   0
    …   …

      | (does nothing)
      ]

      [-2]
…   0   0   …
    0   0
    …   …

      I

   [2]
…   0   0   …
    0   0
    …   …

      *

   [3]
…   0   0   …
    0   0
    …   …

      :

   [0]
…   3   0   …
    0   0
    …   …

      *

   [1]
…   3   0   …
    0   0
    …   …

      I

      [-1]
…   3   0   …
    0   0
    …   …

      [

  [-1]
…   3   0   …
    0   0
    …   …

      |

  [ 3]
…  -1   0   …
    0   0
    …   …

      *

  [ 2]
…  -1   0   …
    0   0
    …   …

これで-1EOFマーカーとして機能し、2印刷されます。

他のプログラムはまで同じ[です。2つ目まではほぼ同じIです。技術的には別のスタックになりますが、値がなければ、それらはすべて区別できません。しかし、その後の違いは問題にI[なりI]ます:

    *|[I*:*I

      [-1]
…   3   0   0   …
    0   0   0
    …   …   …

        ]

          [-1]
…   3   0   0   …
    0   0   0
    …   …   …

        | (does nothing)
        *

          [-2]
…   3   0   0   …
    0   0   0
    …   …   …

今回はEOFマーカーはありませんが、プログラムはまだを出力し-2ます。


4

Zsh、12バイト

<<<2 # 2-<<<

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

基本的なフォワード、コメント、リバースの方法。


I / Oの制限が緩和されている場合、負のリターンコードをサポートするZshのおかげで、より興味深い11バイトのソリューションが可能になります。

return -127

逆に721- nruterすると、コードで終了します127(コマンドが見つかりません)。exit -127使用できませんu8。それはにキャストされます。 オンラインでお試しください!


4

CJam、3バイト

W;1

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

仕組み

通常版:

W    e# Push -1
;    e# Delete
1    e# Push 1
     e# Implicit display

逆バージョン:あなたはアイデアを得る。


4

MATL、3バイト

Nqv

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

仕組み

通常:

N   % Push number of elements in the stack: 0
q   % Subtract 1: gives -1
v   % Concatenate stack contents vertically: leaves -1 as is
    % Implicit display stack contents

逆に:

v   % Concatenate stack contents vertically: gives the empty array, []
q   % Subtract 1: leaves [] as is
N   % Push number of elements in the stack: 1
    % Implicit display. [] is not displayed


4

六角形、5バイト

1!@!(

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

有効なプログラムは次のいずれかでなければなりません。

  • 終了コマンド(@または:)があります。後者は、メモリポインター移動コマンドがある場合にのみ前者と異なります。また、このコマンドは最初または最後のバイトにあってはなりません。
  • 出力コマンドがあります。(!;も可能ですが、おそらくより多くのバイトを取るでしょう)
  • メモリ操作コマンドがあります。

したがって、2バイトのプログラムは明らかに不可能です。2バイト目は終了コマンドでなければならず、最初のバイトはミラー/ IP操作コマンドであってはならず、1バイトしか実行できないため、3バイトプログラムは不可能です。

4バイトのプログラムは不可能だと思います。このようなプログラムは、a@bc六角形のグリッドを持つ形式でなければなりません

 Forward:       | Backward:
                | 
  c b           |   a @
 @ a .          |  b c .
  . .           |   . .

したがってa、IPリダイレクトコマンドである必要があります。ただし、1つのメモリ操作コマンドだけで正と負の両方の数値を生成することは不可能です。


+1は、ささいな答えで最適性を証明します
Jo King



3

Java 5または6、127 67バイト

enum A{A;{System.out.print(9);}}//}};)9-(tnirp.tuo.metsyS{;A{A mune

出力9/-9.

Java 5または6はどこでも利用できないため、オンラインコンパイラはありません。

ただし、この試すことができます127バイト:Javaの同等の8
オンラインそれを試してみたり、それがオンライン逆転してみてください

説明:

enum A{                              // Create an enum
 A;                                  //  With a mandatory value
 {                                   //  And in a separate instance code-block:
  System.out.print(9);}}             //   Print 9 to STDOUT
//}};)9-(tnirp.tuo.metsyS{;A{A mune  // Comment and thus a no-op

Java 5および6には、プログラムの必須mainメソッドが欠落しているにもかかわらず、enum内にコードブロックを作成して何かを実行できるバグがありました。これによりエラーが発生します。

java.lang.NoSuchMethodError:
スレッド「メイン」のメイン例外

But will still output what we'd want to STDOUT first, so we can ignore that.


3

Golang, 109 bytes

package main;import "fmt";func main(){fmt.Println(1)}//})1(nltnirP.tmf{)(niam cnuf;"tmf" tropmi;niam egakcap

And its reverse:

package main;import "fmt";func main(){fmt.Println(-1)}//})1(nltnirP.tmf{)(niam cnuf;"tmf" tropmi;niam egakcap

Try it online!


2
I don't know Go, but it seems you can remove a few bytes. The Println can be Print, and the import "fmt"; doesn't need the space: import"fmt";. :)
Kevin Cruijssen


3

Retina, 6 bytes

-`<
-

Prints 1.

Try it online!



-
<`-

Prints -1.

Try it online!

Explanation: 1

-`<
-

This... does nothing. Due to the `, this is a substitution from < to - (with configuration -, which does nothing), but the input is empty, so the output is empty as well.


And this second stage matches the empty regex against the empty input and counts the number of matches, which is exactly 1. Output is implicit.

Explanation: -1


-

This time we replace the empty regex with -. This does indeed turn the empty input into a single -.

<`-

Here, the configuration actually does something: < prints the stage's input before executing the stage, so we print the -. Then - counts the hyphens in the stage's input which is again 1. Due to the implicit output, this prints a 1 after the -, giving us -1 as required.


3

TEX(MathJax), 4bytes

1%1-

CodeResultForward:1%1-1Backward:-1%11


3

brainfuck, 156 bytes

+++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++<+++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++

Try it online! / Forward/backward verifier in Bash

Prints -1 forward and \n1 backwards.

Despite being almost trivial, I believe this is the optimal solution for this particular fixed output.

Proof:

  • The program cannot have [ or ].

    Therefore the program must have the form <A> . <B> . <C>.

  • Each , can be replaced with a sufficient number of < without increasing the number of + or -.

  • Each + is only useful in either the forward or the backward program, never both.

    Proof: + in part A is obviously only useful in the forward program, and + in part C is obviously only useful in the backward program.

    Denote shift(P) = number of < in P - number of > in P. Consider program <B> = <D> + <E>, the + in the middle is useful in the forward program shift(E) = 0, similarly it's useful in the backward program shift(D) = 0. However if shift(D) = shift(E) = 0 then the program B executed either forward or backward would add a fixed value to the current cell before printing the second time, which can't be the case because ord('1') - ord('\n') != ord('1') - ord('-').

Therefore the program needs at least ord('-')+ord('1')+ord('\n')+ord('1') = 153 +s, 2 .s, and at least a < > or , because shift(B) != 0.

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