Dodaj język do poliglota


239

Jest to wyzwanie w którym każda odpowiedź opiera się na poprzedniej odpowiedzi. Polecam sortowanie wątku według „najstarszego”, aby mieć pewność co do kolejności, w jakiej posty są tworzone.

Uwaga : stało się to dość długotrwałym wyzwaniem, a publikowanie nowych odpowiedzi jest dość trudne. Jako taki, teraz jest dostępny pokój czatowy dla tego wyzwania, na wypadek, gdybyś potrzebował porady na temat konkretnej części potencjalnej odpowiedzi, miał pomysły na języki, które można dodać lub tym podobne. Zapraszam do odwiedzenia, jeśli masz coś o co zapytać lub powiedzieć!

Zadanie

N th programem, które zostaną przedłożone musi działać w n różnych językach; w szczególności wszystkie języki dodane w poprzednich programach, które należy przesłać, oraz jeszcze jeden. Program musi wypisać 1, gdy działa w pierwszym języku używanym w odpowiedziach na to pytanie, 2, gdy działa w drugim języku i tak dalej. Na przykład pierwsza odpowiedź może wypisać 1, gdy zostanie uruchomiona w Pythonie 3, a druga odpowiedź może wygenerować 1, gdy uruchomiona w Pythonie 3 i 2, gdy uruchomiona w JavaScript; w tym przypadku trzecia odpowiedź musiałaby dać 1, gdy uruchomiona w Pythonie 3, 2, gdy uruchomiona w JavaScript i 3, gdy uruchomiona w innym języku.

Dodatkowe zasady

  • Twój program musi działać bez błędów i awarii. Ostrzeżenia (i inne dane wyjściowe stderr) są dopuszczalne, ale program musi wyjść normalnie (np. Przez zjechanie z końca programu lub za pomocą polecenia, exitktóre wykonuje normalne zakończenie programu).

  • Dane wyjściowe muszą być tylko liczbą całkowitą, ale końcowe znaki nowego wiersza są prawidłowe. Inne nieuniknione wyjście standardowe jest również dozwolone. Przykłady: nazwa i wersja tłumacza w Befunge-93, spacja po wydrukowanym ciągu w Zephyr. Niektóre języki zapewniają dwie metody drukowania - ze spacją i bez spacji; w takim przypadku należy zastosować metodę bez spacji końcowej.

  • Każda odpowiedź nie może być dłuższa niż 20% lub 20 bajtów (w zależności od tego, która wartość jest większa) niż poprzednia odpowiedź. (Ma to zapobiec używaniu języków takich jak Lenguage spamujących wątek i zachęcić przynajmniej niewielką ilość golfa.)

  • Używanie różnych wersji tego samego języka jest dozwolone (chociaż oczywiście będą musiały wydrukować różne liczby, więc musisz dopasować kontrolę wersji do poliglota). Nie możesz jednak użyć funkcji języka, która zwraca numer wersji języka. Powtórzenie dokładnie tego samego języka jest oczywiście niemożliwe (ponieważ program musiałby deterministycznie wydrukować jedną z dwóch różnych liczb).
  • Sztuczki, takie jak nadmierne nadużywanie komentarzy, mimo że zostały zbanowane w niektórych konkursach poliglotycznych, są w porządku.
  • Nie musisz używać poprzednich odpowiedzi jako przewodnika po pisaniu własnego (możesz przepisać cały program, jeśli chcesz, pod warunkiem, że jest zgodny ze specyfikacją); jednak opieranie odpowiedzi głównie na poprzedniej odpowiedzi jest dozwolone i prawdopodobnie najłatwiejszym sposobem na rozwiązanie.
  • Nie możesz przesłać dwóch odpowiedzi z rzędu. Pozwól komuś innemu pisać. Ta zasada obowiązuje do momentu spełnienia warunku zwycięstwa.
  • Ponieważ to wyzwanie wymaga od innych konkurentów publikowania w tych samych językach, w których jesteś, możesz używać tylko języków z darmową implementacją (tak jakby to był konkurs ).
  • W przypadku, gdy język ma więcej niż jednego tłumacza, możesz wybrać dowolnego tłumacza dla dowolnego języka, o ile wszystkie programy, które mają działać poprawnie w tym języku, robią to w tym tłumaczu. (Innymi słowy, jeśli program działa w więcej niż jednym tłumaczu, przyszłe posty mogą wybrać jednego z tych tłumaczy, zamiast wpisu „blokującego” określony wybór tłumacza dla danego języka).
  • To wyzwanie wykorzystuje teraz nowe reguły PPCG dotyczące wyboru języka : możesz użyć języka lub tłumacza, nawet jeśli jest nowszy niż pytanie. Nie możesz jednak używać języka / tłumacza nowszego niż pytanie, jeśli a) język został zaprojektowany do celów poligloty lub b) język został zainspirowany tym pytaniem. (Tak więc nowo zaprojektowane praktyczne języki programowania prawie na pewno będą w porządku, podobnie jak niepowiązane esolangi, ale takie rzeczy, jak A Pear Tree , które zostało zainspirowane tym pytaniem, są zakazane). Uwaga: nie zmienia to ważności zaprojektowanych języków dla poliglotów starszych niż to pytanie.
  • Pamiętaj, że warunek zwycięstwa (patrz poniżej) został zaprojektowany w taki sposób, że zerwanie łańcucha (tj. Uniemożliwienie komukolwiek odpowiedzi po tobie za pomocą języka trudnego do poliglota w innych językach) zdyskwalifikuje cię z wygranej. Celem jest, aby iść tak długo, jak to możliwe, a jeśli chcesz wygrać, musisz to uszanować.

Format odpowiedzi

Ponieważ wszystkie odpowiedzi zależą od siebie, spójny format odpowiedzi będzie pomocny. Zalecam sformatowanie odpowiedzi w taki sposób (jest to przykład drugiego linku w łańcuchu):

2. JavaScript, 40 bajtów

(program goes here)

Ten program wypisuje 1 w Pythonie 3 i 2 w JavaScript.

(jeśli chcesz wyjaśnić program, techniki poliglotyczne itp., umieść je tutaj)

Warunek zwycięstwa

Gdy przez 14 dni nie będzie żadnych nowych odpowiedzi, zwycięzcą zostanie ten, kto opublikował drugą najnowszą odpowiedź, tj. Największy poliglot, o którym udowodniono, że nie zepsuł łańcucha. Jednak przedłużanie łańcucha jest nadal bardzo mile widziane!

Zwycięzcą jest Szansa , patrz odpowiedź 194 (TemplAt) .

Lista języków


3
Dla osób, które mogą zobaczyć usunięte posty: post Sandbox był tutaj .

5
Nie ma potrzeby kopiowania poprzedniego programu, chociaż oczywiście można go użyć jako przewodnika; Ponowne wykonanie programu od podstaw może potrwać dłużej! Nie ma potrzeby bezpośredniego łączenia się z odpowiedziami; sortowanie według najstarszych wyświetli już wszystkie odpowiedzi w kolejności.

3
@ ais523 Myślę, że miał na myśli to, że powinny zawierać nowe odpowiedzi, wypróbuj linki z nowym kodem?
Blue

5
Myślę, że potrzebujemy skryptu, który pobiera szesnastkowy zrzut kodu i automatycznie uruchamia go we wszystkich językach ...
mbomb007,

3
Jest to wszechstronna drukarka liczb całkowitych opublikowana jako inny rodzaj wyzwania. (Inspiracja?) Ostateczna odpowiedź (obecnie) 0.0127padłaby, pobita jedynie przez 30-językowe zgłoszenie Sp3000 ... :)
Stewie Griffin,

Odpowiedzi:


80

Uwaga: jeśli zobaczysz to jako pierwsze, możesz posortować według najstarszych

17. Julia (128 bajtów)

#v`16 "<" 6/b0\ .q@#;n4"14""
#>3N9@15o|R"12"*^
#=|
print((1/2and 9 or 13)-(0and+4)^1<<65>>62);# =#;print(17)
#gg99ddi2` |1|1+6

W ostatnim wierszu znajdują się dwa ESC, jeden przed pierwszym, ga drugi po 2. Można by grać bardziej w golfa, ale dzięki V i Pythowi wszystko się popsuło.

Drukuje 1 w Python 3, 2 w V, 3 w Minkolang, 4 w> <>, 5 w Python 2, 6 w SMBF, 7 w Japt, 8 w Retina, 9 w Perlu, 10 w Befunge-93, 11 w Befunge -98, 12 w Fission, 13 w Ruby, 14 w Turtléd, 15 w Haystack, 16 w Pyth i 17 w Julii .


Poradnik:

  • Początek czwartej linii to Python 2/3, Perl, Ruby. Koniec to Julia, dzięki #=wieloliniowym komentarzom (zauważ, że Julia nie ma and/or).
  • V jest <ESC>gg99ddi2<ESC>, co zdecydowanie nadaje się do gry w golfa, ale V jest denerwujące, aby przetestować Wypróbuj online! ponieważ tłumacz jest dość wolny.
  • Minkolang i Haystack najpierw padają v. Befunge-93 i -98 nie, i zależą od b.
  • Retina liczy liczbę spacji i 1s w czwartym wierszu, a V ukrywa się w konfiguracji dla Retina (tj. Przed kliknięciem wstecz).
  • Zgodnie ze wskazówką @ ETHproduction, Japt wykorzystuje backsticks, aby ukryć większość kodu w ciągu.
  • Rozszczepienie jest R"12"*.
  • SMBF został rozegrany <.w pierwszej linii plus finał 6.

24
Gdzie zniknął kod wszystkich pozostałych
Alfie Goodacre,

13
159 bajtów na 128 bajtów? Wow, to świetna gra w golfa!
Krowy szarlatan

6
Ładne, 2 ^ 7 bajtów
tomsmeding

7
Wow ... niesamowite! Będziemy musieli napisać nowe wyjaśnienie dla każdego języka, kiedy wszystko zostanie powiedziane i zrobione ;-)
ETHproductions

4
@AlfieGoodacre „Nie musisz używać poprzednich odpowiedzi jako przewodnika po pisaniu własnego (możesz przepisać cały program, jeśli chcesz, o ile jest zgodny ze specyfikacją)”
mbomb007

52

23. Sześciokąt , 186 bajtów

Przepraszam, jeśli to popsuło plany ...

#v`16/"<"6/b.q@"(::):::  (22)S#;n4"14"
#>3N6@15o|> ^*ttt*~++~~~%
#=~nJ<R"12";
#[

print((1/2and 9 or 13)-(0and+4)^1<<65>>62)#46(89999+++++!)=#print(17)#0\32=""<0]#echo 21
#8␛dggi2␛` |1|6

␛ jest używany do przedstawienia dosłownego znaku ESC.

Wydruki:

23 w Hexagony , 22 w Underload , 21 w Nim, 20 w Preludium, 19 w Reng ( tutaj do przetestowania ), 18 w Cardinal, 17 w Julii, 16 w Pyth, 15 w Haystack, 14 w Turtlèd, 13 w Ruby, 12 w Rozszczepienie, 11 w Befunge-98, 10 w Befunge-93, 9 w Perlu, 8 w Retinie , 7 w Japt , 6 w SMBF, 5 w Python 2, 4 w> <>, 3 w Minkolang, 2 w Vim / V oraz 1 w Python 3.

Aby przejść do niepowiązanych języków, kliknij change languageprzycisk w prawym górnym rogu łącza Sześciokąta.


Sześciokąt nie jest czytelny (w ogóle) w tym formacie. Musimy na to spojrzeć w formie heksagonalnej.
Zauważ, że 2 znaki ESC zostały zastąpione przez s, więc możesz je zobaczyć - są one ignorowane, więc w programie nie ma innych:

        # v 1 6 / " < " 6
       / b . q @ " ( : : )      A lot more readable, right?? No?
      : : : ( 2 2 ) S # ; n
     4 " 1 4 " # > 3 N 6 @ 1
    5 o | > ^ * t t t * ~ + +
   ~ ~ ~ % # = ~ n J < R " 1 2
  " ; # [ p r i n t ( ( 1 / 2 a
 n d 9 o r 1 3 ) - ( 0 a n d + 4
) ^ 1 < < 6 5 > > 6 2 ) # 4 6 ( 8   | Note that the 0s below can be replaced
 9 9 9 9 + + + + + ! ) = # p r i    | With anything (except "`" or " "), 
  n t ( 1 7 ) # 0 \ 3 2 = " " <     V as far as Hexagony is concerned
   0 ] # e c h o 2 1 # 8 ␛ d g
    g i 2 ␛ | 1 | 6 . . . . .    <-- the ␛ represents an esc
     . . . . . . . . . . . .         character
      . . . . . . . . . . .
       . . . . . . . . . .       A "." is a no-op
        . . . . . . . . .
                ^
                | Mirror wraps to here, going NW

Dla tych, którzy nie znają Sześciokąta , istnieje 6 adresów IP, które zaczynają się na 6 rogach. Tylko 1 jest aktywny jednocześnie i można je przełączać za pomocą #][. Model pamięci nie jest tak ważny dla tego programu, ale może być konieczny do zrozumienia w przyszłości. Wszystko, co musisz wiedzieć, to że 1 int jest przechowywany w „zboczu pamięci” (w skrócie ME) i '"}{zmień ME, które jest aktywne.

\/|_>< są zwierciadłami kontrolującymi przebieg programu.

Tak to działa:

Wykonano pierwszą linię:

#       A no-op (sets active IP to 0, the currently active one)
 v      letter chars set the ME to their ASCII value - so ME is now 118
  16    Like Labyrinth, 0-9 multiplies ME by 10 and is added - ME now 11816
    /   A mirror that sends IP going NW by wrapping to the bottom

Spód (fragment odwrócony w pionie, aby można było czytać w górę iw dół):

    .   
   .    A series of no-ops. The IP is going NW now,
  .     because of the mirror on the top.
 .
|       Another mirror. This one sends the IP NE, into the h
 h      sets the ME to 104, the ASCII value for h
  #     104 % 6 == 2, so IP 2 is now active instead of 0

Prawa krawędź:

        8  IP #2 is moving SW, starting in the right corner 
       i   Sets the ME to 105
      <    Mirror. Sends the IP going due West
    ""     These change the Active ME - just know that the new edge is 0
   =       Changes the MP (more in specs) - effectively a no-op used to fill space
\32        pushes 23, and mirrors up NE to the !

Ostatni kawałek odpowiedniego kodu:

