Oszukiwanie cykliczny Quine

19

Pojęcie

Napisz program, który wypisuje kod w swoim języku programowania. Wykonany kod musi wygenerować oryginalny program.

Zasady

  • Ponieważ jest to oszustwo, możesz przeczytać oryginalny kod źródłowy.
  • Pierwszy program wyjściowy musi być w tym samym języku, co program oryginalny.
  • Nie możesz wyprowadzać zwykłego quine. Te dwa programy muszą być różne.
  • Obowiązują standardowe luki.
  • To jest więc najkrótsza odpowiedź wygrywa, jednak nie zostanie wybrana.
dkudriavtsev
źródło
Nadal nie jestem do końca pewien, co stanowi pół-quine.
Conor O'Brien,
@ ConorO'Brien Wyprowadza program, który wypisuje oryginalny program
dkudriavtsev
1
Widzę. Sformułowanie jest dość niejasne.
Conor O'Brien,
2
Dlaczego nie wybrać najkrótszej odpowiedzi? Czy to jest katalog?
ATaco,
1
Dla przypomnienia nazwałbym to wspólnym quine (to wyzwanie wymaga jednak różnych języków).
Martin Ender,

Odpowiedzi:

28

Bash + coreutils, 11 bajtów

tr xy yx<$0

To drukuje

tr yx xy<$0

Wypróbuj online!

To z kolei drukuje

tr xy yx<$0
Dennis
źródło
1
Nie oszustwo we wspólnym języku.
denson,
8
Myślę, że trpolecenie jest przekierowywane na $0własny kod źródłowy. To jest „oszukiwane”.
Roman Gräf,
21

Ślimaki, 0 bajtów



Drugi program to

1

Pierwszy program zlicza liczbę dopasowań pustego wzorca na pustym wejściu (który tak naprawdę ma obszar 0, ale wzorzec jest zawsze uruchamiany przynajmniej raz jako hack, aby umożliwić programom decydowanie, co chcą wydrukować na pustym wejściu). Drugi program zaczyna się od kwantyfikatora (jak {1}w wyrażeniu regularnym), co powoduje błąd analizy. Ponieważ program nie analizuje się pomyślnie, STDOUT jest pustym ciągiem.

feersum
źródło
Myślałem, że prawdopodobnie istnieje język, który to zrobił (tzn. Program zerowy kończy się wynikiem niepustym, ale ten wynik nic nie robi jako program). Próbowałem HOMESPRING, ale nie mogłem zmusić tłumacza do pracy. Wygląda na to, że znalazłeś inny język, w którym to działa. (Czy masz link do tłumacza?)
20

7 , 2 bajty

7 używa 3-bitowego zestawu znaków, ale pobiera dane wejściowe spakowane w bajtach (i zgodnie z meta, języki z podtaktowymi zestawami znaków są liczone za pomocą bajtów pliku na dysku ). Oto xxdzrzut programu:

00000000: 4cf4                                     L.

Podając ten plik do interpretera 7, wyświetli następujący program:

00000000: 4fa6 7f                                  O..

który z kolei ponownie wyświetli oryginalny program.

Co się tu dzieje? Nie ma potrzeby czytania źródła (tak naprawdę nie sądzę, że można odczytać źródło w 7), chociaż program prawdopodobnie oszukuje w inny sposób; Powiedz mi co myślisz. Oto jak działa program. (Zauważ, że każde 7 poleceń ma dwa warianty, z których niektóre nie mają nazw i nie mogą pojawić się w oryginalnym programie. W sumie jest 12 poleceń w sześciu parach. Używam pogrubienia dla poleceń aktywnych, niepogrubionego dla pasywnego polecenia, a w przypadkach, gdy aktywne polecenie nie ma nazwy, nadaję mu taką samą nazwę jak odpowiadające mu polecenie pasywne i polegam na pogrubieniu, aby je rozróżnić. W przypadku, gdy oba są nazwane, np. 7który jest aktywnym wariantem 1, każde polecenie otrzymuje własną nazwę, a pogrubienie to tylko wyróżnianie składni).

231 7 23 Oryginalny program, rozpakowany do formatu ósemkowego
231 Wciśnij 237 na stos
    23 Wciśnij 23 na stos
             (niejawnie) dołącz do programu kopię góry stosu
      2       Duplikat góry stosu (obecnie 23 )
        3      Wyjście góry stosu, pop drugi element stosu

W tym momencie 7 interpreter widzi, że góra stosu zawiera polecenia ( 2i 3), które nie są reprezentowalne, więc ucieka z góry stosu, tworząc 723(co jest). Pierwsze wyjście polecenia wybiera format wyjściowy; w tym przypadku jest to format 7, „formatuj dane wyjściowe w taki sam sposób jak program”. Tak więc polecenia są pakowane w bajty. Następnie program kontynuuje:

231 7 23 23
             (niejawnie) dołącz do programu kopię góry stosu
        2     Duplikat góry stosu (obecnie 237 )
          3    Wyjście góry stosu, pop drugi element stosu
           7   Wciśnij pusty element na stos

W tym momencie na stosie nie ma nic oprócz pustych elementów stosu, więc program kończy pracę. Wyprowadzamy 23wcześniej. Jeśli uciekniemy 237(i musimy, ponieważ zawiera niereprezentatywne polecenia), otrzymamy 7231. To pobiera dane wyjściowe bezpośrednio, tworząc ostateczne dane wyjściowe programu 237231(sformatowane w taki sam sposób jak program, tj. Spakowane w bajty). To 4fa67f. (Można zauważyć, że 1było to całkowicie bezcelowe pod względem wpływu na wynik; jedynym powodem jest to, że oba programy różnią się.)

