n seviyesi Ouroboros Quine


11

Bu 128 dilde quine ouroboros (başka bir dilde bir program çıkaran, başka bir dilde bir program çıkaran bir program (orijinal program çıkaran 125 dilde)) oldukça etkileyici. Ancak ne yazık ki, statik bir yineleme sayısı var.

Bir programın çıktısını veren (başka bir dilde olması gerekmez, ancak olabilir), bir programın çıktısını veren, bir programın çıktısını veren, vb. Yinelemelerin ardından orijinal programı ilk kez veren (yani ara program olmayan) bir program yazın program orijinaliyle aynı olmalıdır, çünkü aksi takdirde girdisini yok sayan bir quin işe yarayacaktır), burada n girdi olarak sağlanan negatif olmayan bir tamsayıdır. Giriş, yalnızca orijinal kaynak kodundaki bir sayı olamaz (örneğin x = <the value of n>, programınızın başına koymak ), aşağıdakilerden biri olmalıdır:

  1. Komut satırı argümanı olarak iletildi
  2. Standart girişten okuma
  3. Yeni programı döndüren / çıkaran bir işleve bağımsız değişken olarak iletilir.

Ouroboros'taki ara aşamalar için, programınız tam olarak çalışan bir program veya çağrıldığında bir sonrakini döndürecek / çıktısını alacak argüman içermeyen bir işlev olabilir.

Kaynak dosyadan kendisi okuyamayabilir veya herhangi bir kine benzeri yapı kullanabilirsiniz (bunu yapacak herhangi bir şey olduğunu düşünmüyorum, ama olabilir)

Açık olmak gerekirse n = 0, program kendi kaynak kodunu çıkarmalıdır.

Eğer n = 1, program orijinal kaynak kodunu veren farklı bir program çıkarmalıdır.

Ve bunun gibi...

Birkaç bayt kazanır!

Düzenle:

Yazmış olmalıyım "Ouroboros'taki ara aşamalar için, programınız ya girişi olmayan tam işlevli bir program ya da argümanları olmayan bir işlev olabilir". Programınız zincirindeki bir sonraki çıktılıyorsa, o zaman sorun olmaz, ancak program n orijinal değerini gereksinim duyulmayacak, giriş için bekler.



1 endeks n yapabilir miyiz? Yani n = 1, yazdırma kaynak kodu, n = 2, kaynak kodu vb.
Süresi Dolmuş Veriler

1
Yineleme sürümleri hala ilk girdiye sahip olacak mı? Diyelim ki ilk girdiğim 3, çıktısını aldığım programı çalıştırıyorum. Hala bir giriş 3 olacak mı yoksa hiç giriş olmayacak mı? Herhangi bir girdi yoksa, sanırım getInput()herhangi bir girdi olmadan benzer bir şey kullanılması durumunda bunu ele almamız gerekir . Ya da, hataları önlemek için daha sonraki yinelemeler için kullanılmayan rastgele bir şey girebilir miyiz getInput()? Aka mevcut Python cevabı geçerli mi?
Kevin Cruijssen

Bir tamsayı verildiğinde, bir tamsayı verildiğinde n, ouroboros nyinelemelerinin "başlangıç ​​programı" olan bir program çıktı olduğundan ve cevabımızın ntekrarlardan biri olarak sayılmaması gerektiğinden şüpheleniyorum. Bu doğru mu?
Outgolfer Erik

@KevinCruijssen Muhtemelen bu konuda daha açık olmalıydım. Ara aşamalar herhangi bir biçimde girdi olamaz. Programın bir sonrakini çıkarır ve daha sonra girdi beklerse, bu iyi olurdu sanırım.
Leo Tenenbaum

Yanıtlar:


5

05AB1E , 28 bayt

Kevin Cruijssen sayesinde -4 bayt + düzeltme

"34çìD«s<©di®ì"34çìD«s<©di®ì

Çevrimiçi deneyin!


açıklama

Bu, kodun önüne yazdırmak için kalan sayıyı ekleyerek çalışır, yani yığına bir girdi gibi eklenir. "0" girişinin temel durumunda, ön taraftaki 0 ​​değerini birleştirmeyecektir.


d, pozitif ( >=0) yerine negatif olmayan ( >0) şeklindedir. Sorun, dhaşhaş olmadan kontrol etmek için, önce çoğaltmanız gerekir, ancak daha sonra yinelemede de atılması gerekir 0"quinsting", aksi takdirde çoğaltılan çıktıyı alır 0. :(
Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ìbelki 28 byte için (hala amaçladığınız yaklaşıma oldukça yakın)? (Güncel sürümünüzün yinelemeden yineleme 0"34çìD«s<Ddiì"34çìD«s<Ddiìçıktıları -1için Dkorkuyorum ..)
Kevin Cruijssen

4

Runik Efsunlar , 39 bayt

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

Çevrimiçi deneyin!

Olur 4 bayt kısa girişlerine burada eşit ya da daha düşük, aynı taktiği kullanarak 05AB1E daha 10. Ancak keyfi olarak büyük değerleri desteklememiz gerektiğinden, daha karmaşık hale gelir.

Nümerik değer nön tarafa yerleştirilir ve sürekli sayı değişmezi olarak ayrıştırılır ´. "3X4+kSqtemel quine kodudur. Önde herhangi bir değer yoksa, yığın uzunluğu yalnızca 1 (ayva) olacaktır, aksi takdirde 2 l1=d*?şeylerin oradan nasıl ele alınacağını belirlemeye izin verir.

  • Bir değer varsa, S:1-}'LA2+-}çalışır: değeri en üste kaydırın, 1'i çıkarın, çoğaltın, yığının alt kısmına bir kopya bırakın, bu değerlerin Günlük 10'unu 100 değerini alın (değerin kendi karakter uzunluğuyla sonuçlanır, artı 1 ´) dizenin sonuna gelen bu kadar karakterleri kaldırın (etkili, hem sonuna kapalı kendisini kısaltılıyor nerede gerekmediğinde ve yanlış değerine sahip olduğundan). Cbir bayt daha kısadır 2+ve aynı değerle sonuçlanır.

  • Bir değer yoksa, girişten bir değer okuyun.