!          Prints the current value of the ME as an int. Success!
 20(R~     Does things to the ME - irrelevant now
      @    Ends the program!

Ważne uwagi:

  • Sześciokąty upuszczają wszystkie si `przed wykonaniem, więc wszelkie zmiany tych zmian nie wpłyną na Sześciokąt
  • Musiałem uzupełnić kod, aby był interpretowany jako sześciokąt o długości 9, zamiast 8 - uważaj na golfa poniżej 169 lub powyżej 217 odpowiednich znaków
  • Z tego powodu cyfry ~~~i 2 0na końcu można zmienić bez szkody dla kodu
  • Po =""prostu odsuwa ME od poprzedniego, aby nowy ME mógł zostać zmodyfikowany. Mogą one być zastąpione innymi postaciami, które robią to samo, bez szkody dla programu hexagony ( 's, na przykład)
  • Technicznie nie jest to zgodne ze specyfikacjami Befunge 93, ponieważ ogranicza ramkę graniczną kodu do 80 o 25 znaków. Jednak większość interpreterów ignoruje tę specyfikację (jak TIO), więc osobiście nie sądzę, żeby to była wielka sprawa. Jeśli tak, możesz dodać komentarz. (Jeśli naprawdę chcę, abym to zmienił, spróbuję)
  • Mam nadzieję, że nie jest to teraz zbyt trudne.

1
To może łatwo stać się najbardziej szalonym przebiegiem programu, jeśli zostanie wykonane prawidłowo. Byłem bliski zrobienia tego z sześciokątem wielkości 8 jakąś szaloną metodą @ ##, ale 9 było o wiele łatwiejsze, kiedy spróbowałem. Ponadto wersja 1 TIO działa znacznie szybciej, ale nie można łatwo przełączać języków.
MildlyMilquetoast

Sugerowałbym następnie Labirynt, ale chcę to zrobić.
MildlyMilquetoast,

Nie mam wystarczających umiejętności, by sam napisać coś takiego, ale tymczasem czekam na pojawienie się Cubixa.
Pavel

@pavel Nie znam tego języka. Zakładam, że to 3D. Brzmi nieźle. Istnieją również grzyby 3D, które mogą być ciekawym dodatkiem
MildlyMilquetoast

Podejrzewam, że najłatwiej jest utrzymać coś takiego jak ten przepływ, o ile wciąż jesteśmy na tej stronie, i po prostu przepisać kod Sześciokąta, gdy przejdziemy do następnego rozmiaru. Jeśli chodzi o języki 3D, Trefunge powinien być dość łatwy do dopasowania, zakładając, że żaden z istniejących języków nie panikuje na widok formfeed. (Również Cubix został opublikowany wcześniej, ale usunięty, ponieważ plakat uznał, że może to być zbyt trudne; utrzymanie Hexagony i Cubix na raz może być dość mylące ...)

52

50. uderzenie, 1024 bajty

#16  "(}23!@)" 3//v\D(@;'[af2.qc]GkGGZ'#)"14";n4
#/*` "[!PPP(22)SP(>7 7*,;68*,@;'1,@ ␉␉␉␉ q
#>␉
# >36!@␉
#`<`
#<]+<[.>-]>[
#{
#z}
#
#=<xR+++++[D>+++++++L+++<-][pPLEASE,2<-#2DO,2SUB#1<-#52PLEASE,2SUB#2<-#32DOREADOUT,2DOGIVEUPDOiiipsddsdoh@O6O4/]>+.-- -. >][
#Rx%>~~~+ +~*ttt*.x
#D>xU/-<+++L
#R+.----\).>]|
#[#[/v/v(/0l0v01k1kx0l0ix0jor0h0h1d111x0eU0bx0b0o1d0b0e0e00m1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10vx0v0l111111^_)  0046(8+9+9+9+9+=!)
###|
'\';echo 50;exit;';print((eval("1\x2f2")and(9)or(13))-(0and 4)^1<<(65)>>(62))or"'x"or'({({1})({1}[(0)])}{1}\{1})'#}#(prin 45)(bye)|/=1/24=x<$+@+-@@@@=>+<@@@=>+<?#d>+.--./
__DATA__=1#"'x"//
#.\."12"__*'
###;console.log 39
""""#//
=begin //
#ssseemeePaeueewuuweeeeeeeeeeCisajjapppp/*/
#define z sizeof'c'-1?"38":"37"
#include<stdio.h>
main(  )/*/
#()`#`\'*/{puts(z );}/*'``
<>{# }//
#}
disp 49#//
#{
1}<>//
$'main'//
#-3o4o#$$$
#< >"3"O.
=end #//
"""#"#//
#}
#|o51~nJ;#:p'34'\
#ss8␛dggi2␛ `|1|6$//''25  =#print(17)#>27.say#]#print(47)#]#echo 21#ss*///nd^_^_Z222999"26

Chcesz dowiedzieć się więcej? Wypróbuj czat Polygot !

Wypróbuj je online!

Jak zwykle zastąpiłem dosłowne tabulatory i dosłowne znaki ESC , ze względu na ograniczenia stosu wymiany. Możesz pobrać łatwo kopiowalną wersję programu z pola „wejściowego” linku TIO powyżej.

Zniszczony

Ten program drukuje 50 w bash, 49 w Octave, 48 w Deadfish ~, 47 w Lily, 46 w Cubix, 45 w PicoLisp, 44 w alphuck, 43 w siatce, 42 w zło, 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 w incydencie, 32 w Whirl, 31 w Modular SNUSP,30 w Whitespace, 29 w Trigger, 28 w Brain-Flak, 27 w Perl 6, 26 w 05AB1E, 25 w Pip, 24 w Thutu, 23 w Hexagony, 22 w niedociążeniu, 21 w Nim, 20 w Preludium, 19 w Reng , 18 w Kardynale, 17 w Julii, 16 w Pyth, 15 w Haystack, 14 w Turtlèd, 13 w Ruby, 12 w Rozłamie , 11 w Befunge-98, 10 w Befunge-93,9 w Perlu 5, 8 w Retinie , 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 testowanych przez powyższy sterownik testowy. Zwykli czterej sprawcy wymagają osobnego testowania:

  • Incydent został przetestowany przy użyciu jego oficjalnego tłumacza offline;

  • Deadfish ~ został również przetestowany przy użyciu oficjalnego tłumacza offline;

  • Modułowy SNUSP został przetestowany tutaj online ;

  • Reng został przetestowany online tutaj .

Wyjaśnienie

Szukałem różnych potencjalnych klientów do dodania języków. Jedną z możliwości było znalezienie języka z #komentarzami wiersza, który mógłby być prawdopodobnie dodany do wiersza „języka skryptowego” (który obsługuje Perl, Python 2 i 3 oraz Ruby). Chwilę zajęło mi wymyślenie odpowiedniego języka, który mógłby być kompatybilny ze składnią z tymi, które już tam są.

Okazuje się, że odpowiedź wpatrywała się we mnie od wieków. Jeśli klikniesz powyższy link TIO, otworzy się sterownik testowy polyglot, napisany bash. Przez cały czas miałem zakładkę z napisem „Bash - TIO Nexus”. Myślałeś, że to podpowiedź, ale najwyraźniej mi tego brakowało. Jako bonus, bash jest także językiem skryptowym, więc termin „linia języka skryptowego” jest nadal odpowiedni.

Program bash uruchamia się w tym samym miejscu, co inne języki skryptowe. Istnieje jednak dość prosty sposób, aby je oddzielić; w ciągach pojedynczych, \jest znakiem ucieczki w większości języków, ale nie w bash. Możemy więc ukryć kod bash przed innymi językami '\'…';, który jest zdegenerowaną instrukcją (bez efektu) w Perl, Python i Ruby, ale wykonywaną w bash. echo 50;exitjest dość prostym sposobem na zakończenie programu bash. Cóż prawie.

Największym problemem jest to, że bash po uruchomieniu exitbędzie kontynuował parsowanie do końca bieżącego wiersza (nawet jeśli nie wykonuje danego kodu), więc musimy upewnić się, że nie ma błędów składniowych w pozostałych linia. Mamy 'tuż po exit;tym, że nie jest (i nie może być) natychmiastowe dopasowanie. Później '…'jest używany do ukrywania kodu Brain-Flak przed językami skryptowymi, ale to by go odsłoniło. W rezultacie musimy zmienić rodzaj literału łańcuchowego, którego używamy do ukrycia kodu, przechodząc z ciągów jedno- i dwu-cudzysłowych. or"'"wykonuje lewę bez przeszkadzania Perlowi, Pythonowi lub Ruby (ponieważ lewy argument jest prawdziwy w każdym przypadku).

Mamy teraz niezrównaną podwójną ofertę, która rozciąga się na przyszłą linię. Trudno było go zamknąć bez zakłócania przynajmniej jednego innego języka; to, co faktycznie robimy, to zmienić sposób, w jaki ukrywamy kod przed bashiem z podwójnego cytatu z powrotem na niedopasowany pojedynczy cytat w komentarzu Python / Ruby w następnym wierszu, a na końcu zamykamy pojedynczy cytat na końcu wiersza.

Pyth i 05AB1E

Gadanie się z podwójnymi cudzysłowami zakłóca również języki, w których do ukrywania kodu, Pyth i 05AB1E używano ciągów z podwójnymi cudzysłowami. Główną sztuczką, której tu używamy, jest zapewnienie, że każda dodana przez nas podwójna cudzysłów ma wkrótce kolejną podwójną cudzysłów, aby odsłonić jak najmniej kodu. (To tłumaczy dodatkowy podwójny cudzysłów w __DATA__wierszu, który nie jest konieczny do bash.) Pyth używa \znaku ucieczki; główną konsekwencją tego jest to, że ograniczyłem zakres, w którym miałem do czynienia z ciągami znaków w językach skryptowych, zmuszając mnie do użycia raczej skomplikowanej metody powyżej (ponieważ nie mogłem łatwo wykorzystać różnicy w \zachowaniu między bash a wszystkim jeszcze). W 05AB1E 'działa jako znak ucieczki na zewnątrzsznurki, a ucieczka przed prowadzącym "nie zrobiłaby tego. Skończyło się więc na tym, że musiałem umieścić bezużyteczny znak dopełniający (domyślnie taki, jak zwykle x; ułatwia to czytanie!) Wewnątrz "'"konstrukcji używanych do zmiany stylów cytowania bash.

Preludium

Zdecydowanie najtrudniejszy język do naprawienia tutaj. Problem polega na tym, że linia skryptowa wraz ze wszystkimi nawiasami została przesunięta na boki, a zatem przepływ sterowania Prelude (który dba o sposób, w jaki nawiasy są wyrównane w pionie) został całkowicie zniszczony. Musiałem więc spróbować zrekonstruować coś, co działa.

Co gorsza, obecny pierwszy wiersz (którego tak naprawdę nie chciałem przepisywać) nakłada coś z twardym ograniczeniem na miejsce, w którym mogą się pojawiać nawiasy. Zaczyna się od niezerowej cyfry (w rzeczywistości dwie z nich!), A wkrótce potem nawias otwierający. To jest pętla w Preludium, a pętle na wczesnym etapie kontroli w Preludium powodują szereg różnych problemów (głównie dlatego, że powodują więcej kodu, a nie mniej). W związku z tym bardzo potrzebowałem otworzyć pętlę 0-iteracyjną w innym wierszu, aby pominąć ten kod. mainLinia do programu C jest bardzo odpowiednia, ale musimy być bardzo ostrożni z którym wspornik zamykający jest dopasowanie; za daleko w prawo i niedopasowany wspornik na#R+linia spowoduje problemy, zbyt daleko w lewo i nie skomentuje wystarczającej ilości kodu. (Należy pamiętać, że nawias otwierający w jednej linii może pasować do nawiasu zamykającego innej linii).

Po wykonaniu tej czynności mamy wystarczająco dużo miejsca, aby trzymać się w nawiasie otwierającym na linii Incydentu i wreszcie bezpiecznie minęliśmy kilka pierwszych znaków programu. Jednak różnica w umieszczaniu nawiasów kończy się, co oznacza, że ​​część kodu zdarzenia / wirowania faktycznie działa w Preludium, co powoduje uszkodzenie stosu. Zamiast próbować temu zapobiec, przesunąłem niektóre zera Whirla bardziej w prawo, pozwalając im ponownie dać nam działający program Preludium.

Kolejna niewielka zmiana dotyczyła pierwszego wiersza programu; ostatni nawias linii był w pozycji, której bardzo trudno było uniknąć. Dodałem dodatkowy ctuż po kodzie Pyth, aby przesunąć go w prawo. (Wiele języków analizuje ten punkt programu, więc zajęło zaskakująco dużo prób i błędów, aby znaleźć znak wypełniający, który nie złamałby co najmniej jednego języka!)

Incydent

Preludium samo w sobie było dość trudne, ale praca z Preludium i incydentem w tym samym czasie była koszmarna. Preludium nałożyło na kod wiele ograniczeń, które uniemożliwiały mi swobodne przemieszczanie się, a tym samym utrudniły grę w przypadkową budowę żetonów. Na przykład Preludium tak naprawdę wymaga tylko jednego 0przesunięcia w prawo, ale to spowodowało, że 00stał się nieudanym tokenem, niszcząc niektóre z tokenów, które chcieliśmy w ramach programu Incydent (ponieważ jeśli dwa tokeny zachodzą na siebie, oba są odrzucane i 00został nakładających token chcieliśmy oprócz nakładających się). Musiałem się wyprowadzić, aby zrobić czwarty egzemplarz i nie dopuścić do tego, aby nawet był uważany za token.

Bardziej subtelne są tokeny ;'i ␠␠(tj. Dwa znaki spacji). Problem polega na tym, że oba pojawiają się przed tym, kGktóry jest używany do przeskakiwania na początek programu, i tym samym przerywają przepływ sterowania Incydentem (oprócz przełamania punktu środkowego programu).

Usunięcie kopii ␠␠poprzez jej rozbicie nie wydaje się wykonalne. Usunięcie go przez nakładanie się może być możliwe ( ␠=jest obiecującym potencjalnym nakładaniem się), ale prawie na pewno mniej gadatliwe jest dodanie czwartej kopii, co zrobiłem tutaj.

Tymczasem możemy użyć innej sztuczki ;'. Rozbicie go nie jest czymś, czego chciałem spróbować, biorąc pod uwagę, że stosuje się go w sytuacjach dość wrażliwych na odstępy. Jednak nie jest tak blisko początku programu (pomimo pojawienia się w pierwszej linii), więc prawdopodobne jest, że moglibyśmy przeskoczyć nad nim (powodując, że nie wpłynie to na przepływ sterowania), zamiast nie potrzebować go. Szukałem odpowiedniego tokena do skoku, który nie spieprzyłby żadnego z innych języków. /vpojawia się nieco wcześniej w pierwszym wierszu i niczego nie łamie, dlatego właśnie tego użyłem.

50 języków w 1 Kib kodu

@MistahFiggins zwrócił uwagę, że moje przesłanie 1025 bajtów byłoby o wiele ładniejsze, gdyby miało 1024 bajty (zwłaszcza, że ​​pięćdziesiąty język jest sam w sobie kamieniem milowym). Wymagało to znalezienia gdzieś bajtu oszczędności. W tym przypadku zapisałem trzy bajty w Deadfish ~, kosztem dwóch dodatkowych bajtów użytych do prawidłowego wyrównania tokenów Incident, a tym samym sprowadzając program dokładnie do 1024 bajtów.

Poprzednio stosowana była formuła Deadfish ~ (2² + 2) ² + 10 × 1 + 2 = 48. Nowa formuła to (3²-2) ²-1, również produkująca 48. Zaskakujące jest to, że znacznie krótszy do napisania w Deadfish ~, mimo że jest znacznie prostszy.

To daje nam również wynik VIP w wysokości 0,008192. Jest to nie tylko nowy rekord, ale także sama w sobie ładna okrągła liczba (co jest oczywiście konsekwencją posiadania ładnych okrągłych liczb jako danych wejściowych do formuły).


2
Przepraszamy za brak TIO> _> (Z poważaniem, twórca Reng)
Conor O'Brien

@ ConorO'Brien Ping Dennis? Ponadto, ais523, powinieneś spróbować zagrać w golfa o jeden bajt;)
MildlyMilquetoast

1
Możesz wyciąć przestrzeń, puts(z )jeśli zamieniasz się (i Pw linii 2, dzięki stworzonej przez ciebie strefie wstępnej. Brawo w tej odpowiedzi. # 50w1k
Chance

1
Tak się składa, że ​​grałem w inny bajt. Teraz jest dokładnie 1024, więc tak naprawdę nie chcę tego zmieniać :-) Być może późniejsza odpowiedź może zaoszczędzić część naszych oszczędności; prawdopodobnie jest ich o wiele więcej (np. istnieje możliwość uzupełnienia / detokenizacji Incydentu, która nie jest już potrzebna).

6
@ ais523 zgodził się. Ta odpowiedź zawsze miała mieć 1024 bajty.
Szansa

38

37. C ++ (gcc), 776 bajtów

#  1"16" 2//v\(;@#/;n4"14"
#/*`3 auaaZ<>16/"<"6/b.q@")(22)S#  ␉␉␉␉ 
#yy␉;36!@
# ␉
#=␉>
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#`<`␉|
print((eval("1\x2f2")and( 9 )or(13 ))-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"*␉
""""#//
=begin␉//
#*/
#include<iostream>␉
int main()  /*/
#()"`#"\'*/{std::cout<<37;}/*'"`"
$'main'␉//
#-3o4o#$$$
<>3N.<>␉//
#xx
#x%~~~+␉+~*ttt*.x
#xx
=end   #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE)  ap
#_~nJ|#o51\   
#0␛dggi2␛`␉|1|6$//''25  >>>>>#>27.say# =#print(17)#^_^_7LEintndus({})!<>+]/*///Z222999/3!@"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 je online!

Zniszczony

Ten program drukuje 37 w C ++, 36 w Labiryncie, 35 w INTERCAL, 34 w Rail, 33 w wypadku, 32 w Whirl, 31 w Modular SNUSP, 30 w Whitespace, 29 w Trigger, 28 w Brain-Flak, 27 w Perl 6 , 26 w 05AB1E, 25 w Pip, 24 w Thutu, 23 w Sześciokąt, 22 w Niedociążenie, 21 w Nim, 20 w Preludium, 19 w Reng, 18 w Kardynał,17 w Julii, 16 w 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.

Dodałem inny format do danych wyjściowych sterownika testowego, który wymyka się podwójnym cudzysłowom, a także zastępuje wstawianie wiersza. Jest to tak, że mogę podać pojedynczy ciąg znaków do programu ac (gcc) owiniętego wokół funkcji utworzonej przez @feersum tutaj . Mam nadzieję, że inni mogą z niego korzystać w obecnej postaci.

Oto program tokenu zdarzenia . Idealnie chciałbym rozróżnić tokeny, ponieważ są one nieco trudne do odczytania, należy wskazać token „środkowy” i dołączyć go do sterownika testowego. Ale tak naprawdę nie wiem, jak zrobić coś innego niż zmusić różne programy do drukowania liczb całkowitych sekwencyjnych, więc jest to o ile mi się udało.

Próbowałem rozwiązać oczywiste problemy z incydentami, takie jak żetony po początkowym i końcowym żetonie skoku oraz wszystko, co wyglądało na obce, ale nie wyważyłem żetonów, aby umieścić je 0ow centrum. Nie jestem do końca pewien, jaka jest logika określenia centrum. Mam nadzieję, że @ ais523 tam pomoże. Ten ciąg pod koniec 7LEintndus({})!<>+byłby wszystkimi tokenami, gdyby nie czwarte włączenie do kodu. Można je wszystkie usunąć (i zastąpić .wyrównaniem sześciokątnym) w celu dostosowania środkowego tokena.

Będę aktualizować ten post z przerwami w ciągu następnego dnia lub dwóch, aby przejść przez kod, (zakładając, że incydent można zweryfikować / naprawić bez przekraczania liczby bajtów). Ale teraz jest już bardzo późno i przede wszystkim chciałem to rozwiązać, zanim musiałem rozwiązać inny problem podobny do Labiryntu. : P

Wyjaśnienie

Jak działa kod C ++.

Myślę, że większość ludzi zna język C ++, więc nie będę wchodził w szczegóły. Komentarze do bloków mają postać /* comment */. Komentarze liniowe mają postać //comment. Rzeczywisty kod wykorzystywany przez C ++ do wygenerowania odpowiedzi to int main() {std::cout<<37;}. A biblioteka, która jest używana do interfejsu z STDOUT, jest przywoływana przez tę instrukcję #include<iostream>.

/ * Komentarze Nadużycie * /

Dla mnie historia C ++ wraca do mojej odpowiedzi Brain-Flak.

Po tym, jak w końcu znalazłem # 28, postanowiłem przestudiować kilka innych poliglotów opublikowanych w PPCG i wszystkie te studia doprowadziły mnie do kilku łatwych odpowiedzi (większość z nich jest nadal dostępna, jeśli ktoś jest tak skłonny). Ale, co ważniejsze, doszedłem do wniosku o ogólnie poliglotach: duże poligloty należą do jednej z dwóch szerokich kategorii: #nadużywanie /*komentarzy lub nadużywanie komentarzy.

W każdym razie nie jest to faktem ani ograniczeniem, ale osobistej mentalności, która kierowała moimi następnymi kilkoma odpowiedziami.

Stąd rozumowałem, że jeśli miałoby to stać się największym na świecie poliglotą, co, jak przypuszczam, jest obecnie, najlepiej byłoby, gdyby mógł wykorzystać nadużycia w komentarzach obu rodzin komentarzy. Dlatego postanowiłem znaleźć sposób na włączenie /*języka komentarzy i skierowałem się w stronę rodziny C głównie ze względu na osobistą znajomość.

Test początkowy w C ++

Mój początkowy proces przemyślenia tego polegał na użyciu C # głównie z powodu mojej znajomości, a pierwszą przeszkodą dla C # było wprowadzenie poliglota do stanu, w którym mógłby zaakceptować linię, która nie zaczynała się #bez traktowania kodu jako języka przez języki skryptowe . Odpowiedź Raila wraz z kilkoma bajtowymi odpowiedziami, które do niej prowadziły, rozwiązały ten kawałek.

Następnie pojawił się problem z zainicjowaniem pierwszego /*bloku komentarza. Wiedziałem, że linia będzie musiała rozpocząć linię od, #aby pozostać niewidocznym dla Perla, Ruby i Pythona, ale wszystko, co pojawiło się wcześniej /*, zostanie odczytane przez C #. Na początku próbowałem #regiontagu C # , ale okazało się, że jest zbyt wyważony dla języków 2D. Wpisz C ++.

C ++ ma kilka dyrektyw preprocesora, z których wszystkie zaczynają się od #, które dają wiele opcji dla języków 2D. Okazało się jednak, że wszystkie z nich były niekompatybilne z co najmniej jednym językiem, a ponieważ znajdowałem się w przestrzeni kodu narażonej na C ++, miałem ograniczone obejścia. Z frustracji i desperacji natknąłem się na fakt, że C ++ po prostu zaakceptuje tylko jeden #przed blokiem komentarzy. Okej, cokolwiek, to wykonalne. Więc ruszyłem do przodu z założeniem, które #/*może działać jako pierwsze trzy postacie w poliglocie.

Druga podstawowa weryfikacja polegała na upewnieniu się, że rzeczywiste wyciągi drukowane będą mogły żyć z innymi kodami. Wiedziałem z odpowiedzi Brain-Flak, że Japt nie lubił niezauważonych {i było to potrzebne, aby C ++ powiedział, int main() {std::cout<<37;}a C ++ nie pozwoli znakowi ucieczki Japt w środku jego kodu. Tym razem miałem szczęście, że porzuciłem dosłowny ciąg Japt tylko dla tego stwierdzenia, Japt nadal z radością dałby ten sam wynik.

Tymczasem Brain-Flak nie lubił {}żadnego z nich, ale znów miałem szczęście, że C ++ było w porządku z #jego poleceniami int main()i {std::cout<<37;}, pozwalając komentować nawiasy klamrowe z perspektywy Brain-Flak.

Ponieważ główne problemy C ++ okazały się teoretycznie możliwe do rozwiązania, zacząłem żmudny proces rozwiązywania wszystkich wprowadzonych przeze mnie błędów.

Krajobraz 2D

Najtrudniejszą częścią tej odpowiedzi była zdecydowanie ponowna konfiguracja dwóch górnych linii poliglota. I najważniejszym problemem był *. Niedociążenie nie pozwoli *przed (. Uważa to za operację matematyczną na pustym stosie, co uważa za błąd. Poliglot wymagał (wcześniej, /*ale C ++ nie mógł na to pozwolić. Rozwiązaniem było dla nas komentarz linii C ++ //do pierwszego wiersza, aby ukryć a, (a następnie rozpocząć drugi wiersz od #/*.

Następnie Befunge naprawdę nie podobał się pomysł /dzielenia bez czegoś, ale po przestudiowaniu istniejącej odpowiedzi Begunge 16/"<"6/b.q@natknąłem się na pomysł liczby i sznurka roztrzaskanego przed sobą //. Działa i nie mam pojęcia, dlaczego C ++ jest w tym dobry, ale akceptuje # 1"16" 2to jako instrukcję otwierającą. Nie zamierzam tego kwestionować, ale wiem, że do jego działania potrzebne są wolne miejsca.

Linia pierwsza

Okazało się, że Japt jest dość wrażliwy na przestrzeń i tak naprawdę nie chciał wejść w swój ciąg oparty na backtick w górnej linii, więc on i backstick Pipa przeniosły się do drugiej linii, zmuszając dużo gimnastyki językowej na linii 1.

  • Pipowi nie spodobała się większość wiersza 1, więc za pierwszym miejscem umieszczono drugie spacje, #które wskazują komentarz.
  • (Dla niedoci¿eniem należało uciekł z Japt z poprzednią \.
  • #jest zakończeniem skoku w Turtlèd, więc było to wymagane, ale Pyth uważa to za pętlę kończącą błąd, więc Pyth potrzebował podzielić przez null / po#
  • Nie jestem pewien, co @robi pierwsza linia, ale Pyth i Japt najwyraźniej lubią jej obecność lepiej niż nie, chociaż @zgodnie z dokumentacją Pytha nie jest to znacząca postać.
  • I wygląda na to, że pierwszy ;można w tym momencie usunąć bez konsekwencji, więc nie jestem już pewien, co tam zostało rozwiązane, chociaż podejrzewam, że było to związane z Pyth. Ale wygląda na to, że przyszłe rozwiązania mogą zaoszczędzić bajt, pomijając ten bajt.
  • <> <i Turtlèd działają w zasadzie tak samo jak poprzednio, z <> <odbijaniem pierwszego #i zawijaniem do końca pierwszego wiersza. A Turtlèd skacze z, #jak wspomniałem, i kończy się "14"sznurkiem, który drukuje.

Trasowanie 2D

Po rozwiązaniu tych problemów następną fazą było routing języków 2D. Wcześniej inicjał vbył ignorowany przez Befunges z powodu poprzedniego #, ale zesłał Haystacka i Minkolanga. Teraz początkowa przestrzeń próbuje wysłać Minkolanga wzdłuż trzeciego wymiaru, który jego dokumentacja określa jako wymiar czasu.

Odsuńmy się na chwilę od trzeciego wymiaru Minolanga: dla mnie błędem jest nazywanie tego wymiarem czasu, który wydaje mi się bardziej przestrzenny niż czasowy. Tak naprawdę nie dostałem go, dopóki nie znalazłem tego linku, który ilustruje tę koncepcję, i wygląda bardziej na wiele warstw szachownicy 3D. Wierzę, że tak właśnie działają języki 3D. Ale ponieważ była to dla mnie nowa koncepcja, pomyślałem, że przekażę tę informację innym.

Tak wiele warstw Minkolang są wyznaczone przez linie kończące się $$$który wrzuciłem na końcu kodu Rail tutaj: #-3o4o#$$$. Teraz Minkolang uderza przestrzeń i spada do pierwszego >w <>3N.<> ␉//i przechodzi do prawego wpisywanie 3. #>nie może być dozwolone, aby rozpocząć tę linię, ponieważ byłoby próbować zakończyć komentarz bloku Perl6, więc <jest używany zamiast #do równowagi dla SMBF i mózg -Artyleria przeciwlotnicza. Jest to jednak procedura zamiany stosu Brain-Flak, więc drugi zestaw <>jest używany po Terminach Minkolang, aby wrócić do prawidłowej odpowiedzi Brain-Flak.

Labrynth podobnie zderza się z przestrzenią, ale powoduje, że Labrynth przesuwa się w dół w kolumnie 1. Następnie skręca w dół linii 2, gdzie podróżuje w dół, 3uderza w kolejną ścianę, powodując, że obraca się ponownie na południe i uderza, ;co powoduje, że 3 zostaje wyskakujące . Następnie program kontynuuje w prawo, gdzie 36 zostaje zapisanych i wydrukowanych, zanim w końcu znajduje @wyjście. Ta ścieżka jest dłuższa, niż powinna, ale odkryłem, że Preludium wyświetli bajt zerowy, zanim będzie to normalne wyjście 20, jeśli byłby !bardziej w lewo niż jest teraz, niezależnie od linii, w której się pojawia. Więc poprawiłem to, ponieważ miałem na to miejsce.

Następnie routing Haystacka został zmieniony, ponieważ /teraz pojawia się przed vlinią 1 i odzwierciedla jego ścieżkę jak Reng. Na szczęście Reng zamieszkuje raczej spokojnie. |Jedynym problemem było to, że igła Haystacka była odbłyśnikiem w Reng, więc Reng używa skoku Befunge ( #) nad igłą, aby poprawnie wyciągnąć Renga.

Befunges kontynuują wzdłuż linii 1, aż do vi zostaną skierowane w dół, a następnie w prawo w drugiej linii, aby zakończyć z tym samym kodem, który był używany wcześniej. Wydaje mi się, że ten kawałek można teraz trochę pograć w golfa, ponieważ mniej języków próbuje znacząco przejść kod, ale nie potrzebowałem już żadnych ścian, aby uderzyć głową, więc zostawiłem go takim, jakim jest.

Wreszcie punktem wyjścia dla kardynała jest to, %że nie trzeba było specjalnie skupiać się na już gęstych dwóch górnych liniach. Więc przeniosłem go do łańcucha Pythona. Jego liczne ścieżki kodu są teraz również ograniczone przez x's, co kończy ruch wskaźnika.

Linia 2 i 3

Jedyną znaczącą zmianą jest to, że wszyscy :grali w golfa z tego czy innego powodu. Może (potrzeby Preludium, a może były to proste problemy z liczbą bajtów - prawdopodobnie oba. Inną rzeczą jest to, że kod skoku wyzwalacza został cofnięty i zmieniony na auaaZ. Miałem miejsce do wypełnienia, aby poznać ścieżkę kodu Befunge i wydawało się to najlepsze. Również <następujący fragment ma na celu zrównoważenie podążania za SMBF >. W końcu, samotny pod koniec drugiej linii ma utrzymać ciąg 05AB1E. Ponadto yyw wierszu 3 znajdują się tylko znaki wypełniające Labirynt.

Esolangi Big String

Po rozwiązaniu dwóch górnych linii nadszedł czas, aby zacząć kopać w pełniejsze parsowanie esolangów, a Pip okazał się mieć problem. Jeśli pamiętasz, mamy do czynienia z nawiasami klamrowymi {std::cout<<37;}poprzez usunięcie łańcucha Japt, aby Japt mógł potraktować to jako kod. Cóż, Pip używa tej samej składni łańcucha i nie podoba mu się ten wiersz jako kod, a Pip ma bardzo podobne opcje deklaracji łańcucha jak Japt. Oba używają pojedynczego, 'aby zadeklarować ciąg jednego znaku, oba używają tej samej deklaracji zmiany znaczenia \i oba przyjmą "jako identyfikatory ciągu. Trudno było więc przekonać Pip, że to struna bez przekonania Japt.

Okazało się, że Japt miał jednak jedną różnicę, którą można wykorzystać - #przyjmuje wartość ascii następnej postaci. Tak, #"`zakończy łańcuch Japt / pip, a następnie powie Japtowi, aby wziął wartość asci ", jednocześnie mówiąc Pipowi, aby zaczął nowy łańcuch. "Prawdopodobnie mogło być grawis zamiast, i prawdopodobnie byłby lepszy, ale moja linia myślenia było użyć innego identyfikatora ciąg od wewnątrz jak innego punktu ciąg manipulacji. Oto kolejne miejsce, w którym możesz zaoszczędzić kilka bajtów.

Następnie musiałem zainicjować łańcuch Japt po nawiasach klamrowych, pozwalając Pipowi pozostać w łańcuchu. Zrobiłem to z '"`jednym cytatem, podwójnym cytatem i zwrotem. W przypadku Japt 'łańcuch nie jest ciągiem, dlatego jest wskaźnikiem, który przyjmuje następny znak jako ciąg znaków. Pip widzi 'łańcuch jako część łańcucha i kończy jego ciąg znakiem ". I w końcu, `wskazuje zarówno Pipowi, jak i Japtowi, że zaczyna się kolejny ciąg znaków, który ciągnie się przez poliglota, aż do ostatniej linii, w której oba języki kończą się szczęśliwie.

Teraz zarówno Japt, jak i Pip działały w tym momencie, ale 05AB1E nie powiodło się z powodu użycia "spowodowania błędu ujawnienia kodu. Na szczęście ten był łatwy do rozwiązania, ustawiając "wokół siebie cały zestaw, pozostawiając zestaw manipulacji ciągiem jako "`#"\\'*/{std::cout<<37;}/*'"`".

Wreszcie linia wygląda teraz tak, z int main() #/*"`#"\'*/{std::cout<<37;}/*'"`"którą Underload miał problem. Kolejne *, były kolejnym błędem składniowym, więc rzuciłem ()w środku, *żeby je złagodzić.

Kruche esolangi

Dużą przeszkodą była teraz Biała Przestrzeń. Nie będę tu wchodził w wiele szczegółów, ponieważ większość rozwiązania Whitespace jest wbudowane w wyjaśnienia już podane, a ja tylko przelotnie zastanawiałem się nad przypadkami, w których białe znaki wymusiły kilka decyzji. Patrzę na ciebie Labirynt. Duża zmiana polega jednak na tym, że rzeczywisty kod wyjściowy odpowiedzi Whitespace znajduje się w wierszu 2-4 zamiast 1-3. Wynika to głównie z ujawnienia kodu Japt w wierszu 1.

Thutu pierwotnie miał problemy z tym, co był ten wiersz: int main() #/*()"`#"\'*/{std::cout<<37;}/*'"`". Więc wrzuciłem kanał tuż przed pierwszym, #aby ukryć wszystkie problemy związane ze wskaźnikiem komentarza, a następnie rozsypałem spam z końcowymi fragmentami /wszędzie tam, gdzie ujawniono kod.

W tym momencie dopasowałem Sześciokąty i znalazłem nowy problem. Kod na samym początku, która rozpoczęła życie # 1"16" 1sprawiły, że +w /+23!@żadnym dłuższym jasnego stosie. Więc właśnie usunąłem +is i znalazłem, że teraz ma wynik 123. Łatwo było to naprawić, zmieniając otwierający gambit na # 1"16" 2i grając w grę Hexagony /3!@.

Whirl miał pewne zmiany, ale przede wszystkim chodziło o to, by przed linią Incydentu pojawiła się odpowiednia liczba wiodących 1. Incydent miał jednak jeden token, który był szczególnie trudny. Miałem dokładnie 3 kopie /*i */.

Początkowo chciałem po prostu rzucić *//*dowolne stare miejsce w kodzie, aby utworzyć czwartą kopię każdego z nich, ale Underload ponownie zobaczył kolejne *, co nie było możliwe. Ostatecznie rzuciłem /na końcu tej linii, int main() /*aby koniec się skończył /*/, myśląc, że sprawię, że tokeny będą się nakładać, ale udało mi się stworzyć tylko 4 kopie jednego z dwóch tokenów. Racja, racja. Tak to działa. No cóż, po prostu rzucę podobnego /w finale, */aby zrobić tam 4. Następnie zastąpiłem kilka sześciokątnych no-opów czwartą kopią kilku żetonów incydentów w tym ciągu w ostatniej linii 7LEintndus({})!<>+.

Wniosek

Ok, to wszystko, co mam dla tego ogromnego refaktora. Obiecuję, że następnym razem nie będę miał tyle do napisania. Właściwie nie mam pojęcia, czy C ++ jest dobrym czy złym wyborem dla tego poliglota, ale moim zdaniem otwiera pewne opcje. Mam nadzieję, że prowadzi to do dobrych rzeczy.

Szczęśliwego kodowania.


2
Wygląda na to, że g++wymaga .cpp, więc dodałem to do sekcji dotyczącej konkretnego rozszerzenia pliku. Potem musiałem to wykorzystać run-wrapper.sh. Zmienię to.
SnoringFrog,

1
Chcę dodać do tego symboliczne pieprzenie mózgów, ponieważ jest to łatwy dodatek, ale znaki unicode zawieszają się w python2 - _ -
SnoringFrog

1
@SnoringFrog Czuję to samo o emoji
Chance

1
Ponadto **nie jest błędem składni w niedociążeniu; po prostu zużywa dużo stosu, który, jak zakładam, nie był w tym czasie dostępny (prawdopodobnie dlatego, że grałeś w dwukropki). Możesz uzupełnić stos grupami lub dwukropkami w nawiasach przed nimi lub między nimi, a czasem ukryć kod przed niedociążeniem, umieszczając go w nawiasach.

2
@ ais523 W bardzo wczesnych dniach C, aby zaoszczędzić czas w przypadkach, gdy było to niepotrzebne, preprocesor nie był uruchamiany, chyba że pierwsza linia zaczynała się od #. Ale jeśli nie chcesz, aby pierwszy wiersz był instrukcją preprocesora, będziesz potrzebował sposobu, aby pierwszy wiersz zaczynał się od # bez faktycznego wykonywania jakiejkolwiek czynności, więc masz dyrektywę zerową. Podejrzewam, że zgodność wsteczna z kodem, który to wykorzystał, była uzasadnieniem włączenia jej do standardu.
Muzer

34

3. Minkolang v0.15 (26 bajtów)

#>>>>>>>>v
print(1)#>3N.i2

Ten program wypisuje 1 w Pythonie 3, 2 w Vimie i 3 w Minkolang v0.15

Mam nadzieję, że nie popsuję rzeczy wprowadzając język 2D

Wypróbuj online!

Wyjaśnienie

#                     stops program from moving through time (really does nothing)
 >>>>>>>>             I can't use a space because then the program will move through time
         v            go down
         >            go right
          3N.         Outputs 3 and end program
                      Anything afterward is ignored since program has ended

Vim jakoś ignoruje Minkolanga, więc to dobrze

Naprawdę nie było problemu z Pythonem, ponieważ ignoruje on komentarze #

Kolejny...

W następnym języku sugeruję coś w stylu> <>, ponieważ #działa jak odbłyśnik (tak, że kierunek zmieni się w lewo i zawinie do końca w prawo), aby można było dodać kod, który może być ignorowany przez inne języki


16
„Poruszać się w czasie” wat?
TuxCrafting,

5
@ TùxCräftîñg Minkolang ma 3 wymiary (2d = normalny, trzeci to czas). TBH, nie rozumiem tego, po prostu stwierdza, że ​​w wyjaśnieniu na łączu TIO
szarlatan krów

@ mbomb007 Do czego dokładnie się odnosisz?
Krowy szarlatan

1
@ TùxCräftîñg Nie sądzę, żebym mógł to zrobić
dkudriavtsev

1
@wat Hm zajęło mi to zbyt długo, aby zrozumieć
TuxCrafting

34

5. Python 2 (35 bajtów)

#3N.;n4
print('1'if 1/2else'5')
#i2

Ten program wypisuje 1 w Pythonie 3, 2 w Vimie, 3 w Minkolang v0.15, 4 w> <> i 5 w Pythonie 2.

Wypróbuj online beta!

W Pythonie 2 1/2 to 0, co jest wartością fałszowania, co powoduje, że Python drukuje 5. W Pythonie 3 1/2 to 0,5, co jest wartością zgodną z prawdą, co powoduje, że Python drukuje 1.


1
Mogę potwierdzić, że działa w Minkolang
szarlatan krów

1
print('1'if 1/2else'5')psuje się w moim systemie bez spacji między 1/2 a innymi
Tasos Papastylianou

Cóż, działa z obiema wersjami na TIO.
betseg

28

4.> <> (29 bajtów)

#>>>>>>>>v;n4
print(1)#>3N.i2

Ten program wypisuje 1 w Pythonie 3, 2 w Vimie, 3 w Minkolang v0.15 i 4 w> <>

Wypróbuj online!

Kod został uruchomiony

#             - change direction to left
            4 - add 4 to stack
           n  - print as a number
          ;   - end the program

Jeszcze inny język 2D.

Nie ma wpływu na Minkolanga, ponieważ dodaje znaki po zmianie kierunku, z jakiegoś powodu jest ignorowany przez Vima. #jest komentarzem w Pythonie, więc nie zmieniaj ich też.


28

28. Brain-Flak , 280 bajtów

#v`16/"<"6/b.q@"(::):::   (22)S#;n4"14"
#>3N6@15o|> ^*ttt*~++~~~%
#=~nJ<R"12";
#[
#`<`|
print((eval("1\x2f2")and (9) or (13))-(0and 4)^(1)<<(65)>>62)or'(\{(\{})(\{}\/^23!@[()])}\{})(\{}\{})'#@46(8+9+9+9+9+=!)=#print(17)#]#echo 21#|/=1/24=x=90/
#8␛dggi2␛` |1|6$//''25  #>say 27#"26

␛ jak zwykle reprezentuje dosłowny znak ESC.

Ten program drukuje 28 w Brain-Flak , 27 w Perl 6 , 26 w 05AB1E , 25 w Pip , 24 w Thutu , 23 w Hexagony , 22 w Underload , 21 w Nim , 20 w Preludium , 19 w Reng (testowane tutaj ), 18 w Kardynale , 17 w Julii , 16 w 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 Vim / V , 1 w Python 3

Po pierwsze, chcę powiedzieć, jaki zaszczyt móc wnieść wkład w to wyzwanie. Słyszałem o golfie tylko kilka tygodni temu i od tego czasu jestem całkowicie uzależniony. Pierwszą rzeczą, jaką zrobiłem, kiedy znalazłem to wyzwanie, było uruchomienie kodu w różnych językach, aby sprawdzić, czy mogę znaleźć coś, z czym mógłbym pracować. Tak było, kiedy byliśmy na poziomie # 6. Szczerze myślałem, że to wyzwanie było szalone, ale oto jesteśmy (# 28 Łał!). Odkryłem wtedy, że Brain-Flak wyprowadza wartość 2. Więc postanowiłem się tego nauczyć.

Brain-Flak okazał się całkiem dobry do tego rodzaju wyzwań, ponieważ jest dość łatwy do nauczenia się i ignoruje prawie wszystkie postacie oprócz (){}[]<>. #również zdarza się komentować wszystko po nim w tym samym wierszu, więc jedyną częścią ostatniego zgłoszenia, które kiedykolwiek rozważano w przypadku Brain-Flak, było print((eval("1\x2f2")and 9 or 13)-(0and 4)^1<<65>>62)następnie sparowanie ((())()<<>>). Więc wtedy plan stał się dodatkiem zbędnego nawiasu do tego, co zacząłem uważać za kod python.

Zmodyfikowałem bity pytona, aby parsować w Brain-Flak, z ((() () ())()()<<()>>)którym równa się 2 stosy, z których pierwsza to 5, a druga to 3. Następnie kwadratuję 5 ({({})({}[()])}{})i dodam wynik do 3 za pomocą ({}{}). Kwadratowanie i dodawanie odbywa się w ciągu znaków z perspektywy Pythona. Nie mogę twierdzić, że rozumiem rozumowanie Pythona tutaj, ale jestem całkiem pewien, że ten ciąg nie byłby inaczej oceniany przez inne języki w znaczący sposób, z kilkoma wyjątkami.

Okazuje się, że Japt interpretuje nawiasy klamrowe w ciągu jako zawierające kod, ale były one wystarczająco łatwe do ucieczki \przed każdym {w tym ciągu. Ale to zwiększyło liczbę bajtów. Takie jest życie.

Preludium było dość wybaczające ze wszystkimi moimi nawiasami. Wcześniejszy komentarz wskazywał, że Preludium będzie pasować do Pparenthezów o wyrównaniu pionowym, a ja stworzyłem tylko jedno. Słodkie! W (górnej linii w linii z oraz (9w dużej linii. Musiałem więc dodać dodatkowe miejsce przed (górną linią. Zakładam tutaj, że podwójna spacja była wskaźnikiem komentarza do czegoś, więc dodanie dodatkowej spacji wydawało się banalne i działało. Powinienem zaznaczyć, że (9)zamiast tego próbowałem dodać dodatkowe spacje , ale kardynał nie współpracował.

05AB1E nie podobała mi się moja pierwsza próba umieszczenia ciągu Pythona w podwójnych cudzysłowach, ale wszyscy wydawali się zadowoleni z używania pojedynczych cudzysłowów. Nic wielkiego.

Sześciokąt był jedynym językiem, który pozostał w tym momencie, i oczywiście przekroczyłem próg wielkości następnego heksa, więc czas się ubrudzić. To /^23!@jest kod Hexagony i jestem bardzo podekscytowany, ponieważ myślę, że znacznie ułatwi przyszłe dodawanie. Ten mały kawałek można w zasadzie przenieść w dowolne miejsce w łańcuchu pytona bez pomijania kodu. To jest pełny ciąg, więc wszyscy jesteśmy na tej samej stronie '(\{(\{})(\{}\/^23!@[()])}\{})(\{}\{})'. /Tutaj ustawia ścieżkę Hexagony od SE -> NW do W-> E dół ten ciąg, który mamy dużo swobody z. (Poprzednim \jest ucieczka/dla thutu BTW). Mój pomysł jest taki, że jeśli wprowadzisz zmiany, istnieje prawdopodobieństwo, że w pewnym momencie przejdziesz przez ten ciąg i możesz przesunąć kawałek Sześciokąta w ciągu, aby złapać ścieżkę kodu i wysłać go do właściwego wniosku. Tylko uważaj, aby nie wchodzić między Japt's \a {. Jeśli masz z tym problem, po @prawej stronie łańcucha znajduje się tylko inne rozwiązanie Hexagony i można je usunąć bez konsekwencji dla innych języków. I oczywiście, jeśli zdarzy ci się złapać ścieżkę kodu Hexagony idącą w przeciwnym kierunku, możesz oczywiście użyć @!32^\zamiast /^23!@. Możesz także zauważyć, że moje rozwiązanie usunęło===2z kodu, aby utrzymać rzeczy poniżej limitu bajtów. Ktoś wspomniał tutaj, że chodziło o wyrównanie Hexagony i już go nie potrzebowałem.

Wreszcie, oto mały fragment kodu, który znalazłem podczas eksploracji codegolf, który przekształca wiersz tekstu w sześciokąt odczytywalny w sześciokątach, aby można było debugować. Jestem pewien, że wiele osób o tym wie, ale nie widziałem tego tutaj, więc może to pomóc komuś innemu. Uczciwe ostrzeżenie, musisz zmienić dane wejściowe, aby usunąć wsteczne i powrotne karetki, a także zamienić dosłowne wyjście na coś, co zajmuje normalną ilość miejsca, aby kod mógł wyrównać porządek w ładnym sześciokącie.

PS Podczas pisania tego zdałem sobie sprawę, że popełniłem błąd. Wierzyłem, że wyczyściłem krawędź pamięci Hexagony z ^, ale najwyraźniej mogę zastąpić ją bez żadnego działania. Które ^prawdopodobnie powinny być +, jeśli starają się manipulować tę sekcję. Najwyraźniej przechodziłem +wcześniej, ale przyszli poliglotnicy mogą nie mieć tyle szczęścia.

Powodzenia!


Przed głosowaniem czekałem na podsumowanie i wyjaśnienie, ale podsumowanie wygląda dobrze, więc głosuję, czekając na wyjaśnienie :-). Zakładam, że wszystkie dodatkowe ukośniki odwrotne mają na celu uniknięcie błędu składniowego w Thutu? Również interesujące podejście do miejsca, w którym dodałeś swój kod, które, jak sądzę, ma coś wspólnego z Hexagony. Miło będzie zobaczyć pełne wyjaśnienie. (Witamy również w PPCG!)

A teraz widzę wyjaśnienie; Lubiłem to czytać. „Kod Pythona” jest faktycznie używany przez kilka języków skryptowych (Python, Perl 5, Ruby), ale wszystkie one interpretują andi w orten sam sposób, więc twoja metoda komentowania kodu w językach skryptowych, ale nie Brain-Flak, działa we wszystkich.

1
Dzięki @ ais523. Wspomniałeś o umieszczeniu mojego kodu. Wiedziałem więc, że muszę umieścić operatory uderzenia mózgu w miejscu widocznym dla języków skryptowych , a moje początkowe, błędne założenie było takie, że najłatwiej będzie to zrobić w nowej linii. To nie zadziałało dla Retiny i nie chciałem sobie z tym poradzić i problemów z językiem 2D, które stworzyłem, próbując naprawić Retinę, jeśli to możliwe. Miałem szczęście, że wpadłem na obecne miejsce.
Szansa

2
Fantastyczna odpowiedź i bardzo dokładne wyjaśnienie! Bardzo się cieszę, że podoba ci się atak mózgu. : D
DJMcMayhem

25

38. C, 804 bajty

#  1"16" 3//v\(@#/;n4"14"
#/*`3 auaaZ<>16/"<"6/b.q@")(22)S#  ␉␉␉␉ 
#yy␉;36!@
# ␉
#=␉>
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#`<`␉|
print((eval("1\x2f2")and( 9 )or(13 ))-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"*␉
""""#//
=begin␉//
#
#*/␉
#define␉z  sizeof 'c'-1?"38":"37"
#include␉<stdio.h>
int main()  /*/
#()`#`\'*/{puts(z);;}/*'``
$'main'␉//
#-3o4o#$$$
<>3N.<>␉//
#xx
#x%~~~+␉+~*ttt*.x
#xx
=end   #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE)  ap
#_~nJ|#o51\   
#0␛dggi2␛`␉|1|6$//''25  >>>#>27.say# =#print(17)#^_^_7LEintndus({})!<>+]/*///Z222999/(3!@)"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 je online!

Zniszczony

Ten program drukuje 38 w C, 37 w C ++, 36 w Labirynt, 35 w INTERCAL, 34 w Rail, 33 w incydencie, 32 w Whirl, 31 w Modular SNUSP, 30 w Whitespace, 29 w Trigger, 28 w Brain-Flak, 27 Perl 6, 26 w 05AB1E, 25 PIP, 24 w Thutu, 23 w Hexagony, 22 w niedociążenia, 21 w mM, 20 w Prelude, 19 w Reng, 18w Kardynale, 17 w Julii, 16 w Pyth, 15 w Haystack, 14 w Turtlèd, 13 w Ruby, 12 w Rozszczep, 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.

Oto moja nieco ulepszona wersja tokensera Incydentu , zaprojektowana tak, aby była nieco mniej golfa, ale nieco bardziej przydatna.

Wyjaśnienie

Zawsze uwielbiałem robić małe poligloty, ale nigdy tak duże; Pomyślałem, że powinienem spróbować!

Po cudownej odpowiedzi C ++ na @ Chance, C wydawał się kolejnym logicznym wyborem i biorąc pod uwagę (w porównaniu z niektórymi wcześniejszymi odpowiedziami) względną łatwość dodania go, zdecydowałem się na to, kiedy miałem okazję!

Użyłem bardzo dobrze znanej sztuczki, aby odróżnić C i C ++; rozmiar stałej znakowej wynosi 1 bajt w C ++, ale rozmiar int (gwarantowany co najmniej 16 bitów) w C. Ten kod powinien być bardzo przenośny (z wyjątkiem systemów, które używają bajtów z wystarczającą liczbą bitów, aby zmieścić int), chyba że Popełniłem głupi błąd.

Najpierw próbowałem zrobić printfwszystko z wbudowanym, ale wiele nawiasów wydawało się powodować problemy dla Japt, więc uprościłem linię, która wydawała się to naprawić.

Następnie, kardynałowi się to nie podobało, jak sądzę z powodu %printf, więc musiałem rozwiązać ten problem, przechodząc do manipulowania łańcuchami.

Moja kolejna próba przypisania ciągu znaków, a następnie zmiany drugiego bajtu zależnego od zachowania C, zakończyła się zdecydowanie zbyt długo i spowodowałaby przesunięcie Sześciokąta na następny rozmiar; Chciałem uniknąć ponownych przeróbek, utrzymując ją wśród dodatkowych postaci, z którymi musiałem się bawić! Potrzebowałem do tego każdego bajtu, więc wdrożyłem zmiany zapisywania bajtów sugerowane przez @Chance.

Grałem więc trochę w ten kod C i wymyśliłem puts(sizeof'c'-1?"38":"37");, że prawie działa, z wyjątkiem tego, że Niedociążenie było niepoprawne, prawdopodobnie z powodu złożonego wyrażenia w nawiasach.

Nawet po usunięciu dodatków, >>które były wymagane do dopasowania <<w Perl6, nie mogłem znaleźć wystarczająco zwięzłego sposobu na podzielenie bardziej złożonej części na przypisanie tablicy znaków. Więc skończyło się na tym, że zamiast tego użyłem preprocesora.

Po wielu próbach i błędach znalazłem rozwiązanie, które wydawało się podobać Retinie. Preludium, które sprawiało mi problemy przez cały czas, skończyło się naprawiać, zanim zacząłem patrzeć, dlaczego się łamie (chyba nawiasy klamrowe lub !miałem w trójce na jednym etapie, patrząc na poprzednie odpowiedzi).

Przez cały czas łatałem białe znaki, aby uzyskać coś, co chciałby Biały; Uznałem, że jest to dość łatwe. W szczególności tab space space spacebyła to bardzo przydatna kombinacja (instrukcja dodawania dwóch górnych elementów na stosie), ponieważ oznaczała, że ​​mogłem dodać białe spacje do linii bez żadnych innych białych spacji bez konieczności zsynchronizowania wszystkiego (przypuszczam, że program oznacza, że ​​tak naprawdę nigdy się nie wykonuje, więc nie martwię się o niedopełnienie stosu).

Przetestowałem teraz Incydent i działa! Ogromne podziękowania dla @Chance i @LliwTelracs, które właśnie uświadomiłem sobie, że NIE jest to walijskie imię, za pomoc w opanowaniu go. Zobacz podświetlanie składni . Usunąłem ;token, który pojawiał się przed #yytokenem. Zrobiłem to po prostu dodając dodatkowy ;po getsinstrukcji (moja poprzednia próba polegała na zamianie s(która teraz pojawia się o wiele bardziej w programie C niż w poprzednim) w ciągu „detokenizującym” na a ;, ale okazało się, że byłem właściwie skrót od Hexagony (dzięki @Chance), więc po nieudanych próbach dodania dodatkowego znaku do ostatniej linii, zmieniłem go z powrotem i dodałem dodatkowy średnik w innym miejscu).

Ulepszyłem też trochę białe znaki, aby zmienić niektóre inne tokeny, aby spróbować wyśrodkować, ponownie tokenizować Tab Linefeed (przesuwając tabulację na końcu #includelinii do środka, tworząc w ten sposób trzy tokeny), i aby usuń tokeny z tokenu potrójnego, przesuwając jedno pole w definelinii.

Wreszcie, dzień po pierwszym przesłaniu, zdecydowałem się przejść do sedna przerażającego preprocesora, ostrzegającego, że gcc wyprodukował (i który spowodował upadek Clanga). Ustaliłem, że powodem, dla którego pierwszy wiersz w ogóle działał, jest to, że dane wyjściowe z preprocesora zapewniają informacje debugowania, takie jak oryginalne nazwy plików i numeracje wierszy. Nie podobały im się pierwsze „2” w pierwszym wierszu, ponieważ oznaczało to „powrót z dołączonego pliku do podanego pliku”, i oczywiście jest to niemożliwe, biorąc pod uwagę, że nie było żadnych dołączonych plików. Po zmianie na „1” (start normalnego nagłówka) spowodowałem, że kilka języków jest zbyt dławionych, zmieniłem go na „3” (start nagłówka wewnętrznego komponentu), co złamało tylko Hexagony, ponieważ teraz polegało na 2. Na początku kodu Hexagony dodałem otwarty nawias(w celu zmniejszenia wartości 3 do 2, a następnie zamknij nawias )po końcu ( @) kodu heksagonu, aby spełnić kryteria Retina, Prelude i Underload, których wszystkie oczekiwane pasujące nawiasy kwadratowe. Ponowne testowanie Reng i Modular SNUSP nie spowodowało żadnych problemów, a tokeny Incydentów wyglądały dobrze, więc teraz to naprawiłem! Przetestowałem to na różnych egzotycznych architekturach i wydaje się, że działa. Wiem, że to nie jest ważne dla golfa kodowego, i nie będę miał nic przeciwko, jeśli przyszli zgłaszający będą musieli to ponownie przerwać, aby zachować liczbę bajtów lub cokolwiek innego (lub jeśli ktoś już zaczął bazować na tym rozwiązaniu i nie chce zmienić swojego za dużo), ale jest jeden dobry powód, dla którego to zrobiłem - kompilator Objective-C TIO obsługuje tylko Clanga, więc będzie to bardzo przydatne, jeśli ktoś chce to dodać!

Pamiętaj, że nigdy nie korzystałem z większości tych języków, mam nadzieję, że mój sukces zachęci nowych użytkowników do wypróbowania tego!


@LliwTelracs Huh, program C połączony przez Chance'a w jego odpowiedzi miał inne dane wyjściowe dla listy tokenów:; #yy; # yy # yy0l0m1k1k0l0i0j0h0h1d0e0b0b0o1d0b0e0e1d0i0f0g0n0f0000000000000 ^ _ ^ _
Muzer

Błąd polegał na tym, że kopiowałem wklejanie wartości do mojego programu, aby nie mógł rozpoznać tabulatorów lub
znaków

@LliwTelracs Po prostu próbując samodzielnie odkryć tokenizację, wygląda na to, że mam teraz trzy razy średnik. Mógłbym dodać dodatkowy, z wyjątkiem tego, że nie sądzę, żebym oszczędził bajt, ponieważ spowoduje to nieprawidłowe wyrównanie sześciokąta. Hmm ...
Muzer

1
Incydent działa!
Muzer

1
@Chance Właśnie patrzyłem, jak ten pierwszy wiersz jest prawidłowy w Preprocesorze C, wygląda na to, że jest to wyjście z Preprocesora używane do informacji debugowania itp. Oznacza to „teraz wracam (2) do pliku o nazwie„ 16 ” linia 1". Myślę, że to 2 powoduje, że Clang dusi się (i gcc ostrzega), ponieważ nigdy nie wszedł do żadnych plików, więc nie ma po co wracać. Kiedy mam szansę, mogę eksperymentować ze zmianą na coś innego, aby skompilować go także w Clang. Zobacz gcc.gnu.org/onlinedocs/cpp/…
Muzer

25

65. ALGOL 68 (Genie) , 1634 bajty

#16  "(}+?23!@)-("//*\Dv;'[af2.q]PkPPX'#CO)"14";n4
#/*0|7//```"`   [-'][!(>77*,;68*,@;'1,@10␉␉11)(22)S␉␉(1 P''53'S^'q
#>␉
# 36!@␉`
#
#_>++++.>.}+?
#`<`
#<]}} +<[<.>>-]>[
#{
#z}
#
#=x<R+++++[D>+++++++59L+++<-][pPLEASE,2<-#2DO,2SUB#1<-#52DO,2SUB#2<-#32DOREADOUT,2PLEASEGIVEUPFACiiipsddsd4O6O@oh]>@@+.---@.>][
#x%+>+=ttt Z_*.
#D>xU/-<+++L
#R+.----\).>]|
#[#[(?2?20l0v0x1k1kMoOMoOMoOMoOMOO0l0ix0jor0h0h1d111x0eU0yx0y0moO1d0y0e0e00m1d0i0fx0g0n0n11MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOmOoMOo0moo0n0tx0t0moO0f0t0gOOM0g0f0h0j0j0i0001k1x0vx0v0l111111^_00)
[ "]56p26q[puts 59][exit]" ,'\[' ];#/s\\/;print"24";exit}}__DATA__/
#
###x<$+@+-@@@@=>+<@@@=>+<?#d>+.--.

#
'(((p\';a=a;case $argv[1]+${a:u} in *1*)echo 50;;*A)echo 54;;*)echo 58;;esac;exit;';print((eval("1\x2f2")and 9or 13)-(0and 4)^1<<(65)>>62)or"'x"or'{}{}{}{}({}<(((((()()())){}{})){}{})>){(<{}(({}){})>)}{}({}())wWWWwWWWWwvwWWwWWWwvwWWWwWWWWWWWWwWWWWwWWWWWWWwWWWWWWWW li ha '#}#(prin 45)(bye)46(8+9+9+9+9+=!)((("'3)3)3)"'
__DATA__=1#"'x"
#.;R"12"'
###;console.log 39
""""
=begin
<>{nd
#sseeeemPaeueewuuweeeeeeeeeeCis:ajjap*///;.int 2298589328,898451655,12,178790,1018168591,84934449,12597/*
#define p sizeof'p'-1?"38":"37"
#include<stdio.h>
main ( ){puts(p);}/*
print 61
#}
disp 49;
#{
}<>
$'main'3
#-3o4o#$$$
#<T>"3"O.s
=end
"""#"
#}
#s|o51~nJ;#:p'34'3\=#print (17)#>27.say#]#print(47)#]#echo 21# xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi xi ax fwwvwWWWwWWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwwwwwwwwwwwWWWwWWWWWwWWWWWWWwWWWWWWWWWwWWWWWWWWWWWWWWWwWWWWWWWWWWWWwvm 
# sss8␛dggi2␛`|$// ''25  16*///~-<~-<~-<<<~-XCOprint("65")#s^_^_2229996#

Wynik VIP ( wszechstronna drukarka liczb całkowitych ): .005949 (w celu poprawy następny wpis nie powinien przekraczać 1710 bajtów)

Wypróbuj online!

Zniszczony

Ten program drukuje 65 w ALGOL 68, 64 w Agony, 63 w Brian & Chuck, 62 w Grass, 61 w SILOS, 60 w Moorhens 2.0, 59 w Tcl, 58 w Ksh, 57 w Wise, 56 w DC, 55 w Brain -Flak Classic, 54 w Zsh, 53 w Shove, 52 w COW, 51 w Zgromadzeniu, 50 w Bash, 49 w Oktawie, 48 w Deadfish ~, 47 w Lily, 46 w Cubix, 45w PicoLisp, 44 w alphuck, 43 w siatkowego 42 w zła, 41 w brainfuck, 40 w minimalnej-2D 39 w coffeescript, 38 w C, 37 C ++, 36 w labiryncie, 35 w INTERCAL, 34 w szynie, 33 incydent, 32 w Whirl, 31 w Modular SNUSP, 30 w Whitespace, 29 w Trigger, 28 w Brain-Flak, 27 w Perl 6, 26 w 05AB1E, 25 w Pip,24 w Thutu, 23 w Hexagony, 22 w niedociążeniu, 21 w Nim, 20 w Preludium, 19 w Reng, 18 w Kardynale, 17 w Julii, 16 w Pyth, 15 w Haystack, 14 w Turtlèd, 13 w Ruby, 12 w Rozszczepienie, 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> <>, 3w Minkolang, 2 w V / Vim i 1 w Python 3.

Weryfikacja

Większość języków można przetestować za pomocą powyższego sterownika testowego, ale 6 języków należy przetestować lokalnie.

  • Reng można przetestować tutaj, aby uzyskać wynik 19 .

  • Modułowa SNUSP mogą być testowane na wyjściu 31 tutaj .

  • Incydent został zweryfikowany w celu przetestowania 33 poprzez ręczne równoważenie tokenów.

  • Deadfish ~ można przetestować na lokalnym wyjściu 48, używając tego interpretera . Zauważ, że Deadfish ~ pobiera poliglota, który ma być zasilany >>standardowym wyjściem, i wypisuje na standardowe wyjście szereg monitów, które są nieuniknioną konsekwencją uruchomienia dowolnego programu Deadfish ~.

  • Za pomocą tego interpretera można przetestować Moorhens 2.0, aby uzyskać wynik 60 .

ALGOL 68

ALGOL jest prawdopodobnie najmniej znanym z czterech języków programowania wysokiego poziomu od pierwszych dni programowania - pozostałe języki tego mglistego rozróżnienia to COBOL, FORTRAN i Lisp. ALGOL był wówczas lepiej znany w kręgach akademickich i matematycznych, ale dziś jest najbardziej znany z ogromnego wpływu na współczesne języki. W rzeczywistości większość współczesnych, praktycznych języków można opisać jako „podobne do Algolu”, z których przynajmniej C to język, który oczywiście ma własną linię wpływów i pochodnych.

Jestem bardzo podekscytowany dołączeniem ALGOL, ponieważ jest to kolejny ważny krok w historii komputerów, który możemy dodać do tego pomnika, który nazywamy poliglotą. To fajne rzeczy.

ALGOL68 to najnowsza z trzech głównych specyfikacji ALGOL, pozostałe to ALGOL60 i ALGOL58. Co ciekawe, specyfikacja nie ma ustalonej składni, co oznacza, że ​​tokeny są zdefiniowane, ale nie ma pisowni. To sprawia, że ​​język jest wysoce zależny od interpretera, ponieważ dowolny dany tłumacz może na przykład użyć innego symbolu do zainicjowania bloku komentarza. Specyfikacja opisuje ¢jako inicjujący blok komentarza. Ponieważ jednak ¢nie znajduje się wśród podstawowych kodów ascii 127, co zrozumiałe, nie ma większego zastosowania jako wskaźnik komentarza wśród dostępnych tłumaczy. Okazuje się, że interpreter Genie pisze ¢jako #, że jest to wszystko, czego potrzebujemy, aby przejść obok postaci 1 i zrobić poliglota.

Genie w rzeczywistości ma trzy opcje składni komentarzy, pozostałe dwie są coi commentobie są pogrubione. Tak, śmiały. Jeśli użyjemy kursywy, to jest to zmienna. Genie rozwiązał to dla nas ponownie, pisząc pogrubioną czcionką wszystkie litery. A ponieważ COnigdzie nie ma w poliglocie, mamy łatwą metodę ukrywania poliglota przed parserem. Jeśli w przyszłości COpotrzebny jest język, możemy przejść do bardziej szczegółowej COMMENTskładni.

W ALGOL nie ma komentarzy do linii - wszystkie mają styl blokowy, co oznacza, że ​​muszą zostać zakończone. Biorąc pod uwagę początkowy stan poliglota, nasz komentarz blokowy ALGOL jest otwierany natychmiast i kończy się pod koniec linii 1, ponieważ Turtlèd podobnie używa #jako tokena skoku. Na szczęście Turtlèd nie ma problemu z przejściem przez znaki Ci, Owięc w wierszu 1 możemy wstawić COnatychmiast po drugim, #aby zainicjować komentarz bloku tłuszczu dla ALGOL68.

Stąd musimy po prostu COprint("65")gdzieś umieścić . Wybrałem ostatni wiersz, ponieważ wolałem zakończyć wiersz innym #komentarzem i nie chciałem, aby komentarz kończył się #na początku ostatniego wiersza. Tak więc śledzimy naszą instrukcję drukowania ALGOL z #si #jako ostatni znak w poliglocie. sW #sjest dla alphuck aby zrównoważyć pw druku.

Dzięki @ ais523 za otwarcie końca poliglota z odpowiedzią 59 i umożliwienie tego wszystkiego.

SMBF

Dodaliśmy inny znak na końcu poliglota, aby zakończyć ostatni komentarz ALGOL, a SMBF wcześniej czytał ostatni znak w celu uzyskania odpowiedzi. Aby temu zaradzić, musiałem zmienić SMBF, aby czytał znak od drugiego do ostatniego, zmieniając ten kod w wierszu 8 [.>-]na ten [<.>>-]. Jest to prywatny blok kodu SMBF, ponieważ MP BF ma wartość 0, gdy pętla jest inicjowana.

Cyngiel

W tym momencie zauważyłem dziwne zachowanie w SMBF i miało to związek z relacjami między tymi segmentami kodu i końcem poliglota.

• Miejsce skoku incydentu: ^_^_

• Miejsce docelowe skoku wyzwalacza oraz odpowiedź: X222999

• Odpowiedź ALGOL68: COprint("65")#s

Odpowiedź ALGOL tokenizowała kilka tokenów Incydentu w jego segmencie kodu, więc kod ALGOL musiał przejść przed segmentem kodu Incydentu. ALGOL spowodował również problem z wyrównaniem preludium, jeśli poszedł pierwszy w kolejności, więc musiał zająć drugie lub trzecie miejsce. Tymczasem SMBF miał niewytłumaczalną awarię, gdy kod Incydentu był ostatni, więc Incydent musiał trwać pierwszy lub drugi. Cóż, zdałem sobie sprawę, że to wprowadzający problem z logiką, który wydawał się nierozwiązywalny, więc postanowiłem uczynić to, co niewytłumaczalne, bardziej… zrozumiałym.

Po przejściu przez SMBF odkryłem, że problem z posiadaniem ^ _ ^ _ na końcu był spowodowany przez Wise. Kod Wise ( ~-<~-<~-<<<~-) nie jest ukryty za niewykonalną pętlą, w przeciwieństwie do większości poliglota. Ale w kodzie Wise nie są zaangażowane kody drukujące SMBF. To tylko zmieniało wartości pamięci. Wydawało się to nieszkodliwe. W takim razie w czym problem? To był ten cholerny SM przed BF.

Kod Wise'a zmienia znaki w kodzie, który ma zostać wykonany, i czy możesz zgadnąć, co jest sąsiadem wartości ascii ^? Jest ]. Wise umieszczał terminator pętli SMBF na końcu poliglota, powodując, że SMBF wpadł w nieskończoną pętlę. To złe mojo.

Po namyśle wziąłem rozwiązanie 0 bajtów do problemu i oddzielone cel skoku wzbudź ( X) od swojej odpowiedzi ( 222999) i zakończył Polyglot wygląda następująco: ~-<~-<~-<<<~-XCOprint("65")#s^_^_2229996#. Działa to tylko dlatego, że po skoku Triggera nie pojawia się żadna postać, która nie jest odpowiedzią Triggera.

Podsumowując

To wszystkie główne zmiany w tej rundzie. Zrobiłem niewielką zmianę, aby wyciąć wiele omawianych cw linii 1, ale to wszystko dla zmian czysto golfowych.

Powodzenia!

Raport powypadkowy

#<q>"3"O.sstał się, #<T>"3"O.sponieważ detokenizacja Tzamiast qbyła bardziej wydajna w równoważeniu

<>{stał <>{ndsię detokenize ndi{␊

Umieścić przestrzeń pomiędzy }}i +w #<]}} +<[<.>>-]>[celu detokenize }}+taniej.


25

2. V (11 bajtów)

print(1)#i2

Ten program wypisuje 1 w Pythonie 3 i 2 w V.

Żeby rzucić piłkę i wcześnie wrzucić mój ulubiony język do miksu. :)

To bardzo prosta odpowiedź.

print(1)#

akurat jest NOP w V. (na szczęście dla mnie) Następnie i2wchodzi w tryb wstawiania i wstawia „2”. Możesz wypróbować V online tutaj

Oczywiście w pythonie

print(1)

drukuje „1” i

#i2

jest komentarzem.


2
Czy to V czy Vim? Tłumacz, z którym się łączysz, jest technicznie „V”.
mbomb007

@ mbomb007 Cóż, V jest prawie całkowicie kompatybilny wstecz, więc zamierzeniem było vim. Myślę, że technicznie jest to jednak V. Czy jest już za późno na zmiany?
DJMcMayhem

2
Nie bardzo, po prostu edytuj tytuł w odpowiedziach.
mbomb007

1
@ mbomb007 Dosłownie zrobi to dosłowny znak ESC (dlatego musiałem użyć go w swoim zgłoszeniu).

1
Uwaga dla testujących to: Musisz upewnić się, że nie masz przeniesionego cliipboarda z poprzedniej sesji Vima.
Riking,

24

20. Preludium, 167 bajtów

#v`16 "<" 6/b0\ .q@#;n4"14""
#>3N9@15o|R"12"*^*ttt*~++%
#=|
print((1/2and 9 or 13)-(0and+4)^1<<65>>62);#35(99999+++++!) =#;print(17)
#       ~nJ<
#
#gg99ddi2` |1|1+6

Dosłowne znaki ESC w tym samym miejscu, co w poprzednich zgłoszeniach (między #i g, oraz między 2i `, w ostatnim wierszu), ponieważ nie można usunąć Vima z trybu wstawiania za pomocą znaków do wydrukowania.

Program drukuje 20 w Prelude , 19 w Reng (testować tutaj ), 18 w Cardinal , 17 w Julia , 16 w Pyth , 15 w stogu siana , 14 w Turtlèd , 13 w Ruby , 12 z rozszczepienia , 11 w befunge-98 , 10 w befunge-93 , 9 w Perl , 8 w siatkówki , 7 w Japt , 6 w SMBF ,5 Pythona 2 , 4 w> <> , 3 w Minkolang , 2 w vim / V , 1 w Pythonie 3 , ia partridgew gruszkę drzewa .

Istniejący kod prawie sam się eliminuje w Preludium, składając się tylko z pętli while z argumentami falsey i pewnych manipulacji stosami na stosach, na których nam nie zależy. Co więcej, w kodzie jest miejsce, które jest komentarzem we wszystkich językach, które je mają (między #i =#przed poprzednim przesłaniem). Trudną częścią dopasowania Preludium do tego było generowanie liczb przy użyciu tylko jednego stosu i bez powiększania liczby bajtów. Ten program wykorzystuje pętlę, która dodaje 45 do każdego elementu stosu i wysyła go jako ASCII, dlatego umieszczając 5 na 3 na stosie, otrzymujemy 20jako wynik. (Zgrabnie, 20 jest łatwiejszą do wyprowadzenia liczbą niż 19 jest w Preludium, więc odpowiedź 19 na postacie faktycznie trochę mi pomogła.)


Preludium powinno być dość łatwe do pracy w przyszłych programach. Kilka porad dla każdego, kto może powodować problemy: nie pozwól nawiasom ustawiać się pionowo; upewnij się, że nie dopuszczasz wykrzykników poza nawiasami; a po umieszczeniu cyfr poza nawiasami nie umieszczaj więcej nawiasów dalej w tym samym wierszu. Luka, w którą wpisuję program Preludium, jest wciąż otwarta i wygląda na to, że może być owocnym miejscem dla innych języków 1D (rodzaj Preludium 1½D, i działa bardziej jak język 1D w tym programie).

Fajnie, pokonaj mnie z Preludium :) Właściwie myślę, że V z ASCII może być możliwe z :%szastąpieniem, ale nawet wtedy jest to trochę trudne (i V jest denerwujące do testowania)
Sp3000

Jeśli użyjesz a, :aby uruchomić polecenie w vimie, będziesz potrzebować powrotu karetki, co również jest niemożliwe do wydrukowania. : /
Zwei

4
+10000000000 a partridgew przypadku Gruszy. Ale czy drukuje się 5 GOLDw PIERŚCIENIACH?
immibis,

23

30. Biała spacja , 296 bajtów

#v`16/"<"6/b.q@"(: ::T):  ␉␉␉␉ :(22)S#;n4"14"
#>3N6@15o|>␉^*ttt*~++~~~%
#=~nJ<R"12"; ␉
#[␉
#`<`|
print((eval("1\x2f2")and (9)or(13))-(0and 4)^(1)<<(65)>>62)or'(\{(\{})(\{\/+23!@}[()])}\{})(\{}\{})'#46(8+9+9+9+9+=!)=#print(17)#]#echo 21#|/=1/24=x=90/
#8␛dggi2␛␉` |1|6$//''25  #>say␉␉ 27#T222999"26

␛ reprezentuje dosłowne ucieczki.

␉ reprezentuje dosłowne zakładki.

Ten program drukuje 30 w białych znakach , 29 w Trigger , 28 w Brain-Flak , 27 w Perl 6 , 26 w 05AB1E , 25 w Pip , 24 w Thutu , 23 w Hexagony , 22 w niedociążeniu , 21 w Nim , 20 w Preludium , 19 w Reng ( tutaj testowane ), 18 w Kardynale , 17 w Julii , 16 w 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 .

Biała spacja to kolejny esolang z ograniczonym zestawem znaków. Ten odczytuje tylko tabulatory, spacje i informacje o wierszach.

Więc kiedy wyciągniemy wszystkie rzeczy, których Whitespace nie czyta, zostaje nam następujący kod:

[space][space][space][LF]
[space][LF]
[LF]
[LF]
[LF]
[space][space][space][space][space][LF]
[space][space][space][space]

Kod do wyjścia 30 jest następujący:

[space][space][space][tab][tab][tab][tab][space][LF]
[tab][LF]
[space][tab]

Tak więc 3 górne wiersze istniejącego kodu otrzymały dodatkowe spacje na końcu wierszy, aby spełnić wymagania. Zauważ, że tabulatory linii 1 i końcowe znaki znajdują się na środku linii, aby zaspokoić potrzeby> <>.

Spacja w wierszu 2 została tutaj zmieniona na tabulator. Wydaje się, że działa identycznie jak przestrzeń dla języków 2D, ale wizualnie już się nie wyrównuje. ¯ \ _ (ツ) _ / ¯

Po otrzymaniu instrukcji, by wypisać 30, gra uzyskała resztę potrzebnych spacji i linii, aby robić bezcelowe rzeczy i poprawnie się kompilować.

Zdarza się, że białe znaki mają instrukcje oznaczające / goto lokalizację kodu etykietą, która pozwala na dowolną liczbę tabulatorów i spacji, co pomogło w ustawieniu odstępów długiej linii. Zaczyna się również i kończy na linii, więc pomogło nam to zwiększyć niektóre linie w liniach 3-6.

Ostatnia linia nie mogła mieć linii bez przerwania Retina, więc jej instrukcje to wykonanie dowolnej matematyki i manipulacji stosem.

Oto pełny kod ze spacjami, tabulatorami i kanałami zastąpionymi przez naszą notację:

#v`16/"<"6/b.q@"(:[Space]::T):[Space][Space][Tab][Tab][Tab][Tab][Space]:(22)S#;n4"14"[LF]
#>3N6@15o|>[Tab]^*ttt*~++~~~%[LF]
#=~nJ<R"12";[Space][Tab][LF]
#[[Tab][LF]
#`<`|[LF]
print((eval("1\x2f2")and[Space](9)or(13))-(0and[Space]4)^(1)<<(65)>>62)or'(\{(\{})(\{\/+23!@}[()])}\{})(\{}\{})'#46(8+9+9+9+9+=!)=#print(17)#]#echo[Space]21#|/=1/24=x=90/[LF]
#8␛dggi2␛[Tab]`[Space]|1|6$//''25[Space][Space]#>say[Tab][Tab][Space]27#T222999"26[LF]

A oto skomentowana wersja samej białej spacji:

Push 30 onto the stack
[space][space][space][tab][tab][tab][tab][space][LF]

Output the number at the top of the stack
[tab][LF][space][tab] 

Jump to label null if the top of the stack is negative. (it's not)
[LF][Tab][LF]

Label this location as [Space]
[LF][Space][Space][Space][LF]

Add the top two items on the stack and replace them with the result. 
[Tab][Space][Space][Space]

Store the stack.
[Tab][Tab][Space]

Edycje: Sześciokąty okazują się przeskakiwać tabulatory jak spacje, w przeciwieństwie do mojego wcześniejszego twierdzenia. @ ais523 był na tyle uprzejmy, że zaktualizował Hexagonizer @ Kenney, aby uwzględnić dosłowne ucieczki i tabulatory. Musiałem go zmodyfikować, aby poprawić moje wcześniejsze stwierdzenie o tym, że tabulatory są odczytywane jako „no-ops” i aby zastąpić dosłowne znaki ucieczki, .ponieważ znak jest szerszy niż inne znaki, co powoduje, że heks jest nieco niewspółosiowy. Tutaj link .

A to jest nasz poprawiony aktualny Hex:

          # v 1 6 / " < " 6 /
         b . q @ " ( : : : T )
        : : ( 2 2 ) S # ; n 4 "
       1 4 " # > 3 N 6 @ 1 5 o |
      > ^ * t t t * ~ + + ~ ~ ~ %
     # = ~ n J < R " 1 2 " ; # [ #
    < | p r i n t ( ( e v a l ( " 1
   \ x 2 f 2 " ) a n d ( 9 ) o r ( 1
  3 ) ) - ( 0 a n d 4 ) ^ ( 1 ) < < (
 6 5 ) > > 6 2 ) o r ' ( \ { ( \ { } )
  ( \ { \ / + 2 3 ! @ } [ ( ) ] ) } \
   { } ) ( \ { } \ { } ) ' # 4 6 ( 8
    + 9 + 9 + 9 + 9 + = ! ) = # p r
     i n t ( 1 7 ) # ] # e c h o 2
      1 # | / = 1 / 2 4 = x = 9 0
       / # 8 . d g g i 2 . | 1 |
        6 $ / / ' ' 2 5 # > s a
         y 2 7 # T 2 2 2 9 9 9
          " 2 6 . . . . . . .

W końcu grałem w niepotrzebne postacie, głównie dodane wcześniej, aby ustawić nawiasy preludium i sześciokąty sześciokąta.

Kod Nim jest z powrotem do echo 21zecho 5+5+11

Sześciokąt #@46jest teraz#46

Kod Hexagony jest z powrotem /+23!@=z/+23!@

Nawiasowe ułożenie Prelude (9) or (13)stało się(9)and(13)

Cóż, to wszystko co mam. Powodzenia wszystkim!


1
Wydaje mi się, że naprawiłem wszystkie linki i dodałem the w miejscach miejsca, które wynikały z moich kopii past. Nie wiem, jak przekształcić tabulatory w tabulatory w SE, kod w Tio powinien być jednoznaczny. Musiałem też ponownie stworzyć moje rozwiązanie z instrukcji zawartych w tej odpowiedzi, ale jakoś skończyło się to o 2 mniej bitów ... Ups?
Szansa

1
Właśnie zauważyłem błąd w twoim wyjaśnieniu: znak powrotu karetki (ASCII 13) jest znakiem innym niż znak wiersza (ASCII 10). Zdecydowana większość języków (w tym biała spacja) dba o liczby 10, a nie 13 (i zakłada się, że podział wiersza w zgłoszeniu PPCG to tylko jeden ASCII 10, chyba że zaznaczono inaczej, ponieważ liczby 13 mają tendencję do zawyżania liczby bajtów do nie zasiłek).

1
Twój obraz wyjaśnienia heksagonu jest niepoprawny ( drukuje sięe23 ) z powodu ;e po zbliżeniu NW po pierwszym odbiciu. Powyższy link działa ...
MildlyMilquetoast

1
Doszedłem do wniosku, że TIO for Hexagony traktuje znaki tabulacji jako spacje / znaki nowej linii. Obraz, który udostępniasz w programie heksagonalnym, robi tylko wyjście, jeśli podążysz za nim (lub umieścisz go w TIO, zastępując tabulatory .s). Jednak skopiuj kod z obrazka do TIO, z wyjątkiem usunięcia szkolenia .(nie stanowiącego części rzeczywistego kodu) i wszystkich plików. Drukuje 23.
Łagodny Milquetoast

1
Wow, dzięki @MistahFiggins! Wygląda na to, że popełniłem kilka błędów dedukcyjnych i rozpowszechniłem je zgodnie z moim wyjaśnieniem. Poprawiłem objaśnienie Hexagony, schemat heksagonalny i skrypt Hexagonoizer Perl, a także bezpośrednio sprawdziłem wynik w stosunku do Hexagony. Teraz wszystko powinno być dobrze. Dobre znalezisko!
Szansa

23

100. brainbool, 2953 bajtów

#16  "?63(o?23!*# #@"/*\DZZCv;'[af2.q]PkPPX)\('#CO"14"; */
#/*0|7//```"`  [>.>.])[-'][(>77*;,68*,@,1',;# l1011)(22)S\4n;iiipsddpsdoh coding:utf8ââââ(1P''53'S^'????!?!??!??!!!!???!?!??!!?!?!!!!!?!!!!?????!????????????????????!) (qx
#>â
# 36!@â`  e++++++::@ 
#~
#y
#`<`
#<<<#>>]}}+-[.+..]+-+<[<<.>>x>-]>[
#{
#x}
#2""/*\*
#=x<R+++++[D>+++++++q   L+++<-][pPLEASE,2<-#2FAC,2SUB#1<-#52FAC,2SUB#2<-#32FACREADOUT,2PLEASEGIVEUPFACs]>@@+.---@.>][
#x%+>+=ttt Z_*.
#D>xU/-<+++L
#R+.----\   \).>]4O6O@|
#[#[(?2?20l0v01k1kMoOMoOMoOMoO MOO0l0ix0jor0h0h1d111x0eU0y0yx0moO1d0y0e0e00m1d0i0fx0g0n0n11MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOmOoMOo0moo0n0tx0t0moO0f0t0gOOM0g0f0h0j0j0i0001k1x0vx0v0l111111^_0 )0\\
[  "]56p26q[puts 59][exit]" ,'\[999'];#/s\\/;print"24";exit}}__DATA__/
###x<$+@+-@@@@=>+<@@@=>+<?#d>+.--.<!\
'(wWWWwWWWWwvwWWwWWWwvwWWWw WWWWWWWWwWW/"78"oo@WWwWWWWWWWwWWWWWWWWwwwwvwWWWwWWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWw              (([5]{})))â\';';print((eval("1\x2f 2")and 9or 13<< (65)>>65or 68)-(0and 4)^1<<(65)>>62)or"'x"or' {}{}{}{}({}<(((((()()())){}{})){}{})>)(({})5){}x{(x<(<()>)({})({}<{}>({}){})>){({}[()])}}({}){}({}()<()()()>)wWW no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no os sp '#}#(prin 45)(bye)46(8+9+9+9+9+=!)((("3'3)))"'a'[[@*3*74[?]*]*(<*.*\>]xxxxxxxxxxxxx)'# \\
__DATA__=1#"'x"
#.;R"12"'
###;console.log 39;'(******* **********819+*+@[*99[?]*]***|!)'
#\\
""""#\
' ( <><        (          )>  ){ ({}[()]  )}{\';      a=$(printf \\x00    );b=${#a};#\\
" }"';           ((   ( (';case "{"$ar[1]"}"${b} in *1)echo 54;;*4)echo 78;; *1*)echo 50;;*)echo 58;;esac;exit;# (((('))))#\
=begin
#p             +555/2+55x%6E2x
;set print "-";print 89;exit#ss 9
utpb now 70 dollar off!
utpb has been selling out worldwide!
#9999 9 seeeemPaeueewuuweeeeeeeeeeCis:ajjappppppp😆😨😒😨💬95💬👥➡
👋🔢🌚🌝🌝🌚🌚🌚🌚🌚

set ! 57
set ! 51
More 91 of thiset of re9
How much is it*/
#if 0
.int 2298589328,898451655,12,178790,1018168591,84934449, 12597
#endif//*
#1"" //*
#include<stdio.h> 
#defineâ x(d)â#d
#define u8 "38\0 "
main ( ) {puts( sizeof (0,u8)-5?u8"67":*u8""?"37":     x( 0'0  "'\"")[9]?"75":'??-'&1? "79":"77");"eg5""6 27""e ' Zing  ";}//*/
#if 0
#endif//* --... ...--
/*/
p=sizeof("9( 999 99\"    ); print'(''72'')';end!"            );main( ){puts(  "92");return(9-9+9 -9);}
#if 0â
#endif//* rk:start | print: "69" rk:end<(9    >5b*:,1-,@
print 61
#}
disp 49 ;9;
#{
}{}<>
$'main'3
#-3o4o#$$$
#<T>"3"O.</+++++++>/+++<-\>+++.---.
#<<<#>>> /
reg end="";print(85);reg s#++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-.
=end
;"""#"#xxxxxxxy"78"\++++>/<~#class P{        function:Main(a:String[] )~Nil{83->Print();} }
#}pS9^7^8^MUOUOF@:8:8\\
#s|)o51~nJ;#:p'34'3  \=#print(17)#>27.say#]# print(47) #]#echo 21#fwwwwwWWWwWWWWWwWWWWWWWwWWWWWWWWWwWWWWWWWWWWWWWWWwWWWWWWWWWWWWwvm>++++
#s8âdggi2âM`|$//''  1$6~-<~-<~-<<<~-COprint ("65")#asss^_^_#
#9 "25"  +/ *///X222999686#

Wynik VIP ( wszechstronna drukarka liczb całkowitych ): .002953 (w celu poprawy, następny wpis nie powinien przekraczać 3042 bajtów)

Zniszczony

Ten program drukuje 1 w Python 3, 2 w V / Vim, 3 w Minkolang, 4 w> <>, 5 w Python 2, 6 w SMBF, 7 w Japt, 8 w Retina, 9 w Perl 5, 10 w Befunge- 93, 11 w Befunge-98, 12 w Fission, 13 w Ruby, 14 w Turtlèd, 15 w Haystack, 16 w Pyth, 17 w Julii, 18 w Kardynale, 19 w Reng, 20 w Preludium, 21w Nim, 22 w Underload , 23 w Hexagony, 24 w Thutu, 25 w Pip, 26 w 05AB1E, 27 w Perl 6, 28 w Brain-Flak, 29 w Trigger, 30 w Whitespace, 31 w Modular SNUSP, 32 w Whirl , 33 w incydencie, 34 w szynie, 35 w INTERCAL, 36 w Labiryncie, 37 w C ++ 03, 38 w C99, 39 w CoffeeScript, 40 w Minimal-2D, 41 w pieprzeniu mózgu, 42 w złu, 43 w siatce, 44 w alphucku, 45 w PicoLisp, 46 w Cubix, 47 w Lily, 48 w Deadfish ~, 49 w Octave, 50 w Bash, 51 w Zgromadzeniu, 52 w COW, 53 w Shove, 54 w Zsh, 55 w Brain-Flak Classic, 56 w dc, 57 w Wise, 58 w Ksh, 59 w Tcl, 60 w Moorhens, 61 w SILOS, 62 w Grass, 63w Brian & Chuck, 64 w Agony, 65 w ALGOL 68, 66 w Surface, 67 w C11, 68 w Python 1, 69 w rk-lang, 70 w Commercial, 71 w tym, 72 w Fortran, 73 w Morse, 74 w Archway, 75 w C ++ 11, 76 w Trefunge-98, 77 w C ++ 14, 78 w desce rozdzielczej, 79 w C ++ 17, 80 w Klein 201, 81 w Klein 100, 82 w Brain-Flueue, 83 w Objeck, 84 , w Klein 001 85 w ZKL, 86 w Miniflak, 87 Alice, 88 w pingpong, 89 w gnuplot, 90 w RunR, 91 w Cood, 92 w C89, 93 w zestaw, 94 w Emotinomicon, 95 w emotikonom 96 w EmojiCoder, 97 w Cubical, 98 w Archway2, 99 w 99 . 100 w mózgu

Weryfikacja

Wypróbuj online! Języki niedostępne w TIO:

Wyjaśnienie

Nie mogę uwierzyć, że udało nam się dotrzeć do 100 języków. Chciałbym tylko trochę czasu podziękować wszystkim zaangażowanym w ten proces. To była przyjemna jazda i mam nadzieję, że dodam jeszcze 100 innych.

Brainbool jest już od dłuższego czasu. Jednak ponieważ brainbool może wydać tylko dwie liczby 1i do tej 0pory nie byłem w stanie go dodać (nie było mnie w okolicy 10 i 11).

Brainbool jest jak pieprzenie mózgu, tyle że zamiast owijania w 256, owija się w 2. Brainbool również nie ma, -ponieważ jest nadmiarowy z +. Nasz kod brainbool do wyjścia 100 jest dość prosty:

+.+..

Aby zamaskować dane wyjściowe dla „pieprzenia mózgu”, dodajemy pętlę i minus:

+-[.+..]

Teraz wszystko, czego potrzeba, to znaleźć miejsce na kod. Moim wyborem było pierwsze +na najwyższym poziomie kodu „ pieprzenia mózgu” w linii 8. Aby zastąpić plus, dodaliśmy nasz kod, +-+który działa jak „ +pieprzenie mózgu” i „noop” w buforze mózgowym.

+-[.+..]+-+

Cubix

Umieszczam swój kod przed kapsułką Cubix, powodując, że lustro przesuwa się na ścieżkę wskaźnika. Aby to naprawić, przesunąłem kapsułę o kilka kroków do przodu przed krzywdzącym lustrem i wszystko było w porządku.

Zaskakujące, że nic innego nie złamało nawet tego haniebnego incydentu.


W rzeczywistości brainbool może generować tekst aribtrary. Jeśli podasz mu -bargument, zbuduje jedynki i jedynki w bajtach, a następnie wyświetli jako znaki.
Pavel

1
@WheatWizard Potwierdzam, że działa w Archway2.
stasoid

1
Gratulacje! Zauważyłem, że wynik VIP również spadł poniżej 0,003.
Ørjan Johansen

1
Muszę wyznać, że kiedy pisałeś pierwotnie o dodaniu tego do 100/101, nie sądziłem, że kiedykolwiek się tu dostaniemy. To jest cholernie fajne.
SnoringFrog,

1
@stasoid Pracuję nad uzyskaniem Archwaya na TIO, po prostu FYI.
MD XF

21

27. Perl 6 , 235 bajtów

#v`16/"<"6/b.q@"(::):::  (22)S#;n4"14"
#>3N6@15o|> ^*ttt*~++~~~%
#=~nJ<R"12";
#[
#`<`|
print((eval("1\x2f2")and 9 or 13)-(0and 4)^1<<65>>62)#@46(8+9+9+9+9+=!)=#print(17)#3]#echo 21#===2|/=1/24=x=90/
#8␛dggi2␛` |1|6$//''25  #>say 27#"26

␛ jak zwykle reprezentuje dosłowny znak ESC.

Program drukuje 27 Perl 6 , 26 w 05AB1E , 25 PIP , 24 w Thutu , 23 w Hexagony , 22 w niedociążenia , 21 w mM , 20 w Prelude , 19 w Reng (testowane tutaj ), 18 w Cardinal , 17 w Julia , 16 lat w 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 Vim / V , 1 w Python 3 i (jak to Boże Narodzenie)a partridgew A Pear Tree .

Podświetlanie składni tworzone przez Stack Exchange dla tej odpowiedzi jest całkowicie niepoprawne. #`<jest jednym z wielu wieloliniowych znaczników komentarzy w Perlu 6 i kończy się na #>, dlatego jedynym kodem, który faktycznie działa w Perlu 6, jest bardzo prosty say 27. Wybrałem ten konkretny znacznik komentarza, ponieważ <>w większości języków nie są pasującą parą, a zatem niedopasowane <języki nie będą łamane, takie jak Retina, które próbują go przeanalizować.

Nie jestem do końca pewien, jak działa Heksagonia. Kiedy się zepsuł, zmieniłem jedną z używanych przez nią postaci z a +na a, 0aby sprawdzić, czy została trafiona; okazuje się, że tak było, i okazuje się, że to naprawiło program, ale nie jestem pewien, dlaczego (wiem, że się zepsuł z powodu #linii wykonywania, ale nie jest jasne, dlaczego usunięcie +rzeczy naprawia). (Ta postać jest również analizowana przez Thutu, ale na szczęście nie ma to wpływu na funkcjonowanie programu Thutu, ponieważ w tym momencie programu wszystko, co nie jest poprzedzone przez, =jest dosłownie kopiowane do działającego string.) Zauważ, że 0and+4stał się z poprzedniego wiersza0and 4, aby była o jedną postać krótsza z punktu widzenia Sześciokąta (Sześciokąt nie widzi spacji); ma to zrekompensować przejście #|do poprzedniej linii #`<`|, która jest o jedną postać dłuższą z punktu widzenia Hexagony (ponieważ nie widzi też cudzysłowów). Zauważ, że kod dzieli teraz tylko pięć bajtów od rozszerzenia długości boku sześciokąta i zerwania wszystkiego o bieżącym kodzie sześciokąta. I tak poleciłbym to zrobić i po prostu przerobić sekcję Heksagonia kodu; prawdopodobnie będzie łatwiej, niż trudniej, zmieścić wszystko po rozszerzeniu.

Zmieniły się także niektóre inne języki, głównie po to, aby dodać wystarczającą solidność, by zmieścić dowolny kod w ostatnim wierszu. $//jest znacznikiem komentarza w Japt, który pozwala spacjom później w linii, dzięki czemu dodany program jest mniej delikatny w Japt (tymczasem //łamie się, jeśli w linii znajdują się nawiasy zamykające, a spacja jest rodzajem zamykającego nawiasu w Japt). Para spacji jest znacznikiem komentarza w Pip, co oznacza, że ​​kod Pip można tutaj znacznie uprościć. Oznacza to również, że możemy uprościć 05AB1E do banalnego "26. Retina potrzebuje piątej linii, aby być prawnym wyrażeniem regularnym, które jest dobre w dopasowywaniu rzeczy (końcowe|jest zatem dla Retina); analizuje inaczej niż odpowiadający mu wiersz w poprzednim wpisie, ale w sposób, który jest równie odpowiedni. Kardynał jest również nieco nieco prostszy niż w poprzednich wpisach, ale jest to zwykły zbieg okoliczności z tym, że wszystko ustawia się w pionie, a zmiana polega na kodzie, który i tak nic nie zrobił.

Zakładając, że przerobisz Heksagonię (prawdopodobnie będziesz musiał to zrobić), istnieją bezpieczne miejsca do dodania kodu we wszystkich trzech ostatnich liniach: 3in #3]#jest tylko dla Heksagonii (i łatwo ją zmienić); Przestrzeń pomiędzy #i "na końcowej linii jest ignorowany przez większość języków; i nic tak naprawdę nie analizuje końca piątej linii poza Retiną. (Istnieje również wiele innych miejsc, w których można dodać kod, ale są to prawdopodobnie najwygodniejsze).


1
Przypadkowo przegłosowałem tę odpowiedź i zauważyłem, że przegłosowałem, gdy zauważyłem, że mój przedstawiciel spadł o 1. Czy możesz edytować odpowiedź, aby móc ją głosować? : D
betseg

4
@betseg: Dodałem nieco więcej dyskusji na temat Sześciokąta, właśnie dla ciebie.

2
Gratulujemy nagrody! Chciałem sprawić, by ten post znów się poruszał: P
FlipTack

Planowałem to kontynuować od wieków, to była tylko próba znalezienia czasu. (Właściwie podjąłem próbę Perla 6 jakiś czas temu, wcześniej w łańcuchu, i nie opublikowałem go, ponieważ nie działał. Na szczęście nauczyłem się na błędach i tym razem działa.)

21

31. Modułowy SNUSP , 326 bajtów

Program

#v`16/"<"6/b.q@"(: ::T):  ␉␉␉␉ :(22)S#;n4"14"
#>3N6@15o|>␉^*ttt*~++~~~%
#=~nJ<R"12"; ␉
#[␉
#`<`|
print((eval("1\x2f2")and (9)or(13))-(0and 4)^(1)<<(65)>>62)or'(\{(\{})(\{}[()])}\{})(\{}\{})'#46(8+9+9+9+9+=!)=#print(17)#]#echo 21#|/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
#8␛dggi2␛␉` |1|6$//''25  #>say␉␉ 27#T222999+/+23!@"26

Jak zwykle, jest to dosłowny znak ESC i dosłowna karta.

Zniszczony

Ten program drukuje 31 w modułowej SNUSP, 30 w białej spacji, 29 w Trigger, 28 w Brain-Flak, 27 w Perl 6, 26 w 05AB1E, 25 w Pip, 24 w Thutu, 23 w Hexagony, 22 w niedociążeniu, 21 w Nim , 20 w Preludium, 19 w Reng, 18 w Kardynale, 17 w Julii, 16 w Pyth, 15 w Haystack, 14 w Turtlèd, 13 w Ruby, 12 w Rozłam,11 w Befunge-98, 10 1 w Pythonie 3.w Befunge-93, 9 w Perlu 5, 8 w Retinie , 7 w Japt, 6 w SMBF, 5 w Pythonie 2, 4 w> <>, 3 w Minkolang, 2 w V / Vim i

Weryfikacja

Dlaczego nie ma linków w podsumowaniu? Ponieważ pracowałem nad czymś, aby znacznie ułatwić testowanie, sterownik testowy, który uruchamia program w większości wymienionych tutaj języków i drukuje wynik. Mam nadzieję, że powinno to znacznie ułatwić dodawanie przyszłych języków do poliglota. Możesz uzyskać wyniki tego programu dla 28 z 31 języków, uruchamiając następujący link TIO (który jest sterownikiem testowym napisanym w mieszance Bash, Perl i A Pear Tree):

Wypróbuj je online!

Łącze tworzy również blok kodu w formacie / widoczny powyżej i formatuje kod w sześciokąt:

          # v 1 6 / " < " 6 / b
         . q @ " ( : : : T ) : :
        ( 2 2 ) S # ; n 4 " 1 4 "
       # > 3 N 6 @ 1 5 o | > ^ * t
      t t * ~ + + ~ ~ ~ % # = ~ n J
     < R " 1 2 " ; # [ # < | p r i n
    t ( ( e v a l ( " 1 \ x 2 f 2 " )
   a n d ( 9 ) o r ( 1 3 ) ) - ( 0 a n
  d 4 ) ^ ( 1 ) < < ( 6 5 ) > > 6 2 ) o
 r ' ( \ { ( \ { } ) ( \ { } [ ( ) ] ) }
\ { } ) ( \ { } \ { } ) ' # 4 6 ( 8 + 9 +
 9 + 9 + 9 + = ! ) = # p r i n t ( 1 7 )
  # ] # e c h o 2 1 # | / = 1 / 2 4 = x
   = 9 [ < $ + @ + - @ @ @ @ = > + < @
    @ @ = > + < ? # > + . - - . ] / #
     8 . d g g i 2 . | 1 | 6 $ / / '
      ' 2 5 # > s a y 2 7 # T 2 2 2
       9 9 9 + / + 2 3 ! @ " 2 6 .
        . . . . . . . . . . . . .
         . . . . . . . . . . . .
          . . . . . . . . . . .

Brakuje trzech języków: V jest zbyt wolny, a Reng i Modular SNUSP nie są zainstalowane na TIO. Na szczęście wszystkie trzy mają tłumaczy internetowych:

  • Możesz przetestować program w V / Vim (zamierzone wyjście: 2) tutaj na TIO.
  • Jest takie Reng tłumacza on-line (zamierzone wyjście: 19) tutaj .
  • Jest online Modular SNUSP interpreter (zamierzone wyjście: 31) tutaj . (Jest reklamowany jako interpreter SNUSP, ale Modular SNUSP jest dialektem, który faktycznie implementuje, co widać po @znakach na całej stronie).

Wszystkie trzy generują zamierzone wyniki, więc wszystkie 31 programów jest odpowiednio testowanych. (Jedną z rzeczy, która mnie trochę niepokoi, jest to, czy program Whitespace kończy się poprawnie; jednak tutaj biała spacja jest identyczna z poprzednim zgłoszeniem, więc obie mają rację, czy obie są złe. Jeśli okaże się, że program rzeczywiście się kończy niepoprawnie oba programy można naprawić w ten sam sposób).

Wyjaśnienie

Po pierwsze, sześciokąt, który zawsze wymaga zmiany. W rzeczywistości jest to o wiele prostsze niż wcześniej; Przeniosłem kod Hexagony na kod tuż po kodzie Trigger, co oznacza, że ​​jest on bardzo blisko końca programu, a „kapsułka” Hexagony, która drukuje 23 i wychodzi, zaczyna działać niemal natychmiast. Ostatnia linia ogólnie wygląda na dobre miejsce na umieszczenie kapsułki, ponieważ oznacza to mniej poleceń, które mogą potencjalnie zakłócić działanie Sześciokąta.

Wszystkie pozostałe zmiany dotyczą dodania modułowego kodu SNUSP. Pierwszą rzeczą do zapamiętania jest to, że SNUSP zaczyna wykonywać od pierwszego $znaku w programie i jest językiem 2D, który wychodzi po zejściu z krawędzi programu, a tym samym umieszczając program SNUSP na końcu długiej linii (wewnątrz kod Thutu, w miejscu, w którym Thutu akceptuje prawie wszystko), możemy zapewnić, że SNUSP nie zobaczy żadnego kodu z innych języków, a większość innych języków nie będzie dbać o SNUSP. Jednym z języków, na którym zwracano uwagę, był Perl 6, czyli parsowanie kątowników; Umieściłem <bezpośrednio przed kodem SNUSP, aby był szczęśliwy (ponieważ nawiasy i tak były naturalnie prawie dopasowane). Innym językiem, na którym zależy, jest SMBF;.wyjścia zarówno w SMBF, jak i SNUSP, i nie chcemy tworzyć dodatkowych wyników. Na szczęście, jak widać w SMBF, po tym programie <.>>[…]następuje kod SNUSP, tzn. Bieżący element taśmy ma wartość 0. Zatem umieszczenie kodu SNUSP w nawiasach kwadratowych „komentuje to” z punktu widzenia SMBF.

Jeśli chodzi o sam kod, wykorzystuje on dobrze znaną sztuczkę do pisania stałych w Modular SNUSP, w której piszesz wiele poleceń „procedury startowej” z rzędu i skutecznie tworzysz rodzaj liczby bazowej Fibonacciego. Podstawową ideą jest to, że +koduje liczbę 1; @dodaje do siebie liczbę reprezentowaną przez kod po nim i liczbę reprezentowaną przez kod po nim minus jego pierwszy znak; i =nie ma @=operacji (w ten sposób podwoi liczbę po prawej stronie). W tym systemie wybrałem @@@@=+@@@=+#jako reprezentację liczby 48.

Jest tu jednak problem; standardowa metoda pisania stałych w SNUSP pozostawia kontrolę nad startem programu, a przy pomocy onelinera (który chciałem tu napisać z oczywistych powodów), nie ma sposobu, aby zmienić adres IP tak, aby wskazywał w dowolnym kierunku, ale w prawo. Oznacza to, że w jakiś sposób będziemy musieli uzyskać adres IP, aby przekazać całą stałą definicję i przejść w prawo, bez zamykania programu (co #normalnie by to zrobiło). Aby rozwiązać ten problem, ostrożnie zastosowałem definicję liczby, dla której +zawsze było poprzedzone =. Oznacza to, że mogę napisać kod, aby ustawić drugą komórkę na 48 za pośrednictwem @@@@=>+<@@@=>+<#, wiedząc, że żadne z >poleceń nie zostanie pominięte przez@polecenie (i tym samym kontrolujemy wskaźnik taśmy). Ponadto wiemy, że na końcu #pierwsza komórka taśmy nadal będzie miała swoją wartość początkową. Dlatego możemy użyć pierwszej komórki taśmy jako znacznika, aby wiedzieć, czy powrócić z definicji procedury, czy też przejść w prawo (wykonujemy mnóstwo procedur, ale wychodzimy z programu, spadając z krawędzi, aby to nie miało znaczenia).

Zatem końcowy kod SNUSP to $+@+-@@@@=>+<@@@=>+<?#>+.--.. Te $znaki początku programu. +@+-ustawia pierwszy element taśmy na 1 ( ++-ale gdy procedura rozpocznie się od @powrotu, zacznie działać kod od -początku, więc ustawienie elementu taśmy z powrotem na 0. ?#kończy procedurę tylko wtedy, gdy pierwszy element taśmy jest niezerowy; w ten sposób w końcu skończymy #z drugim elementem taśmy ustawionym na 50 (48 ze stałej definicji, plus 2 z dwóch >+<napotkanych przy przejściu w prawo później). Wtedy wszystko, co musimy zrobić, to >+.--.wyprowadzić kody ASCII 51 ( 3) i 49 ( 1) i wypadają poza krawędź programu ( ]w SNUSP nie ma opcji, a /odzwierciedla przepływ sterujący w pionie, tak aby spływał z górnej krawędzi programu); ten bit działa identycznie jak pieprzenie mózgu.


20

11. Befunge 98 , 102 bajtów

#v;2^0;7||"<+0+0+0+<;n4
#v0#_q@
#>3N.
#|\w*
#8  ^1b0<
#|
#M`
print(None and 9or 1/2and 1or 5)
#jd5ki2

Wydruki:

Szczerze mówiąc, nie mam pojęcia, dlaczego kod Vima zajmuje 1 minutę. Nie ma też pojęcia, jak działa siatkówka.

Wyjaśnienie:

#v          Skips the v, which would send the IP down
  ;         Unlike '93, where ; is a no-op, '98 skips to the next ;
            and doesn't execute anything in between
   2^0;     Not executed, unlike Befunge 93
       7|   Pushes 7 onto the stack, and then sends the IP up, because 7 is not 0
n0b1        n clears the stack, and #s are pushed until the stack is [0, 11, 1
    *.      multiplies the top 2 values of the stack to give 11, and prints it (yay!)
      _     Sends the IP right, because the top value of the stack is 0
       q    Ends the program (no-op for '93, which continues to @)

Ważne uwagi:

  • 0Obok bnie jest to bezwzględnie konieczne w obecnym stanie kodu, a stos została wyczyszczona. Można go usunąć, jeśli to konieczne, ale pozwala wcześniej na inne manipulowanie stosami w ramach ewentualnego przyszłego programu.
  • _q@Jest tam jako część siatkówki (To nie działa bez niego, nie pytaj mnie dlaczego). Dodanie qpozwala również kodowi 98 uruchomić toperację, która dzieli adres IP (wraz z drukowaniem programu Retina 8 zamiast 7)
  • Nie _jest to proste, >ponieważ zepsułoby to część SMBF.

Edycja: Właśnie zdałem sobie sprawę, że _q@prawdopodobnie powinno być @00(gdzie 0 może być ~ dowolnym znakiem), aby program był bardziej elastyczny w przyszłości. Jestem jednak zbyt leniwy (i zmęczony), żeby zmienić teraz wszystkie linki. W końcu do tego dojdzie ...

Edycja 2: Tak szybko nie spodziewałem się 6 dodatkowych odpowiedzi. Wydaje mi się, że tak jest. Świetna robota dla wszystkich!


Heh, napisałem moją 11. odpowiedź, tylko po to, aby zdać sobie sprawę, że została już opublikowana, teraz zmieniłem ją na 12. odpowiedź :)
szarlatan krów

Wiesz, dlaczego Vim wykonuje tak długo?
MildlyMilquetoast,

@MistahFiggins Chyba dlatego, że kod musi zostać przekonwertowany na naciśnięcia klawiszy, ale poza tym nie mam pojęcia
szarlatan krów

Napisałem tego tłumacza vim i nie mam pojęcia, dlaczego to trwa tak długo. Nie zauważyłem wcześniej wielu problemów z wydajnością, ale to dlatego, że większość moich odpowiedzi V / Vim ma mniej niż 40 bajtów. Nie bardzo wiem, co go powoduje, ale wiele osób narzeka na to w tym temacie.
DJMcMayhem

20

35. INTERCAL (C-INTERCAL), 631 bajtów

#v`16/"<"6/b.q@"(: ::Q):  ␉␉␉␉ :(22)S#;n4"14"
#>3N6@15o|>␉^*ttt*~++~~~%
#= >␉1#v#v0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#[␉
#`<`|
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"␉*
""""#//
=begin␉//
$'main'//
#-3o4o#␉
=end   #//
"""#"#//
#0]#echo 21#/ (\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a
#   +/Jn~
#8␛dggi2␛`␉|1|6$//''25  >>>#>27.say# =#print(17)#$nd^_^_.]Q222999/+23!@1#"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 je online!

Zniszczony

Ten program drukuje 35 w INTERCAL, 34 w Rail, 33 w incydencie, 32 w Whirl, 31 w Modular SNUSP, 30 w Whitespace, 29 w Trigger, 28 w Brain-Flak, 27 w Perl 6, 26 w 05AB1E, 25 w Pip , 24 w Thutu, 23 w Hexagony, 22 w niedociążeniu, 21 w Nim, 20 w Preludium, 19 w Reng, 18 w Kardynale, 17 w Julii, 16 w 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. Testowałem Incydent lokalnie na własnym systemie, używając oficjalnego tłumacza.

Zauważ, że dodałem kilka zmian do sterownika testowego, aby ułatwić wykrycie ukrytych znaków; różne bajty NUL wkradły się na wyjście programu w niektórych językach. Zdecydowałem, że to prawdopodobnie nie jest problem, ponieważ a) robił to szeroki zakres zgłoszeń, oraz b) tłumacze Befunge wydają się dodawać dodatkowe NUL bajty, chociaż nic w programie nie sugeruje tego (chyba że ja coś przeoczyłem), więc musiało to trwać od wieków i prawdopodobnie jest częścią tego, jak działa tłumacz. (Należy zauważyć, że w językach, które nadal wysyłają bajty NUL - Befunges i Minkolang - nie zmieniono kodu tego przesłania).

Poprzednie zgłoszenie Raila kończy się przez awarię, która jest niedozwolona, ​​ale można to łatwo naprawić (dodając #na końcu programu Rail i dostosowując Hexagony do dopasowania), więc nie uważałem tego za poważny problem. Szyna w tym rozwiązaniu wychodzi poprawnie.

Wyjaśnienie

Jak działa kod INTERCAL

INTERCAL analizuje cały program. Jednak błędy składniowe są w środowisku INTERCAL elementem wykonawczym, a nie czasem kompilacji, i jest to często wykorzystywane do tworzenia komentarzy. (Jeśli próba wykonania błędu składniowego spowoduje jego awarię, spowoduje to awarię programu z błędem ICL000I, wbrew błędnemu twierdzeniu Wikipedii. Ale jeśli możesz temu zapobiec - a INTERCAL ma wiele sposobów, aby zapobiec wykonywaniu poleceń - spowoduje to całkiem szczęśliwie nie wykonać bez spowodowania problemu).

W związku z tym możemy zapobiec śmieciom na końcu uruchomionego pliku, po prostu najpierw zamykając program (co jest i tak wymagane), ponieważ INTERCAL ulega awarii, jeśli dojdzie do końca programu bez wyraźnej komendy exit). Obsługa początku programu jest bardziej interesująca i wykorzystuje błąd analizatora składni. Możesz napisać coś DO %20 READ OUT #8w stylu wyjścia VIIIz prawdopodobieństwem 20% (a poza tym nic nie robić). O ile mogę stwierdzić, C-INTERCAL analizuje samotny% w drugiej linii jako wskazujący na 0% prawdopodobieństwa uruchomienia pierwszego polecenia, a zatem konsekwentnie nie uruchamia go za każdym razem. (Nie jestem pewien, dlaczego tak to analizuje, ale patrząc na skompilowany kod pokazuje, że generuje liczbę losową i porównuje ją do 0.)

Oto jak wyglądał program INTERCAL przed dopasowaniem go do reszty poliglota:

DO,1<-#2
DO,1SUB#1<-#52
DO,1SUB#2<-#32
DOREADOUT,1
PLEASEGIVEUP

Jest to dość proste: utworzenie 2-elementowej tablicy; ustaw odpowiednio elementy na 52 i 32 (dziesiętne) (najlepiej nie wspominać o kodowaniu ciągów INTERCAL; zapomniałem, jak to działa i musiałem przeprowadzić różne eksperymenty, aby dowiedzieć się, dlaczego te liczby kodują 35); odczytać na standardowe wyjście; i wyjdź z programu. Na końcu dodałem dodatkową PLEASE, aby zakończyć instrukcję GIVE UP, rozpoczynając nową instrukcję dla śmieci na końcu programu, zachowując akceptowalne granice dla grzecznej rozmowy. Oczywiście INTERCAL nie wygląda zupełnie tak w gotowym produkcie; Wyjaśnię dlaczego, kiedy będziemy.

Pochowany pod ciężarem Ses

Najbardziej oczywistym problemem związanym z programem INTERCAL jest to, że zawiera on literę S. Jest to prawie nieuniknione, ponieważ nie można zindeksować tablicy bez użycia danej litery. Jest jednak Spoleceniem wyjściowym w trybie Niedociążenie i nie ma sposobu, aby zapobiec analizowaniu całego programu. Jedynym rozwiązaniem jest umieszczenie kodu INTERCAL w nawiasach, odpowiedniku niedociążenia literału łańcucha, aby nie działał natychmiast.

Mamy jednak dwa ^znaki na końcu programu, które wykonują kod niedociążenia; więc te i tak Szostaną wykonane, jeśli nic z tym nie zrobimy. Mogłem zmienić go na inny znak, ale zdecydowałem, że łatwiej jest chronić kod, aby stał się bez znaczenia. aucieka przed łańcuchem w Niedociążeniu (co oznacza, że ^po wykonaniu łańcucha po prostu usunie go z ekranu, zamiast wywoływać szkodliwe skutki uboczne). Mamy już jeden aw sayużywanym kodzie Perl 6 (który w tym układzie kodu jest wystarczający ze względu na niepowiązane zmiany). Jednak aby ludzie nie musieli na tym polegać, dodałem kolejnyana końcu linii (i tak chciałem tam postaci, aby uwidocznić to, co w przeciwnym razie byłyby końcowe spacje, a ponieważ Hexagony wymagał wypełnienia w tej postaci; zwróć uwagę, że Hexagony był dość łatwy do naprawienia w tym programie i tak naprawdę nie potrzebujesz osobnej dyskusji). Więc kod niedociążenia jest trochę mniej kruchy, niż mógłby być.

Preludium do wielu prac i zamieszania

Ach, Preludium. Zwykle nie jest to najtrudniejszy język, ale zdecydowanie tak było. Istnieją dwa prawdziwe problemy: jeden polega na tym, że dodanie dodatkowych nawiasów na bardzo długiej linii niesie ze sobą ryzyko zakłócenia przepływu sterowania programem Prelude (ponieważ tworzą one odpowiednik whilepętli), a jednym z nich jest po prostu problem zapobiegający ich podszyciu w górę w pionie (co odpowiada za większość przypadkowego przemieszczania się białych znaków na liniach). Zauważ, że Whitespace też sprawił mi trochę kłopotów, ale ten program jest podobny do poprzedniego z punktu widzenia Whitespace, więc był to w zasadzie przypadek „naprawienia Preludium bez zerwania białych znaków”.

Nie jestem zbyt pewien, jak Preludium faktycznie działa w tym momencie. Jest kilka poprawek do tego przeznaczonych, na przykład 0 w lewym dolnym rogu, ale najwyraźniej nie działają one tak, jak zamierzałem. (Kod Julii również został przeniesiony na sam dół wiersza, ponieważ nawiasy w jego printoświadczeniu były naprawdę trudne do rozwiązania.) Być może będziemy musieli po prostu zostawić to tajemnicą.

Awaria w reaktorze rozszczepienia

Chociaż powyższe zmiany dotyczyły dość subtelnych problemów, które trudno naprawić, istnieje o wiele bardziej oczywisty problem; DOREADOUTpasuje do wyrażenia regularnego R...O, a tym samym spowoduje, że rozszczepienie wytworzy niepożądane wyjście w czwartym cyklu, co nie jest wystarczającym czasem na wygenerowanie zamierzonego wyjścia 12. I INTERCAL ma tylko jedną instrukcję, która generuje dane wyjściowe (chyba, że ​​jako dane wyjściowe uznajesz awarię). Jednym z rozwiązań tego problemu jest próba dodania spacji między READi OUT, aby dać nam czas na przechwycenie wyniku, ale to denerwuje Whitespace. Przez pewien czas myślałem, że ten program jest niemożliwy; R, L, U, I Dsą wszystkie punkty wejścia w rozszczepienia, a wszystko stanie potencjalnie uruchomiony kod problematycznej i INTERCAL słowa kluczowe muszą być wielkimi literami.

Jest jednak poprawka i dość zaskakująca. W ramach procesu internacjonalizacji C-INTERCAL akceptuje słowa kluczowe w wielu językach, z obsługą zarówno angielskiego, jak i łacińskiego. Nie mogliśmy tego uniknąć S, ale możemy tego uniknąć O; FACjest doskonale dobrym substytutem DO, a także LEGERE EXoznacza to samo, co READ OUT. (W ten sposób program skończył się mieszanką angielskiego i łaciny, ale to jest w porządku; prawie nie czyni go mniej czytelnym.) W związku z tym możemy z radością pozwolić Fission zwariować w prawym dolnym rogu, i po prostu nie pozwolić, aby produkował wynik. Możemy zmienić aktualny kod rozszczepienia na koniec *zamiast na;, który zamyka cały program, a nie tylko jeden wątek; ten kod działa dość szybko, więc wychodzi z programu, zanim wszystkie zbłąkane punkty wejścia zdążą wyrządzić jakiekolwiek szkody.

Dzianina 6, Perl 6

Następny problem: komentarze w Perlu 6 działają poprzez dopasowanie <i >. Operatorem przypisania INTERCAL jest <-. Na szczęście, to dodaje dodatkowe nawiasy otwierające , więc mogłem po prostu dodać kilka nawiasów zamykających, aby je anulować w osobnej lokalizacji w programie (w tym przypadku tuż po kodzie Pip).

Nie chciałem jednak zmieniać budżetu na białe znaki programu, ale przeniesienie kodu Julii (dla Preludium) spowodowało dodanie dodatkowej spacji do ostatniego wiersza; Musiałem skądś je usunąć. Podwójna spacja jest znacznikiem komentarza w Pipie, więc prawie nie mogłem ich zmienić; jedyną dostępną opcją jest miejsce w say 27. Golfiści Perla 5 od razu pomyśleliby, że „dobrze, po prostu zrób say+27to” (unary +przydaje się zaskakująco często!), Ale niestety nie jest to poprawna składnia Perla 6.

Co nam może zrobić, chociaż, aby zmienić sayod składni funkcji do składni metody. Literały całkowite mają wiele metod, w tym jedną do ich wydrukowania, więc 27.sayjest to całkowicie poprawny program o tej samej długości.

Być kwadratowym? Nie bądź tam

Kolejnym problemem jest to, że dodałem dodatek .do programu. Użytkownicy SMBF będą wiedzieć, że jest to wyraźnie problem w tym języku, generując zbłąkane dane wyjściowe (w tym przypadku NUL bajtów). Było już. produkujących wyjście bezpański ostatni program, ale to nie znaczy, że nie powinien skorzystać z okazji, aby go naprawić.

Podstawową ideą jest tutaj utworzenie pętli SMBF w celu skomentowania instrukcji obrażających. Oznacza to przesuwanie nawiasów kwadratowych. Wziąłem je z całego kodu SNUSP (ponieważ i tak były tam tylko ze względu na Incydent, a Incident nie obchodzi, gdzie są w programie) i umieściłem nawias otwierający na początku kodu INTERCAL, a klamra zamykająca tuż przed spustem (w ten sposób starannie ukrywając oba .).

Niestety nawiasy kwadratowe mają znaczenie dla Retiny; widzi […<-#…i mówi „to nie ma sensu, nie możesz stworzyć tego zakresu, ponieważ <nie występuje wcześniej #”. Na szczęście można to łatwo naprawić za pomocą strategicznie umieszczonego ukośnika odwrotnego.

Incydent w centrum programu

To stało się ostatnią odpowiedzią i od tej pory prawdopodobnie będzie się powtarzać; różne ciągi zdarzały się przypadkowo trzy razy i przesuwały się wokół centrum programu z punktu widzenia Incydentu.

Najpilniejszym do obsłużenia był token 1#, który pojawia się trzy razy, jeśli dokonasz tych zmian naiwnie: #= >␉1#na początku trzeciej linii __DATA__=1#i echo 21#. Dlaczego to jest problem? Ponieważ 1#trzecia linia nachodzi na siebie #vzaraz po niej, a dwa nakładające się tokeny nie powodują policzenia żadnego z nich. I #vjest token zwykliśmy komentować kodu przed programem zewnątrz Incident! Naprawiłem to, wkradając się na dodatek 1#bardzo blisko końca programu (podążają za nim tylko trzy znaki); żaden z języków analizujących tę część programu nic z tym nie robi.

Było wiele innych problematycznych żetonów do rozwiązania. Kilka były pojedyncze litery, Pa U; Poradziłem sobie z tym, zmieniając kilka brakujących wypełniaczy w kodzie zdarzenia z xna odpowiednio Plub U, dając czwartą kopię. Zmiana na kod rozszczepienia pozostawia *jako token, ale przede wszystkim jest podzielony inaczej niż normalnie, pojawia się dwa razy przed kodem zdarzenia i tylko raz później. Dlatego zamiast go usunąć, użyłem go do częściowego zrównoważenia nowego LEtokena, który pojawił się w kodzie INTERCAL. To wystarczy, aby przejechać środek programu z powrotem0oznak. Oczywiście zmiany w programie mogą to zakłócić. (Moje próby przeniesienia Incydentu na TIO nie powiodły się, ponieważ libdivsufsort nie jest tam dostępny, więc wygląda na to, że moglibyśmy skorzystać z nowego tłumacza, zwłaszcza w JavaScript, aby mógł on działać online. Jeśli jesteś zainteresowany, spójrz na to pytanie ).


1
Wow, to wyzwanie przeszło zaskakująco długą drogę. Dobra robota!
MildlyMilquetoast

Łacina?! Wow, co za świetne rozwiązanie! Podoba mi się, że kod mówi teraz „proszę się poddać”. To tak, jakby odważyłem się odejść.
Szansa

19

1. Python 3 (8 bajtów)

print(1)

Ten program wypisuje 1 w Pythonie 3.

Zaczynam od Pythona 3, ponieważ wiem, że jest dobry dla poliglotów i że można go poprowadzić w wielu różnych kierunkach (chciałem też upewnić się, że pierwsza odpowiedź była w stosunkowo normalnym języku, a nie w absurdalnym esolangu, który jest trudny do poliglota z).


Czy> <> byłoby dobrym wyborem dla drugiego języka (abyśmy zaczęli spację 2d)?
Krowy szarlatan

Oznacza to, że następna odpowiedź nie może być dłuższa niż 9 bajtów? Naprawdę trudno będzie wymyślić inną.
DJMcMayhem

1
@DJMcMayhem Każda odpowiedź nie może być
kwakanie krów

19

10. Befunge , 95 bajtów

#v02^0;7||"<+0+0+0+<;n4
#v0#@00
#>3N.
#|\w*
#8
#|
#M`
print(None and 9or 1/2and 1or 5)
#jd5ki2

Pomiędzy ji dw ostatnim wierszu znajduje się dosłowny znak ESC (grr, @ ais523). Nie jest uwzględnione w tym kodzie. Aby uzyskać rzeczywisty kod, przejdź do Try it onlinelinku.

Drukuje 1 w Python 3, 2 w Vim, 3 w Minkolang, 4 w <> <, 5 w Python 2, 6 w SMBF, 7 w Japt, 8 w Retina, 9 w Perl i 10 w Befunge.

Ten kod dzieli się *z Retina oraz .z Minkolang i SMBF.

Wypróbuj online

Wyjaśnienie

Rzeczywisty program

#v02^
    @
    .
    *



    t
    5
#v02^

Ostatni wiersz został napisany dla jasności ( plac zabaw Befunge jest cykliczny).

#

Trampolina, przeskakuje v

02^

Naciśnij, 0a następnie 2ułóż w stos i idź w górę.

5t*.@

Push 5, no-op, pomnóż dwa elementy na stosie ( 2i 5), wydrukuj, zakończ program.


1
To powoduje, że SMBF drukuje bajt zerowy na początku ..
PurkkaKoodari,

@ Pietu1998 naprawiony!
JungHwan Min.

Hej, to nie ja wybrałem język, w którym wiele najważniejszych poleceń to znaki niedrukowalne ... (W innych wiadomościach rozważałem Befunge jako silną możliwość dodania do tego poliglota; wydaje się, że dobrze pasuje inne języki. Podoba mi się sposób, w jaki to zrobiłeś, chociaż może wymagać modyfikacji, aby zmieścił się bardziej.)

@ ais523 Zgadzam się, że modyfikacja tego kodu może być trudna. Aby to złagodzić, wstawiłem kilka 0s, aby wskazać, że tymi znakami mogą być cokolwiek (oprócz "<+0+0+0+<;n4części), a części kodu Befunge można przesuwać. I wskazówka dla następnej osoby: większość znaków nie ma żadnych opcji w Befunge, więc dodanie większej liczby linii prawdopodobnie nie wpłynie na kod Befunge.
JungHwan Min.

Zastanawiam się nad przesłaniem befunge-98 (lub innej podobnej funge), ponieważ dodają sporo operacji, których nie ma w normalnym '93. Może być trudno dopasować i musiałbym dowiedzieć się, jak działały wszystkie inne języki, abym mógł je obejść ...
MildlyMilquetoast,

19

21. Nim (161 bajtów)

#v`16/"<"6/b.q@#;n4"14""
#>3N6@15o|> ^*ttt*~++ %
#=~nJ<R"12";
#[

print((1/2and 9 or 13)-(0and+4)^1<<65>>62)#46(89999+++++!)=#print(17)#]#echo 21
#8dggi2` |1|6

Dwie <ESC>sekundy, pomiędzy 8di pomiędzy 2`ostatnią linią. Możesz powiedzieć, że mój poprzedni był w golfa w pośpiechu, ponieważ obudziłem się dziś rano i zdałem sobie sprawę, że mogę wziąć jeszcze więcej. Miałem 152 bajty, ale wydaje się, że działa to tylko w Perlu 5.24.0, więc w trosce o kompatybilność z TIO na razie zachowałem oryginalne wyrażenie.

Drukuje 1 w Python 3, 2 w V, 3 w Minkolang, 4 w> <>, 5 w Python 2, 6 w SMBF, 7 w Japt, 8 w Retina, 9 w Perlu, 10 w Befunge-93, 11 w Befunge -98, 12 w rozłamie, 13 w rubinie, 14 w Turtléd, 15 w stogu siana, 16 w Pyth, 17 w Julii, 18 w kardynale, 19 w Reng, 20 w Preludium i 21 w Nim .

Zauważ, że Nim na ideone.com używa wersji 0.11.2, która jest odrobinę za stara, ponieważ program ten opiera się na #[ ... ]#komentarzach wieloliniowych dodanych na początku 2016 roku.

Dzięki interpreterowi systemu Windows w Cardinal mój przepływ pracy składa się teraz z dwóch laptopów i Pythona http.serverpomiędzy nimi.


Edytuj - kilka innych wskazówek:

  • Początkiem 8ostatniego wiersza jest ustawienie limitu Retiny na pierwsze 8 meczy, w przeciwnym razie Retina wyrzuciłaby 2. Zauważ, że oznacza to, że regex ostatniej linii musi teraz pasować co najmniej 8 razy w drugiej ostatniej linii, a nie dokładnie 8 - podczas mojego wtrącania zmodyfikowałem Preludium, aby uzyskać prawidłową Retinę, ale okazało się, że w końcu nie było to konieczne .
  • Niedopasowany cytat na końcu pierwszego wiersza jest taki, że Pyth nie skarży się na niepoprawną składnię reszty kodu.
  • Jeśli zmodyfikujesz drugą linię, być może będziesz musiał zmienić 6@dla Minkolang, co powoduje, że wskaźnik przeskakuje o 6 pól, aby wylądować na nim ^.
  • Jest []teraz parę , więc SMBF musi znajdować się na komórce 0, zanim trafi do [, lub alternatywnie wnętrze musi wyczyścić komórkę.

Prawdopodobnie jest coś więcej do gry w golfa (nawet teraz widzę wolne miejsce przed %kardynałem), ale naprawdę powinienem przestać grać w golfa we wczesnych godzinach porannych.


1
TIO obsługuje teraz Cardinal
MildlyMilquetoast

19

51. Zestaw (x64, Linux, AS) , 1086 bajtów

#16  "(}23!@)(" 3//*v\D@;'[af2.qc]'#)"14";n4
#/*` PkPPZ (22)S"[!(>7 7*,;68*,@;'1,@␉␉␉␉ q
#>␉
# >36!@␉
#`<`
#<]+<[.>-]>[
#{
#z}
#
#=x<R+++++[D>+++++++EAL+++<-][pPLEASE,2<-#2DO,2SUB#1<-#52PLEASE,2SUB#2<-#32DOREADOUT,2DOGIVEUPDOiiipsddsdoh]>+.-- -. >][
#x%+>+=+~tt .
#D>xU/-<+++L
#R+.----\).>]|
#[#[(}2}20l0v01k1kx0l0ix0jor0h0h1d111x0eU0bx0b0o1d0b0e0e0@O6O4/0m1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10vx0v0l111111^_)  0046(8+9+9+9+9+=!)
###|
'\';echo 50;exit;';print((eval("1\x2f2")and(9)or(13))-(0and 4)^1<<(65)>>(62))or"'x"or'({({1})({1}[(0)])}{1}\{1})'#}#(prin 45)(bye)|/=1/24=x<$+@+-@@@@=>+<@@@=>+<?#d>+.--./
__DATA__=1#"'x"//
#.\."12"__*'
###;console.log 39
""""#//
=begin //
#sseemeePaeueewuuweeeeeeeeeeCisajjap*///;.int 2298589328,898451655,12,178790,1018168591,84934449,12597/*
#define p sizeof'p'-1?"38":"37"
#include<stdio.h>
main ( )/*/
#
#"`#"\'*/{puts (p);}/*'"`"
/*
<>{#65}//
#}
disp 49#//
#{
1}<>//
$'main'//
#-3o4o#$$$
#<R>"3"O.
=end #//
"""#"#//
#}
#s|o51~nJ;#:p'34'\=#print (17)#>27.say#]#print(47)#]#echo  21
#sss8␛dggi2␛ `|1|6$//''25  16*///89^_^_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ć.

Chcesz dowiedzieć się więcej? Wypróbuj czat Polygot !

Wypróbuj online!

Wynik VIP ( wszechstronna drukarka liczb całkowitych ): .008186 (w celu poprawy, następny wpis nie powinien przekraczać 1151 bajtów)

Ten program drukuje 51 w asemblerze , 50 w Bash, 49 w Octave, 48 w Deadfish ~, 47 w Lily, 46 w Cubix, 45 w PicoLisp, 44 w alphuck, 43 w siatce, 42 w złym, 41 w brainf *** , 40 w minimalnym 2D, 39 w CoffeeScript, 38 w C, 37 w C ++, 36 w Labiryncie, 35 w INTERCAL, 34 w szynie, 33 w incydencie, 32 w Whirl,31 w modułowych SNUSP, 30 w białych odstępach, 29 w Trigger, 28 w Brain-Flak, 27 w Perl 6, 26 w 05AB1E, 25 w Pip, 24 w Thutu, 23 w Hexagony, 22 w Underload , 21 w Nim, 20 w Preludium, 19 w Reng, 18 w Kardynał, 17 w Julia, 16 w Pyth, 15 w Haystack, 14 w Turtlèd, 13 w Ruby, 12 w Rozłam , 11 w Befunge-98,10 w Befunge-93, 9 w Perlu 5, 8 w Retinie , 7 w Japt, 6 w SMBF, 5 2 w V / Vim i 1 w Python 3.w Python 2, 4 w> <>, 3 w Minkolang,

Weryfikacja

Większość języków jest testowana przez sterownik testowy pokazany powyżej.

  • Reng można przetestować do wyjścia 19 tutaj,.

  • Modułowy SNUSP można przetestować do wyjścia 31 tutaj .

  • Oglądany kształt sześcianu Cubix tutaj

  • Incydent jest sprawdzany poprzez utrzymanie równowagi żetonów, jak opisano w poprzednich odpowiedziach.

  • Dla Deadfish ~, mogą być testowane na wyjściu 48 z tego . Zauważ, że Deadfish ~ pobiera poliglota, który ma być karmiony standardowym stdinem, ale drukuje pewną liczbę>> standardowym wyjściem, na standardowe wyjście monitów, które są nieuniknioną konsekwencją uruchomienia dowolnego programu Deadfish ~.

  • Montaż może być testowany na wyjściu 51 tutaj

Dziękuję i gratuluję

Kiedy odpowiedź @ ais523 50-w-1-k spadła 2 tygodnie temu, łza spłynęła mi po policzku. To było zbyt piękne. I to było w Bash. To było zbyt idealne.

Odwróciłem się do żony i powiedziałem „Myślę, że poliglot jest skończony”, odczuwając ogromną dumę.

Odwróciła się, żeby spojrzeć mi w oczy, przerwała na chwilę i powiedziała: „Dobrze. Teraz wyjmij śmieci. ”

Chodziło jej o to, że czuła głęboką radość dla mnie i moich internetowych przyjaciół. Dziękuję i gratuluję wszystkim.

Wyjaśnienie zespołu

W następnych dniach mój umysł wędrował z powrotem do czegoś, co @ ais523 powiedział na czacie poliglota na krótko przed opublikowaniem Basha. Zwrócił uwagę, że niektóre smaki montażu# komentarze linii i /*komentarze blokowe. Cóż, to wystarczyło, żebym powoli tracił rozum przez następne 2 tygodnie.

W poliglotach istnieje swego rodzaju ukryte wyzwanie polegające na włączeniu legalnych języków. Używam tutaj terminu legalnie bardzo luźno, ale myślę, że wszyscy możemy sobie wyobrazić, o co mi chodzi. Brainf *** to jedna rzecz, ale zupełnie inna rzecz to Mathlab lub R. Assembly z pewnością należy do tej drugiej kategorii, a mój umysł nie mógł odpuścić. Ale nic nie wiedziałem o Zgromadzeniu, więc była to bitwa pod górę.

Po chwili uderzenia głową w problem, szukając sposobu na współistnienie asemblera i C / C ++, znalazłem dokumentację dla asemblera GNU:

Aby zachować zgodność z wcześniejszymi asemblerami, linie zaczynające się od „#” mają specjalną interpretację. Po „#” powinno znajdować się wyrażenie bezwzględne (patrz Wyrażenia): logiczny numer linii następnego wiersza. Dopuszczalny jest łańcuch (patrz Ciągi): jeśli jest obecny, jest to nowa nazwa pliku logicznego. Reszta linii, jeśli w ogóle, powinna być spacją.

Zauważyłem, że stało się to dość podobne do naszej dyrektywy przedprocesowej dla C / C ++ w linii 1 poliglota. Po kilku próbach i błędach odkryłem, #1 “bla” 1//*że wprowadziłby komentarz blokowy tylko do asemblera.

I tak powstał poliglot.

Z największymi rozwiązanymi problemami z blokowaniem, postanowiłem zagrać w golfa na przykładzie tego świata.

.intel_syntax noprefix
.section .data
     msg: .asciz "51"
.section .text
.global _start
_start:
    # write syscall
    mov     rax, 1
    # file descriptor, standard output
    mov     rdi, 1
    # message address
    mov     rsi, OFFSET FLAT:msg
    # length of message
    mov     rdx, 14
    # call write syscall
    syscall
    #End the Program
    mov    rax, 60
    mov    rdi, 0
    syscall

Kredyt pierwotny autora

Właściwie skłamałem przed chwilą, pierwsza używana wersja kodu asemblera była w składni AT&T, która jest jedną z dwóch gałęzi syntaktycznych asemblera. Jednym z głównych elementów składni AT&T jest to, że odwołania do rejestrów używają %przedrostka, co jest problemem dla poliglota. Kardynał używa %jako początkowego wskaźnika, więc jeśli zaśmiecilibyśmy sporo %, byłoby to jak druga reakcja rozszczepienia.

Druga gałąź składniowa, która nie jest używana %jako przedrostek rejestru, nosi nazwę składni Intela. Exploit, którego używamy w poliglocie, aby ominąć pierwszą linię i wprowadzić komentarz blokowy, znajduje się w asemblerze GNU (w skrócie GAS lub AS). AS ma tę przyjemną cechę, że pozwala na obie gałęzie składniowe. Musisz tylko zadeklarować, że chcesz użyć składni Intela, co dzieje się w wierszu 1 kodu asemblera.

Zespół używa rejestrów, które są niewielką liczbą lokalizacji pamięci dosłownie zlokalizowanych na CPU dla szybkości dostępu. Nie jest to jedyne w Zgromadzeniu inne niż fakt, że ich użycie nie jest oderwane od troski dewelopera.

Istnieją różne rodzaje rejestrów, które są wykorzystywane do różnych celów. Z Wikipedii:

• AX mnożyć / dzielić, ładować i przechowywać ciąg

• Liczba CX dla operacji i zmian ciągów

• Adres portu DX dla IN i OUT

• Rejestr indeksu BX dla MOVE

• SP wskazuje na górę stosu

• BP wskazuje na podstawę ramy stosu

• SI wskazuje na źródło w operacjach strumieniowych

• DI wskazuje miejsce docelowe w operacjach strumieniowych

AX jest stosowany w linii funkcji _start tutaj: mov rax, 1. rW raxwskazuje, że pamięć jest 64-bitowym. Jeśli zamienimy to na e, wskazywałoby to na pamięć 32-bitową, co jest całkowicie poprawne w przypadku procesora 64-bitowego. Po prostu nie wykorzystalibyśmy górnej połowy dostępnej pamięci. Aby wskazać pamięć 16-bitową, wystarczy użyć ax, co jest dla nas w porządku, ponieważ drukujemy tylko liczby całkowite. Możemy więc zagrać w kilka bajtów, zmieniając wszystkie odniesienia do rejestru na 16-bitowe.

Okej, nie do końca wszystkie odniesienia do rejestru mogą upuścić r. mov rsi, OFFSET FLAT:msg. Jeśli znasz Asembler, ale nie to stwierdzenie, to dlatego, że było to częściowo unikalne dla AS. Przynajmniej to, co wyciągnąłem z tego , co pomogło mi sprowadzić złoto do sprawiedliwego lea rsi,m.

Po tym, eksperymentalnie odkryłem, że mogę powalić _start:się na sprawiedliwość _pi ciąć .global _startcałkowicie, wydając tylko ostrzeżenie. Po drugie, msg:został zredukowany do jednej zmiennej znakowej p:. Wybrałem pzarówno zmienną łańcuchową, jak i funkcję początkową, aby zrównoważyć część zestawu sdodanego dla korzyści Alphucka.

Następnie ;włączam, aby rozgraniczać instrukcje, aby umieścić je wszystkie w jednym wierszu. Ma to przede wszystkim na celu uniknięcie nadmiernego trailing #//s na każdej linii z korzyścią dla Thutu. Zauważyłem też, że nasz asembler nie wydaje się rozróżniać wielkości liter, więc po prostu zapisywałam wielkie i małe litery różnych znaków, aby uniknąć nierównowagi incydentów.

To nas sprowadziło do:

.intel_syntax noprefix;.text;mov ax,1;mov di,1;lea rsi,m;mov dx,2;syscall;mov ax,60;mov di,0;syscall;m:.asciz "51"

Po tym wszystkim Japt i Underload były jedynymi problemami dzieci w tej odpowiedzi. Japt miał trochę wołowiny z *dodatkiem dodanym w linii 1, ale wydawało się, że zostało to naprawione poprzez powrót do puts(p);linii z odpowiedzi C ++. Skończyło się również na rzucaniu (w tym wierszu i zamykaniu go w wierszu Octive. Było tak, aby niedociążenie przestało działać. Podobne leczenie zastosowano w wierszu 1, aby dodać *tam.

To wystarczyło, aby spełnić wymagania bajtowe tego wyzwania. W rzeczywistości zweryfikowałem to, produkując tę wersję oprogramowania poliglotycznego. Ale chciałem również spróbować poprawić wynik VIP, jeśli to możliwe. A ponieważ spełniłem wszystkie wymagania związane z tym wyzwaniem, czułem się dobrze, współpracując przy grze w golfa. Zatrzymałem się więc na czacie poliglota, by poszukać pomocy w golfie.

Musimy zejść głębiej

@ ais523 zademonstrował technikę przekazywania instrukcji asemblerowi jako kodu maszynowego za pomocą tej instrukcji.

.text;.long 2298589328,898451655,12,178790,1018168591,84934449,12597 Kod maszynowy to seria instrukcji numerycznych wykonywanych bezpośrednio przez CPU, które mogą być reprezentowane w postaci dziesiętnej, szesnastkowej lub ósemkowej. Dla naszych celów liczba dziesiętna jest najkrótsza, ponieważ (hex 0xreprezentuje wiodącą reprezentację). .longOświadczenie tutaj robi deklarację, że co za tym idzie to seria przecinku instrukcje kodu maszynowego.

Cóż, naciągnąłem również na to stwierdzenie, aby zobaczyć, na co pozwoli asembler, i wprowadziłem kilka zmian. Po pierwsze, stwierdziłem, że mogę usunąć .text;wszystko razem, z tylko problemami z ostrzeżeniami, co było dość sprzedaną oszczędnością bajtów. Potem chwilę później znalazłem to stwierdzenie w dokumentacji specyfikacji AS

.long jest taki sam jak .int

Chłodny. Możemy więc dokonać tej wymiany na szybki bajt. Teraz nasz zestaw, ale tak naprawdę kod maszynowy, został zredukowany do tego:

.int 2298589328,898451655,12,178790,1018168591,84934449,12597.

Chociaż wszystko jest dobrze i dobrze, dość trudno jest pracować bezpośrednio z kodem maszynowym i chciałem przynajmniej zobaczyć, jak wykonać wszystkie tłumaczenia. Idealnie więc chcielibyśmy zdemontować kod maszynowy z powrotem do złożenia. Najłatwiejszym sposobem jest zrobienie zrzutu obiektu, który @ ais523 pokazał mi za pomocą tego fragmentu kodu.

Oto fragment kodu.

A oto tylko Zgromadzenie.

nop
mov    $0x1,%al
mov    %eax,%edi
lea    0xc(%rip),%rsi
mov    $0x2,%dx
syscall 
mov    $0x3c,%al
xor    %edi,%edi
syscall 
.byte 0x35
xor    %eax,(%rax)

Ten link pokazuje także około 2 znaków liczb szesnastkowych obok każdej linii zestawu. Odpowiadają one instrukcjom dziesiętnym. Na przykład, jeśli umieścisz 2298589328w tym przecinku konwerter hex, można dostać 8901B090z powrotem. A jeśli przyjrzysz się uważnie, są to pierwsze 4 instrukcje szesnastkowe z zrzutu obiektu (w odwrotnej kolejności).

Z tego, co mogę powiedzieć, zestawy 4 liczb szesnastkowych są zawsze używane do konwersji na dziesiętne, a główną sztuczką oszczędzania bajtów jest tutaj zbudowanie zestawu, tak aby kilka ostatnich liczb szesnastkowych w naszych 4 zestawach wynosi 00. Te następnie przekształcą do zer wiodących, kiedy wstawiamy je do .intinstrukcji, które są właśnie pomijane.

Tak dzieje się w 12oświadczeniu. W heksowej części zrzutu obiektu jest to 0c 00 00 00.

O ile rozumiem Zgromadzenie w ciągu 2 tygodni. Co za katastrofa!

Incydent

Incydent był trudniejszym rozwiązaniem w przypadku krótszego wdrożenia zespołu, ponieważ spowodował, że znaczniki poliglota znacznie przewyższyły górę. Oto raport z incydentu.

  • ! w wierszu 2 detokenizuje się !

  • Pierwszy EAna linii INTERCAL detonuje się

  • Ostatnia spacja w wierszu od drugiego do ostatniego odznacza token spacji.

  • 85 w ostatnim wierszu detokenizes

  • RW #<R>"3"O.detokenizesR

  • 65w <>{#65 }//tokenizes65

  • 16 w ostatniej linii się detonuje

  • 89 w ostatniej linii się symbolizuje

Kardynał

Właśnie zdałem sobie sprawę, że dokonałem zmiany w Kardynale, że zapomniałem dokumentować. Spędziłem trochę czasu szukając sposobów na oszczędzanie bajtów i postanowiłem nauczyć się kardynała. Po krótkim czasie z dokumentacją zobaczyłem tę linię.

= kopiuje aktywną wartość wskaźnika do jego nieaktywnej wartości.

W poliglocie nie była to sztuczka. Stare rozwiązanie zawierało następujące instrukcje: `++ ~ * t

++ zaskarża do 2.

~ zmienia aktywny stos

* dodaje stosy.

Zdałem sobie sprawę, że ~*można to osiągnąć za pomocą samej =instrukcji, więc przerobiłem rozwiązanie, aby usunąć niepotrzebne zamiany stosów i dodać tę oszczędność małych bajtów.


3
Jestem zaintrygowany tym, jak możesz kontynuować poligloty na tym niesamowitym etapie. W jaki sposób???
Qwerp-Derp,

3
To naprawdę czysta piękność.
Muzer

Unary powinien być następny
Christopher

Nie, to zabiłoby wynik VIP (chyba że kod miałby 3 bajty lub mniej)
CalculatorFeline

19

6. SMBF , 45 bajtów

#v<++++<;n4
#>3N.
print('1'if 1/2else'5')
#i2

Wypróbuj online

Ten program wypisuje 1 w Pythonie 3, 2 w V, 3 w Minkolang v0.15, 4 w> <>, 5 w Python 2 i 6 w SMBF.

Używa SMBF (inaczej Samo-modyfikujący Brainfuck) <++++<>.. Wskaźnik jest przesuwany w lewo (do ostatniego znaku kodu źródłowego), a komórka jest czterokrotnie zwiększana, a następnie drukowana.


17

13. Ruby (129 bajtów)

#v;2^0;7||"<+0+0+0+<*!2'!1'L;n4
#v0#_q@
#>3N.
#|\w*
#8  ^1b0<
#|
#M`
print ((0 and'13')or(None and 9 or 1/2 and 1 or 5))
#jd5ki2

Zwróć uwagę na dosłowny Escznak w ostatnim wierszu między ji d, zgodnie z odpowiedzią Perla na ais523 .

Wypróbuj online!

Drukuje 1 w Python 3, 2 w Vim, 3 w Minkolang, 4 w <> <, 5 w Python 2, 6 w SMBF, 7 w Japt, 8 w Retina, 9 w Perl, 10 w Befunge, 11 w Befunge- 98, 12 w rozszczepieniu i 13 w rubinie.

Tylko niewielka modyfikacja istniejącego printoświadczenia w celu nadużycia faktu, który 0jest prawdziwy w Ruby. Musiałem dodać spacje do innych instrukcji, aby poprawnie parsować.


17

15. Stóg siana (141 bajtów)

#v;2^0;7||"<+0+0+0+<*!2'!1'L#'1r'4;n4
#v0#_q@
#>3N.15o|1
#|\w*
#8  ^1b0<
#|
#M`
print ((0 and'13')or(None and 9 or 1/2 and 1 or 5))
#jd5ki2

Uwaga: nie jest ESCpo ow trzeciej linii i po jw ostatnim wierszu

Drukuje 1 w Python 3 , 2 w Vim, 3 w Minkolang, 4 w <> <, 5 w Python 2 , 6 w SMBF, 7 w Japt, 8 w Retina, 9 w Perl, 10 w Befunge, 11 w Befunge- 98 , 12 w Fission, 13 w Ruby, 14 w Turtlèd i 15 w Haystack.

Wypróbuj online!

Wyjaśnienie

#v                           go down
 v
 >                           go right
  3N.                        does nothing important
     15o|                    outputs 15 and ends program
                             there is an <ESC> after 'o' since 'o' in Vim enters insert mode
         1                   I added this to satisfy Retina

Wspaniale, dziękuję za sprawdzenie Haystack! :)
Kade

@Kade To fajny język 2D, tłumacz online byłby bardziej pomocny (chociaż już pobrałem interpreter Pythona) :)
Cack quack

@Kade Teraz jest link TIO do stogu siana!
Krowy szarlatan

@MistahFiggins Link działa dla mnie i daje wynik 15
szarlatan krów

@MistahFiggins Cache? Ponieważ działa dla mnie bez żadnych problemów i komunikatów o błędach
szarlatan krów

17

9. Perl, 84 bajtów

#v;7||"<+0+0+0+<;n4
#>3N.
#|\w*
#8
#|

#M`
print(None and 9or 1/2and 1or 5)
#j␛d5ki2

Jest to dosłowny ESC znak w kodzie między rzeczywistą ja d; został tutaj zastąpiony przez ␛ dla lepszej widoczności.

Wyświetla 1 w Pythonie 3 , 2 w Vimie (testowane lokalnie, ale tutaj jest link do bardzo podobnego języka V), 3 w Minkolang , 4 w <> < , 5 w Python 2 , 6 w SMBF , 7 w Japt , 8 w Retina i 9 w Perl .

Zdobądźmy trochę bardziej egzotycznych języków, poprzez nadużywanie arytmetyki, która działa inaczej w różnych językach. ( Nonew Pythonie jest falsey, ale w Perlu jest prawdą, a and/ orłańcuchy działają tak samo w obu językach).

Oprócz Pythona musiałem również zmienić kod vim. Zamiast przekształcić go w serię bezczynności, po prostu pozwalam mu wstawiać śmieci, a następnie ponownie je usuwam na końcu.


4
Poważnie? Uczynisz niezwykle trudnym dla kogokolwiek, by udzielił odpowiedzi, jeśli umieścisz dosłownie ESC. Musimy być w stanie przetestować kod.
mbomb007

1
Nie musisz uwzględniać dosłownego ESC we własnych odpowiedziach; Właśnie odkryłem, że jest to najłatwiejszy sposób na napisanie tego. (Dodatkowo działa dobrze w Firefoksie i w testach lokalnych; jedyne, co mnie blokuje przed umieszczeniem go w poście, to to, że Chromium, którego używam do SE, nie chce umieścić go w polu wprowadzania.)

1
Ponadto nie można testować lokalnie pod kątem Vima. Języki są definiowane przez używany interpreter. Więc to naprawdę V, które mieliśmy przez cały ten czas.
mbomb007

1
Err, czy vimtłumacz nie jest dla Vima? (Działa to zarówno w vimV, jak i V.)

4
@ ais523 może wstawisz ␛, aby reprezentował bajt 0x1B?
betseg

17

36. Labirynt , 647 bajtów

#v`16/"<"6/b.q@"(: ::Q):  ␉␉␉␉ :(22)S#;n4"14"
#>3N36!@@15o|>␉^?.*ttt*~++~~~%
#= >␉1#v#v0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#[␉
#`<`|
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"␉*
""""#//
=begin␉//
$'main'//
#-3o4o#␉
=end   #//
"""#"#//
#0]#echo 21#/ (\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a
#   +/Jn~
#0␛dggi2␛`␉|1|6$//''25  >>>#>27.say# =#print(17)#$nd^_^_.]Q2229991#;abcd!fghij/+23!@"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 je online!

Zniszczony

Ten program drukuje 36 w Labiryncie, 35 w INTERCAL, 34 w szynie, 33 w incydencie, 32 w Whirl, 31 w Modular SNUSP, 30 w Whitespace, 29 w Trigger, 28 w Brain-Flak, 27 w Perlu 6, 26 w 05AB1E , 25 w Pipie, 24 w Thutu, 23 w Heksagonii, 22 w Niedociążeniu, 21 w Nim, 20 w Preludium, 19 w Reng, 18 w Kardynale, 17 w Julii, 16 w 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. @ ais523 pomógł debugować i naprawić kod zdarzenia, który teraz działa.

Jak działa Labirynt

Labirynt zaczyna trochę przesuwać niektóre kolumny w źródle, ale po kilku krokach wskaźnik dociera do miejsca, w którym Nznajduje się na 2. linii (początkowo, zanim wskaźnik się tam dotrze, już go nie ma N), przesuwa się w prawo , z 0 na górze stosu. Następnie po prostu popycha i drukuje 36 i kończy się na36!@

Rzeczy, które zrobiłem, złamały się

Wiedziałem, że chcę dodać Labirynt, ponieważ jest to jeden z niewielu esolangów, o których trochę wiem. Dzięki debuggerowi odkryłem, że zmieniając 8 w ostatnim wierszu na 0, Labirynt nie utknął w nieskończonej pętli i, co dziwne, nic innego nie wydawało się zepsuć. Stamtąd po prostu wrzuciłem surowe polecenie 36 i polecenie wyjściowe, których potrzebowałem, a te dogodnie doprowadziły @do zakończenia.

Potem przystąpiłem do naprawy tego, co złamałem: Minkolanga, Kardynała i Sześciokąta.

!Robił Minko pomiń następny znak, który jest potrzebny do rozwiązania, więc po prostu dodany dodatkowy @. Na razie w porządku.

Zmiana długości drugiego wiersza sprawiła, że ​​kardynał przegapił swoje wyjście. Próba dodania dodatkowej informacji .w pierwszej linii sprawiła, że ​​Preludium straciło rozum (bez pojęcia, dlaczego, szczerze mówiąc), więc wybrałem inną metodę i po prostu upuściłem ją w drugiej linii. To nieumyślnie odrodziło trzeci wskaźnik kardynała, więc dopełniłem rzeczy ?(nie koniecznym wyborem, tylko pierwszą rzeczą, którą znalazłem, która naprawiła zarówno rozszczepienie, jak i kardynał).

Sześciokąty były na szczęście stosunkowo prostym rozwiązaniem, po prostu wrzuciłem ciąg liter, aby wskaźnik znalazł kod. Uznałem, że alfabet nie powinien był pojawiać się wcześniej i nie spowoduje problemów z Incydentem. Wtedy też zdałem sobie sprawę, że nie testowałem Incydentu. Dzięki @ ai523 dowiedziałem się, że potrzebuję dodatkowego wykrzyknika, więc eciąg alfabetu został zmieniony na a !.

Wyniki z wszechstronnej drukarki liczb całkowitych

Tylko dla kopniaków i odejścia od komentarza @Stewie Griffin do pytania, oto fragment, który pokazuje, jak każda odpowiedź byłaby oceniona, gdyby została wprowadzona do „The Verstatile Integer Printer”.


1
OK, wygląda na to, że to tylko nieznacznie powoduje problemy z Incydentem; program znajduje się poza środkiem, ponieważ ma teraz dokładnie trzy wykrzykniki, ale można to łatwo naprawić, zmieniając znak wypełniający na czwarty wykrzyknik. Zmieniłem ealfabet dodany do wykrzyknika; to wydaje się działać.

1
Miły! Potajemnie czekałem na labirynt, więc dobrze dla ciebie. W osobnej notatce najlepszą jak dotąd częścią kodu (dla mnie) jest komunikat „PLEASEGIVEUPPLEASE”, który mówi, żebyś przestał próbować. ;)
MildlyMilquetoast

17

41. brainf *** , 916 bajtów

#  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 Dlinii 1 wysyła wskaźnik instrukcji w dół do Lwiersza 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*.xdla 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. pW 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ć, qby 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. Ookazał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 \Ddalej 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 1do poliglota przed linią Incydent / Wir. To dodatkowe 1spowodowało, że Whirl zaczął wskazywać niewłaściwe instrukcje na kierownicy. Pierwszą 1w 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, 4aby 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 Rw #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, xw #= xto, 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.


Błąd w zdarzeniu (drukuje, 3333a następnie czeka na dane wejściowe), ale prawdopodobnie łatwo go naprawić. Problem polega na tym, że już umieszczone token ( -]) po tym ^-tokena, który był wcześniej używany, aby przejść do końca programu. Pozostałe dwa zastosowania -]są następujące po sobie, więc tworzy wzór… xx… x…, który jest skokiem wstecz. Przeniesienie tego -]trochę wcześniej (lub ^_nieco później lub obu) może być jednak dość łatwe.

