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.

Luke
źródło
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 .

Sp3000
źródło
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.
}_~
Martin Ender
źródło
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.

isaacg
źródło
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.

kapusta
źródło
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.
Addison Crump
źródło
2

JavaScript (ES6), 42 bajty

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

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

Mama Fun Roll
źródło
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
mroman
źródło
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.

nimi
źródło
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.

El'endia Starman
źródło
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
Sp3000
źródło
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.

Kevin Cruijssen
źródło
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 )

Kevin Cruijssen
źródło