クインの猫2匹


30

チャレンジ

2つのプログラム、AとBを作成します。どちらも同じ言語のcatプログラムです。連結された場合、AB(同じ言語でも)はクインである必要があります。

たとえば、とが両方とも言語XYZのcatプログラムであるhelloとしworldます。helloworldが上記の言語の馬である場合、ソリューションは有効です。

猫やキンになじみのない人にとっては、猫のプログラムはstdinを介して与えられたものを正確に出力するものであり、キネは独自のソースコードを出力するプログラムです。

スコアリングとルール

  • 連結されたABプログラムの合計バイト数がスコアです。これはコードゴルフであるため、最低スコアが勝ちます。
  • 標準的な抜け穴は禁止されています
  • 入力はstdinから取得し、出力はstdoutに送信する必要があります。
  • catプログラムは引数を取る必要はありません。標準入力を標準出力にコピーするだけです。
  • クインは、プログラムに入力が与えられていないときに機能するはずですが、他の入力に対して正しく機能する必要はありません(可能性はあります)。
  • クインは、ソースコードを一度だけ正確に出力する限り、終了する必要はありません。
  • クインは少なくとも1バイトの長さが必要です。
  • AとBは同じプログラムにすることができます。
  • BAは、クインまたは有効なプログラムである必要はありません。

AとBが同じプログラムルールになる可能性があるとは思わない
ムハンマドサルマン

2
@MuhammadSalman私の最初のアイデアは、猫プログラムを2倍にして馬に変えることでした。私はそれが可能かどうかを完全に確信していなかったので、より簡単な解決策への扉を開きたかっただけです。私は両方の点で間違っていたように見えますが、私はそれで大丈夫です。
ビーフスター

3
AB多くの言語は0バイトの猫を持ち、0バイトのクインを許可するので、おそらく空でないものを追加する必要があります。
DJMcMayhem

9
@DJMcMayhem 0バイトのクインは有効なクインではありません。
ニッサ

4
猫プログラムとは何ですか?
ペドロA

回答:


32

V、2 + 2 == 4バイト

2i2i

馬をお試しください!

猫を試してください!

A2i

B2i

どのように機能しますか?

まず、Vの仕組みについて説明します。この答えを可能にしている注目すべき点の1つは、Vでは空のプログラム catプログラムであることです。これは特別なケースではなく、Vの動作に固有のものです。起動時に、すべての入力が「バッファ」にロードされ、各コマンドが何らかの形でバッファを変更し、プログラムが完了すると、バッファが暗黙的に出力されます。これは、NOPの文字列も猫プログラムであることを意味します。

このiコマンドは、挿入モード入ることを意味します。つまり、後に続くすべての文字iがバッファーに追加されます。その前に数字があれば、そのテキストはn回複製されます。

これは、catプログラムの場合、バッファーに何も追加されず、読み取られたとおりに出力されることを意味します。言い換えると:

        " (Implicitly) Load all input
2       " 2 times,
 i      " Insert the following text into the buffer...
        " (nothing)
        " (Implicitly) Print the buffer

しかし、馬にとっては、後にテキストがありますi

2       " 2 times,
 i      " Insert the following text into the buffer...
  2i    "   "2i"
        " (Implicitly) Print the buffer

生意気な無回答

V、0バイト

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

Aは空のプログラムです。

Bも空のプログラムです。

:P


21
他のすべての言語:オイ、行き止まりになりました!。V:*標準のquine *をポストします。
エリックアウトゴルファー

13

ルビー、71バイト

2;puts (<<2*2+?2)[/.+2/m]||$<.read
2;puts (<<2*2+?2)[/.+2/m]||$<.read
2

次のように猫に分割できます。

2;puts (<<2*2+?2)[/.+2/m]||$<.read
2

そして

;puts (<<2*2+?2)[/.+2/m]||$<.read
2

2つの猫は、3つすべてのプログラムでノーオペレーションである先頭の2を除いて同一です。<<2独自のライン上の終端2は、我々は自分自身に連結した文字列、(あるまで次の行に始まることにすべてを意味し、herestringである*2)とherestringが整形式である猫の末尾2を追加しますが、空、そのため、正規表現は一致しませんので、正規表現に進み、$<.readSTDOUTを出力します。ただし、猫を連結すると、3行目まで文字列が終了しないため、正規表現が一致し、馬を短絡して出力します。


11

Pyth、29バイト(5 + 24) 27バイト(5 + 22)

pz=T0?TzjN*2]"pz=T0?TzjN*2]     # Quine
pz=T0                           # Cat A
     ?TzjN*2]"pz=T0?TzjN*2]     # Cat B

