Artımlı Quine


23

Göreviniz, kaynak kodunun ilk karakterini, ardından ikinciyi, ardından üçüncü ... her çalıştırıldığında çıktısını alan bir program veya işlev yazmaktır.

Örneğin, programınız foodilde bardosyadaysa baz.bar, buna benzer bir çıktı almalısınız:

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

Programınız kaynak kodunu bu şekilde yazdırarak bir şey yapabilir. Dosyanın kaynak kodunu değiştirebilirsiniz, ancak yazdırılacak kaynak kodunun orijinal kaynak kod olduğunu unutmayın.

Bu bir kod golf, yani bayt cinsinden en kısa program kazanır.


1
Dosyanın kaynak kodunu değiştirebilirsek, bu da okuyabileceğimiz anlamına mı geliyor?
FlipTack

1
@ Flp.Tkc İyi bir soru. Gerçekten hiçbir fikrim yok. Kaynağı okuyarak quine oluşturmanızı istemiyorum, ancak yalnızca dosyayı değiştirmek için kaynak okursanız sorun yok.
Conor O'Brien,

Yanıtlar:


6

Jöle , 12 bayt

“;⁾vṾ®ȯ©Ḣ”vṾ

Bu bir niladik bağlantı. Çevrimiçi deneyin! (Bağlantıyı on iki kez çağıracak kodu içerir.)

Nasıl çalışır

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

Ek bir bonus olarak, kayıt on iki çağrıdan sonra boş bir dize tutacağından, bir kez daha sahtedir ve bağlantı yeniden başlatılmaya hazırdır. Bağlantıyı 24 kez aramak, kaynak kodunu iki kez, 36 kez üç kez çağırmak vb.


Jelly'i tanımıyorum, öyleyse altbilgi tam olarak ne yapar? Neden ^ 17?
Conor O'Brien,

Yukarıdaki bağlantıyı ( ¢), kimlik işlevini ( ¹ilk çağrıdan sonra gerçekten gerekmeyen) arayın, dönüş değerini satır beslemeye ayarlayın ( , önceki dönüş değerini dolaylı olarak yazdırır), tekrarlayın. ¹ve her ikisi de üst kodludur, ancak ilgisizdir. Bunları daha az kafa karıştırıcı ile değiştirdim ¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(çağrı, birleştirme, tekrarlama).
Dennis,

12

Javascript - 26 bayt

f()Kaynak kod karakterini karakter karaktere döndüreceğini tanımlar .

n=0;f=x=>("n=0;f="+f)[n++]

Karakter bittikten sonra tanımsız döndürür.

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness


Yanılmıyorsam, işlev çağrısını kodun bir parçası olarak eklemelisiniz.
Mama Fun Roll

@MamaFunRoll İlgili meta gönderiye bağlantı var mı?
Downgoat

Hiçbirini bilmiyorum: P Ancak, işlev çağrısının kendisinin sıranın bir parçası olduğunu her zaman düşündüm; belki eksik bir şeyim var?
Mama Fun Roll

@ MamaFunRoll Bu özellik özellikle işlevlere izin verir, bu nedenle bir aramaya gerek kalmaz. Zaten bu tanecik mücadelesi için pek anlamlı olmaz.
Dennis,

Tamam, emin olmak için.
Mama Fun Roll

2

yığılmış , rekabet etmeyen, 34 bayt

