# 4"16" 3//v\(@#/;\D"14"<;n4
#/*`3 afaaZ">;[77*,68*,@;'1,'1,q)(22)S# ␉␉␉␉ (
#yy␉;36!@
#`<` ␉
#=␉x
#<]+<[.>-]>[
#␉<
###xR+++++[D>+++++++L+++<-][<<<]>+.---.>][
#px%>~~~+␉+~*ttt*.x
#D>xU/-<+++L)
#R+.----.R␉>]|
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#|␉
print((eval("1\x2f2")and(9)or(13 ) )-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1111|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"␉*
###; console.log 39
""""#//
=begin␉//
#*/
#define␉z sizeof 'c'-1?"38":"37"
#include<stdio.h>
int main() /*/
#()`#`\'*/{puts(z);}/*'``
$'main'␉//
#-3o4o#$$$
<>"3"O.<␉>//
#
=end #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a>>>
#>27.say# /7Jn~15o|
#8␛dggi2␛`␉|1|6$//''25 =#print(17) ###^_^_LEintnd"3"z!]/}23!@/*///Z222999"26
␉
to dosłowna zakładka, ␛
dosłowny znak ESC; W innym przypadku wymiana stosów zmieniłaby program. Polecam skopiowanie programu z pola „input” linku TIO poniżej, jeśli chcesz na nim popracować.
Wypróbuj online!
Wynik VIP (wszechstronna drukarka liczb całkowitych): 0,01329
Zniszczony
Ten program drukuje 41 w brainf ***, 40 w Minimal-2D, 39 w CoffeeScript, 38 w C, 37 w C ++, 36 w Labirynt, 35 w INTERCAL, 34 w Rail, 33 incydent, 32 w Whirl, 31 w Modułowy SNUSP, 30 w białych znakach, 29 w Trigger, 28 w Brain-Flak, 27 w Perl 6, w Nim, 20 w Preludium, 19 w Reng, 18 w Kardynał, 17 w Julia, 16 26 w 05AB1E, 25 w Pip, 24 w Thutu, 23 w Hexagony, 22 w niedociążeniu,21w Pyth, 15 w Haystack, 14 w Turtlèd, 13 w Ruby, 12 w Fission , 11 w Befunge-98, 10 w Befunge-93, 9 w Perl 5, 8 w Retina, 7 w Japt, 6 w SMBF, 5 w Python 2, 4 w> <>, 3 w Minkolang, 2 w V / Vim i 1 w Python 3.
Weryfikacja
Większość języków jest testowana przez sterownik testowy pokazany powyżej. Możesz przetestować Reng tutaj i Modular SNUSP tutaj ; generują odpowiednio 19 i 31, zgodnie z wymaganiami.
Sterownik testowy został w końcu zaktualizowany o Tokenizer. Cały kod C jest przechowywany jako argument z perspektywy skryptu Bash. Zmieniłem również wyjście, aby zawijało się poziomo z końcem spacji po każdym tokenie zamiast wypisywać w pionie. To była tylko moja preferencja, aby dopasować ją do wyjścia Białej Przestrzeni. Ale każdy może to zmienić, jeśli uzna, że jest to zbyt mylące.
Dokonałem także korekty sterownika testowego, aby obsłużyć odstępy między kolumnami dla znaku UFT8 Turtlèda w podsumowaniu. Ta niewspółosiowość doprowadzała mnie do szału! „Poprawka” jest dość hackingowa, ponieważ po prostu szuka è i zmienia szerokość kolumny dla tego przypadku, ale wykonuje zadanie.
Wyjaśnienie
Po pierwsze, chcę powiedzieć, jak niesamowite jest @ SnoringFrog's wszechstronny wynik w postaci całkowitej kodu z ostatniego postu. Od jakiegoś czasu obliczam odpowiedzi, a to zainspirowało mnie do tego, by pozostać małym. Myślę, że w końcu możemy pokonać odpowiedź @ sp3000.
Zacząłem więc pracować nad tą odpowiedzią, próbując grać w golfa, co mogłem i byłem całkiem udany. Miałem nawet odpowiedź w innym języku z całkowitą liczbą bajtów mniejszą niż # 40. Ale kiedy próbowałem grać w golfa w trybie Minimal-2D, musiałem nauczyć się BF, aby móc lepiej pracować z jego pochodnymi, i w tym procesie znalazłem rekord @ Primo Witaj, świecie! . Zakochałem się w elegancji.
Okazało się, że minimal-2D nie było wystarczająco wydajne, aby wykorzystać technikę inicjalizacji taśmy używaną przez @Primo, ale teraz jestem zdania, że i tak byłby zbyt ciężki. W końcu próbujemy tylko wydrukować liczbę całkowitą. Ale @Primo posłało mnie ścieżką do nauki mnożenia w BF, którą przyniosłem do kodu Minimal-2D.
Potem, po tym wszystkim, ponownie przeczytałem komentarz @ SnoringFrog o tym, jak dołączyć BF i zdałem sobie sprawę, że nie tylko mogę to zrobić, ale mogę użyć dużej części kodu Minimal-2D, który zagrałem w golfa w odpowiedzi na BF. Więc wkopałem się, żeby odpowiedzieć z BF, i oto jesteśmy.
Jeszcze jedna rzecz, zanim przejdę do szczegółów. Wprowadziłem kilka zmian z powodów innych niż golf. Najpierw przeniosłem większość kodu @SnoringFrog dodanego nieco poniżej języków 2D w kilku górnych wierszach. Dla mnie jest to długoterminowy ruch strategiczny, aby zapobiec przemieszczaniu się 2D-lang po środku poliglota, aby w miarę możliwości zapobiec przyszłym błędom. Liczba uderzeń bajtu była niska dla tego ruchu, więc wybrałem go.
Po drugie, podczas różnych ponownych czynników dowiedziałem się, że Begunges i Minkolang generują spację końcową po wynikach liczbowych i że była to przyczyna pustych bajtów, które widzieliśmy w sterowniku testowym dla tych języków. Naprawiłem je, wyprowadzając wartość stosu jako kod ascii (który nie zawierał spacji końcowej), zamiast wartości bezpośrednio. Wystąpił także mały bajt dla tej zmiany, ale teraz wyjście sterownika testowego jest tak jednolite. Jak mógłbym nie?
SM / BF
Szybko przejrzyjmy podstawy. Są to jedyne prawidłowe polecenia dla SMBF i BF:
> Move the pointer to the right
< Move the pointer to the left
+ Increment the memory cell under the pointer
- Decrement the memory cell under the pointer
. Output the character signified by the cell at the pointer
, Input a character and store it in the cell at the pointer
[ Jump past the matching ] if the cell under the pointer is 0
] Jump back to the matching [ if the cell under the pointer is nonzero
Oba języki mają taśmę pamięci, w której wartości są przechowywane i zmieniane. Jedyną różnicą SMBF jest to, że niezależnie od wykonywanego kodu zapisywany jest również na taśmie pamięci po lewej stronie punktu początkowego. Jak wskazał @SnoringFrog, uzyskanie przez SMBF i BF różnych wyników zależy od przesunięcia wskaźnika pamięci na lewo od źródła. W interpretatorze BF Tio wskaźnik pamięci może przesuwać się w lewo od początku i znajdzie zera zamiast kodów ascii Polyglota, które widzi SMBF. Oto przykład, który można uruchomić zarówno w SMBF, jak i BF, aby zilustrować różnicę.
Na początku poliglota Befunges wymagają >
ukończenia drugiego rzędu, a Perl6 wymaga, aby każdy >
poprzedzony był znakiem <
. Tak więc SM / BF zacznij od <>
pozostawienia wskaźnika pamięci na początku, a następnie naciśnij a[
który przeskakuje ofensywne znaki dla obu języków do ]
szóstego rzędu.
Następnie zwiększamy komórkę pamięci pochodzenia dla obu języków i przesuwamy wskaźnik pamięci w lewo za pomocą +<
. (W przypadku konwencji konwersacyjnej komórkę pamięci pochodzenia nazywamy komórką 0, komórkami po prawej stronie początkowej 1, 2, ... oraz komórkami po lewej -1, -2,…). Komórka -1 zawiera kod asci ostatniego znaku w poliglocie w SMBF i 0 w BF, więc po [
napotkaniu następnego , tylko BF przeskakuje do następnego]
podczas gdy SMBF przechodzi do kodu.
Podczas przechodzenia SMBF [.>-]
drukuje 6 znalezione na końcu poliglota, a następnie przesuwa wskaźnik pamięci z powrotem do komórki 0, ustawiając jego wartość z powrotem na zero, aby wyjść z]
. Aby przejrzeć, taśmy w tym kuflu są następujące: komórki ujemne SMBF przechowują poliglota, a ich 0, a komórki dodatnie zawierają zero. Komórki ujemne i dodatnie BF mają zero, podczas gdy komórka początkowa ma 1.
Następnie >
przenosi SMBF do komórki 1 i BF z powrotem do komórki 0, umożliwiając BF wprowadzenie swojego prywatnego kodu: [<+++++[>++++++++++<-][<<<]>+.---.>]
( Usunąłem z tego znaki inne niż BF). Wracamy do komórki -1 i inicjalizujemy naszą zmienną kontrolną pętli (komórka -1) do wartości 5. Następnie wchodzimy do pętli, w której dodajemy 10 do komórki 0 i zmniejszamy komórkę -1 pięć razy przed wyjściem z pętli, w której będziemy wskazywać na komórkę -1 o wartości 0.
Następnie napotykamy [<<<]
wskazując na zero, więc BF nie przechodzi przez to. Ma to na celu zrównoważenie liczby >
poprzedzających<
, aby Perl6 nie popełnił błędu.
W tym momencie komórka 0 jest wyceniana na 51. Wartość ascii 4 wynosi 52, więc przenosimy wskaźnik do komórki 0, dodajemy 1, a następnie wypisujemy wartość. Na koniec zmniejszamy komórkę 0 z powrotem do znaku ascii 1 i drukujemy ponownie przed ustawieniem wskaźnika pamięci na komórkę 1 (wartość 0), aby wyjść poza ]
.
Zarówno SMBF, jak i BF uderzają w ostatnią [
linię 8, podczas gdy obie spoczywają na wartości 0. Więc oba przeskakują obok pozostałego kodu Minimal-2D, aż ]
napotka się go w linii 11. Ale to trwa krótko, ponieważ linia 12 zaczyna się od innej[
który prowadzi oba języki do prawie końca poliglota, gdzie nie napotyka się dalszych instrukcji.
Refaktorzy
Minimal-2D
Ponowne zapisywanie Minimal-2D miało głównie na celu zaoszczędzenie niektórych bajtów w sposób podobny do sztuczki mnożenia przez BF. Minimal-2D jednak nie ma znaków [
i ]
do kontroli pętli. Zamiast tego ma następujące polecenia:
/ Skips next instruction if the data pointer is set to 0.
U Tells the program to switch to the up direction of processing instructions.
D Tells the program to switch to the down direction of processing instructions.
L Tells the program to switch to the left direction of processing instructions.
R Tells the program to switch to the right direction of processing instructions.
Można ich użyć do stworzenia tej samej struktury logicznej, choć w dworku 2D, jak w BF. Na przykład, BF ++++++[>++++++<-]>.
jest równoważne z tym w Minimal-2D.
Oto uproszczona wersja kodu Minimal-2D w poliglocie, z usuniętym wszelkim obcym kodem i zastąpionymi wszystkimi znakami zawierającymi miejsce #
.
###################D
###R+++++[D>+++++++L
###>
D>#U/-<+++L)
R+.----.R
W D
linii 1 wysyła wskaźnik instrukcji w dół do L
wiersza 8 poliglota, który wysyła wskaźnik w lewo. Tutaj ustawiamy zmienną kontrolną pętli (komórka 0) na 7, przesuwamy wskaźnik pamięci do komórki 1 i wchodzimy do pętli. W pętli dodajemy 3 do komórki 1, zmniejszamy komórkę 0, a następnie sprawdzamy, czy wartość komórki 0 jest jeszcze równa zero. Jeśli nie, dodajemy kolejne 8 do komórki 1, a następnie zmniejszamy i sprawdzamy ponownie. Wynikiem tej pętli jest to, że wartość komórki 1 jest ustawiona na 51 na końcu pętli (6 * 8 + 3).
Wychodzimy z pętli, przeskakując U
, przesuwając wskaźnik pamięci do komórki 1 i schodząc w dół, a następnie w prawo na linii 11 poliglota. I na koniec, zwiększamy do wartości ascii dla 4, a następnie zmniejszamy do wartości ascii dla 0, zanim wybiegniemy w prawo, aby zakończyć program.
Siatkówka oka
Siatkówka miała wiele wymagań, z którymi trudno było pracować dla wszystkich pochodnych BF. Nie lubi kolejnych +
lub niedopasowanych ()
lub []
. Ale tak naprawdę są to tylko wymagania dla każdej innej linii, więc wiele pracy dla BF, SMBF i Minimal-2D obracało się wokół umieszczenia dużej części kodu na liniach parzystych.
Jednak jeden bajt |
przypisany wyłącznie do Retiny znajduje się na końcu linii 11. Cytując @ ais523 „większość wyrażeń regularnych kończących się na | dopasuje wszystko ”. Bez tego Retina zwraca 0. Dlaczego to naprawia, nie wiem. Nie musiałem zbyt długo wkopywać się w siatkówkę, prawdopodobnie dlatego, że unikałem długiej linii. Ale tak jak Preludium, stwierdziłem, że nie muszę go tak rozumieć, jak muszę zrozumieć, jak go debugować, co w tym przypadku polegało głównie na usuwaniu linii (w wielokrotnościach 2), dopóki nie znalazłem linii to powoduje, że się psuje. Domyślałem się tej poprawki na podstawie komentarza @ ais523 i zostałem nagrodzony. Chyba jestem po prostu zbyt fajny do szkoły.
Kardynał
Zdarzyło mi się, że @ SnoringFrog umieścił Minimal-2D w stosunku do kodu Cardinal. Jest to dobra lokalizacja, biorąc pod uwagę, że kardynał nie denerwuje siatkówki i wydaje się, że pozwala na pewne przeplatanie z Minimal-2D. Kiedy więc postanowiłem przeszczepić ziemię od Minimal-2D do 2D, zabrałem Kardynała na przejażdżkę. Kardynał wprowadził jednak kilka kosmetycznych zmian. Najpierw rzuciłem >
prawie początek instrukcji #p x%>~~~+ +~*ttt*.x
dla Minimal-2D, aby zmienić wskaźniki pamięci w jego pętli / Po drugie, przesunąłem wszystko o jeden znak w prawo, aby dać Minimal-2D miejsce, aby mógł z wdziękiem wyjść z pętli. p
W tym użądlenia jest dla tej postaci wyściółki.
Befunge / 98
Befunges to miejsce, w którym zacząłem grać w golfa w poliglocie, ponieważ refaktor C ++ zmienił cały pozostały kod 2D, z wyjątkiem tego. Próbując dowiedzieć się, że WTF dzieje się w tym kodzie, znalazłem to w dokumentacji Begunge:
.
Komenda pokaże wartość ze stosu i wyjście je jako liczba dziesiętna, a następnie przez przestrzeń , trochę jak Forth. ,
wstawi wartość, zinterpretuje ją jako wartość ASCII znaku i wyświetli ten znak ( bez spacji ).
Święty Moley! Możemy wyczyścić bajty zerowe na wyjściu. Potem wszystko polegało tylko na ustaleniu, jak wprowadzić większe wartości asci i segregowaniu kodu. Befunge-98 miał kod skoku ;
informując go, aby przejść nad [77*,68*,@
IN;[77*,68*,@;'1,'1,q
, który dał nam segregację.
Befunge-98 miał również polecenie ( '
), aby pobrać kod ascii następnego znaku. Tak więc '1,
bierze kod asci kodu dla znaku 1
, umieszcza go na stosie, a następnie drukuje znak ascii dla najwyższej wartości na stosie za pomocą ,
. Muszę to zrobić dwa razy, aby wydrukować 11 i rzucić, q
by rzucić wdzięcznie.
Befunge właściwy jest trochę mniej wygodny, ale tylko sprawiedliwy. Tutaj musimy wykonać obliczenia, aby umieścić żądany kod na stosie. Na szczęście nasze kody zostały łatwo pomnożone przez 7 * 7 i 6 * 8 przed tym samym poleceniem wyjściowym ,
. Następnie opuściliśmy Befunge, @
zanim kod jego starszego brata zanieczyścił wynik.
Minkolang
Po znalezieniu poprawki dla końcowych spacji Befunge, byłem bardzo podekscytowany pomysłem znalezienia poprawki Minkolang, a dokumentacja Minkolanga mówi, że komenda wyjściowa, która była używana do tego momentu, działała w taki sam sposób, jak interpreter Befunge. O
okazało się, że zostało to udokumentowane jako inne polecenie wyjściowe, które nie zostało opisane jako udostępnianie tego Begunge-ness, więc po prostu zrobiłem zdjęcie w ciemności i próbowałem wyprowadzić ciąg "3"
. Bezbłędne zwycięstwo.
> <>
Jedną z pierwszych rzeczy, na które patrzyłem, przenosząc kod Minimal-2D, było sprawdzenie, czy mogłem wraz z nim przenieść> <>. Gdybym miał do czynienia z transwersalizmem poliglotycznym 2D, miałbym do czynienia ze wszystkimi przestępstwami. Zasadniczo szczęście rzuciłem się na rozwiązanie polegające ;n4
na umieszczeniu na końcu linii 1 i przesunięciu \D
dalej z powrotem do linii 1. BTW, nie wiedziałem, że> <> można skierować w dół przed odpowiedzią 40, ponieważ jest ona tak dobrze zamknięta . Chciałbym pomyśleć, że można to później wykorzystać do odróżnienia> <> od innego podobnego języka.
Perl6
Mówiłem o niektórych <>
problemach z równoważeniem Perl6 gdzie indziej w tej odpowiedzi, więc nie zamierzam tego więcej omawiać. Ale chcę podkreślić, że przeszedłem #>27.say#
do drugiej do ostatniej linii. To nie ma funkcjonalnego celu w tej odpowiedzi. Wykonałem ten ruch, aby spełnić inną odpowiedź, że ostatecznie nie skorzystałem z tej rundy. Postanowiłem po prostu to zostawić, ponieważ planuję opublikować tę odpowiedź przy następnej okazji i nie chciałem zawracać sobie głowy cofaniem i ponownym robieniem tego.
Poprawki błędów
05as1e
05as1e zdecydowanie nie podobał się nowy kod Begunge tak bardzo, jak stara wersja. Przypuszczam, że to ,
s, ponieważ jest to jedyna rewolucyjna postać. W każdym razie musiałem przesunąć się "
dalej w drugim wierszu, aby ukryć ofensywne polecenia, i wiedziałem, że "
musiałem przejść przed ścieżką kodu Befunge, ponieważ "
było to tak w obu językach. (Mogę tylko wymyślić terminy takie jak „tak”, prawda?) <
Dwuwymiarowość linii 2 jest dość sztywna, ale udało mi się zastąpić ścieżkę kodu przed Begunge za pomocą "
. <
Był jednak wymóg Perl6. (Musi mieć <
poprzedzające wszystkie >
s.) Byłem w stanie upuścić <
linijkę pierwszą w miejscu określonym przez instynkt i uprzedzić, rozwiązując 05ab1e i Perl6 niezgodę.
Wir
Zmiany Befunge na linii 2 dodały dodatkowy element 1
do poliglota przed linią Incydent / Wir. To dodatkowe 1
spowodowało, że Whirl zaczął wskazywać niewłaściwe instrukcje na kierownicy. Pierwszą 1
w dyrektywie preprocesora C / C ++ była tylko odwołanie do numeru linii w kodzie, i może to być równie łatwo dowolny inny numer linii, więc dowolnie zmieniłem to, 4
aby zadowolić Whirl.
Incydent
Detokenizujący ciąg na końcu poliglota jest w tym momencie dobrze znany, więc nie będę w niego wchodził. Usunąłem z łańcucha, co mogłem i dodałem nowe wymagane tokeny. Są 2 detokenizujące postacie, których nie ma w tym ciągu, choć powinienem zwrócić uwagę. Pierwszy, drugi R
w #R+.----.R >]|
potrzebne jest tutaj, ponieważ jest to punkt wyjścia Fusion, i było bezpieczniej na tej linii, ponieważ nie było już nagłówek punktem wyjścia Fusion w tym samym kierunku. Po drugie, x
w #= x
to, aby usunąć znak zaangażowany w ␉␊#
wzoru, który stał się bardziej powszechne.
Inne
Sześciokąty, Białe spacje i Preludia miały zwykle drobne poprawki, ale nic specjalnego, o czym warto mówić.
Końcowe przemyślenia
To wszystko, co mam na tę odpowiedź. Tym, którzy szukają punktu wyjścia do następnej odpowiedzi, sugeruję zło. Wydaje się to wykonalne, chociaż nie przyjrzałem się temu zbyt dokładnie, ale podejrzewam, że integracja nie byłaby zbyt trudna. Wiem, że ma komendę skoku, która powinna pomóc przejść obok dużej części poliglota. Powodzenia.