Quine / Reverse Quine


26

Napisz kompletny program, który przyjmuje logiczną lub nieujemną liczbę całkowitą. To musi:

  • Wyprowadza własny kod źródłowy, jeśli wartością wejściową jest fałsz
  • Wysyła własny kod źródłowy w odwrotnej kolejności, jeśli wartość wejściowa jest zgodna z prawdą

Twój program nie może być palindromiczny ani w żaden sposób nie może odczytać własnego kodu źródłowego.

To jest golfowy kod - wygrywa najkrótszy kod w bajtach.


6
Więc ... jeśli mój język nie ma boolanów. Ale 0 to fałsz, a dodatnie liczby całkowite są prawdziwe. Czy mogę założyć, że dane wejściowe będą wynosić tylko 0 lub 1 (jako stand-ins dla booleanów - język w rzeczywistości zawsze da jeden z tych dwóch jako wynik operatora warunkowego)? Czy też muszę obsługiwać liczby całkowite, ponieważ nie mogę używać „rzeczywistych” wartości logicznych?
Martin Ender

Odpowiedzi:


9

Gol> <> , 9 bajtów

'rd3*I?rH

Czuję się trochę niezręcznie, publikując to, ponieważ mamy już odpowiedzi> <>, Vitsy i Minkolang. Jedynymi dodatkami do standardowego quine są I(odczyt wejściowy liczby całkowitej), ?(wykonaj następną, jeśli prawda) i r(odwrotny stos).

Wypróbuj online .


Dołączyć do klubu! : D I tak wygrywasz. +1
Addison Crump

1
8 bajtów:sP#Hr?I"
Jo King

18

CJam, 17 16 bajtów

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

Sprawdź to tutaj.

Dość prosta modyfikacja standardowego quine. Inne rozwiązania dla 17 bajtów:

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

Jeśli mogę założyć, że wejście to tylko 0 lub 1 (jako stand-in dla wartości logicznej, dla której nie ma dedykowanego typu w CJam), otrzymuję 15, pomijając g:

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

Wyjaśnienie