@ ais523 Dzięki. To właśnie dostaję do gry w golfa podczas pisania. Zawsze pamiętaj, aby sprawdzić dzieci z incydentu. Na szczęście udało mi się to naprawić przez dodanie przez odjęcie, więc myślę, że ogólnie wygrana.
Szansa

1
Jeśli uruchomisz V z -v(dla pełnych słów), możesz zastąpić dosłowne znaki ucieczki <esc>, co może ułatwić pracę z kodem w przyszłości. (Myślę)
Pavel

Łał! Dzięki @ ais523 za nagrodę. Co za świetny sposób na rozpoczęcie w poniedziałek rano!
Szansa

Befunge-98 jest starszy niż Befunge-93?
CalculatorFeline

17

183. Obraz rozruchowy Intel 8080 (ZEMU), 9870 bajtów

Wypróbuj online!

Wyjaśnienie

Dzięki Potato44 za pomysł dodania kodu maszynowego udzielenie tej odpowiedzi było świetną zabawą.

Nie zrobiłem pliku COM CP / M, ponieważ ogranicza rozmiar polyglota do około 60 KB, czego chcę uniknąć. Obraz rozruchowy okazał się jeszcze łatwiejszy do wykonania niż COM, ponieważ ZEMU domyślnie ładuje sektor rozruchowy z 6. sektora (sektory logiczne oparte na 1 bajcie, 128 bajtów), więc start poliglota nie musi być wykonywany. Kod rozruchowy musi mieć przesunięcie 0x280 ((6-1) * 128) w poliglocie.

