Quine / Ters Quine


26

Boole veya negatif olmayan bir tamsayı girişi alan eksiksiz bir program yazın. O olmalı:

  • Girdi değeri yanlış ise kendi kaynak kodunu yazınız
  • Girdi değeri gerçek ise, kendi kaynak kodunu tersten yazınız

Programınız palindromik olamaz ve kendi kaynak kodunu hiçbir şekilde okuyamaz.

Bu kod golf - bayt cinsinden en kısa kod kazanır.


6
Yani ... eğer dilimde boolean yoksa. Ancak, 0 sahtedir ve pozitif tamsayılar gerçeğe yakındır. Girişin yalnızca 0 veya 1 olacağını varsayabilir miyim (boolean'ların standları olarak - dil aslında her zaman şartlı bir operatörün sonucu olarak bu ikisinden birini verir)? Yoksa "gerçek" booleans kullanamadığım için tamsayıları desteklemeli miyim?
Martin Ender

Yanıtlar:



18

CJam, 17 16 bayt

{`"_~"+Wq~g#%}_~

Burada test et.

Standart kirin oldukça düz bir şekilde değiştirilmesi. 17 bayt için diğer çözümler:

{`"_~"+q~{W%}&}_~
{`"_~"+q~!2*(%}_~

Girişin yalnızca 0 veya 1 olduğunu varsayabilirim (bir boole için stand-in olarak, CJam için özel bir tür yoktur) g:

{`"_~"+Wq~#%}_~

açıklama

{`"_~"+  e# Standard generalised quine framework. Leaves the source code on the stack. 
  W      e# Push a -1.
  q~     e# Read and evaluate input.
  g      e# signum, turning truthy values into 1 (leaving 0 unchanged).
  #      e# Power. -1^0 == 1, -1^1 == -1.
  %      e# Select every Nth element: a no-op for 1 and reverses the string for -1.
}_~

0 ve 1, CJam Boolelileri olduğundan, buna ihtiyacın olduğunu sanmıyorum g.
Dennis,

@Dennis Evet, bundan gerçekten emin değildim.
Martin Ender

Şaşırtıcı bir şekilde, bunu bir şekilde yendim. oo Daha çok golf oynarsan şaşırmam. : D
Addison Crump

9

Pyth, 17 bayt

_WQjN*2]"_WQjN*2]

Standart Pyth quine'da basit bir değişiklik.


Kahretsin, bunu kum havuzundan bir saat sonra göndermeyi bekliyordum.
lirtosiast

7

> <>, 17 Bayt

Girişi yığına itmek için (veya çevrimiçi tercümana önceden yığına girdi koymanız için) -v bayrağını (+1 bayt) gerektirir.

'rd3*$?rol?!;70.

Yalnızca tamsayı girişlerine izin verildiyse (örneğin, sahtecilik için 0, gerçeğin 1'i), aynı miktarda bayt için (bayraksız) aşağıdakini yapabilirsiniz.

'rd3*ic%?rol?!;80.

Çevrimiçi deneyin

> <> İçin Truthy / falsy, sırasıyla 0 ve 0 olmayan bir şeydir.


6

Vitsy , 15 Bayt

... Ben ... CJam'ı yeniyorum! (bağırır) Anne! Bak anne, ben yaptım!

'RD3 * I86 * -) rl \ Ç

Açıklama:

'RD3 * I86 * - (rl \ Ç
Standart quine, ancak bir bükülme ile:

Kaynak kodu bir dize olarak yakala
 rd3 * ASCII'de 'karakteri yarat
     i86 * - Giriş karakterini ASCII olarak alın ve 48'i ondan çıkarın. 
                    Eğer sıfırsa, if ifadesi sonraki talimatı geçecektir.
          (r Yığının en üst öğesi sıfır ise, sonraki öğeyi yapmayın.
                    Buradaki bir sonraki öğe ters.
            l \ O Yığını yazdır.

Vitsy'nin Yeni Versiyonu , 11 Bayt

v'rd3 *} h) rZ
v Girişi değişken olarak yakalayın.
 'Başka biriyle karşılaşıncaya kadar kaynağı yakala'
  r Yığını ters çevirin.
   d3 * 'yığına it.
      } Yığını sağa döndürün.
       v) Değişkeni (giriş) yığına itin ve sıfır olmadığını test edin.
         r Eğer öyleyse, yığını tersine çevirin.
          Z Yığındaki her şeyi çıkar.

2

Javascript (ES6), 42 bayt

$=_=>'$='+(_?$:[...''+$].reverse().join``)

Bu, Bling Quine'ımın bir modifikasyonudur . Bu da iki kat daha uzun.


Bu aslında bir şey çıktı mı? Yalnızca bir REPL'de çalışan yanıtlara izin verilmez.
feersum

1
@ETHproductions Bu, işlevi çağırır, ancak yine de hiçbir şey yazdırmaz. Ayrıca, artık bir kuyruk olmazdı.
Dennis,

@Dennis Doğru. Sanırım, prompt()Düğüm.JS'ye geçmedikçe, bu gerekli olmalı. $=_=>(A=`$=${$};$(prompt())`,alert(_?A:[...A].reverse().join``));$(prompt())Düzgün çalıştığına inanıyorum , ancak daha fazla golf oynayabilir.
ETHProductions

1
“Programınız [...] hiçbir şekilde kendi kaynak kodunu okuyamıyor.” Bu çözüm bu kategoriye giriyor mu?
ETHProductions

2

Burlesque, 40 bayt

ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh

Açıklama:

Burlesque, gelişmiş yığın ve kod manipülasyon yerleşiklerine sahiptir. Aslında, programın kaynak koduna erişemezsiniz, ancak gelecekte yürütülecek kalan koda erişebilirsiniz. Bu, #Qonu izleyen tüm kodları döndürecek, bu yüzden #Qne yaptığımızla o koda her şeyi eklemeliyiz ri#Q.

blsq ) #Q1 2++
12 -- this is the result of 1 2++
{1 2 ++} -- this is the result of #Q

++1 2yığın tabanlı olduğundan teknik olarak yasadışıdır. Ancak şu şekilde çalışmasını sağlamak için kodu değiştirebiliriz 1 2++:

blsq ) #Q<-#q++1 2 
12

Bu yapılarda çalışmak inanılmaz derecede zordur ve hiç kimse bunları quine ile ilgili şeyler dışında üretken bir şey için kullanmadı. Eğer tersine çevirirseniz ++1 2almak 2 1++üretecektir hangi 21değil 12. Yukarıdaki kodun üretilmesinin 12nedeni , sonunda, sadece sonuçtan daha fazlasını yürütmekle sonuçlandığımızı #Qda içermesidir : p. Biz yürütme sona üreten .<-2 1++2 1++#q<-12

Aslında kodumuzdaki şeyleri değiştirebiliriz, örneğin bu kod ?+kendi içindeki tüm olayların yerini alır.?*

blsq ) #Q(?+)(?*)r~5.-#q5 5?+
25

Kullanımı:

$ echo "1" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
hs fi sp "-<" j +. /\ "Q#ir" -~ HS 2Q#ir
$ echo "0" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh

2

Haskell, 126 118 108 bayt

main=readLn>>=putStr.([t,reverse t]!!);t=s++show s;s="main=readLn>>=putStr.([t,reverse t]!!);t=s++show s;s="

Bekler 0veya 1girdi olarak.


2

Minkolang 0.10 , 13 bayt

"66*2-n,?r$O.

Burada dene.

Bu tam bu dört karakterleri dışındaki standart Quine'ın gibidir: n,?r. ngirişten bir tamsayı alır, ,ters çevirir, bu nedenle girişin kaba olup olmadığını ?atlar r. Aksi takdirde, ryığını ters sırayla çıkacak şekilde ters çevirir.


1
Gökgürültüm gitti. : c
Addison Crump,

2

Python 2, 51 bayt

s="print('s=%r;exec s'%s)[::1-2*0**input()]";exec s

0

Java 10 (tam program), 282 bayt

interface N{static void main(String[]a){var s="interface N{static void main(String[]a){var s=%c%s%1$c;s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}";s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}

Çevrimiçi deneyin.

Java 10 (lambda işlevi olarak), 154 bayt

b->{var s="b->{var s=%c%s%1$c;s=s.format(s,34,s);return b?new StringBuffer(s).reverse():s;}";s=s.format(s,34,s);return b?new StringBuffer(s).reverse():s;}

Çevrimiçi deneyin.

Açıklama:

interface N{                          // Class
  static void main(String[]a){        //  Mandatory main-method
    var s="interface N{static void main(String[]a){var s=%c%s%1$c;s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}";
                                      //   Unformatted source code
    s=s.format(s,34,s);               //   Format the source code (the quine-String)
    System.out.print(                 //   Print:
      new Boolean(a[0])?              //    If the input is true:
       new StringBuffer(s).reverse()  //     Print the quine-String reversed
      :                               //    Else:
       s);}}                          //     Print the quine-String as is

açıklaması:

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

Ve sonra new StringBuffer(s).reverse()eğer girdi-boole değerini temel alarak gerekirse quine-String'i tersine çevirmek için kullanılır.


0

05AB1E , 21 bayt

0"D34çý‚sè"D34çý‚sè

Çevrimiçi deneyin.

Ekleyerek varsayılan .0"D34çý"D34çý‚sè

Açıklama:

0                        # Push 0 to the stack
                         #  STACK: [0]
 "D34çý‚sè"             # Push the string 'D34çý‚sè' to the stack
                         #  STACK: [0, 'D34çý‚sè']
            D            # Duplicate this string
                         #  STACK: [0, 'D34çý‚sè', 'D34çý‚sè']
             34ç         # Push '"' to the stack
                         #  STACK: [0, 'D34çý‚sè', 'D34çý‚sè', '"']
                ý        # Join the stack with '"' delimiter
                         #  STACK: ['0"D34çý‚sè"D34çý‚sè']
                 Â       # Bifurcate (short for Duplicate & Reverse)
                         #  STACK: ['0"D34çý‚sè"D34çý‚sè', 'ès‚Âýç43D"ès‚Âýç43D"0']
                        # Pair them up:
                         #  STACK: [['0"D34çý‚sè"D34çý‚sè','ès‚Âýç43D"ès‚Âýç43D"0']]
                   s     # Swap to get the boolean input (0 or 1)
                         #  STACK: [['0"D34çý‚sè"D34çý‚sè','ès‚Âýç43D"ès‚Âýç43D"0'], 1]
                    è    # Index the input into the list
                         #  STACK: ['ès‚Âýç43D"ès‚Âýç43D"0']
                         # (Output the top of the stack implicitly)

PS: Otomatik olarak takip eden bir yeni satır yazdırır. Bunun da tersine çevrilmesi gerekiyorsa, bunun yerine 23 bayttır:

0"D34çý‚sè?"D34çý‚sè?

Çevrimiçi deneyin. ( yeni satır olmadan? açık bir Yazdır )

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.