[tostr ':!' + execCounter # out]:!

Standart quine üzerindeki bir varyasyon. Bu tam bir programdır. Bu, execCounterbu programın kaç kez çalıştırıldığını anlamak için kullanılır. Her şey çıktıktan sonra hatalar.

Burada dene!


2

Pip , 31 bayt

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

Anonim bir işlev. TIO'da test et!

açıklama

Bu standart Pip quine ile başlayın:

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

Bir işlev yapmak için bunu kaşlı ayraçlar içine sarın. Şimdi, tüm kaynağı geri vermek yerine, onu endekslememiz gerekiyor. Dizin için global bir değişken kullanmak ve onu her seferinde arttırmak, "her seferinde bir sonraki karakter" gereksinimini karşılayacaktır. vEn iyi aday, çünkü önceden başlatılmış -1. İlk seferde arttırmak 0, bir sonraki seferde 1vb. Endeksini verir .

Pip döngüsel indekslemeye sahiptir, bu nedenle fonksiyon son karakterini yazdırdıktan sonra, başlangıçta baştan başlar.


1

Python, 90 bayt

Standart Python quine'a bir eklenti (hoş geldiniz golfleri):

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

Bu, üzerinde yineleme yaptığınız anlamına gelen bir python üreteci işlevidir ve her yineleme, kaynak kodunda bir sonraki karakteri sağlar. Tüm karakterler döndürüldüğünde, bu durumla kilitlenir IndexError.

Test için, bu betiği programın sonuna ekleyin:

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

Veya çevrimiçi deneyin!


1

*> <> , 13 21 bayt

" r:2+a1Fi1+:1F1+[ro;

\nDizini takip etmek için adlandırılmış bir dosya oluşturur .

Bu daha çok golf oynayabilir, ama hiçbir şey hemen bana atlamaz.

Çıktı

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

açıklama

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

Hile Artımlı Quine

a1Fi1+:0go1F;

açıklama

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit

haha, bir dosyayı "\ n" olarak adlandırabileceğinizi bilmiyordum. Bu teknik olarak, kaynak kodunu gtalimatlarla okur .
Conor O'Brien,

@ ConorO'Brien, ah, yeterince adil. hmm ...
redstarcoder

*> <> Bir çeşit yığın indeksleme var mı? Veya komut tekrarı? Ardından, "your code goes here;> <> için standart quine çerçevesini kullanabilir , ardından yığıntaki nt üyesine erişebilirsiniz
Conor O'Brien

@ ConorO'Brien evet Teal Pelican bana diğer hile quine cevabımdaki bu quine varyantını gösterdi :).
redstarcoder

1
@ redstarcoder Daha fazlası için (YAY!) çalıştım ve r # yerine yenisini koyarsanız: 1- the # like; #; veya [+ 1F1: + 1iF1a-1: vs: "Ben şu anda bu test edemez ama buna kodundan 1 bayt keser inanıyoruz> <> quines #O <-1 gibi yapılabilir.": D
Teal pelikan

1

Mathematica, 91 bayt

Yorumlar çok hoş; Hala hangi sicimlerin uygun sicimler olduğuna dair ipleri öğreniyorum.

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

Argüman olmadan tekrar tekrar çağırılan bir fonksiyon tanımlar. 91'inci çağrıdan sonra, büyük bir hata atıyor ve değerlendirilmeden dönüyor.

Üstesinden gelinmesi gereken iki konu vardı: birincisi, sadece kullanmak istedim StringTake[ToString[#0]<>"[]"]ama ToString[]tırnak işaretlerini siliyor gibiydi; bu yüzden değiştirmek zorunda "[]"tarafından FromCharacterCode[{91, 93}]. İkincisi, Mathematica değişkenleri başlatılmamış olarak başlar, bu yüzden daha ++qönce qarayamıyorum; Bu yüzden ilk If[!NumberQ[q], q = 0]gerekli.

Alakasız Koda: aranırken NumberQ, ben Mathematica adlı bir işlevi vardır öğrendim TrueQ... evet, döner Trueargümanı ise Trueve Falseargüman ise False! (Yardımcı program, Falsediğer tüm argümanlara da geri dönmesidir.)


1

Mikroscript II, 40 33 bayt

Bir kod bloğu değişmez, dilin bir işleve en yakın değeri:

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

Çalıştırdıktan sonra, xtekrar çağrılmasını kolaylaştırmak için kendisini tekrar devreye sokar .


0

Bash (ve zsh, ksh), 39 bayt

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

Program yazdırıldıktan sonra hiçbir şey yazdırmaz.

0Geçerli dizinde olmadığından emin olun ve çalıştırın:

bash iquine.bash

PPCG'ye Hoşgeldiniz! Dizini artırmak için zekice bir fikrin var. Ne yazık ki, bu cevap kendi kaynak kodunu okuyarak çalışır gibi görünüyor, bu standartlarımıza göre geçerli bir soru olmadığı anlamına geliyor . Kendi kaynağını okumaktan başka quine teknikleri kullanacak şekilde değiştirirseniz, iyi bir cevap olacaktır.
DLosc
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.