インターキン-ループで互いに出力する2つのプログラム


29

プログラムAは実行時にプログラムBのコードを出力し、BはAのソースを出力します。

要件:

  • 両方のプログラムで1つの言語のみ
  • プログラムは異なります。それ自体を出力する1つのプログラムは資格がありません。
  • 両方のプログラムは空ではないか、少なくとも1バイトの長さです。ソースと出力の両方の末尾の改行は無視されます
  • stdinは閉じられています。何も読まないでください(したがって、ソース読み取って操作することはできません)。出力は標準出力に送られます。
    編集: stdinはに接続されてい/dev/nullます。明確になっている場合は、閉じるように注文できます。
  • random関数を使用しないでください。

追加:

  • 可能であれば説明する

スコアは全長です。プログラムに影響しない場合、末尾の改行はカウントされません。



5
「ランダム関数を使用しないでください。」どういう意味ですか?乱数を出力する関数?
ミスターXcoder


stdinが閉じているという意味ではないことを確信しています。これにより、stdinが最初に開いたファイルの複製になるため、一部の環境が爆破されます。とにかく、あなたがそれを修正しないならば、私はそれを乱用します。
ジョシュア

回答:


18

CJam、13 + 13 = 26バイト

{sYZe\"_~"}_~

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

出力

{sZYe\"_~"}_~

説明

{       e# Standard quine framework, leaves a copy of the block on the stack
        e# for the block itself to process.
  s     e# Stringify the block.
  YZe\  e# Swap the characters at indices 2 and 3, which are Y and Z themselves.
  "_~"  e# Push the "_~" to complete the quine.
}_~

e\2番目と3番目のオペランドが可換であるため、他のプログラムはまったく同じことを行い、元の順序にスワップZしてY戻ります。


17

CJam11 + 13 = 24 11 + 12 = 23バイト

"N^_p"
N^_p

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

出力:

"N^_p
"
N^_p

出力には13バイトがありますが、次のとおりです。

プログラムに影響しない場合、末尾の改行はカウントされません。

そこで、それを利用するためにスペースを改行に変更しました。

これは、最短のCJam適切なクインに基づいています。

"_p"
_p

そしてN^、文字列を改行でxorします。これは、各文字が一意である文字列について、改行がない場合は改行を追加し、存在する場合は削除します。

馬の質問でその馬を見たことがあると思いますが、見つけることができませんでした。


これまでの他のすべての答えとは異なり、2つの異なるサイズのプログラムを持っていることに対して+1。編集:もう一度投票できるようになるとすぐに..最後の投票の上限に達した>。>
ケビンCruijssen

長さが異なるのに適しています。
-iBug

「クインの質問でそのクインを見たことがありますが、見つかりませんでした。」GolfScriptの回答でのみ言及されています。
マーティンエンダー

12

RProgN 2、3 + 3 = 6バイト

最初のプログラム:

0
1

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

2番目のプログラム:

1
0

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

-2 Martin Enderに感謝します。


7
言語を切り替えることで2バイトを保存できます:tio.run
Martin Ender

@MartinEnderうん、RProgN 2がそのような動作をするのを忘れてしまった...
エリックアウトゴルファー

11
この動作が存在することを除いて、RProgNについては何も知りません。
マーティンエンダー

RProgNの@MartinEnder作成者、明確なものが必要かどうかを尋ねてください!
アタコ

@ATacoまあ、私はdownvoteを明確にするためにあなたを求めていると思いますが、私はあなたができるとは思わない...
エリックOutgolfer

6

C、95 + 95 = 190バイト

16 * 2バイトを節約してくれた@immibisに感謝します!

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

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

出力:

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=0^1;printf(s,34,s,34,i);}

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

どの出力:

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

1
なぜそれを常にCと呼ぶのではなく、プログラムを変えるためにiの変更に頼るのですか?Cは%cより短い
user253751

@immibisはい、あなたは正しいです、それで十分です。
Steadybox

5

Javascript、67 + 67 = 134バイト

第1プログラム:

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=0))

2番目のプログラム:

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=1))

これは、ハーマン・ラウエンシュタインのトライインターキンに対する答えに基づいています