Używam ZEMU emulator, który jest powiązany z tej strony . Aby uruchomić program Polyglot w ZEMU:

  • Dyski> A: wybierz plik polyglot
  • Opcje> Zestaw instrukcji I8080
  • Naciśnij przycisk Boot

Funkcja wypisująca jeden znak do konsoli ( cns$ot) została skopiowana z BIOS22Dv221.ASM z dystrybucji ZEMU. Wprowadziłem dwie zmiany: znak nie jest maskowany do 7-bitowego ASCII, ponieważ kontrolujemy parametry i jrz cns$otjest zastępowany przez, jz cns$otponieważ jrz(skok względny, jeśli zero) to instrukcja Zilog Z80 nieobecna w Intel 8080.

Wstępny program ( składnia Intel , monter związane z tutaj ):

    org 3120h    ; chosen so that cns$ot == 0x3131, easier to generate
                 ; this program will be generated at this offset
                 ; to run it directly specify org 0100h

    mvi c,31h    ; '1'
    call cns$ot
    mvi c,38h    ; '8'
    call cns$ot
    db 38h       ; for answer 188, NOP in I8080
    mvi c,33h    ; '3'
    call cns$ot
    hlt          ; halt processor

;;;;;;;;; copied from BIOS22Dv221.ASM
cno$sp equ 7dh
cno$sb equ 01h
cno$si equ 00h
cno$dp equ 7ch

