Liczniki wykrywające język pseudochine poliglota


11

Quines są fajne. Poligloty też są fajne. Quiny Polyglot istnieją, ale możemy podnieść poprzeczkę jeszcze wyżej.

Napisz plik zawierający poprawny program dla języków α, β i γ. Gdy plik jest wykonywany (prawdopodobnie po skompilowaniu) jako program języka α lub β, dane wyjściowe programu powinny mieć taką samą formę, jak prawidłowe zgłoszenie do konkursu. Jeśli twój plik jest wykonywany jako program γ, wyświetli liczbę. Wartością tej liczby jest łańcuch poprzednich wykonań programu interpretowany jako liczba binarna.

Wyjaśnienie to może być nieco trudne do zrozumienia, więc oto przykład. Niech Α, Β i Γ będą funkcjami, które wykonują swoje wprowadzanie jako język α, β lub γ odpowiednio. zaprogramuj i zwróć wyjście tych programów. Niech x będzie prawidłowym zgłoszeniem do tego konkursu. Następnie następujące wyrażenie, w którym przetwarzamy x przez język β, α, β, α, α, β i γ w tej kolejności, da 41, ponieważ 41 10 = 101001 2 .

Γ (Β (Α (Α (Β (Α (Β ( x )))))))

Nie można zakładać, że przedostatnie wykonanie w łańcuchu jest wykonaniem w języku β. W przypadku, gdy oryginalne przesłanie jest wykonywane bezpośrednio jako program językowy γ, drukuje się 0.

Twój program będzie działał poprawnie do szesnastu kompilacji w łańcuchu; to znaczy, najwyższa liczba, którą Twój program może wydrukować na końcu to 2 15 - 1. Oczywiście, twój program może obsługiwać dłuższe łańcuchy kompilacji.

To konkurs popularności, który zachęca do kreatywnych rozwiązań. Zgłoszenie z największą liczbą głosów wygrywa.


Czy te trzy języki mogą być równe (nawet jeśli drastycznie zmniejszy to liczbę głosów pozytywnych)?
Zgarb

6
@Zgarb Chciałbym zobaczyć rozwiązanie, w którym niektóre (lub wszystkie) języki są równe. Zobaczmy, jak potrafisz rozróżniać równe języki.
FUZxxl

1
...Widzę. : DI pospiesznie przeczytałem wyzwanie.
Zgarb

@Zgarb co powiesz na różne wersje tego samego języka? magic += Number(System.env.lang_version[-1])
John Dvorak,

1
+1 za używanie liter greckich zamiast nudnego a,b,club 1,2,3=)
flawr

Odpowiedzi:


13

Python 2, Python 3,> <> (Fish)

#;n0
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

Wyjaśnienie w języku Python

Interpretatory Python 2 i Python 3 działają podobnie, z tą różnicą, że v=int(1/2*2)zmienna otrzymuje różne wartości ( 0i 1), ponieważ Python 2 używa dzielenia zmiennoprzecinkowego, a Python 3 używa dzielenia liczb całkowitych.

W każdym uruchomieniu dodają wyrażenie +0*2lub +1*2 do pierwszego wiersza (po #;n) i do xłańcucha (po ostatniej komendzie zapisu). Interpreter> <> używa pierwszego dodatku, a pytony drugiego używają do tworzenia poprawnych quines.

Kod po B(A(B(B(x)))):

#;n+1*2+0*2+1*2+1*20
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])+1*2+0*2+1*2+1*2n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

> <> Objaśnienie (ryby)

Kiedy uruchomisz interpreter> <>, wskaźnik kodu odbija się od #owinięć wokół pierwszej linii i zaczynając od końca pierwszej linii, a kurs na zachód zaczyna wypychać liczby na stos. Jeśli operator przyjdzie ( +lub *) wyskakuje dwa górne elementy ze stosu i odsuwa wynik. Dzięki tej metodzie uzyskujemy reprezentację base2 poprzednich przebiegów ( 13w poprzednim przykładzie). Jest to pożądana liczba, więc wyprowadzamy ją ni kończymy na ;.


To jest całkiem miłe.
FUZxxl,
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.