Javascript(無効な読み取りソースコード)、75 + 75 = 150 61 + 61 = 122 58 + 58 = 116 50 + 50 = 100バイト

Tusharのおかげで20バイト、Craig Ayreのおかげで6バイト、kamoroso94のおかげで16バイト節約しました

第1プログラム:

f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f()

2番目のプログラム:

f=_=>alert(("f="+f).replace(1,a=>+!+a)+";f()");f()

1と0を入れ替えます。その逆も同様です。これらは両方とも同じことを行い、ソースコードのために異なる出力を生成します。


1
数バイト節約しましょう。f.toString()=> (''+f)(0|1)=> 0|1(a,b)=> a結果f=()=>("f="+(''+f).replace(/0|1/g,a=>a==0?1:0)+";f()");f()
17

あなたはバイトのカップルを保存するために使用されていないパラメータを使用することができますf=_=>@Tusharが示唆されているように、コールバック交換してから括弧を削除:a=>+!+a
クレイグ・アイレ

置き換える"f="+(f+"")("f="+f)するため-3バイト。
kamoroso94

-5バイトの場合は/0|1/g/1|0/g01それぞれ置き換えます。
kamoroso94

実行しましたか?このように動作しf=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f()ます。
kamoroso94

4

Python 2、63 + 63 = 126バイト

オンラインで試す

最初のプログラム:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]

出力:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

2番目のプログラム:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

出力:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]

4

JavaScript(JsShell)、35 + 34 = 69バイト

1:

(f=x=>print(`(f=${f})(${-x})`))(-1)

2:

(f=x=>print(`(f=${f})(${-x})`))(1)

3

Mathematica、43 + 44 = 87バイト

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -1 1]

そして

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -(-1)]

私のコンピューターでテストしましたが、2番目の出力は-1最後にしかありません-1 1
numbermaniac

@numbermaniacこれらのコードはテキストベースのインターフェースで作成しました。ノートブックでは機能しないようです。
-alephalpha

3

asmutils sh、16 + 16バイト、「stdin is closed」ルールを乱用。

#!/bin/sh
tr x y

stdinが閉じられ、shがスクリプトを最初の使用可能なハンドルまで開くため(最新のシェルのように番号の大きいハンドルに移動するのではなく)、trはスクリプトを開かずにスクリプトのコピーから読み取ります。

このインターフェイスはペイロードに対応していますが、ペイロードの挿入には注意が必要です。

さらに、この元のバージョンは、私が当時使用していた古代のカーネルのいくつかのクレイジーなバグを悪用しています。(私はそのカーネルに何が起こっているのかわかりません-後で、デバイスのメジャー番号とマイナー番号が異なることがわかりました。)asmutilsを壊したABIの変更を修正した場合、インターキンはまだ動作しません。asmutils shにexecがあるかどうかは忘れますが、もしそうなら、これは最新バージョンです:

exec dd skip=0 | tr x y

これは、asmutils ddの意図的なバグを悪用します。パフォーマンスの最適化があり、可能であればスキップのためにllseekを呼び出しますが、バイトを保存するために、SEEK_CURではなくSEEK_SETを渡します。これにより、stderrではゴミが発生しますが、stdoutではインターキンが発生します。Asmutils ddには、stderrスパムを抑制するオプションがありません。


/dev/null代わりにstdinが接続されている場合、これは機能しますか?とにかく、良い仕事です!
-iBug

@iBug:いいえ。閉じたstdinと、asmutils shがlibcにリンクされていないため、libcの自動修復コードを継承しないという事実に完全に依存しています。
ジョシュア

あなたは必要#!/bin/shですか?
電卓

@CalculatorFeline:他の何かの定義の正確さに依存します。
ジョシュア

通常、シバンはカウントされないため、これは6バイトになります。
電卓


1

Common Lisp、58文字

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

...または、*print-circle*グローバルに設定されていると仮定しても構わない場合は24文字T

#1=(print '(write '#1#))