; print char to console, receives char in c register
cns$ot:
    in cno$sp    ; in status
    xri cno$si   ; adjust polarity
    ani cno$sb   ; mask status bit
    jz cns$ot    ; repeat until ready
    mov a,c      ; get character in a
    out cno$dp   ; out character
    ret

Ten program zawiera znaki, których nie można używać bezpośrednio w poliglocie. Większość znaków kontrolnych ASCII (kod <0x20) jest zabroniona w Simula, znaki inne niż ASCII (kod> = 0x80) nie mogą pojawiać się same, ponieważ plik musi być poprawny UTF-8. Tak więc powyższy program jest generowany przez inny program, który jest poprawny UTF-8.

Poniższy program generuje potrzebny kod i przeskakuje do niego. ld (hl),anie można użyć z powodu Grass ( 'w'==0x77). sub h(0x94) i xor a(0xAF) są bajtami kontynuacyjnymi UTF-8, muszą być poprzedzone bajtem wiodącym UTF-8. Instrukcja ret nc(= 0xD0, zwróć, jeśli nie przenosi) jest używana jako bajt wiodący UTF-8. Żeby nic nie robić, poprzedza ją scfinstrukcja (ustaw flagę carry). ','Unikano także (0x2C) i '.'(0x2E) dla DOBELA. org 0100hdyrektywa nie jest używana, ponieważ używany asembler jej nie rozumie (org jest ustawiony w GUI). Ten program i tak jest niezależny od pozycji. Bardziej lubię mnemoniki Ziloga, więc użyłem ich do dłuższego programu.