それは楽しかった。
ここで馬を試してみてくださいここ
で最初の猫を
試してみてください

説明

Cat A
pz=T0
pz       Print the input.
  =T0    (Irrelevant for cat)

Cat B
?TzjN*2]"pz=T0?TzjN*2]
?Tz                      If T (10) is truthy, output the input.
   jN*2]"pz=T0?TzjN*2]   (Irrelevant for cat)

Quine
pz=T0?TzjN*2]"pz=T0?TzjN*2]
pz                            Print the (empty) input (without a newline).
  =T0                         Set T to 0.
     ?Tz                      If T (0) is truthy, output the input.
             "pz=T0?TzjN*2]   Otherwise, get this string...
          *2]                 ... take two copies...
        jN                    ... and join them with a quote.

11

C#(Visual C#コンパイラ)、551バイト

A:95バイト

class A{public static int i=2;static void Main(string[]args){System.Console.Write(args[0]);}}//

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

B:438 + 18バイト

class A{public static int i=0;}
class B{static void Main(string[]args){if(A.i<1){System.Console.Write(args[0]);return;}var a=@"class A{{public static int i=2;static void Main(string[]args){{System.Console.Write(args[0]);}}}}//class A{{public static int i=0;}}
class B{{static void Main(string[]args){{if(A.i<1){{System.Console.Write(args[0]);return;}}var a=@{0}{1}{0};System.Console.Write(a,'{0}',a);}}}}";System.Console.Write(a,'"',a);}}

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

A + B:533 + 18バイト

class A{public static int i=2;static void Main(string[]args){System.Console.Write(args[0]);}}//class A{public static int i=0;}
class B{static void Main(string[]args){if(A.i<1){System.Console.Write(args[0]);return;}var a=@"class A{{public static int i=2;static void Main(string[]args){{System.Console.Write(args[0]);}}}}//class A{{public static int i=0;}}
class B{{static void Main(string[]args){{if(A.i<1){{System.Console.Write(args[0]);return;}}var a=@{0}{1}{0};System.Console.Write(a,'{0}',a);}}}}";System.Console.Write(a,'"',a);}}

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

AとBは入力をコマンドライン引数として受け取ります。A + Bは入力を無視します。/p:StartupObject=BMSBuildに送信されるオプションには、BおよびA + Bの18バイトが追加されます。A + Bでのみ厳密に必要ですが、Bにも含めないことは不正行為のように見えます。このように、A + Bのコンパイラフラグは、Aのコンパイラフラグ(なし)とBのコンパイラフラグです。

説明

プログラムAは簡単です。クラスAにはにi初期化された(未使用の)静的変数が含まれ、2実行時に最初の引数を出力します。//最後には、A + Bのコードのために重要であるが、A自体には何もしません。

プログラムBは単独では奇妙ですが、本質的には同じです。にi初期化された静的変数を含むクラスAを作成し、クラス0BのMainメソッドを実行します。このメソッドはA.i1未満であるためプログラムAと同じで、奇妙なものの前に戻ります。ここで改行は必要ありませんが、A + Bにとって重要です。

結合すると、//プログラムAからはプログラムBからのクラスA宣言がコメントアウトされますが、改行のためにクラスBは問題なく、代わりにプログラムAからA.i2値を参照できます。A.Main()も存在するため、コンパイラフラグにより​​プログラムはB.Main()を実行します。その結果、プログラムA + Bは引数を出力せず、代わりにB.Main()の次のセグメントに移動します。これは基本的に標準のC#quineです。


1
「猫プログラム... stdinをstdoutにコピーする必要がある」
ヤコブ

9

ハスケル、116 + 20 = 187 175 174 136バイト

ØrjanJohansenが私に見せてから保存したバイト数 interact

ねこ1

g=";main|idmain<-(++\"g=\"++show g++g)=interact idmain|1>0=interact id";main|idmain<-(++"g="++show g++g)=interact id

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

ねこ2

main|1>0=interact id

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

クイン

g=";main|idmain<-(++\"g=\"++show g++g)=interact idmain|1>0=interact id";main|idmain<-(++"g="++show g++g)=interact idmain|1>0=interact id

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


ここでの基本的な原則は、最初の猫を2番目の猫に追加するとき、from aとやり取りする関数の名前を変更することidmainです。以来は、interact id私たちが望む猫であるidmain私にQUINEを返す関数を。明らかな解決策はを使用するconstことですが、入力も空の(++)作品であると仮定できるためです。ここから、かなり標準的な方法でソースコードを見つけます。ソースgをエンコードする変数があり、特別なラッパーを使用して文字列形式とコード形式で印刷します。で終わる必要があるため、エンコーダを先頭に置く必要があるというわずかな例外がありinteract idます。これは余分なことを意味しますg=エンコードされていないため、手動で処理する必要があります。次の猫はかなり標準的なものですが、他の猫の最後にタックしたときに有効なコードにする必要があるため、両方の猫をパターンガードのインスタンスにする必要があります。

代替戦略、43 + 105 = 186 148

ねこ1

g="";main|idmain<-(++g++show g)=interact id

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

ねこ2

main|1>0=interact id where g="g=\"\";main|idmain<-(++g++show g)=interact idmain|1>0=interact id where g="

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

クイン

g="";main|idmain<-(++g++show g)=interact idmain|1>0=interact id where g="g=\"\";main|idmain<-(++g++show g)=interact idmain|1>0=interact id where g="

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


1
getContents+ putStrをに置き換えることで、かなり短くすることができinteract idます。オンラインでお試しください!(クインは、空でない入力では機能しなくなり(++ ...)ましたidmain。これにより、のセクションを使用できます。)
ØrjanJohansen

@ØrjanJohansenありがとう!知らなかったのはinteract、HaskellでIOを行うことはめったにないからだと思います。投稿を編集しました。
小麦ウィザード

8

Python 3、286バイト

私の最初のPythonゴルフと私の最初の馬!あまりエレガントではありませんが、機能します。

プログラムA(238バイト)

from atexit import*;s="from atexit import*;s=%r;register(lambda:print(end='b'in globals()and s%%s or open(0).read()));b=0\nif's'not in vars():print(end=open(0).read())";register(lambda:print(end='b'in globals()and s%s or open(0).read()));

(末尾の改行なし)

プログラムB(48バイト)

b=0
if's'not in vars():print(end=open(0).read())

(末尾の改行なし)

オンラインで試す

謝辞

