Drukuj kawałki Polyglot


22

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 47byłby ÈFGdla języka A ​​i ├êFGdla 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 XYsą poprawnymi danymi wyjściowymi w obu, ale YZsą również poprawne w B, możesz wybrać XYjako wynik dla A i YZjako wynik dla B, więc możesz ubiegać się o oba z nich w swoim wyniku ( ale nie możesz ubiegać się XYo oba języki z powodu powyższej reguły).
  • Wszystkie wyjścia muszą być jak najkrótsze. Na przykład, jeśli twój kod był print('foo')#somethingdla Pythona 3 (ignorując fakt, że dane wyjściowe są niepoprawne), kod, który musiałbyś wygenerować, byłby print('foo')i print('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.

2
Przedostatnia reguła brzmi tak, jakbyśmy musieli udowodnić, że niemożliwe jest dalsze granie w golfa w wynikowy sposób za pomocą jakiegokolwiek innego zestawu usunięć. Czy to celowe?
Martin Ender,


Jak definiujesz „usuwanie” w przypadku języka, którego polecenia nie mają długości 8 bitów? Czy usuwasz ze źródła polecenie na raz, czy bajt na raz?

@MartinEnder Można założyć dobrą wiarę. O ile ktoś nie znajdzie krótszego quinu, który można uformować z poliglota, odpowiedź jest wiarygodna.
Mego

@ ais523 Wszystko odbywa się na poziomie bajtów.
Mego

Odpowiedzi:


11

GolfScript + CJam + Rozszczepienie 2 + galaretki , 4 języki, 24 bajtów, wynik 2.667

Zacznijmy od zrzutu heksa:

00000000:  3322 3024 700a 2721 2b4f 5222 0a3c 3024 700a 6523 7fff cccc

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):

3"0$p
'!+OR"
<0$p
e#<DEL>ÿÌÌ

Gdzie <DEL>jest znak kontrolny 0x7f.

W przypadku Jelly zakłada się, że znajduje się na stronie kodowej Jelly, gdzie wygląda to tak:

3"0$p½'!+OR"½<0$p½e#¶”ṘṘ

GolfScript

eW ostatnim wierszu jest zmienną nieznany i #komentarze na zewnątrz pozostałej części linii, więc drukuje

"0$p"
0$p

z końcowym podawaniem linii. To jest wersja poliglota GolfScript / CJam standardowego quine:

".p"
.p

Wypróbuj poliglota. | Spróbuj quine.

CJam

Tutaj e#komentuje ostatni wiersz, więc prawie identycznie, drukuje się

"0$p"
0$p

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

'!+OR"

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:

3"0$p½'!+OR"½<0$p½e#
”ṘṘ

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 3pierwsze 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.


9

> <> + Python, 2 języki, 51 46 bajtów, wynik ~ = 0,16 0,17

Ponieważ nie ma jeszcze odpowiedzi, zacznę od prostej

#.09;!?lo}*2+2f"
_='_=%r;print _%%_';print _%_

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).


1
Nieznaczne dostosowanie odpowiedzi> <> pozwala zaoszczędzić trochę bajtów: - # "~ r10gol?!; 60. |!
Pelikan Teal

@Tealpelican Dziękujemy za przypomnienie mi o użyciu .! 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żywania g(ponieważ można go interpretować jako „odczytanie kodu źródłowego”)
Leo

To całkiem słuszny argument za nie używanie g. Patrząc i trochę się nad tym zastanowić, możesz jeszcze bardziej go zmniejszyć, używając # (ascii 35) ze stosu, aby uzyskać swoje „like; # .09;!? Lo} -1”
pelikan Teal

7

JavaScript + Python 2 + Japt, 3 języki, 132 bajty, wynik ~ = 0,205

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"""
console.log(S,uneval(S))//""";print S%S

To drukuje

S="S=%s;console.log(S,uneval(S))";console.log(S,uneval(S))

w JavaScript (tylko w Firefox),