Ne olursa olsun: :0)2*?çoğaltın ve sıfır ile karşılaştırın.

  • Sıfır olmayan itme varsa ´.

  • Sıfırsa, değeri açın. Gördüğü ilk baytı yürütmeye çalıştığında sayısal olmayan ve hemen aynı konumda sayı modundan düştüğü için bayt !yerine kullanarak hile yapabilir 2?ve kaydedebiliriz ´.

Yığının tamamını yukarıdan aşağıya yazdırın.


3

Java 10, 145 bayt

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

Çevrimiçi deneyin ve bazı yinelemelerin çıktılarını görün .

Açıklama:

açıklama:

  • var sBiçimlendirilmemiş kaynak kodunu içeren
  • %s bu String'i kendi içine koymak için kullanılır s.format(...)
  • %c,, %1$cve 34çift ​​tırnak işaretlerini biçimlendirmek için kullanılır
  • s.format(s,34,s) hepsini bir araya getirir

Zorluk bölümü:

İlk lambda işlevi bir longgirdiyi parametre olarak alır .

  • Bu, Long N=n;ilk yinelemede değişken olarak ayarlanır . Ya da Long N=%s;sonraki tekrarlar için.
  • Üçlü onay N>0?N-1+"L":"n"bu dolduracak %sdeğeri ile N-1birlikte eklenmiş, Luzun ve bir String dönüştürmek için olduğundan %seğer N1 ise daha büyük olan Nyerine 0 (ilk girdi olarak verilen 0ya da bu 'interquine- son yineleme döngü '), bunu bunun yerine %silk nharfle doldurur .

Spesifikasyon, ara çıktıların tam bir program veya argümansız bir işlev olması gerektiğini söylüyor
Bilgisizlik

@EmbodimentofIgnorance Biliyorum, bende var. İlk lambda işlevi bir longişlev parametresi alır ve diğer lambda işlevleri de 1 bayt daha kısa olduğu için girdi almamalarını belirten zorluklar için her zaman kullandığım kullanılmayan bir Voidparametre alır . v->()->
Kevin Cruijssen

2

Haskell , 195 164 bayt

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

Çevrimiçi deneyin!

Bu oldukça basit bir quine tekniği kullanır. aBir sayıya ayarlanmış bir değişkenle değiştiririz . Bu sayı sıfırsa (başlangıçta) a, girdi alır ve girdi numarasına ayarlanmış olarak kaynağımızı çıkarırız. Eğer asıfır biz çıkışı bizim kaynağı değildir aaz birine seti. Bu şekilde a, orijinal kaynağı çıkarmadan önce sıfıra kadar geri sayar.



2

R , 92 bayt

f=function(n=-1){gsub("\\s","",paste("f=",sub("-?\\d+",n-1,paste(deparse(f),collapse=""))))}

Çevrimiçi deneyin!

deparseHile olarak kabul edilirse , işte bir alternatif:

R , 108 bayt

function(n=-1){s="function(n=%d){s=%s%s%2$s;sprintf(s,n-1,intToUtf8(34),s)}";sprintf(s,n-1,intToUtf8(34),s)}

Çevrimiçi deneyin!


1

Perl 6 , 44 bayt

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

Çevrimiçi deneyin!

Standart girdi ile girdi alır ve değiştirilen tek şeyin ilk sayı olduğu bir program döndürür. Sonraki her program, azaltılan bu sayı dışında aynı programı verir.



1

Python 3.8 (ön sürüm) , 60 56 55 53 bayt

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

Çevrimiçi deneyin!

Jo King sayesinde -2 bayt

53 bayt sürümünden itibaren Python 2 ve Python 3'te de çalışır.


Ara işlev, tam bir program veya bağımsız değişken almayan bir işlev gibi görünmüyor.
Nick Kennedy

O mors operatörü :=Python'a hoş bir ektir, bu kesin.
mbomb007

"Ouroboros'taki ara aşamalar için, programınız ya tam işlevli bir program ya da çağrıldığında bir sonrakini döndürecek / çıktısını alacak argümanları olmayan bir işlev olabilir ."
mbomb007

@NickKennedy Spesifikasyona uymak için güncellendi ve tesadüfen kaydedilmiş 4 bayt.
negatif yedi

1
Kullanmadan 53 bayt:=
Jo King
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.