Çift Yönlü Kine Zinciri


9

PPCG'de şimdiye kadar yeterince kine yoktu ...

Meydan okuma:

Göreviniz bir program "A0" oluşturmaktır. Bu program girdi olmadan çalıştırıldığında hiçbir şey çıktılamaz. Bu program girişle çalıştırıldığında, "A1" çıkışını verir. "A1" girişsiz çalıştırıldığında, "A0" çıkışını verir. "A1" girişle çalıştırıldığında, "A2" çıkışını verir. Hemen hemen "A (k)" girdi olmadan çalıştırıldığında "A (k-1)" verir ve girdi ile çalıştırıldığında "A (k + 1)" verir.

ayrıntılar

Bu zorluğun yeterince basit olduğuna inanıyorum; başka kural yok. Her program bu arada en az 1 bayt içermelidir. Girdinin yalnızca ASCII karakterlerden oluşacağını varsayabilirsiniz ve isterseniz boşlukları yok sayabilirsiniz, ancak belirli bir girdi belirtebilirsiniz. Çıktı STDOUT veya STDERR olabilir, ancak tüm programlarınızın aynı çıktıya çıkması gerekir. Diğeri de metin içerebilir (böylece STDOUT'a çıktı verebilir ve ardından bir hata ile çıkabilirsiniz). @Dennis'e bunu işaret ettiği için teşekkürler.

Tüm programlar aynı dilde olmalı ve her program diğerlerinden benzersiz olmalıdır.

Puan "A0" programının uzunluğuna eşittir. Bu bir kod-golf meydan okuma olduğundan, en düşük puan kazanır!


Çoğu gönderimin A (k) ve A (k + 1) değerlerinin büyüyen bir dizeye eklenmesiyle tek bir karaktere sahip olacağını tahmin etmek üzücü :(
Sparr

@Sparr Ne yazık ki, muhtemelen bu olacak. :( Ah, buna karşı nasıl net bir kural
koyacağımı anlayamıyorum

bunu doğru bir şekilde yorumladığımda, emin olamadığım iki taneden birine çıktı alabilirsiniz . İstenen çıktıyı STDOUT'a yazdırırsak, STDERR'ın boş olması gerekir mi? Çünkü bir hatayla çıkışa izin verilmez.
Dennis

Tüm programlar farklı mı olmalı? Soru bunu söylemiyor.

4
Ayrıca, "Çift Yönlü Kine Zinciri" gibi biraz daha etkileyici bir başlık önerebilir miyim? "süper meta quine", diğer programları basan programların ötesinde çok fazla şey söylemez ve gelecekte bu zorluğu aramayı zorlaştıracaktır.
Martin Ender

Yanıtlar:


1

Pip , 28 bayt

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

Çevrimiçi deneyin!

açıklama

Bu bilinen en kısa Pip quine'nin değiştirilmiş bir versiyonudur V Y"`V Y`.RPy". Bu kine, bir dizeyi tanımlayarak, ydeğişkene sorarak ve sonra değerlendirerek çalışır. Değerlendirildiğinde, dize repr ydeğerini alır (böylece değerini yçift ​​tırnak işaretleri arasına alır ) ve kalıp değişmezini `V Y`ön tarafına birleştirir .

Stratejimiz bir koymaktır 0sonra, programda yerini 0ile 10giriş olsaydı, veya değiştirin 10ile 0hiçbir giriş olsaydı. (Bu nedenle, bir ( k ) 'dan oluşan bir dizi içerir k 1 en bir 0 takiben) 0ve 10dahili değişken (vardır çünkü uygundur ive tbu değerler, sırasıyla), onlara bakınız böylece vermeden gerçek basamak kullanarak .

Yani yerine RPy, bizim istediğimiz RP yRitorada giriş ve eğer RP yRtideğilse. İki durumu, değerleri değiştirerek tve iinput ( I#q Sti) varsa, sonra yaparak birleştirebiliriz RP yRti. (Bu test sahip #q, uzunluk girişleri gibi, çünkü giriş 0Falsey bulunmaktadır.)

Şimdi sadece 0kodda bir değişmez almak ve hiçbir çıkış üretmeyen A0 özel durumunu işlemek zorundayız . Her ikisi de falsey ise test ederek 0+ive geri dönerek çözülebilir u:

  • Herhangi bir k > 0 için A ( k ) ' deki sayı sıfırdan farklı ve bu nedenle doğrudur (örn. 110+i).
  • İçin k = 0, A (sayı k ) sıfır olacaktır:
    • Girdi varsa ive ttakas ve i10. 0+iise hala doğrudur.
    • Girdi yoksa, ihala 0 ve 0+ifalsey. Quine core yerine, unil için yerleşik bir değişken olan çıktı üretiriz. Nil baskısı çıktı üretmez.

Aferin! Tıkır tıkır çalışıyor.
HyperNeutrino

1

Python 2, 93 bayt

Sonunda bir satır besleme var.

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

Giriş ile deneyin | Giriş yapmadan deneyin

Bu, benzer bir soruya verdiğim yanıttan değiştirildi .

Girdi varsa, artar p. Elde programı olacak Yani p=2+..., p=3+...vb


Bu 0'ı giriş olarak tanımıyor
fəˈnɛtɪk

@LliwTelracs Giriş tırnak içine alınmalı (bir acı olmalı). Cevaptaki köprülere bakın.
mbomb007

Olduğu gibi, programınız dizeler ve 0 dışındaki tüm sayılarla çalışır.
fəˈnɛtɪk

1
@LliwTelracs O zaman sayıları kullanmaya çalışmayın. Fikir birliğine göre, input()girdiyi kullanmak yerine tırnak işaretleri içine almak için kullanabilirim ve gerektirebilirim raw_input(). Sıfır girmek istiyorsanız, tuşunu kullanın "0".
mbomb007

Güzel çözüm! Çoğu cevabın sonsuz uzunlukta büyümesini bekliyordum (teknik olarak bu aynı anlamda değil). Aferin!
HyperNeutrino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.