{`"_~"+  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.
}_~

Ponieważ 0 i 1 to booleany CJama, nie sądzę, że potrzebujesz g.
Dennis

@Dennis Tak, tak naprawdę nie byłem tego pewien.
Martin Ender

Zaskakujące, jakoś to pokonałem. oo Nie zdziwię się, jeśli bardziej zagrasz w golfa. : D
Addison Crump

9

Pyth, 17 bajtów

_WQjN*2]"_WQjN*2]

Prosta modyfikacja standardowej quiny Pyth.


Cholera, czekałem na opublikowanie tego od godziny po tym, jak został piaskowiony.
lirtosiast

7

> <>, 17 bajtów

Wymaga flagi -v (+1 bajt) do wypychania danych wejściowych na stos (lub do wcześniejszego umieszczenia danych wejściowych na stosie w tłumaczu online).

'rd3*$?rol?!;70.

Możesz wykonać poniższe czynności dla tej samej ilości bajtów (bez flagi), jeśli dozwolone są tylko wartości całkowite (tj. 0 dla fałszu, 1 dla prawdy).

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

Wypróbuj online

Prawda / fałsz dla> <> oznaczają odpowiednio nie 0 i 0.


6

Vitsy , 15 bajtów

... ja ... biję CJam! (krzyczy) Mamo! Słuchaj mamo!

„rd3 * i86 * -) rl \ O

Wyjaśnienie:

„rd3 * i86 * - (rl \ O
Standardowy quine, ale z niespodzianką:

„Przechwyć kod źródłowy jako ciąg
 rd3 * Utwórz znak „w ASCII
     i86 * - Pobierz znak wejściowy jako ASCII, a następnie odejmij od niego 48. 
                    Jeśli wynosi zero, to instrukcja if spowoduje pominięcie następnej instrukcji.
          (r Jeśli górny element stosu ma wartość zero, nie rób następnego elementu.
                    Kolejny element tutaj jest odwrotny.
            l \ O Wydrukuj stos.

Nowsza wersja Vitsy , 11 bajtów

v'rd3 *} v) rZ
v Przechwyć dane wejściowe jako zmienną.
 „Zdobądź źródło, dopóki nie napotkasz innego”
  r Odwróć stos.
   d3 * Push 'do stosu.
      } Obróć stos w prawo.
       v) Wciśnij zmienną (wejściową) do stosu i sprawdź, czy nie jest ona równa zero.
         Jeśli tak, odwróć stos.
          Z Wyjście wszystkiego ze stosu.

2

JavaScript (ES6), 42 bajty

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

To jest modyfikacja mojej Bling Quine . To też dwa razy dłużej.


Czy to faktycznie coś wytwarza? Odpowiedzi, które działają tylko w REPL, są niedozwolone.
feersum

1
@ETHproductions Wywołałoby to funkcję, ale nadal nic nie wydrukowałoby. Poza tym nie byłby to już quine.
Dennis

@Dennis Right. Myślę, że to oznacza, że prompt()jest to konieczne, chyba że przejdziemy na Node.JS. Wierzę, że $=_=>(A=`$=${$};$(prompt())`,alert(_?A:[...A].reverse().join``));$(prompt())działa poprawnie, choć może można by go bardziej zagrać w golfa.
ETHprodukcje

1
„Twój program [...] nie może w żaden sposób odczytać własnego kodu źródłowego.” Czy to rozwiązanie należy do tej kategorii?
ETHproductions

2

Burleska, 40 bajtów

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

Wyjaśnienie:

Burlesque ma zaawansowane wbudowane funkcje manipulacji stosami i kodami. W rzeczywistości nie można uzyskać dostępu do kodu źródłowego programu, ale można uzyskać dostęp do pozostałego kodu, który ma zostać wykonany w przyszłości. Oznacza to, #Qże zwróci cały kod, który następuje po nim, dlatego musimy dodać wszystko #Qdo tego kodu, co robimy ri#Q.

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

++1 2jest technicznie nielegalnym kodem, ponieważ jest oparty na stosie. Ale możemy manipulować kodem, aby działał jako 1 2++:

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

Praca z tymi wbudowanymi funkcjami jest niezwykle trudna i nikt jeszcze ich nie wykorzystał do niczego produktywnego oprócz rzeczy związanych z quine. Jeśli się odwrócisz ++1 2, otrzymasz to, 2 1++co wytworzy, 21a nie wyprodukuje 12. Powodem, dla którego powyższy kod 12jest generowany, jest #Qtakże to, że <-w rezultacie wykonujemy o wiele więcej niż tylko 2 1++: p. W końcu wykonujemy to, 2 1++#q<-co produkuje 12.

Możemy faktycznie zastąpić rzeczy w naszym kodzie, na przykład ten kod zastępuje wszystkie wystąpienia ?+w sobie?*

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

Stosowanie:

$ 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 bajtów

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

Oczekuje 0lub 1jako dane wejściowe.


2

Minkolang 0,10 , 13 bajtów

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

Wypróbuj tutaj.

To jest dokładnie tak jak standardowy Quine'a wyjątkiem tych czterech znaków: n,?r. npobiera z wejścia liczbę całkowitą, ,odwraca ją, więc ?przeskakuje, rjeśli dane wejściowe są zgodne z prawdą. W przeciwnym razie rstos jest odwracany, tak aby był wyprowadzany w odwrotnej kolejności.


1
Mój grzmot zniknął. : c
Addison Crump

2

Python 2, 51 bajtów

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

0

Java 10 (pełny program), 282 bajty

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);}}

Wypróbuj online.

Java 10 (jako funkcja lambda), 154 bajtów

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;}

Wypróbuj online.

Wyjaśnienie:

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

wyjaśnienie :

  • var sZawiera kod źródłowy niesformatowany
  • %s służy do umieszczenia tego ciągu w sobie s.format(...)
  • %c, %1$ci 34służą do formatowania podwójnych cudzysłowów
  • s.format(s,34,s) łączy to wszystko

A następnie new StringBuffer(s).reverse()służy do odwrócenia ciągu quine-String, jeśli to konieczne, na podstawie logiki wejściowej.


0

05AB1E , 21 bajtów

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

Wypróbuj online.

Modyfikacja domyślnego 0"D34çý"D34çý przez dodanie ‚sè.

Wyjaśnienie:

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: Automatycznie drukuje końcowy znak nowej linii. Jeśli to również powinno zostać odwrócone, zamiast tego ma 23 bajty:

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

Wypróbuj online. ( ?jest wyraźnym drukiem bez nowej linii )

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.