Składnia Zilog , asembler link stąd :

  ; generate: 0E 31 CD 31 31 0E 38 CD 31 31 38 0E 33 CD 31 31 76 DB 7D EE 00 E6 01 CA 31 31 79 D3 7C C9

  ld hl,3120h

  ld a,3Fh
  scf       ; set carry flag so that ret nc does nothing
  ret nc    ; utf8 lead byte for next insn
  sub h     ; a -= h; a = 0Eh;  utf8 cont byte (opcode 0x94)
  ld c,a

  ld (hl),c ; 0Eh    ; not using ld (hl),a because it is 'w'
  inc hl

  ld (hl),h ; 31h
  inc hl

  ld a,32h
  cpl       ; a = ~a; a = 0xCD
  ld d,a
  ld (hl),d ; CDh
  inc hl

  ld (hl),h ; 31h
  inc hl
  ld (hl),h ; 31h
  inc hl

  ld (hl),c ; 0Eh
  inc hl
  ld (hl),38h ; 38h
  inc hl

  ld (hl),d ; CDh
  inc hl
  ld (hl),h ; 31h
  inc hl
  ld (hl),h ; 31h
  inc hl

  ld (hl),38h ; 38h
  inc hl

  ld (hl),c ; 0Eh
  inc hl
  ld (hl),33h ; 33h
  inc hl

  ld (hl),d ; CDh
  inc hl
  ld (hl),h ; 31h
  inc hl
  ld (hl),h ; 31h
  inc hl

  ld (hl),76h ; 76h
  inc hl

  ld a,23h  ; not using ld a,24h because it has '$' (breaks SNUSP)
  inc a
  cpl       ; a = ~a; a = 0xDB
  ld d,a
  ld (hl),d ; DBh
  inc hl

  ld (hl),7Dh ; 7Dh
  inc hl

  ld a,c    ; a = 0Eh
  cpl       ; a = F1h
  dec a
  dec a
  dec a     ; a = EEh
  ld d,a
  ld (hl),d ; EEh
  inc hl

  scf
  ret nc
  xor a     ; a ^= a; a = 0; utf8 cont byte
  ld c,a
  ld (hl),c ; 00h
  inc hl

  ld a,4Ah
  scf
  ret nc
  sub h     ; a -= h; a = 0x19;  utf8 cont byte
  cpl       ; a = ~a; a = 0xE6
  ld d,a
  ld (hl),d ; E6h
  inc hl

  ld a,c
  inc a
  ld d,a
  ld (hl),d ; 01h
  inc hl

  ld a,35h
  cpl       ; a = 0xCA
  ld d,a
  ld (hl),d ; CAh
  inc hl
  ld (hl),h ; 31h
  inc hl
  ld (hl),h ; 31h
  inc hl

  ld (hl),79h ; 79h
  inc hl

  ld a,2Dh  ; not using ld a,2Ch because it has ','
  dec a
  cpl       ; a = 0xD3
  ld d,a
  ld (hl),d ; D3h
  inc hl

  ld (hl),7Ch ; 7Ch
  inc hl

  ld a,36h
  cpl       ; a = 0xC9
  ld d,a
  ld (hl),d ; C9h

  ld sp,3232h  ; set up stack for generated program

  ld hl,3120h  ; not using ld l,20h because it has '.'
  jp (hl)      ; go to generated program 
               ; confusing mnemonic - actually it is jp hl, ie. PC = HL
               ; opcode 0xE9, utf8 lead byte (0xE9 = 0b11101001), must be followed by 2 cont bytes
  db 80h,80h

