Dwukierunkowy łańcuch Quine

9

PPCG nie ma już dość quines ...

Wyzwanie:

Twoim zadaniem jest stworzenie programu „A0”. Gdy ten program jest uruchamiany bez danych wejściowych, nic nie wyświetla. Gdy ten program jest uruchamiany z wejściem, wyprowadza „A1”. Gdy „A1” jest uruchamiane bez wejścia, wyprowadza „A0”. Gdy „A1” jest uruchamiane z wejściem, wyprowadza „A2”. Prawie, „A (k)” wyświetli „A (k-1)”, gdy uruchomi się bez wejścia, i wyśle ​​„A (k + 1)”, gdy uruchomi się z wejściem.

Detale

Uważam, że to wyzwanie jest dość proste; tak naprawdę nie ma innych zasad. Nawiasem mówiąc, każdy program musi zawierać co najmniej 1 bajt. Możesz założyć, że dane wejściowe będą się składać tylko ze znaków ASCII i możesz zignorować spacje, jeśli chcesz, ale nie możesz podać konkretnych danych wejściowych. Dane wyjściowe mogą być do STDOUT lub STDERR, ale wszystkie programy muszą być wysyłane do tego samego. Drugi może również zawierać tekst (więc możesz wyprowadzać dane do STDOUT, a następnie wyjść z błędem). Dzięki @Dennis za zwrócenie na to uwagi.

Wszystkie programy muszą być w tym samym języku, a każdy program musi być unikalny w stosunku do pozostałych.

Wynik jest równy długości programu „A0”. Ponieważ jest to wyzwanie dla golfa, wygrywa najniższy wynik!

HyperNeutrino
źródło
Z przykrością przewiduję, że większość zgłoszeń będzie miała A (k) i A (k + 1) różniące się jednym znakiem dodawanym do rosnącego ciągu :(
Sparr
@Sparr Niestety, prawdopodobnie tak się stanie. :( No cóż, nie mogę wymyślić jasnej reguły przeciwko temu.
HyperNeutrino
możesz wypisać tylko jeden z dwóch, których nie jestem pewien, jeśli poprawnie interpretuję to. Jeśli wydrukujemy żądane wyjście do STDOUT, to czy STDERR musi być pusty? Ponieważ jest bezwzględnie dozwolone wyjście z błędem.
Dennis
Czy wszystkie programy muszą być inne? Pytanie tego nie mówi.
4
Czy mogę zasugerować nieco bardziej wyrazisty tytuł, np. „Dwukierunkowy łańcuch quine”? „super meta quine” nie mówi wiele poza programami drukującymi inne programy i utrudni wyszukiwanie tego wyzwania w przyszłości.
Martin Ender

Odpowiedzi:

1

Pip , 28 bajtów

V Y"I#qSti0+i?`V Y`.RPyRtiu"

Wypróbuj online!

Wyjaśnienie

To jest zmodyfikowana wersja najkrótszej znanej piny Pip V Y"`V Y`.RPy". Quine działa poprzez zdefiniowanie łańcucha, wciągnięcie go do yzmiennej, a następnie ocenę. Podczas oceny ciąg przyjmuje repr z y(w ten sposób zawija wartość ypodwójnych cudzysłowów) i konkatenuje dosłowny wzór `V Y`z przodu.

Nasza strategia jest umieszczenie 0w programie, a następnie zastąpić 0ze 10jeśli było wejście lub wymienić 10ze 0gdyby nie było wejście. (A zatem A ( k ) będzie zawierać liczbę składającą się z k 1, po której następuje 0.) 0i 10są wygodne, ponieważ istnieją wbudowane zmienne ( ii todpowiednio) z tymi wartościami, więc możemy się do nich odwoływać bez użycia rzeczywistych cyfr .

Zamiast tego RPychcemy, RP yRitczy był jakiś wkład, a RP yRtijeśli nie. Możemy połączyć te dwa przypadki, zamieniając wartości ti ijeśli istnieje input ( I#q Sti), to robimy RP yRti. (Mamy do testu #q, na długości wejścia, ponieważ wejścia jak 0są falsey).

Teraz musimy tylko wpisać literał 0w kodzie i obsłużyć specjalny przypadek, w którym A0 nie generuje żadnych danych wyjściowych. Oba można rozwiązać, testując 0+ii zwracając, ujeśli jest to falsey:

  • Dla dowolnego k > 0 liczba w A ( k ) będzie niezerowa, a zatem prawdziwa (np 110+i.).
  • Dla k = 0 liczba w A ( k ) będzie wynosić zero:
    • Jeśli są dane wejściowe ii tsą zamieniane, a ich liczba iwynosi 10., 0+inadal jest to prawda.
    • Jeśli nie ma danych wejściowych, iwynosi wciąż 0 i 0+ijest falsey. Zamiast rdzenia quine wyprowadzamy wyjście u, które jest wbudowaną zmienną zerową. Drukowanie zero nie daje wyników.
DLosc
źródło
Dobra robota! Działa jak marzenie.
HyperNeutrino
1

Python 2, 93 bajty

Kończy się podawanie linii.

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

Wypróbuj z wejściem | Wypróbuj bez wkładu

Zostało to zmodyfikowane z mojej odpowiedzi na podobne pytanie.

Jeśli jest wejście, to będzie rosło p. Tak otrzymany program będzie p=2+..., p=3+...itp

mbomb007
źródło
To nie rozpoznaje 0 jako danych wejściowych
fɛnɛtɪk
@LliwTelracs Dane wejściowe muszą być otoczone znakami cudzysłowu (musi to być żądło). Zobacz hiperłącza w odpowiedzi.
mbomb007
W tej chwili twój program działa z ciągami i wszystkimi liczbami innymi niż 0.
fəˈnɛtɪk
1
@LliwTelracs Więc nie próbuj używać liczb. Zgodnie z konsensusem, mogę używać input()i wymagać, aby dane wejściowe były otoczone cytatami, zamiast używania raw_input(). Jeśli chcesz wprowadzić zero, użyj "0".
mbomb007
Fajne rozwiązanie! Spodziewałem się, że większość odpowiedzi będzie nieskończenie długa (technicznie ta nie, ale nie w tym samym sensie). Dobra robota!
HyperNeutrino