  • ジョー・キングのおかげで-24バイト
  • Jo Kingのおかげで-82バイト

改行と引用符end=open...を使用する必要がないように、%r代わりに使用して使用でき%sます
ジョーキング

かっこいい%rです。ただし、改行についてどういう意味かわかりません。
ヤコブ

1
%s改行をフォーマットする代わりに、リテラルを実行できます\n;代わりにステートメントを分割するために使用することもできます\nif独自の行にある必要がある場合を除く)。%を行うことで文字列内でエスケープできます%%。文字列をフォーマットするために必要な唯一の引数は文字列自体であり、他のすべてはストライプ化できます
ジョーキング

1
プログラムB(およびそのテキスト)はlocals()、2バイトを節約するために使用できます。
ジョナサンアラン

6

C ++(clang)、313 + 102 = 415バイト

プログラムA(改行で終わる):

#include<cstdio>
#define Q(x,y)#x,B=#y;x
int c;auto I="#include<cstdio>",A=Q(int main(){if(c)printf("%s\n#define Q(x,y)#x\",\"#y;x\nint c;auto I=\"%s\",A=Q(%s,)\n#ifdef Q\nint n=++c;\n#else\n%s\n%s\n#endif",I,I,A,I,B);else while((c=getchar())>=0)putchar(c);},int c;int main(){while((c=getchar())>=0)putchar(c);})

プログラムB(改行で終わらない):

#ifdef Q
int n=++c;
#else
#include<cstdio>
int c;int main(){while((c=getchar())>=0)putchar(c);}
#endif

ひどく卑劣ではなく、いつものようにC ++はクイニングにはあまり適していません。同じアイデアをあちこちでバイトを削る方法があったとしても、私は驚かないでしょう。1つの小さな問題は、定義された後に何かの動作を変更することであり、副作用を持つ動的変数初期化子がそのトリックを行います。(これは、コンパイラ拡張なしでCでも実行できますか?)

オンラインで試してください:ABAB

(私が知っている唯一の移植性の懸念は、プログラムが<cstdio>グローバル名前空間との両方に名前を置くことを想定していることですstd。)


5

Befunge-98(FBBI)、8 + 15 = 23バイト

A + B:(入力なしでのみ機能します)

+9*5~,#@#@~,9j>:#,_:@#"

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

A:

+9*5~,#@

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

B:

#@~,9j>:#,_:@#"

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


誰かがベファンジの答えを管理してくれるかどうか疑問に思っていました。これが2Dではないのは
残念

@Beefsterええ。問題は、2d Quineを実行するのがかなり難しいことです。多分私は何かに
取り組むつもりです-MildlyMilquetoast

5

Python 3、100 + 37 = 137バイト

プログラムA:

s='s=%r;print(end=open(0).read())#print(end=open(0).read())\nprint(s%%s)';print(end=open(0).read())#

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

プログラムB:

print(end=open(0).read())
print(s%s)

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

Quine ABを作る

s='s=%r;print(end=open(0).read())#print(end=open(0).read())\nprint(s%%s)';print(end=open(0).read())#print(end=open(0).read())
print(s%s)

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

入力が空の場合にのみ機能します。そうでない場合は、入力を出力の先頭に追加します。


二重引用符は単一のものでなければなりません。
ジョナサンアラン

クラッシュは許可されていますか?
ヤコブ

質問がクラッシュをしていることを言っていない@Jakob ない許可され、通常はSTDERRに出力が無視される
ジョー・キング

わかりました。賢いショートカット!
ヤコブ

4

アタッシュ、15 + 126 = 141バイト

A:

AllInput[]|Echo

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

B:

@{If[_,s.="AllInput[]|Echo@{If[_,s.=%s;;Printf[s,Repr!s],AllInput[]|Echo]es}|Call";;Printf[s,Repr!s],AllInput[]|Echo]es}|Call

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

A + B:

AllInput[]|Echo@{If[_,s.="AllInput[]|Echo@{If[_,s.=%s;;Printf[s,Repr!s],AllInput[]|Echo]es}|Call";;Printf[s,Repr!s],AllInput[]|Echo]es}|Call

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

説明

各catプログラムAllInput[]|Echoは、単純なcatプログラムであるをエンコードします。Bは主なクインフェーズです。単独では、@入力なしで呼び出される(として呼び出される|Call)ベクトル化された関数(単項を介して)です。したがって、最初の条件If[_,A,B]実行はB、単にAllInput[]|Echoです。

場合A + Bが実行され、単項は@バイナリなる@によるEchoラムダと合併します:

AllInput[]|Echo@{If[_, ...

これは、ラムダが実行される前に実行されることを意味しEchoます。条件に戻ると、この関数はすべての引数としてSTDINを持っています。そのため、標準のクインフレームワークであるをIf[_,A,B]実行しAます。


3

スタックス、16 + 12 = 28バイト

猫1:

"yi|d|ca34b4lr"y

実行してデバッグする

"yi|d|ca34b4lr"y Full program, implicit input
"yi|d|ca34b4lr"  Push the string
               y Push raw input
                 Implicit output of top item

猫2:

i|d|ca34b4lr

実行してデバッグする

i|d|ca34b4lr Full program, implicit input
i            Don't parse input (prefix directive)
 |d          Push main stack depth, always zero
   |c        Cancel because top item is falsy, and implicitly print
     a34b4lr Never executed

クイン:

"yi|d|ca34b4lr"yi|d|ca34b4lr

実行してデバッグする

"yi|d|ca34b4lr"yi|d|ca34b4lr Full program
"yi|d|ca34b4lr"              Push the string
               y             Push input
                i            No-op
                 |d          Push main stack depth, i.e. 2
                   |c        Do nothing because top is truthy
                     a       Get the string to the top
                      34     Push 34 (charcode of ")
                        b    Copy both
                         4l  Listify top 4
                           r Reverse
                             Implicit output

3

猫1:

Lua、41バイト

a=io.read;while a(0)do io.write(a(1))end;

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


猫2:

Lua、70バイト

if a then io.input(arg[0])end;a=io.read;while a(0)do io.write(a(1))end

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


クイン:

Lua、111バイト

a=io.read;while a(0)do io.write(a(1))end
if a then io.input(arg[0])end;a=io.read;while a(0)do io.write(a(1))end

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

io.input(arg[0]) Cat 2では、現在のファイルを標準入力として設定し、その結果、catはソースコードを出力します


1
PPCGへようこそ
ムハンマドサルマン

最後のセミコロンを削除すると、cat 1に1バイトを保存できますか?
ムハンマドサルマン

1
残念ながら、現在のファイルの読み取りは標準的な抜け穴です。しかし、とにかく試してみてください。
ビーフスター


0

JavaScript(Node.js)、199バイト


a=()=>console.log(require('fs').readFileSync(0)+'');a();var a=a||0;b=()=>console.log(require('fs').readFileSync(0)+'');!a?b():c=()=>console.log(`a=${a};a();var a=a||0;b=${b};!a?b():c=${c},c()`),c()

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

Cat A、57バイト


a=()=>console.log(require('fs').readFileSync(0)+'');a();

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

Cat B、142バイト

var a=a||0;b=()=>console.log(require('fs').readFileSync(0)+'');!a?b():c=()=>console.log(`a=${a};a();var a=a||0;b=${b};!a?b():c=${c},c()`),c()

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

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