Ten program jest złożony w:

! 1>?7ДOq#t#>2/Wr#t#t#q#68#r#t#t#68#q#63#r#t#t#6v#>#</Wr#6}#y/===Wr#7ЯOq#>J7Д/Wr#y<Wr#>5/Wr#t#t#6y#>-=/Wr#6|#>6/Wr122! 1退

Musi mieć przesunięcie 0x280 w poliglocie (patrz wiersz 2). Test abstrakcji w sterowniku testowym sprawdza to.

Refaktoryzacje

Muszle

Przeniesiono pociski z powrotem do najdłuższej linii. Bardziej podoba mi się ten układ, ponieważ pareny nie są wyrównane z innymi językami. Przeniesiono Maurów i Flaki przed pociskami, aby nie pękały przy zmianie pocisków. Najdłuższa linia ma teraz ten układ:

Grass  Moorhenses  Flaks  Shells  Rubies/Pythons/Perl5  PicoLisp  Prelude  Klein001

Nowy kod muszli:

a=$(printf \\x00)
b=$(echo -n $a | wc -c)
case $b[1] in 1*)echo 54;; 4*)echo 78;; 8*)echo 166;; *1*)echo 50;; *)echo 58;; esac
exit

Stary kod muszli:

a=$(printf \\x00)
b=${#a}
case "{"$ar[1]"}"${b} in *1)echo 54;; *4)echo $((19629227668178112600/ 118248359446856100));; *1*)echo 50;; *)echo 58;; esac
exit