印刷されたコードの表現は、#1#次のコンスセルを指す循環構造として読み取られます#1=。実行されないようにプログラムを引用します。以来、*print-circle*Tは、REPLは、印刷中にこのようなリーダー変数を放出するように注意を要します。これは上記のコードが出力するものであり、以下を返します:

#1=(write '(print '#1#)) 

上記のコードを評価すると、次のように出力されます。

#1=(print '(write '#1#))

のデフォルト値に*print-circle*準拠したい場合(準拠する実装ではNIL)、変数を一時的に再バインドする必要があります。

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

LETの本体内で、*print-circle*Tであるものを印刷します。

#1=(write
    '(let ((*print-circle* t))
       (print '#1#))
    :circle t) 

ご覧のとおり、新しいプログラムは再バインドしません*print-circle*が、writeによって呼び出される低レベル関数であるを使用しているため、printなどの追加の引数を渡すことができ:circleます。コードは期待どおりに機能します。

#1=(let ((*print-circle* t))
     (print '(write '#1# :circle t)))

円形の構造体の世話をしながら、あなたは物事を印刷するにもかかわらずしかし、あなたは、スクリプトとしてではなく、REPLの内側に上記のプログラムを実行する必要があり、両方writeprintも印刷されている値を返します。また、デフォルトのREPLでは、値も出力されますが、動的コンテキストの外側に*print-circle*はT があります。


1

> <>、16 + 16 = 32バイト

":1-}80.r   !#o#

そして

#o#!   r.08}-1:"

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

これは、プログラムでジャンプを使用することで機能します。最初のプログラムのジャンプは、スタックの逆をスキップします(スタックを逆にした場合は、クインになります)。2番目のプログラムはリバースをスキップしませんが、プログラムの流れによってすでにリバースされていた場合、元のプログラムを作成します。

このコードはエラーで終了します。


1

RProgN 2、7 + 7 = 14バイト

印刷注文を乱用するだけでなく、RProgNのより良い使用方法を誇示したいと思いました...

1
«\1\-

そして...

0
«\1\-

説明した

1   # Push the constant, 1. (Or 0, depending on the program)

«\1\-
«       # Define a function from this to the matching », in this case there isn't any, so define it from this to the end of the program, then continue processing.
 \      # Flip the defined function under the constant.
  1\-   # Get 1 - Constant.

これによりスタックが上下逆に印刷されるため、新しい定数が最初に印刷され、次に関数の文字列化されたバージョンが印刷されます。

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


1

ロゴ、65 + 66 = 131バイト

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] 1]

そして

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] -1]

1

Python 3、74 + 74 = 148バイト

a='a=%r;b=%r;print(b%%(b,a))';b='b=%r;a=%r;print(a%%(a,b))';print(b%(b,a))

そして

b='b=%r;a=%r;print(a%%(a,b))';a='a=%r;b=%r;print(b%%(b,a))';print(a%(a,b))

私もそれを理解していません


1

> <>、12 + 12 = 24バイト

'3d*!|o|!-c:

そして

':c-!|o|!*d3

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

両方のプログラムは、ラップ文字列リテラルを使用してコードをスタックに追加し、'さまざまな方法でコマンドを生成します。スタックを印刷するとき、コードを後方にプッシュし'ますが、先頭に留まります。'; を生成するいくつかのバリエーションがあります。3d*d3*00g:c-ときとペア3d*:9-を組み合わせた場合00g

Befunge-98で13 * 2バイトの投稿するにはあまりにも似たソリューション

"2+ck, @,kc+2


0

Javascript(ES6)、36 + 36 = 72バイト

プログラム1:

f=n=>('f='+f).replace(/4|5/g,n=>n^1)

プログラム2:

f=n=>('f='+f).replace(/5|4/g,n=>n^1)

これらのプログラムは、自身のクローンを作成すること5により機能445

console.log((
    f=n=>('f='+f).replace(/4|5/g,n=>n^1)
)())
console.log((
    f=n=>('f='+f).replace(/5|4/g,n=>n^1)
)())


2
これはquineというタグが付けられているため、独自のソースを読み取るため、これは通常「不正なquine」と見なされます。OPの決定についてはわかりませんが、通常は許可されていません。
スティーブン


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