S='S=%r;print S%%S';print S%S

w Python 2 i

`i96d)p2`i96d)p2

w Japt. ( Przetestuj online! )

JavaScript

Tak widzi JavaScript:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A
console.log(S,uneval(S))

Pierwszy wiersz to no-op, ponieważ Anie jest używany w żaden sposób. Druga linia zestawów Sdo łańcucha S=%s;console.log(S,uneval(S)), a drukuje trzecie, po wymianie %sz unevalreprezentacją ed S(tylko Szawinięte w cudzysłowie). Rezultatem jest quine w JavaScript.

Pyton

Właśnie to widzi Python:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S"
print S%S

Pierwsza linijka to właściwie brak op; jedyną ważną częścią jest A=1koniec. Przekształca Asię to w liczbę, dzięki czemu dzielenie liczb całkowitych A//2w drugim wierszu nie generuje błędu.

Drugi wiersz jest w większości taki sam, z wyjątkiem tego, że ustawia Sciąg S=%r;print S%%S. Trzeci wiersz jest drukowany Spo zamianie na %rsurową reprezentację S(tylko Szawiniętą w pojedyncze cudzysłowy). Wynikiem jest quine w Pythonie 2.

Japt

Oto kod JavaScript, który widzi interpreter Japt:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"","\nconsole.log(S,uneval(S))//","";.p("r".i("n".t(),S%S))

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:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A

Pierwsza linia ustawia Ana Quine Japt, a druga Sna część Jine quine. Jednak w Japt tylko ostatnie wyrażenie jest wysyłane do wyjścia; to jest A, więc wynik jest `i96d)p2`i96d)p2.


Co to jest uneval? Nie działa dla mnie
Cyoce,

@Cyoce developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Działa to jednak tylko w przeglądarce Firefox.
ETHproductions

3

Jolf +> <>, wynik = 2 ** 3/15 = 0,533 ....

"r0:g>o<
"Q«Q«

Praca nad dodaniem do tego innego języka.


2

> <>, Python 2 i 3, 3 języki, 107 bajtów, wynik = 27/107 ~ = 0,252

#o<}-1:"
a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

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:

_='_=%r;print _%%_';print _%_

Po pierwsze, aby był kompatybilny zarówno z Python 2, jak i Python 3, zmieniłem printinstrukcję na wywołanie funkcji i dodałem dodatkową przestrzeń, która przyda się później:

_='_=%r;print (_%%_)';print (_%_)

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 sprawdza Truew Pythonie 2, ale Falsew Pythonie 3:

1/1is 1

Aby odróżnić wyniki między dwoma językami, musiałem selektywnie usunąć pierwszy i ostatni nawias w printwywołaniu (dlatego potrzebowałem spacji wcześniej - bez spacji, nie byłaby to poprawna printinstrukcja w Pythonie 2) . Dlatego musiałem zmodyfikować uprząż quine w następujący sposób:

a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

To wyrażenie ma a:-a|9wartość 0:9w Python 2 i1:-1 Python 3. Zatem bjest "(_%(_,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.


1

Python 2 + Retina, 2 języki, 55 bajtów, wynik = 2 ^ 3/55 ≈ 0,145

Użyłem $nzamiast, aby oba były poprawne ASCII.

S='S=%r;print S%%S';print S%S#|
#$n\(*S1`$n\(*S1`
#\`#

Python , Retina

Pyton:

S='S=%r;print S%%S';print S%S

Siatkówka oka:


\(*S1`
\(*S1`

0

> <> + Pyke + Python 2, 81 bajtów, wynik = 3 ** 3/81 ~ 0,333

"""r00gol?!;60.
a=%r;print a%%a"""#);"34.Cp\D\Es"DEp00/
a=__doc__[-15:]
print a%a

Próbowałem zrobić coś innego ze wszystkimi językami.

> <> widzi:

"""r00gol?!;60.

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:

"34.Cp\D\Es"DEp00/

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!

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.