Długość $ajest $(echo -n $a | wc -c)teraz obliczana ( stąd ). Początkowo użyłem tego, aby się go pozbyć #, ale teraz jest używany z powodu krótszego kodu. Pociski mogą zawierać, #ponieważ Flaki są przed pociskami.

Yash (166) używa wbudowanej komendy echo, która domyślnie nie obsługuje opcji, więc „-n” i linefeed są częścią wyjścia, co daje dodatkowe 4 bajty. Gdy nie jest ustawiony ECHO_STYLEdomyślnie na SYSV( -nopcja nie jest akceptowana).

To łącze TIO testuje kod we wszystkich powłokach.

Dodatkowo (((((przed pociskami naprawić niedociążenie i siatkówkę. Dodano jeszcze jedną parę parenów, aby ukryć 58przed Preludium (zamknięte #)później exit). {wcześniej ((((((jest dla Japt, bez niego Japt zawiesza się.

Flaks

Z powodu przeniesienia Flaksa kod startowy można uprościć - ([])pozostaje tylko :

     line 21      (Grass(([5]{})))    scripting langs                  clear stack     Flaks main code                                                                                      begin skip code      the rest of polyglot   end skip code   print(85)
old: []{}[][][]   ((([]{})))          ((()()<<()>>)((()([])))<<()>>)   {}{}{}{}{}{}{}  ({}<(((((()()())){}{})){}{})>)(({})){}{(<(<()>)({})({}<{}>({}){})>){({}[()])}}({}){}({}()<()()()>)   (<><()>){({}[()])}{           ...           }{}<>              ()
new: []{}[][][]     ([]  )                                                             ({}<(((((()()())){}{})){}{})>)(({})){}{(<(<()>)({})({}<{}>({}){})>){({}[()])}}({}){}({}()<()()()>)   (<><()>){({}[()])}{           ...           }{}<>              ()

Ten link TIO testuje kod we wszystkich Flaksach.

Rozszczepienie i kardynał

Rozszczepienie została przeniesiona do LNUSP: R"12"R _*. Drugi wskaźnik służy do jak najszybszego zakończenia Rozszczepienia - w trzecim kroku, patrz odpowiedź 54, aby uzyskać więcej informacji.

Kardynał został przeniesiony do LNUSP: @ %"18". Podobnie jak w przypadku Rozszczepienia, drugi wskaźnik służy do jak najszybszego zakończenia Kardynała - w 3 kroku.

MarioLANG

Użyj ####...zamiast ====...jako platformy:

wprowadź opis zdjęcia tutaj

Minimal-2D

Polyglot z MarioLANG:

wprowadź opis zdjęcia tutaj

Wierd i 1L_a

Wierd: użyj spacji w wierszu 10 kolumny 79, aby odzwierciedlić IP.
1L_a, Wierd: spacja w wierszu 9 kolumna 79 jest ważna.

wprowadź opis zdjęcia tutaj

Cubical

Nowy kod: :1*23!/5x%6E0

:1*23!/5x%6E0
! - skip over / in Klein 201
x - destroy Cardinal pointer before it hits /

pure:
:1*23/5%6E0

faceval:
0 0
1 9
2 18
3 27
4 36
5 45

program:
:1   mem = 9
*23  mem *= 18; mem *= 27
/5   mem /= 45
%6   print mem
E0   exit

9*18*27/45 == 97 (integer division)

6 in %6 is used to print mem because 0-5 are used to print faceval (eg. %3 prints 27)
0 in E0 is not an exit code, it is present just to trigger E instruction

Klein 201/100

Nowy kod: !|*****[[[828+*+@+*99]]]*****|!

W końcu stos mnożenia zawiera jedno zero, ponieważ wyskakiwanie z pustego stosu daje zero. To zero jest dodawane do liczby głównej za pomocą +obok @. Wcześniej był odrzucany ?, patrz odpowiedź Kleina 001 .

Jak działają drzwi w Klein:

wprowadź opis zdjęcia tutaj

Wir

Kod wirowy jest w zasadzie taki sam, jedyną zmianą jest to, że kod główny zakłada, że ​​bieżąca operacja to ops.one (2), a nie ops.load (4).

Skutecznie Wir można uznać za posiadający 3 operacje:

  • 1 obróć o jeden krok
  • 0 zmienić kierunek obrotów
  • 00 wykonać bieżącą instrukcję i pierścień przełączający

Połączone operacje w celu uproszczenia rozumowania na temat programu:

  • 0000 jeśli aktualny op nieaktywnego pierścienia jest noop, po prostu wykonaj bieżący op aktywnego pierścienia bez żadnych skutków ubocznych
  • 11..11 obróć n kroków
  • 011..11 zmienić kierunek i obrócić n kroków

0000wykonuje bieżącą instrukcję aktywnego pierścienia, ale także wykonuje bieżącą instrukcję nieaktywnego pierścienia jako efekt uboczny. Jeśli bieżąca instrukcja nieaktywnego pierścienia jest nieszkodliwa, możemy po prostu skupić się na operacjach na aktywnym pierścieniu, nie zastanawiając się, co dzieje się z nieaktywnym pierścieniem. Jest to szczególnie przydatne w tym programie, ponieważ ma wyraźną separację: najpierw liczba 32 jest tworzona tylko za pomocą pierścienia matematycznego, a następnie przełączamy się na pierścień ops i wykonujemy tam 2 instrukcje (wydrukuj i wyjdź).

Najpierw chciałem, aby bieżąca operacja na ops ring była noop, gdy główny kod zacznie działać. Ma 2 zalety: 1) główny kod wirowy może być wykonywany osobno i 2) możemy całkowicie zapomnieć o pierścieniu operacyjnym podczas tworzenia numeru 32 z pierścieniem matematycznym. Jednak sprawia, że ​​kod jest dłuższy niż był, więc zamiast tego główny kod zakłada, że ​​bieżąca operacja to ops.one (2). Oznacza to, że wartość ops.value jest ustawiona na 1 jako efekt uboczny operacji matematycznych, które następnie są używane do drukowania. Stary kod osiągnął ten sam efekt z instrukcją ops.load, ale użycie ops.one wyraźniej wyraża zamiar - ustawienie wartości ops.value na wartość niezerową.

at this point current ring is ops, dir = clockwise, cur op = ops.one
00    switch to math ring
011   rotate to math.not
0000  math.not (math.val = 1)
01111 rotate to math.store
0000  math.store (mem[0] = 1)
1     rotate to math.add
0000  math.add (math.val = 2)
01    rotate to math.store
0000  math.store (mem[0] = 2)
011   rotate to math.mult
0000  math.mult (math.val = 4)
0000  math.mult (math.val = 8)
0000  math.mult (math.val = 16)
0000  math.mult (math.val = 32)
011   rotate to math.store
00    math.store (mem[0] = 32), switch to ops ring
up to this point the program is the same as before

01111 rotate to ops.intio
0000  ops.intio - print mem[0] as number
0111  rotate to ops.exit
00    ops.exit

Nowy kod jest krótszy, ponieważ stary kod ma kilka redundantnych przełączników kierunku w drugiej części programu, nie z powodu nowego założenia.

old: (1111) 00011000001111000010000010000011000000000000000001100 01111110000011100
new: (11)   00011000001111000010000010000011000000000000000001100   011110000011100

Jak zachować poprawność Whirl przy zmianie czegoś przed wierszem Incydent / Wir:

  • upewnij się, że 0przed głównym kodem wirowym jest parzysta liczba s
  • upewnij się, że nie ma dwóch kolejnych 0s
  • dodaj / usuń wystarczającą liczbę 1s, aż Whirl znów zacznie działać; dodanie ns 1jest równoznaczne z usunięciem 12-ns 1i odwrotnie

Nieświadomie złamałem pierwszą zasadę, kiedy dodałem Ropy. Kiedy jest nieparzysta liczba 0s, kod główny zaczyna działać z nieprawidłowym kierunkiem dzwonienia operacji, co łamie instrukcję wyjścia. Teraz jest 0linia 3, która kompensuje 0linię 1.

Inne

CoffeeScript : console.log a&&39||180( stąd )

INTERCAL : przeniesiono do linii 37
Brainfuck , Agony : przeniesiono do innych pochodnych brainfuck w linii 10

xEec : przeniesiono do 1L_a ( h#115# o#)

CSL : przeniesiono do linii 80
Trefunge : przeniesiono do linii 120
Gaot ++ , Kamienie : umieszczono w osobnych liniach


4
Fajnie, to dużo bajtów do gry w golfa.
Potato44,

16

16. Pyth (159 bajtów)

#v\;2^0\;7||"<+0+0+0+<*!2'!1'L#'1r'4;n4
#v0#_q@
#>3N.15o|1
#|\w*
#8  ^<1b0 <
#|
#M`
print ((0 and'13')or(None and 9 or 1/2 and 1 or 5))
#"07|5//00;16 "jd5ki2

Uwaga: po trzecim wierszu i po ostatnim wierszu znajduje się ESCbajt ( 0x1B) .oj

To było całkiem fajne doświadczenie. Japt i Pyth są językami golfy, ale Japt jest infiksem, a Pyth jest prefiksem, a Pyth automatycznie żąda wprowadzenia i kończy się niepowodzeniem, jeśli brakuje argumentów.

Przed odpowiedzią na Haystacka miałem prawie działające rozwiązanie #, które pobiera kod char w Japt i błąd pętli do błędu w Pyth. Pyth okazuje się bardzo przydatny w poliglotach, ponieważ zwykły komentarz #działa zasadniczo jako tłumik błędów.

Kiedy wróciłem do domu, udało mi się znaleźć ten fragment kodu, który działał w obu przy użyciu //, który działa jako komentarz w Japt i dwa działy w Pyth. Potem wystarczyło, aby Befunges prawidłowo trasy.

Jest mało prawdopodobne, aby było to optymalne, ale na razie jest wystarczająco dobre. Próbowałem je wszystkie przetestować, ale bardzo doceniam to, że ktoś podwójnie sprawdza, czy wyjścia są zgodne.

Drukuje 1 w Pythonie 3 , 2 w V , 3 w Minkolang , 4 w> <> , 5 w Python 2 , 6 w Samomodyfikującym Brainfuck , 7 w Japt , 8 w Retina , 9 w Perlu , 10 w Befunge (-93 ) , 11 w Befunge-98 , 12 w Fission , 13 w Ruby , 14 w Turtléd , 15 w Haystack i

16 w Pyth .

Wyjaśnienie

Pyth widzi tutaj:

#v\;2^0\;7||"string
multiline
string"07|5//00;16 "string

To przekłada się na następujący pseudokod:

while no errors occur:
    evaluate ";"
    print 2
    print 0 to the power ";"
    print 7
    print "string\nmultiline\nstring" or 0 or 7
    print 5 or 0 divided by 0 divided by (missing)
print 16
do nothing with "string"

Pierwsza pętla kończy się przy próbie oceny, ;które nie jest prawidłowym wyrażeniem. Następnie Pyth po prostu drukuje 16.


Rozszerzanie w jaki sposób? Nadal potrzebuję jeszcze 5 lub więcej bajtów dostępnych dla mojej odpowiedzi;)
Alfie Goodacre,

@AlfieGoodacre Dodając pozostałe szczegóły do ​​postu. Chciałem pozostać przy zdrowych zmysłach i dlatego opublikowałem swój kod, zanim ktokolwiek ukradł moje miejsce. : D
PurkkaKoodari,
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.