双方向クインチェーン


9

PPCGはすでに十分な数のクインを持っていません...

チャレンジ:

あなたの仕事はプログラム「A0」を作成することです。このプログラムを入力なしで実行すると、何も出力されません。このプログラムを入力して実行すると、「A1」が出力されます。「A1」を入力なしで実行すると、「A0」が出力されます。"A1"を入力で実行すると、 "A2"が出力されます。「A(k)」は、入力なしで実行すると「A(k-1)」を出力し、入力付きで実行すると「A(k + 1)」を出力します。

細部

この課題は十分に単純だと思います。本当に他のルールはありません。ところで、すべてのプログラムには、少なくとも1バイトが含まれている必要があります。入力はASCII文字のみで構成されると想定して、必要に応じて空白を無視してもかまいませんが、特定の入力を指定することはできません。出力はSTDOUTまたはSTDERRのいずれかになりますが、プログラムはすべて同じものに出力する必要があります。もう1つにもテキストが含まれている可能性があります(そのため、STDOUTに出力してエラーで終了する場合があります)。それを指摘してくれた@Dennisに感謝します。

すべてのプログラムは同じ言語である必要があり、各プログラムは他のプログラムとは異なる必要があります。

スコアはプログラム「A0」の長さに等しい。これはコードゴルフのチャレンジなので、最低のスコアが勝ちます!


ほとんどの提出では、成長する文字列に追加される単一の文字によってA(k)とA(k + 1)が異なることを予測して悲しいです:(
Sparr

@Sparr残念ながら、おそらくそれが起こります。:(まあ、私はそれに対して明確なルールを作成する方法を見つけ出すことはできません。
HyperNeutrino

これを正しく解釈している場合、私はわからない2つのうちの1つにしか出力できません。必要な出力をSTDOUTに出力する場合、STDERRを空にする必要がありますか?通常、エラーで終了することが許可されているためです。
デニス

すべてのプログラムが異なる必要がありますか?質問はそれを言っていません。

4
また、「双方向クインチェーン」のようなやや表現力豊かなタイトルを提案してもいいですか。「スーパーメタクイン」は、他のプログラムを印刷するプログラムをはるかに超えているわけではなく、将来的にこの課題を探すのが難しくなります。
マーティンエンダー

回答:


1

ピップ、28バイト

V Y"I#qSti0+i?`V Y`.RPyRtiu"

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

説明

これは、最も短い既知のPip quineの修正バージョンですV Y"`V Y`.RPy"。そのクインは、文字列を定義し、それをy変数にヤンクして評価します。評価されると、文字列はy(したがって、値をy二重引用符で囲む)のreprを受け取り、パターンリテラル`V Y`をその前に連結します。

当社の戦略は置くことです0、その後、プログラムに置き換え010入力があった場合、または交換10して0何の入力がなかった場合。(したがって、A(kは)からなる番号を含むことになるK 1つのは0が続く)010組み込み変数(存在するので便利であるiし、tこれらの値と、それぞれ)、我々はそれらを参照することができるようにすることなく、実際の数字を使用して。

したがって、の代わりにRPyRP yRit入力があったかどうかが必要ですRP yRti。私たちは、の値を交換することにより、2つのケースを組み合わせることができますtし、i入力が(存在する場合I#q Sti)、その後、やってRP yRti。(入力#q長さ0は誤っているため、入力の長さをテストする必要があります。)

0コードでリテラルを取得し、出力を生成しないA0の特殊なケースを処理する必要があるだけです。どちらもテスト0+iして問題がuなければリターンすることで解決できます:

  • いずれかのためにK > 0、A(IN数kは)ゼロでないであろうと(例えば、従ってtruthy 110+i)。
  • 以下のために、K = 0、A(IN数kは)ゼロとなります。
    • 入力がiありt、スワップされiて10である場合0+iは、まだ真実です。
    • 入力がない場合iでも、は0で0+iあり、誤っています。quineコアの代わりに、unilの組み込み変数であるを出力します。nilを出力しても何も出力されません。

よくやった!魅力のように機能します。
HyperNeutrino 2017年

1

Python 2、93バイト

末尾に改行があります。

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

入力してみてください | 入力なしでお試しください

これは、同様の質問に対する私の回答から変更されています

入力がある場合、インクリメントしますp。だから、結果のプログラムは次のようになりますp=2+...p=3+...など、


これは入力として0を認識しません
fəˈnɛtɪk

@LliwTelracs入力は引用符で囲む必要があります(文字列である必要があります)。回答のハイパーリンクを参照してください。
mbomb007

それがあるとして、あなたのプログラムは、文字列と0以外のすべての数字で動作します
fənɛtɪk

1
@LliwTelracsでは、数値を使用しないでください。コンセンサスによると、を使用するinput()代わりに、引用符で囲む必要がある入力を使用できますraw_input()。ゼロを入力する場合は、を使用します"0"
mbomb007

素敵な解決策!私はほとんどの答えが無限に長くなることを期待していました(技術的にはこれは同じ意味ではありません)。よくやった!
HyperNeutrino 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.