Bieganie 237231przebiega prawie dokładnie w ten sam sposób; różnica polega na tym, że bezużyteczne 1uruchamia się zaraz po pierwszym wydruku (a pusty element jest domyślnie usuwany przy drugim osiągnięciu bieżącego końca programu). Ponownie, w 231końcu sam się wyprowadza, w 23końcu sam się wyprowadza poprzedzony 7, i otrzymujemy 231723, oryginalny program.

Spostrzegawczy może zauważyć, że oba programy, mimo że mają tę samą długość w „natywnej” ósemce języka, mają różne długości na dysku. Jest tak, ponieważ program 7 można uzupełnić dowolną liczbą 1 bitów, a spakowany format odrzuca dopełnianie końcowe. Oto jak odbywa się kodowanie:

2  3  1  7  2  3
010011001111010011(1...)
4   c   f   4   padding

Innymi słowy, dwa bajty 4C F4wystarczają do przedstawienia programu, więc to wszystko, czego użyłem.


źródło
11

Python 3, 297 279 251 243 225 218 208 180 126 111 bajtów

Nieuczciwość:

A=''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))

To drukuje:

B=''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))

który po uruchomieniu drukuje oryginalny program.

L3viathan
źródło
Łał! Chłodny! Nigdy bym o tym nie pomyślał.
dkudriavtsev
8

Partia, 14 bajtów

@echo @type %0

Które gdy działają jako cyclicquine.batwyjścia

@type cyclicquine.bat

Które po uruchomieniu wyświetla oryginalny plik wsadowy.

Neil
źródło
8

RProgN , 4 bajty.

Społeczność wydaje się uważać tego rodzaju za oszustwo , które spełnia kryteria.

1
2

Z końcowym znakiem nowej linii.

To drukuje

2
1

Z końcowym znakiem nowej linii, który drukuje pierwszy kod.

RProgN drukuje stosy, więc od góry do dołu.

Wypróbuj online!

ATaco
źródło
1\n1\nJakiś czas temu odbyła się rozmowa na czacie, która sugerowała, że w RProgN będzie nieuczciwym quine, ponieważ każda z nich drukuje się nawzajem (i byłoby to uważane za oszustwo, gdyby każda drukowała się sama). Wszystko to naprawdę implikuje to, że czasami oszukiwanie w quinach może być trudne. (Jednak ta odpowiedź jest poprawna w obu przypadkach, ponieważ pytanie tak naprawdę nie wymaga oszukiwania, po prostu pozwala .)
Ponadto, chociaż niechętnie mówiłem, w RProgN 1\njest technicznie poprawny quine, ponieważ 1nie jest stałą, ale wywołaniem funkcji, która wypycha 1na stos.
ATaco
Istnieje wiele definicji właściwego quine w użyciu. Jest to nieważne przez co najmniej jeden, ale prawdopodobnie ważne przez niektóre inne.
@ ais523 Wzbudziłeś moją ciekawość, określiłeś RProgN, ale nie sądziłem, że mój mały język zwrócił na siebie tyle (lub jakąkolwiek) uwagę. Czy w szczególności czat na temat RProgN, czy język o podobnej składni?
ATaco
Było około 7 , co również ma tendencję do drukowania segmentów programu „wstecz”. Wyciągałem wnioski z podanych tam opinii.
6

Jolf, 6 bajtów

1q_a_q

Po uruchomieniu powoduje to:

q_a_q1

Co z kolei daje wynik 1q_a_q.

Wypróbuj tutaj!

Wyjaśnienie

1q_a_q
1       the digit one (ignored)
 q      the source code (ignored)
     q  the source code
    _   reversed
   a    and outputted
 _      and reversed (ignored)

q_a_q1
q       the source code (ignored)
     1  the digit one (ignored)
    q   the source code
   _    reversed
  a     and outputted
 _      and reversed (ignored)
Conor O'Brien
źródło
5

JavaScript (ES6), 69 60 59 bajtów

(_0=_=>console.log(`(_0=${_0})()`.replace(/0/g,n=>+!+n)))()

Wyjścia:

(_1=_=>console.log(`(_1=${_1})()`.replace(/1/g,n=>+!+n)))()

-1 bajt (@ETHProductions): użyj 0 w wyrażeniu regularnym zamiast \ d

darrylyeo
źródło
Spróbuj n=>1-nzamiast n=>+!+n.
Conor O'Brien,
@Conner O'Brien Niestety 1skończy się na regexie.
darrylyeo
@ETHproductions Heh, powinienem o tym pomyśleć.
darrylyeo
3

Bash, Cat i Rev, 19 16 bajtów

rev $0 # 0$  ver

-3 dzięki @izabera

Nikogo tu nie ma
źródło
Czy nie byłoby to Bash, Taci `Rev?
Conor O'Brien,
rev $0 # 0$<space><space>verz jakiegoś powodu nie mogę wstawić dwóch spacji w komentarzu
izabera
Och, fajnie @izabera
NoOneIsHere 12.12.16
@ ConorO'Brien Nie, tac rev-ed jest cat.
NoOneIsHere 12.12.16
@SeeOneRhino Oh .... Rozumiem
Conor O'Brien,
1

> <>, 16 bajtów

"$r00gol?!;50.01

Wypróbuj tutaj!

Wyjścia

"$r00gol?!;50.10

To jest modyfikacja tej podanej tutaj . Nie jestem pewien, czy to oszustwo, czyta codbox i wysyła go.

redstarcoder
źródło
1
możesz zmienić 00g na: 2- i zachowa tę samą liczbę bajtów bez czytania pudełka z kodami.
Teal pelikan
@Tealpelican, dzięki! Chodzi jednak o to, aby uznać to za „oszustwo”: str. (I nie do końca rozumiem tę zasadę)
redstarcoder,