Poliquina jest zarówno quine, jak i polyglot. 1 Musisz napisać quine, która jest ważna w co najmniej dwóch różnych językach. To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
1 Wymyśliłem to. A raczej zrobili to Geobici . Najwyraźniej nie był też pierwszym .
Zasady dla Quines
Akceptowane są tylko prawdziwe quines. Oznacza to, że musisz wydrukować cały kod źródłowy dosłownie do STDOUT, bez :
- czytanie kodu źródłowego, bezpośrednio lub pośrednio.
- polegając na środowisku REPL, które po prostu ocenia i drukuje każde podane wyrażenie.
- opierając się na funkcjach językowych, które w niektórych przypadkach drukują tylko źródło.
- za pomocą komunikatów o błędach lub STDERR, aby napisać całość lub część quine. (Możesz pisać różne rzeczy do STDERR lub generować ostrzeżenia / niekrytyczne błędy, o ile STDOUT jest poprawnym quine, a komunikaty o błędach nie są jego częścią.)
Ponadto twój kod musi zawierać literał ciągu.
Zasady dla Polyglots
Dwa używane języki muszą być wyraźnie różne. W szczególności:
- Nie mogą to być różne wersje tego samego języka (np. Python 2 vs. Python 3).
- Nie mogą to być różne dialekty tego samego języka (np. Pascal vs. Delphi).
- Jeden język może nie być podzbiorem drugiego (np. C vs. C ++).
Odpowiedzi:
CJam / GolfScript, 34 bajty
Liczba bajtów zawiera końcowe podawanie wiersza, ponieważ bez niego program nie byłby quine.
Podczas gdy CJam i GolfScript są bardzo podobne w niektórych aspektach, istnieje wiele różnic. Aby uczynić z tego „uczciwą” polikwinę, postanowiłem w jak największym stopniu polegać na różnicach . Z wyjątkiem składni bloków i łańcuchów (które języki współużytkują z tak wieloma innymi), żadna część kodu nie osiąga dokładnie tego samego w obu językach.
Interpreter online GolfScript ma błąd; ten program działa tylko z oficjalnym tłumaczem.
Przykładowy przebieg
Jak to działa (CJam)
Jak to działa (GolfScript)
CJam / GolfScript, 12 bajtów
Cheaty rozwiązanie, które w jak największym stopniu pozwala uniknąć różnic między językami.
Wypróbuj online:
Jak to działa (CJam)
Jak to działa (GolfScript)
źródło
C # / Java, 746 bajtów
Korzystam z właściwości, że znaki w Javie można zapisać jako identyczne sekwencje Unicode. Jeśli mamy
A
instrukcję dla kompilatora C # iB
instrukcję dla Java, możemy użyć następującego fragmentu kodu:Będzie to „rozpoznawane” w następujący sposób za pomocą C #:
I w następujący sposób przez Javę:
Z powodu podziału
\u000A
linii\u002F
jest/
i\u002A
jest*
w Javie.Ostateczna poliglota-quine to:
Jednak rozmiar jest zbyt duży ze względu na gadatliwość języków.
Kompilacja dostępna na ideone.com: C # , Java .
źródło
Python 3 i JavaScript, 134 bajty
Oto moja (ostatnia?) Próba:
Prawdopodobnie można go nieco pograć w golfa, zwłaszcza jeśli ktoś zna lepszy sposób na uzyskiwanie pojedynczych cudzysłowów w JavaScript.
Gotowany program wygląda następująco:
eval()
Funkcja oceni wyrażeń w obu językach. Tak więc długi łańcuch zostaje wykonany:To dzieli długi łańcuch na spacje i ocenia podciąg indeksowany
2%-4
. JavaScript uruchomi trzeci podciąg (2 % -4 == 2
), a Python drugi ostatni (2 % -4 == -2
), ponieważ ich operatory modulo zachowują się inaczej w przypadku negatywów.Reszta ciągu jest ignorowana w obu językach. JavaScript zatrzymuje się na
//
, podczas gdy Python widzi go jako dzielenie liczb całkowitych i zatrzymuje się na#
.Więc JavaScript drukuje kod źródłowy na konsoli tutaj:
I Python tutaj:
Oba wykorzystują ostatnią część ciągu, który jest szablonem programu:
źródło
a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"])
. Testowane w JavaScript, ale nie w Pythonie ... ale powinno działać.a.split(1)
.q=unescape("%27")
Ruby / Perl / PHP, 52
Skopiowano dosłownie z Perla Quine Christophera Durra .
To jest nadużycie zasad. Ruby i Perl zdecydowanie nie są tym samym językiem, ani też Perl nie jest podzbiorem Rubiego (na przykład większość połączonych quinów Perla nie działa w Rubim). Ale Ruby został zaprojektowany tak, aby mógł wyglądać bardzo podobnie do Perla, jeśli tego chcesz, i dzieje się to często podczas gry w golfa.
źródło
-R
i nie potrzebujesz tagów skryptu. php.net/manual/en/features.commandline.options.phpBash / GolfScript, 73
W każdym z pierwszych 3 wierszy znajduje się spacja.
Bash / GolfScript, 78
źródło
PHP / Perl - 171
Biegnij z:
php
Kod jest uruchomiony (nie tylko drukuje się).źródło
Bash / Ruby,
10482Starsza wersja:
Bash / Ruby, 128 bez niezdefiniowanego zachowania
źródło
<<a
w Ruby działa tak jak Bash, ale zwraca ciąg znaków. Nie pisałem wcześniej programu Ruby. Właśnie znalazłem przypadkowy język z tą funkcją.<<word
zwraca ciąg zamknięty linią z pojedynczymword
.reticle / befunge-98, 28 bajtów [niekonkurencyjny]
Wypróbuj siatkę! Wypróbuj befunge 98!
Cokolwiek pomiędzy
;
s w befunge jest ignorowane i!
przeskakuje do segmentu między;
s dla siatki. Tak więc siatka widzi:Befunge widzi:
źródło
Ruby / Mathematica, 225 bajtów
Oto moja bardzo łatwa do wykonania polyquine (która służy jako przykład i dowód słuszności koncepcji):
Pierwsza część oparta jest na tym rubinowym quine i jest w zasadzie:
Przypisanie łańcucha jest dokładnie takie samo w Mathematica.
puts s%s
Interpretowany jest jako iloczyn: 4 symboleputs
, łańcuchs
,%
(ostatni wynik REPL lubOut[0]
jeśli jest to pierwszy wyraz ocenić) i innys
. To oczywiście zupełnie bez znaczenia, ale Mathematica nie dba o to i;
tłumi wszelkie dane wyjściowe, więc jest to po prostu przetwarzane w ciszy. Następnie#
czyni resztę wiersza komentarzem dla Ruby, podczas gdy Mathematica kontynuuje.Jeśli chodzi o kod Mathematica, największą jego część stanowi symulacja przetwarzania napisów w formacie Ruby bez użycia literałów.
FromCharacterCode@{37,112}
jest%p
iFromCharacterCode@{37,112}
jest%%
. Pierwszy zostaje zastąpiony samym ciągiem (gdzieInputForm
dodaje cudzysłowy) drugi zostaje zastąpiony pojedynczym%
. Wynik jestPrint
edytowany. Ostatnim haczykiem jest, jak sobie z tym poradzić z#
przodu. Jest to symbol Mathematica dla pierwszego argumentu funkcji czysto (anonimowej). Więc robimy to, aby uczynić to wszystko czystą funkcją przez dodanie&
i natychmiastowe wywołanie funkcji z argumentem1
. Przygotowanie1
do wywołania funkcji „zwielokrotnia” wynik przez1
, które Mathematica ponownie połyka, niezależnie od tego, jakie funkcje są zwracane przez funkcję.źródło
> <> i CJam, 165 bajtów
Do CJam program zaczyna się od wieloliniowego literału łańcuchowego. Jest to
`
poprzedzane znakiem ucieczki , a następnie używa standardowej quine do wydrukowania kodu quine, a także końcowego komentarza.Aby> <>, pierwszy
"
rozpoczyna literał ciąg, który przechodzi przez cały pierwszy wiersz, wypychając każdy znak na stos. Następnie spacje końcowe (utworzone z powodu uzupełniania danych wejściowych) są usuwane, a następnie stos jest odwracany. Każdy znak na stosie (tzn. Cały pierwszy rząd) jest wyprowadzany, a następnie przechodzi do drugiego rzędu.Drugi rząd zasadniczo robi to samo, tyle że w przeciwnym kierunku, więc nie trzeba odwracać stosu. (Tak czy inaczej, bo muszę usunąć końcowe spacje).
Wreszcie przechodzi do trzeciej linii. Jedyną zasadniczą różnicą jest to, że musisz pominąć blok CJam, co odbywa się za pomocą
.
Pojedynczego cudzysłowu, przechwytuje całą linię (ponownie, wstecz), a następnie jest wyprowadzana.źródło
C / PHP,
266304300282241203 + 10 bajtów+10 bajtów, ponieważ kompilacja w C wymaga flagi kompilatora GCC
-Dfunction=
.Jak to działa (w PHP):
<?php
HTML.//
nie jest komentarzem w HTML, więc jest po prostu drukowany.main
jest zadeklarowany jako funkcja ze zmiennąa
.printf
wypisuje znak powrotu karetki (w celu zastąpienia już wydrukowanego//
), a następnie kod źródłowy, przy użyciu standardowej metody quiningu C / PHP.#if 0
jest ignorowany przez PHP.main($a)
inicjuje pustą zmiennąa
. (Wcześniej używaneerror_reporting(0)
do ignorowania błędów spowodowanych wywołaniemmain()
)#endif
jest również ignorowane przez PHP.Jak to działa (w C):
//<?php
jest komentarzem jednowierszowym, więc jest ignorowany.function
kluczowe jest ignorowane z powodu argumentu kompilatora wiersza poleceń-Dfunction=
.$
. (To uratowało dzień.)printf
wypisuje znak powrotu karetki (w tym przypadku bezużyteczny), a następnie kod źródłowy, używając standardowej metody quiningu C / PHP.#if 0
ignoruje wszystko aż doendif
, więc PHP może zadzwonićmain
.#endif
kończy blok „ignoruj mnie”.źródło
Wumpus / > <> / Befunge-98 28 bajtów
Wypróbuj w Wumpus! , Wypróbuj w> <>! , Wypróbuj w Befunge-98!
Jak to działa:
Kod Wumpus:
> <> Kod:
Kod Befunge-98:
źródło
05AB1E / 2sable, 14 bajtów, niekonkurujący
Wypróbuj online! (05AB1E)
Wypróbuj online! (2sable)
2sable pochodzi z 05AB1E i jest podobny, ale ma duże różnice.
Końcowy znak nowej linii.
źródło
C / TCL, 337 bajtów
źródło
C / Vim 4.0, 1636 bajtów
Zawiera znaki kontrolne.
Twój Vim musi mieć następujący zestaw:
źródło
C / Lisp, 555 bajtów
Celowo pusty pierwszy wiersz.
źródło
Perl / JavaScript (SpiderMonkey), 106 bajtów
Wypróbuj Perl online!
Wypróbuj JavaScript online!
Wyjaśnienie
Quine dane są przechowywane w
$_
obu językach, a następnieeval
ed, co jest prawie standardową procedurą w Perlu. Wybrałem SpiderMonkey na TIO, ponieważ ma onprint
funkcję, ale można ją łatwo przenieść do przeglądarki na + 20 bajtów (dodajeval("print=alert");
na początek$_
definicji s).Perl widzi dane w nim przechowywane
$_
ieval
jak zwykle. Ponieważ+[]
jest prawdą w Perlu,'
jest przechowywany$q
poprzez ciąg XORh
iO
. Ostatnia sztuczka polega na wywołaniu, wprint
którym wykorzystuje pierwszą część JavaScript+
, która w Perlu traktuje wszystkie elementy jako liczby i sumuje się0
, a następnie używamy||
operatora, aby zwrócić to, czego faktycznie chcemy,(q($_),"=$q$_$q;",q(eval($_)))
co jest równoważne"\$_=$q$_$q;eval(\$_)"
.W JavaScript,
+[]
powraca0
, więc zadzwonićunescape("%27")
do sklepu'
w$q
(Niestety,atob
doesm't istnieć w SpirderMonkey ...). W wywołaniu doprint
, ponieważ+
w JavaScript jest operatorem konkatenacji, pierwszy blok buduje pożądane dane wyjściowe, a druga część po||
jest ignorowana.Dzięki komentarzowi Patricka Robertsa do
unescape
sztuczki!Perl / JavaScript (przeglądarka), 108 bajtów
Wypróbuj Perl online!
Wyjaśnienie
Przechowujemy dane quine
$_
w obu językach, a następnieeval
to, co jest prawie standardową procedurą w Perlu.Perl widzi dane w nim przechowywane
$_
ieval
jak zwykle. Elementeval
wewnętrzny$_
jest wykonywany i nie może zostać przeanalizowany, ale ponieważeval
nie jest błędny.printf
jest następnie wywoływany, z pojedynczym cudzysłowemq()
, z`
jako separator, ponieważ samo użycie`
spowoduje wykonanie poleceń w powłoce, a następnie dla pierwszego użycia$q
, ponieważ+[]
jest to prawdą w Perlu,'
jest przechowywane w$q
ciągu XOR ciąguh
iO
.W JavaScript
eval
blok wewnątrz$_
ustawia funkcjęq
, którareturn
jest jej argumentem jakoString
aliasyconsole.log
doprintf
, ponieważconsole.log
formatuje ciąg znaków jakprintf
w Perlu. Kiedyprintf
nazywa się+[]
zwraca0
, więc wzywamyatob
do dekodowania'
i przechowywania$q
.źródło
Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1031 bajtów
Sprawdź to online!
Opierając się na moich aktualizacjach tej odpowiedzi , pomyślałem, że spróbuję zoptymalizować kod, który wypisuje inną permutację, ale ostatecznie dodałem Bash, który i tak dodał ładowanie więcej bajtów. Chociaż jest to bardziej zoptymalizowane niż moja pierwsza próba (zapisano ponad 300 bajtów), jestem pewien, że można go jeszcze pograć w golfa.
Alternatywne Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 bajtów
Sprawdź to online!
Nieco bliżej mojego pierwotnego podejścia, ale powtarzanie argumentów za
printf
jest nadal szalone. Użycie zamiast tego argumentów pozycyjnych sprawia, że działa to tylko w Chrome i trudno jest również pracować w PHP, ponieważ$s
in%1$s
jest interpolowany, ale może zaoszczędzić wiele bajtów, być może stosując kombinację dwóch podejść ...źródło
C / dc, 152 bajty
Korzystając z komentarzy, tak!
źródło
Perl 5 / Ruby / PHP / JavaScript (przeglądarka), 153 bajty
Wypróbuj Perl online!
Wypróbuj Ruby online!
Wypróbuj PHP online!
źródło