30 języków, 248 bajtów, 248/30 ^ 3 = 0,009185
#|#?15g,@ kkmNmSaIeoe99+{\#/-;n@0ea
#[9!@>.>.eeaww#-1@*"12" L
#{
###
#`{
25
print(4^2 +7)/2
"""
Jo is here.
$'main'MoO OOM
7
>Jo, 30
>X Jo
f::=~27
::=]##}#(prin 29)
print (7/6*24)###;alert 2#-[>+<-----]>-.|#(write(if(= 1/5 .2)26 3))"""
Edycja: Beatnik został usunięty, ponieważ testy pierwotności w Beatniku mogą być niemożliwe.
Kod zawiera tabulatory (które są zniekształcane przez Stack Exchange) i końcowy znak nowej linii, więc oto xxd
:
00000000: 237c 233f 3135 672c 4020 2020 0920 2020 #|#?15g,@ .
00000010: 206b 6b6d 4e6d 5361 4965 6f65 3939 2b7b kkmNmSaIeoe99+{
00000020: 5c23 2f2d 3b6e 4030 6561 0a23 5b39 2140 \#/-;n@0ea.#[9!@
00000030: 3e2e 3e2e 6565 6177 7723 2d31 402a 2231 >.>.eeaww#-1@*"1
00000040: 3222 094c 0a23 7b20 090a 2323 230a 2360 2".L.#{ ..###.#`
00000050: 7b0a 3235 0a70 7269 6e74 2834 5e32 202b {.25.print(4^2 +
00000060: 3729 2f32 0a0a 0a22 2222 0a4a 6f20 6973 7)/2...""".Jo is
00000070: 2068 6572 652e 0a24 276d 6169 6e27 4d6f here..$'main'Mo
00000080: 4f20 4f4f 4d0a 2037 0a3e 4a6f 2c20 3330 O OOM. 7.>Jo, 30
00000090: 0a3e 5820 4a6f 0a66 3a3a 3d7e 3237 0a3a .>X Jo.f::=~27.:
000000a0: 3a3d 5d23 237d 2328 7072 696e 2032 3929 :=]##}#(prin 29)
000000b0: 0a70 7269 6e74 2028 372f 362a 3234 2923 .print (7/6*24)#
000000c0: 2323 3b61 6c65 7274 2032 232d 5b3e 2b3c ##;alert 2#-[>+<
000000d0: 2d2d 2d2d 2d5d 3e2d 2e7c 2328 7772 6974 -----]>-.|#(writ
000000e0: 6528 6966 283d 2031 2f35 202e 3229 3236 e(if(= 1/5 .2)26
000000f0: 2033 2929 2222 220a 3))""".
Możesz także skopiować i wkleić kod z tego „Wypróbuj online!” link .
Jest to dość kiepska gra w golfa, ale chciałem odrzucić pomysł, że gdy będziesz mieć wystarczająco dużo języków, liczba bajtów nie będzie już tak ważna. Powiedziawszy, że jest kilka języków, które wciąż mogę łatwo dodać (np. Objeck), ale obecnie są one zbyt długie, aby były przydatne. Skończyło mi się dobre języki, więc na razie mogę się tu zatrzymać.
Uruchom wszystkie programy z </dev/null 2>/dev/null
(tj. Puste wejście, zignorowany STDERR).
Wyjaśnienie jest dość długie, więc oto streszczenie:
No. Lang. Non-esolang? 2D esolang? BF/BF-deriv?
--------------------------------------------------------------------------
1 COW ✓
2 CoffeeScript ✓
3 Common Lisp ✓
4 Retina
5 Befunge-93 ✓
6 Python 2 ✓
7 Rail ✓
8 ETA
9 Prelude
10 Gol><> ✓
11 evil
12 Foo ✓
13 Ruby ✓
14 ><> ✓
15 Brian & Chuck ✓
16 Whitespace
17 3var
18 Axo ✓
19 Labyrinth ✓
20 Starry
21 Fission ✓
22 Brainfuck ✓
23 Julia ✓
24 Lily ✓
25 GolfScript
26 Chicken Scheme ✓
27 Thue
28 Perl 6 ✓
29 Picolisp ✓
30 TRANSCRIPT
COW jest pochodną Brainfuck z dodatkowymi poleceniami, z których jedno jest wyjściem numerycznym. Wszystko, co nieprawidłowe, jest ignorowane, więc wykonywany program jest po prostu
MoO OOM
co zwiększa komórkę do 1, a następnie drukuje ją jako liczbę.
CoffeeScript widzi:
# comments
###
multiline comment
###;alert 2# comment
który po prostu ostrzega 2.
(Tak, prawdopodobnie byłoby lepiej, gdyby ten język zajął ten slot, ale jestem zbyt leniwy, aby przetasować w tym momencie: P)
Common Lisp (clisp) widzi:
#|
multiline comment
|#(write(if(= 1/5 .2)26 3))"""
1/5
jest racjonalny i nie równy 0.2
, więc 3 jest drukowane. Postępowanie """
to błąd składniowy.
Zauważ, że print
wydaje się, że wypisuje poprzedni znak nowej linii i końcowe miejsce w Common Lisp. Jednak na szczęście write
działa zarówno w programie Common Lisp, jak i Chicken Scheme.
Wprowadzone ograniczenia : co druga linia zaczynająca się od pierwszej musi być poprawnym wyrażeniem regularnym.
Każda para linii tworzy etap zastępowania, zastępując wystąpienia dopasowania wyrażenia regularnego pierwszej linii drugą linią. Pośrodku mamy parę
„” „
który zastępuje początkowy pusty ciąg """
. Ostatnia pusta linia, nie będąca częścią żadnej pary, jest traktowana jako etap dopasowania, licząc liczbę dopasowań wyrażenia regularnego. Istnieją cztery przypadki pustego łańcucha """
, mianowicie 1"2"3"4
.
Befunge jest językiem 2D, a odpowiednie instrukcje są
# # 15g,@
w pierwszej linii i 5
w 25
linii. #
pomija następną instrukcję, 15g
pobiera znak w pozycji (1, 5)
w kodzie ( 5
w 25
wierszu), ,
wyświetla znak i @
zatrzymuje.
Python widzi:
# comments
25
print(4^2 +7)/2
"""
multiline string
"""
(4^2+7)/2 = (xor(4,2)+7)/2 = (6+7)/2 = 13/2 = 6
, który dostaje print
ed.
Rail jest językiem 2D, a wykonywanie rozpoczyna się od $
głównej funkcji, kierującej się na południowy wschód. Tak więc odpowiednią częścią kodu jest
$'main'
7
o
J
z o
i J
pochodzące z linii używanych przez TRANSCRIPT. Po wyprowadzeniu 7 pociąg uderza nierozpoznaną J
instrukcję, która powoduje awarię programu.
Wprowadzone ograniczenia: Znaki przed programem ETA nie powinny być wprowadzone etaoinsh
.
ETA rozpoznaje tylko litery etaoinsh
i ich duże litery, co oznacza, że kod zaczyna się od
NSaIeoe
n...e
popycha baza numer 7 w oparciu o to, co znajduje się wewnątrz ograniczników, które przez SaI
to 624
, lub 312 w systemie dziesiętnym. o
następnie wyprowadza jako char, najwyraźniej po modulo 256, podając char 8
(punkt kodowy 56). e
następnie próbuje podzielić się z pustym stosem, co się nie udaje.
Wprowadzone ograniczenia: Nie więcej niż jedna ()
w dowolnej kolumnie, ()
dopasowane czytanie kolumny na raz, brak nieskończonych pętli spowodowanych ()
.
Wymaga to ustawienia interpretera języka Python NUMERIC_OUTPUT = True
.
Preludium to język, w którym każda linia jest wykonywana osobno. Wykonuje się wiele znaków, ale ważną częścią jest
9!
w drugim wierszu, który wyprowadza 9. ()
w Preludium, oznacza pętlę, ale dzięki wyróżnieniu #
s (które wyskakują ze stosu), wierzchołki stosów są zawsze równe 0 do momentu uderzenia pętli, więc żaden z nich są uruchomione. ()
Jednak ograniczenia kodu źródłowego Prelude dotyczące wprowadzonych obcych przestrzeni.
Ta część (i> <>) działa jak odpowiedź Martina . Odpowiednim kodem jest
# ;n@0ea
Gol> <> jest językiem 2D i #
odzwierciedla adres IP, dzięki czemu podróżuje w lewo. Zawija się, pcha 10, 14 i 0 na stos. @
następnie obraca stos, podnosząc 10 na szczyt, n
wysyła go i ;
zatrzymuje program.
Ta część jest również podobna do odpowiedzi Martina.
zło ignoruje wszystko oprócz małych liter. Ignorując kilka dodatkowych znaków, odpowiednią częścią jest
aeeeaeeaww
gdzie a
inkrementuje zmienną A
, e
to funkcja splotu zła, która tasuje bity A
i w
generuje wyniki A
. Stąd produkujemy 1
dwa razy, dając 11
.
Ale co z resztą instrukcji, a zwłaszcza w
z ostatniej linii? Powiedzmy, że czasami najłatwiej jest po prostu zepsuć kod i modlić się, aby nadal działał we wszystkim, co tutaj ...
Foo wypisuje wszystko między podwójnymi cudzysłowami, więc odpowiednią częścią jest
"12"
w drugiej linii. Ponieważ jednak potrzebujemy później podwójnych cudzysłowów, używamy metody podobnej do odpowiedzi Martina, aby wyeliminować błąd Foo, a mianowicie poprzedniej #-1@
. Nie jest jasne, dlaczego to działa w języku, w którym żołnierze stoją w obliczu pustego stosu i dzielenia przez zero błędów, ale cieszę się, że tak.
Podobnie jak Python, Ruby widzi:
# comments
25
print(4^2 +7)/2
"""
multiline string
"""
Jednak warto zauważyć, że multiline ciąg jest faktycznie trzy oddzielne ciągi ( ""
, "..."
, ""
) sklejone. Linia wydruku drukuje (4^2+7) = xor(4,2)+7 = 6+7 = 13
, zanim popełnisz błąd, próbując podzielić nil
przez 2.
Ta część jest taka sama jak część Gol> <>, z @
tą różnicą, że zamiast niej 14 znajduje się na górze, co zostaje wyprowadzone.
Brian & Chuck to pochodna BF z dwiema taśmami, w których wskaźnik instrukcji jednej taśmy jest wskaźnikiem pamięci drugiej taśmy. W przypadku braku ```
pierwszych dwóch wierszy kodu źródłowego używa się do inicjalizacji taśm.
Odpowiednie znaki w pierwszych dwóch wierszach to:
?15
# >.>.
?
Taśmą Briana przekazuje kontrolę do Chucka w komórce wskazywanego (the #
) jest niezerowe. Następnie Chuck wykonuje >.>.
, wysyłając dwa znaki po znaku zapytania.
Używając odpowiednio STL
spacji, tabulacji i nowego wiersza, początek programu to:
SSSTSSSSL
TL
STL
L
L
Pierwszy wiersz wypycha 16 ( +10000
podstawa 2), poprzedni TLST
drukuje go jako liczbę. Kolejne trzy nowe linie zatrzymują program.
Należy jednak pamiętać, że ten program jest specyficzny dla interpretera. Reszta błędów składniowych kodu w większości interpreterów, dlatego wymagany jest bardziej łagodny interpreter, taki jak ten, do którego prowadzi link powyżej.
Z pierwszego wiersza wykonywanych jest mnóstwo instrukcji, ale odpowiednie są
kkmmao#/
Ze względu na ograniczenia ETA używamy k
do zmniejszania zmiennej B, a nie a
do jej zwiększania. kk
zmniejsza B do -2 i mm
kwadraty B dwa razy do 16, co jest zwiększane do 17 za pomocą a
. Jest to następnie generowane za pomocą o
.
#
jest następnie używany do resetowania B do 0 i /
powoduje błąd programu przez dzielenie przez 0.
Wprowadzone ograniczenia: Brak instrukcji przed programem Axo, które zmieniają kierunek IP
Po raz kolejny mnóstwo instrukcji jest wykonywanych w pierwszym wierszu, ale odpowiednie są
# # 15 ,@ 9 9 + { \
Axo jest językiem 2D, takim jak Befunge, i #
podobnie jest pomostem, który pomija następną instrukcję, ale tylko wtedy, gdy górna część stosu wynosi zero. 15,
push na stos, ale stos jest opróżniany @
. 99+
następnie popycha 18, {
wychodzi i \
zatrzymuje się.
Labirynt to kolejny język 2D, a wykonywane instrukcje to
#|#
[9!@
#
wypycha długość stosu, która po raz pierwszy wynosi 0. |
jest bitowe LUB, nie zmienia niczego, ponieważ stos ma w tym momencie po prostu #
zero , a drugi przesuwa teraz 1 z powodu samotnego zera. Skręcamy w prawo z powodu 1, 9
konwertuje to 1 na 1*10+9 = 19
, !
drukuje i @
zatrzymuje się.
Ten program opiera się na fakcie, że [
obecnie nie jest uznaną instrukcją, a zatem jest traktowany jak ściana.
Wprowadzone ograniczenia: Wszystkie +
s muszą mieć co najmniej jedną poprzednią spację
Jeśli usuwamy nierozpoznane znaki, odpowiednią częścią kodu jest
, +.. +
,
jest wejściem, ale ponieważ potokujemy /dev/null
stamtąd, nie ma żadnego, wypychając 0 na stos. A +
z n >= 5
poprzednimi spacjami popycha n-5
, więc następna instrukcja popycha 2. ..
następnie wypisuje te dwie cyfry w odwrotnej kolejności.
Następnie mamy +
jedną poprzedzającą spację, która się powiela. Jednak stos jest pusty, więc się pomyliliśmy.
Jedyną istotną częścią dla rozszczepienia jest
*"12"L
L
spawnuje atom poruszający się w lewo, "21"
drukuje 21 i *
zatrzymuje się.
Wprowadzone ograniczenia: Nie .
przed pierwszym[
Wymaga to interpretera, który podaje 0 na EOF i ma 8-bitowe komórki. Odpowiednim kodem jest
,+-[>.>.-+.>,>]-[>+<-----]>-..
Inital -
ma na celu przesunięcie +
, a pierwszy [...]
nie jest wykonywany, ponieważ komórka ma 0. Poniżej -[>+<-----]>-
ustawia komórkę na kod char 2
i ..
wysyła ją dwukrotnie.
Julia widzi:
# comments
25
print(4^2 +7)/2
Drukowane jest to 4^2+7 = pow(4,2)+7 = 16+7 = 23
, a program popełnia błąd, próbując podzielić nothing
przez 2. Zauważ, że Julia wydaje się nie przejmować faktem, że reszta kodu i tak spowodowałaby błąd składniowy.
Lily widzi:
# comment
#[
multiline comment
]## comment
print (7/6*24)# comment
7/6*24 = 1*24 = 24
jest drukowane.
GolfScript widzi:
# comments
25
print(
GolfScript jest oparty na stosie, więc 25 jest wypychany na stos, a następnie otwierany i drukowany print
. (
następnie próbuje zmniejszyć ukryty pusty ciąg na stosie, co kończy się niepowodzeniem i powoduje błąd programu.
Schemat kurczaka ma tę samą #| ... |#
składnię komentarzy wielowierszowych co Common Lisp. Jednak w
(write(if(= 1/5 .2)26 3))
1/5
jest liczbą zmiennoprzecinkową, która jest równa 0.2
, więc zamiast tego wyprowadzane jest 26.
Thue jest językiem opartym na przepisywaniu napisów. Pierwszą istotną częścią jest
f::=~27
::=
który definiuje podstawienie, f -> 27
oznacza koniec podstawienia za pomocą ::=
. Lone f
w if
zostaje zastąpiony 27
, który jest wyprowadzany.
Perl 6 ma nową składnię komentarzy, a mianowicie #`(some bracket)
komentarz wielowierszowy aż do pasującego nawiasu. Zatem Perl 6 widzi:
# comments
#`{
multiline comment
}# comment
print (7/6*24)# comment
który drukuje 7/6*24 = 28
.
Picolisp widzi:
# comment
#{
multiline comment
}#(prin 29)
który wypisuje 29. Następnie wiersz powoduje błąd składniowy.
TRANSCRIPT to esolang tematyczny wzorowany na przygodach tekstowych. Nierozpoznane linie są ignorowane (co pozwala dodać dodatkowy tekst historii / smaku do rzeczywistych instrukcji kodu), więc odpowiednie linie to:
Jo is here.
>Jo, 30
>X Jo
Pierwszy wiersz deklaruje zmienną łańcuchową Jo
, używając dwuliterowej nazwy, ponieważ nazwy jednoliterowe wydają się zawodzić. Drugi wiersz ustawia ten ciąg "30"
, który jest wyprowadzany przez X
(„badaj”) w trzecim wierszu.
2.7.1
celu2.7.n
. (W rzeczywistości Sweerpotato robi to samo z głównymi wersjami.)