Codegolf: Quine and Antiquine


13

To wyzwanie jest podobne do Can You Meta Quine?

Quine to program, który produkuje się na STDOUT. Wyzwanie polega na utworzeniu programu A, który po uruchomieniu tworzy program B na STDOUT. Program B po uruchomieniu tworzy program A na STDOUT. Programy A i B muszą być napisane w tym samym języku (i działać w tym samym języku). Połączone pytanie ograniczało A! = B. To wyglądało zbyt łatwo. Dlatego w tym pytaniu nalegamy, aby A i B były antykami, stosując następujące reguły:

  1. Programy A i B nie mogą używać tych samych znaków, z wyjątkiem białych znaków i separatorów instrukcji oraz znaków interpunkcyjnych.
  2. Programy A i B muszą zawierać co najmniej jeden znak, który nie jest ani białą spacją, ani separatorem instrukcji, ani znakiem interpunkcyjnym.
  3. Do celów reguł 1 i 2 termin „biała spacja” wyklucza dowolny symbol lub sekwencję symboli, który sam jest interpretowanym wyrażeniem, operatorem lub symbolem (w przeciwieństwie do separatora). Dlatego w języku białych znaków nie ma białych znaków.
  4. Separator instrukcji to element składniowy konwencjonalnie używany w języku do rozdzielania instrukcji. Obejmuje to nowy wiersz w pythonie lub średnik w Javie, perl lub C.
  5. Znak interpunkcyjny to znak ASCII, który nie jest ani białą spacją, ani klasą wyrazów POSIX (tzn. Podkreślenie nie jest w tym celu interpunkcją) - tzn. ispunct()Zwróci prawdę, a nie będzie _.
  6. Program A po uruchomieniu musi wytworzyć program (Program B) na swoim STDOUT, który po uruchomieniu tworzy Program A.
  7. Programy A i B muszą być w tym samym języku programowania.
  8. Używany język programowania musi być faktycznie językiem programowania. Chyba że zrobisz dobry przypadek, sugeruję, że Turing musi być kompletny.
  9. Co najmniej jedna z liter A i B musi wykonać co najmniej jedną instrukcję w języku.

Jest to kod golfowy, więc wygrywa najkrótsza odpowiedź, a wynik to długość programu A w bajtach (tzn. Długość programu B nie ma znaczenia).


Czy możesz dodać „interpunkcję” do listy wyjątków w pierwszej klauzuli? Niemożliwe jest rozwiązanie tego zadania w wielu językach (szczególnie tych, które wymagają od ciebie nawiasów klamrowych w głównej funkcji) inaczej.
FUZxxl,

powiązane, ale prawdopodobnie wystarczająco różne.
Martin Ender

@FUZxxl Pozwoliłem na znaki interpunkcyjne, ale wykluczyłem podkreślenia.
dniu

1
W tym celu, czy są Ai są auważane za różne „postacie”?
HostileFork mówi: nie ufaj SE

1
Byłoby lepiej, gdybyś dostarczył pełną listę znaków ASCII, które pasują do reguły 5.
aditsu zakończyło się, ponieważ SE to EVIL

Odpowiedzi:


5

GolfScript, 13 bajtów

1{\~\".~"}.~

Dane wyjściowe to

-2{\~\".~"}.~

który generuje program początkowy.

Liczba bajtów obejmuje końcowy LF, ponieważ dane wyjściowe będą go zawierały.

Wypróbuj online.

Jak to działa

1       # Push 1.
{       # Start code block.
  \~\   # Apply logical NOT to the second topmost element of the stack.
  ".~"  # Push that string.
}       # End code block.
.~      # Duplicate the code block and execute the copy.

GolfScript drukuje zawartość stosu po zakończeniu.


Przeczytaj ponownie opis problemu -Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg

1
Wszystko jednak 1i 2to znaki interpunkcyjne.
Dennis

OK, zasady zostały zmienione od czasu ich ostatniego przeczytania.
isaacg

Tak, to działa. Sformułowałem zasady, aby nie dopuścić do użycia białych znaków jako instrukcji, ale zapomniałem o tej samej luce w interpunkcji. Więc luka legalnie eksploatowana.
dniu

14

Pascal (731 znaków)

Program A:

program s;{$h+}uses sysutils;const p='program s;{$h+}uses sysutils;const p=';a='a';aa=''';';aaa='a=''';aaaa='''';aaaaa='begin write(lowercase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),''lower''+''c'',''tm''+''p'',[]),''up''+''c'',''lower''+''c'',[]),''tm''+''p'',''up''+''c'',[])+aa+aaaaa))end.';begin write(upcase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),'lower'+'c','tm'+'p',[]),'up'+'c','lower'+'c',[]),'tm'+'p','up'+'c',[])+aa+aaaaa))end.

Program wyjściowy B:

PROGRAM S;{$H+}USES SYSUTILS;CONST P='PROGRAM S;{$H+}USES SYSUTILS;CONST P=';A='A';AA=''';';AAA='A=''';AAAA='''';AAAAA='BEGIN WRITE(UPCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),''LOWER''+''C'',''TM''+''P'',[]),''UP''+''C'',''LOWER''+''C'',[]),''TM''+''P'',''UP''+''C'',[])+AA+AAAAA))END.';BEGIN WRITE(LOWERCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),'LOWER'+'C','TM'+'P',[]),'UP'+'C','LOWER'+'C',[]),'TM'+'P','UP'+'C',[])+AA+AAAAA))END.

Program wyjściowy A.


3
Podoba mi się (niewłaściwe) wykorzystanie tłumaczenia przypadków.
abligh

11

ROT13 ( już nie konkuruje po aktualizacji reguły )

Nie jestem pewien, czy liczy się to jako język, ale z pewnością nie nadrobiłem tego wyzwania. Zazwyczaj odpowiedzi na niektóre narzędzia, takie jak sedsą również akceptowane. Jest to jednak wyrok osądu, więc jeśli się nie liczy, usunę go (czy jest gdzieś meta dyskusja na temat tego, co liczy się jako język? Edytuj: Teraz jest )

A

Cykle między Ai N:

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A

Myślę, że to nie działa, ponieważ rot13 po prostu przyjmuje dane wejściowe STDIN, a nie wykonuje programu. Jeśli argumentujesz, że jest to program o zerowej długości, nie spełnia reguły 2. Program (z sed) jest przekazywany sed -e. Gdyby to było do zaakceptowania, catbyłby to quine, i tacbyłby quine i antyk. Jednak nic nie produkuje źródła do cat, tacczy o to chodzi rot13.
dniu

@abligh Jeśli używany jest język rot13, dlaczego powinienem wydrukować kod źródłowy dla rot13? Ponadto, jeśli uruchomię Golfscript, Python lub cokolwiek innego, prawdopodobnie po prostu przekażę mu kod źródłowy za pomocą standardowego pliku lub pliku, więc tak naprawdę nie ma żadnej różnicy. W tym przypadku rot13 jest tłumaczem.
Ingo Bürk

rot13ponieważ język programowania nie wydaje się spełniać żadnej rozsądnej definicji „języka programowania” i niczego nie interpretuje. Poprawię to pytanie, aby było jaśniejsze.
dniu

Nie mam nic przeciwko. Pozostawię tę odpowiedź jako już nie konkurującą i rozpocznę meta dyskusję. Nawiasem mówiąc, niezłe wyzwanie. Nie mogę się doczekać, aby zobaczyć „prawdziwe” rozwiązania!
Ingo Bürk,
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.