Zazwyczaj poligloty są skonstruowane w taki sposób, że każdy język może zignorować części kodu obecne w innych językach, zawijając je w literały łańcuchowe, używając składni komentarza lub innych podobnych sztuczek.
Twoim celem jest napisanie poliglota, w którym wyjściem dla każdego języka jest kod z poliglota, który generuje ten wynik. W szczególności dane wyjściowe muszą być skonstruowane z kodu poliglota z tylko usunięciami i musi to być quine w danym języku.
Zasady
- Dozwolone są tylko odpowiednie quiny (bez odczytu kodu źródłowego, bez pobierania danych wejściowych, wyjście musi być do STDOUT lub najbliższej alternatywy, jeśli STDOUT nie jest opcją, a programy muszą składać się z więcej niż tylko literałów, które są domyślnie drukowane).
- Ponieważ różne języki mogą używać różnych kodowań, ważne są tutaj nieprzetworzone bajty. Na przykład, jeśli język A używa UTF-8, a język B używa CP437, kod (szesnastkowy)
C3 88 46 47
byłbyÈFG
dla języka A i├êFG
dla języka B. - Wszystkie dane wyjściowe muszą być odrębne (ponownie, porównanie surowych bajtów). Pozwala to uniknąć komplikacji przy próbie ograniczenia mniejszych wersji językowych - jeśli dwa języki używają tej samej części kodu do wykonania tej samej czynności, nie można uzyskać do nich obu.
- Jeśli masz dwa języki A i B, które
XY
są poprawnymi danymi wyjściowymi w obu, aleYZ
są również poprawne w B, możesz wybraćXY
jako wynik dla A iYZ
jako wynik dla B, więc możesz ubiegać się o oba z nich w swoim wyniku ( ale nie możesz ubiegać sięXY
o oba języki z powodu powyższej reguły).
- Jeśli masz dwa języki A i B, które
- Wszystkie wyjścia muszą być jak najkrótsze. Na przykład, jeśli twój kod był
print('foo')#something
dla Pythona 3 (ignorując fakt, że dane wyjściowe są niepoprawne), kod, który musiałbyś wygenerować, byłbyprint('foo')
iprint('foo')#
nie byłby dozwolony. Jeśli istnieje wiele ciągów o tej samej (minimalnej) długości, które dają prawidłowe wyniki, możesz wybrać jeden z nich. - Zgłoszenia muszą być poliglotami w co najmniej 2 językach.
- Twój wynik zostanie przyznany przez
(number of programming languages with distinct outputs)**3/(total byte size of polyglot)
. Najwyższy wynik wygrywa. W przypadku, gdy dwa zgłoszenia osiągną ten sam wynik, zgłoszenie, które osiągnęło ten wynik jako pierwszy, wygrywa.
Odpowiedzi:
GolfScript + CJam + Rozszczepienie 2 + galaretki , 4 języki, 24 bajtów, wynik 2.667
Zacznijmy od zrzutu heksa:
W przypadku GolfScript, CJam i Fission 2 interpretujemy to w niektórych jednobajtowych kodowaniach zgodnych z ASCII, takich jak ISO 8859-1 (dokładne kodowanie nie ma znaczenia, ponieważ języki i tak definiują tylko operatory znaków ASCII):
Gdzie
<DEL>
jest znak kontrolny0x7f
.W przypadku Jelly zakłada się, że znajduje się na stronie kodowej Jelly, gdzie wygląda to tak:
GolfScript
e
W ostatnim wierszu jest zmienną nieznany i#
komentarze na zewnątrz pozostałej części linii, więc drukujez końcowym podawaniem linii. To jest wersja poliglota GolfScript / CJam standardowego quine:
Wypróbuj poliglota. | Spróbuj quine.
CJam
Tutaj
e#
komentuje ostatni wiersz, więc prawie identycznie, drukuje siębez końcowego podawania linii.
Wypróbuj poliglota | Spróbuj quine.
Rozszczepienie
Rozszczepienie widzi tylko drugą linię, która jest standardową czcionką rozszczepienia, więc drukuje
Nie mogę tutaj podać linku online dla polyglota, ponieważ TIO wysyła plik do Fission jako UTF-8, ale Fission czyta bajt źródłowy bajt, co powoduje, że ostatnia linia jest za długa. Jednak przetestowałem to lokalnie za pomocą pliku zakodowanego w standardzie ISO 8859-1 (w którym ostatni wiersz ma taką samą długość jak drugi), aby potwierdzić, że to działa.
Spróbuj quine.
Galareta
Pilcrow to pseudonim dla linii w Galaretce, więc źródło jest równoważne z:
Wszystkie oprócz ostatniego wiersza programu Jelly są „linkami pomocniczymi” (tj. Funkcjami), które można zignorować, chyba że zostaną wywołane, pod warunkiem, że są poprawne pod względem składniowym. Jest to właściwie powód, dla którego
3
pierwsze miejsce zajmuje program CJam i GolfScript, ponieważ w przeciwnym razie"
nie można go przeanalizować w Jelly.W przeciwnym razie, ponieważ funkcja nie zostanie wywołana, program jest równoważny tylko drugiej linii, która jest standardową galaretką.
Wypróbuj poliglota. | Spróbuj quine.
źródło
> <> + Python, 2 języki,
5146 bajtów, wynik ~ =0,160,17Ponieważ nie ma jeszcze odpowiedzi, zacznę od prostej
Wypróbuj dla > <> i Python
Dla> <> pierwsza linia to quine (# odzwierciedla, „umieszcza całą linię na stosie, następnie wciskamy 34 (kod znaków dla”) i drukujemy wszystko), wykonanie nigdy się z niej nie przenosi, więc skutecznie ignoruje resztę kod.
Dla Pythona pierwszy wiersz jest komentarzem, podczas gdy drugi wiersz jest quine (standardowe podejście w pythonie, przy użyciu podstawienia łańcucha tym samym ciągiem co oba argumenty).
źródło
.
! Dostosowałem swój quine przy użyciu tego podejścia, chociaż wolę zachować ciąg w odwrotnej kolejności (ponieważ pozwala to zaoszczędzić bajty) i unikać używaniag
(ponieważ można go interpretować jako „odczytanie kodu źródłowego”)JavaScript + Python 2 + Japt, 3 języki, 132 bajty, wynik ~ = 0,205
To drukuje
w JavaScript (tylko w Firefox),
w Python 2 i
w Japt. ( Przetestuj online! )
JavaScript
Tak widzi JavaScript:
Pierwszy wiersz to no-op, ponieważ
A
nie jest używany w żaden sposób. Druga linia zestawówS
do łańcuchaS=%s;console.log(S,uneval(S))
, a drukuje trzecie, po wymianie%s
zuneval
reprezentacją edS
(tylkoS
zawinięte w cudzysłowie). Rezultatem jest quine w JavaScript.Pyton
Właśnie to widzi Python:
Pierwsza linijka to właściwie brak op; jedyną ważną częścią jest
A=1
koniec. PrzekształcaA
się to w liczbę, dzięki czemu dzielenie liczb całkowitychA//2
w drugim wierszu nie generuje błędu.Drugi wiersz jest w większości taki sam, z wyjątkiem tego, że ustawia
S
ciągS=%r;print S%%S
. Trzeci wiersz jest drukowanyS
po zamianie na%r
surową reprezentacjęS
(tylkoS
zawiniętą w pojedyncze cudzysłowy). Wynikiem jest quine w Pythonie 2.Japt
Oto kod JavaScript, który widzi interpreter Japt:
Jak widać, jest to w większości to samo co odpowiedź JavaScript, z jednym głównym wyjątkiem: dwie ostatnie linie są połączone. W rezultacie to właśnie widzi tłumacz:
Pierwsza linia ustawia
A
na Quine Japt, a drugaS
na część Jine quine. Jednak w Japt tylko ostatnie wyrażenie jest wysyłane do wyjścia; to jestA
, więc wynik jest`i96d)p2`i96d)p2
.źródło
uneval
? Nie działa dla mnieJolf +> <>, wynik = 2 ** 3/15 = 0,533 ....
Praca nad dodaniem do tego innego języka.
źródło
> <>, Python 2 i 3, 3 języki, 107 bajtów, wynik = 27/107 ~ = 0,252
Wypróbuj online: Python 2 , Python 3 , > <>
Wyjście Python 3 jest dokładnie drugim wierszem, a wyjście Python 2 jest tym quine . Wyjście> <> to pierwszy wiersz.
Wyjaśnienie
Ten program jest oparty na klasycznej wersji Python 2:
Po pierwsze, aby był kompatybilny zarówno z Python 2, jak i Python 3, zmieniłem
print
instrukcję na wywołanie funkcji i dodałem dodatkową przestrzeń, która przyda się później:Następnie potrzebowałem sposobu na odróżnienie Pythona 2 od Pythona 3. Jednym z najprostszych sposobów jest skorzystanie z faktu, że
/
w Pythonie 2 jest dzielenie liczb całkowitych, ale w Pythonie 3 dzielenie zmiennoprzecinkowe. Zatem poniższy kod sprawdzaTrue
w Pythonie 2, aleFalse
w Pythonie 3:Aby odróżnić wyniki między dwoma językami, musiałem selektywnie usunąć pierwszy i ostatni nawias w
print
wywołaniu (dlatego potrzebowałem spacji wcześniej - bez spacji, nie byłaby to poprawnaprint
instrukcja w Pythonie 2) . Dlatego musiałem zmodyfikować uprząż quine w następujący sposób:To wyrażenie ma
a:-a|9
wartość0:9
w Python 2 i1:-1
Python 3. Zatemb
jest"(_%(_,b))"
w Python 3, ale w Python 2 pierwsze i ostatnie znaki są odrzucane, pozostawiając_%(_,b)
. Dzięki tej modyfikacji poliglot był ważny dla tego wyzwania.Jak sugeruje pelikan Teal, quine> <>
#o<}-1:"
można dodać dość łatwo, dzięki temu, że#
rozpoczyna się komentarz Python w jednym wierszu. Wystarczy go dodać, a nowa linia dodaje inny język i zwiększa wynik prawie dziesięciokrotnie.źródło
Python 2 + Retina, 2 języki, 55 bajtów, wynik = 2 ^ 3/55 ≈ 0,145
Użyłem
$n
zamiast,¶
aby oba były poprawne ASCII.Python , Retina
Pyton:
Siatkówka oka:
źródło
> <> + Pyke + Python 2, 81 bajtów, wynik = 3 ** 3/81 ~ 0,333
Próbowałem zrobić coś innego ze wszystkimi językami.
> <> widzi:
Jest to niewielka modyfikacja standardowej> <> quine, aby na początku użyć potrójnego ciągu znaków. Pozwala to, aby końcowe potrójne cudzysłowy dla Pythona znajdowały się w innym wierszu.
Wypróbuj online!
Pyke widzi:
W Pyke nie stworzyłem wcześniej żadnej książki i dlatego musiałem o niej pomyśleć. Użyłem tradycyjnych technik quitingu, aby utworzyć ciąg, a następnie ewaluować go samemu jako dane wejściowe. Uwaga: aby działało to bez efektu wizualnego, ostrzeżenia będą musiały zostać wyłączone. Występuje błąd z błędem dzielenia przez 0 na etapie generowania.
Wypróbuj tutaj! Lub tylko część quine.
Python widzi:
To wszystko. Python używa całego kodu do tworzenia swojej quine. Postanowiłem osadzić część quine w dokumentacji (choć ostatecznie zaoszczędziłoby to bajtów do usunięcia, ale myślę, że to fajne). To modyfikacja standardowej techniki quiningu.
Wypróbuj online!
źródło