"Witaj świecie!"


419

Więc ... to trochę zawstydzające. Ale nie mamy prostego „Witaj, świecie!” wyzwanie jeszcze (pomimo 35 oznaczonych tagiem i wciąż rośnie). Chociaż nie jest to najciekawszy golf w popularnych językach, znalezienie najkrótszego rozwiązania w niektórych esolangach może być poważnym wyzwaniem. Na przykład, o ile wiem, nie wiadomo, czy udało się znaleźć najkrótsze możliwe rozwiązanie Brainfuck.

Co więcej, podczas gdy cała Wikipedia (wpis w Wikipedii został usunięty, ale jest archiwum na archive.org ), esolangs i Rosetta Code mają listy „Witaj, świecie!” programy, żaden z nich nie jest zainteresowany najkrótszym językiem dla każdego języka (istnieje również repozytorium GitHub ). Jeśli chcemy być znaczącą witryną w społeczności golfistów kodu, myślę, że powinniśmy spróbować stworzyć ostateczny katalog najkrótszego „Hello, World!” programy (podobnie jak nasze podstawowe wyzwanie quine zawiera jedne z najkrótszych znanych quines w różnych językach). Zróbmy to!

Zasady

  • Każde zgłoszenie musi być pełnym programem.
  • Program nie może pobierać żadnych danych wejściowych i drukować Hello, World!do STDOUT (ten dokładny strumień bajtów, w tym wielkie litery i interpunkcja) oraz opcjonalny końcowy znak nowej linii i nic więcej.
  • Program nie może zapisywać niczego do STDERR.
  • Jeśli ktoś chce to nadużyć, tworząc język, w którym drukuje pusty program Hello, World!, a następnie gratulacje, po prostu utorował drogę do bardzo nudnej odpowiedzi.

    Pamiętaj, że musi być tłumacz, aby można było przetestować zgłoszenie. Dozwolone jest (a nawet zachęcane) samodzielne pisanie tego tłumacza dla wcześniej niewdrożonego języka.

  • Zgłoszenia są oceniane w bajtach , w odpowiednim (wcześniej istniejącym) kodowaniu, zwykle (ale niekoniecznie) UTF-8. Niektóre języki, takie jak Foldery , są trudne do zdobycia - w razie wątpliwości zapytaj na Meta .
  • Tu nie chodzi o znalezienie się języka z najkrótszych „Hello, World!” program. Chodzi o znalezienie najkrótszego „Cześć, świecie!” program w każdym języku. Dlatego nie oznaczę żadnej odpowiedzi jako „zaakceptowana”.
  • Jeśli wybrany przez ciebie język jest trywialną odmianą innego (potencjalnie bardziej popularnego) języka, który ma już odpowiedź (pomyśl dialekty BASIC lub SQL, powłoki uniksowe lub trywialne pochodne Brainfuck, takie jak Alphuck), rozważ dodanie uwagi do istniejącej odpowiedzi, że to samo lub bardzo podobne rozwiązanie jest również najkrótsze w innym języku.

Na marginesie, proszę nie głosować nudnych (ale ważnych) odpowiedzi w językach, w których nie ma wiele do golfa - są one nadal przydatne w tym pytaniu, ponieważ próbuje skompilować katalog tak kompletny, jak to możliwe. Jednak zrobić głównie upvote odpowiedzi w językach gdzie autorzy rzeczywiście musiał włożyć wysiłek w golfa kod.

Aby uzyskać inspirację, sprawdź kolekcję Hello World .

Katalog

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

## Perl, 43 + 2 (-p flag) = 45 bytes

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

## [><>](https://esolangs.org/wiki/Fish), 121 bytes


2
@isaacg Nie, nie ma. Myślę, że byłyby interesujące języki, w których nie jest oczywiste, czy możliwe jest testowanie pierwotności.
Martin Ender

6
Jeśli ten sam program, na przykład "Hello, World!", jest najkrótszy w wielu różnych i niepowiązanych językach, czy należy go opublikować osobno?
aditsu

2
@ mbomb007 Cóż, domyślnie jest ukryty, ponieważ trzy bloki kodu zajmują dużo miejsca. Mógłbym je zminimalizować, tak aby były one pojedynczymi liniami, ale wolałbym zachować kod, który mógłby być utrzymywany na wypadek pojawienia się błędów.
Martin Ender

7
@ETHproductions „W przeciwieństwie do naszych zwykłych zasad, możesz swobodnie korzystać z języka (lub wersji językowej), nawet jeśli jest on nowszy niż to wyzwanie”. Jednak zdecydowanie pomocne byłoby opublikowanie języka i implementacji przed opublikowaniem.
Martin Ender

2
@MartinEnder ... Prawie. Jeśli dwa rozwiązania BF mają ten sam rozmiar, to jedno z mniejszym porządkiem leksykograficznym zajmie mniejszą liczbę bajtów w Unary. Oczywiście gwarantuje, że najmniejsze rozwiązanie Unary przetłumaczone na BF będzie najmniejsze.
user202729,

Odpowiedzi:


442

Utknął, 0 bajtów

Cóż, nie można uzyskać krótszy niż ... Pusta wyjście programu wola Hello, World!w Stuck .


57
Cholera, spóźniłem się 20 minut! : P
Kade

33
Noooo dawaj najszybszy pistolet na zachodzie;)
Rozpad Beta

30
@Zuck Cóż, tak, Stuck został stworzony do gry w kod, podobnie jak CJam / GolfScript / Pyth. Hello, World!Rzeczą było po prostu coś, co włożył w postaci zastępczego wczesnej fazie rozwoju. Nie zamierzałem tego tak długo zostawiać, po prostu nigdy nie zabrałem się do jego usuwania.
Kade

132
Próbowałem znaleźć krótsze rozwiązanie, ale utknąłem.
Cyoce

51
-1 bajtów w jQuery. Próbowałeś jQuery?
10 odpowiedzi

244

PHP, 13 bajtów

Hello, World!

Tak. To działa.


261
Jak zwykle w przypadku PHP, zawsze zastanawiasz się, jak to może działać
Fatalize

95
Działa oczywiście, ponieważ nie ma go <?phpw kodzie, przez co w ogóle nie jest interpretowany przez PHP :)
Lynn

58
Oznacza to, że jest to tylko odpowiedź HTML ...
Nelson

82
@Nelson nie, nie ma. PHP niekoniecznie musi być umieszczone w HTML. Dodatkowo, HTML nie jest drukowany na standardowe wyjście
georgeunix

26
To najbardziej zabawna odpowiedź w historii
Oliver Ni

241

Brainfuck, 78 bajtów

Nagroda otwarta: jeśli ktokolwiek może poprawić ten wynik, przekażę nagrodę (+500). @KSabznalazł 76 72 bajtowe rozwiązanie!

--<-<<+[+[<+>--->->->-<<<]>]<<--.<++++++.<<-..<<.<+.>>.>>.<<<.+++.>>.>>-.<<<+.

Wypróbuj online!

Pierwsze 28 bajtów --<-<<+[+[<+>--->->->-<<<]>]inicjuje taśmę z następującą relacją powtarzalności (mod 256):

f n = 171 · (-f n-1 - f n-2 - f n-3 + 1) , przy f 0 = 57 , f 1 = 123 , a f 2 = 167 .

Współczynnik 171 powstaje, ponieważ 3 -1 ≡ 171 (mod 256) . Kiedy bieżąca wartość jest tłumaczona, jedna komórka wstecz (przez <+>---) odejmując 3 za każdym razem skutecznie pomnaża tę wartość przez 171.

Przy n = 220 wartość do tłumaczenia wynosi zero, a iteracja zatrzymuje się. Dziesięć bajtów poprzedzających punkt zatrzymania to:

[130, 7, 43, 111, 32, 109, 87, 95, 74, 0]

Zawiera wszystkie elementy niezbędne do produkcji Hello, World!, w stylu polowania i dziobania, z drobnymi poprawkami.

Znalazłem również alternatywne rozwiązanie 78-bajtowe:

-[++[<++>->+++>+++<<]---->+]<<<<.<<<<-.<..<<+.<<<<.>>.>>>-.<.+++.>>.>-.<<<<<+.

Wypróbuj online!

Uważam, że ten jest lepszy od pierwszego z kilku powodów: zużywa mniej komórek pozostawionych z domu, modyfikuje w sumie mniej komórek i kończy się szybciej.


Więcej szczegółów

Relacje nawrotów mają zaskakująco zwięzłe reprezentacje w Brainfuck. Ogólny układ jest następujący:

{...s3}<{s2}<{s1}[[<+>->{c1}>{c2}>{c3...}<<<]>{k}]

które reprezentuje:

f n = c 1 · f n-1 + c 2 · f n-2 + c 3 · f n-3 + ... + k

z

f 0 = s 1 , f 1 = s 2 + c 1 · f 0 + k , f 2 = s 3 + c 2 · f 0 + c 1 · f 1 + k itp.

Dodatkowo <+>można zmienić, aby pomnożyć zakres przez stałą bez wpływu na punkt zatrzymania, a przed >{k}przesunięciem zakresu o stałą można dodać wyraz , ponownie bez wpływu na punkt zatrzymania.


Inne przykłady

Ciąg Fibonacciego

+[[<+>->+>+<<]>]

N-gonal Numbers

Trójkątne Liczby

+[[<+>->++>-<<]>+]

Zdefiniowane jako f n = 2 · f n-1 - f n-2 + 1 , przy f 0 = 0 , f 1 = 1 .

Liczby kwadratowe

+[[<+>->++>-<<]>++]

Liczby pięciokątne

+[[<+>->++>-<<]>+++]

itp.


BF Crunch

Opublikowałem kod, którego użyłem do znalezienia niektórych z tych rozwiązań na github . Wymaga .NET 4.0 lub wyższej.

Usage: bfcrunch [--options] text [limit]

Arguments
------------------------------------------------------------
  text              The text to produce.
  limit             The maximum BF program length to search for. If zero, the length of the
                    shortest program found so far will be used (-r). Default = 0

Options
------------------------------------------------------------
  -i, --max-init=#  The maximum length of the initialization segment. If excluded, the
                    program will run indefinitely.
  -I, --min-init=#  The minimum length of the initialization segment. Default = 14
  -t, --max-tape=#  The maximum tape size to consider. Programs that utilize more tape than
                    this will be ignored. Default = 1250
  -T, --min-tape=#  The minimum tape size to consider. Programs that utilize less tape than
                    this will be ignored. Default = 1
  -r, --rolling-limit
                    If set, the limit will be adjusted whenever a shorter program is found.
  -?, --help        Display this help text.

Dane wyjściowe podano w trzech wierszach:

  1. Całkowita długość znalezionego programu i segment inicjujący.
  2. Podjęta ścieżka, zaczynając od bieżącego wskaźnika taśmy. Każdy węzeł odpowiada jednemu znakowi wyjścia, reprezentowanemu jako (wskaźnik, koszt).
  3. Wykorzystany segment taśmy.

Na przykład końcowy wynik dla bfcrunch "hello world" 70 -r -i23:

64: ++++[[<+>->+++++>+<<]>]
49, (45, 5), (44, 3), (45, 6), (45, 1), (45, 4), (42, 4), (43, 5), (45, 3), (45, 4), (46, 2), (44, 4)
32, 116, 100, 104, 108, 132, 0, 0, 132, 0

Odpowiada to pełnemu programowi:

++++[[<+>->+++++>+<<]>]<<<<.<+.>++++..+++.<<<.>+++.>>.+++.>.<<-.

Inne rekordy

Witaj świecie!

Opakowanie, 78 bajtów :

--<-<<+[+[<+>--->->->-<<<]>]<<--.<++++++.<<-..<<.<+.>>.>>.<<<.+++.>>.>>-.<<<+.

lub

-[++[<++>->+++>+++<<]---->+]<<<<.<<<<-.<..<<+.<<<<.>>.>>>-.<.+++.>>.>-.<<<<<+.

Nieopakowanie , 87 bajtów (wcześniej 92 bajty (mitch) ):

--->->->>+>+>>+[++++[>+++[>++++>-->+++<<<-]<-]<+++]>>>.>-->-.>..+>++++>+++.+>-->[>-.<<]

Witaj świecie!

Opakowanie, 80 bajtów :

++<-[[<+>->+>--->-<<<]>+++]>+.<<<<<<<++.>>>..>.<<--.<<<--.>>+.>>>.+++.<.<<<-.<+.

Bez opakowania, 81 bajtów (wcześniej 92 bajty (hirose) ):

+>---->->+++>++>->+[++++++++[>++++++++>>+++++<<<-]<]>>.>++>.>..+>>.+>-->--[>-.<<]

Witaj świecie!

Opakowanie, 74 bajty :

-<++[[<+>->->+++>+<<<]->]<<.---.<..<<.<<<---.<<<<-.>>-.>>>>>.+++.>>.>-.<<.

Bez opakowania, 84 bajtów :

---->+++>++>->->++[+++++++[>+++++[>++>>+<<<-]<-]++<]>>>>.---.>---..+>->.+>-->+>[-.<]

Wersja Esolangs

Witaj świecie! \ N

Opakowanie, 76 bajtów :

+[++[<+++>->+++<]>+++++++]<<<--.<.<--..<<---.<+++.<+.>>.>+.>.>-.<<<<+.[<]>+.

To wykorzystuje jedną komórkę pozostawioną z domu, a zatem byłoby uważane za 77.

Bez opakowania, 83 bajty :

->+>>>+>>---[++++++++++[>++++++>+++>+<<<-]-<+]>+>+.>.->--..>->-.>[>.<<]>[+>]<<.>++.

Rdebath zatwierdzony . wyjście profilbf:

Hello World!
Program size 83
Final tape contents:
 :   0   0  73 101 109 115 112  88  33  10   0
                                         ^
Tape pointer maximum 10
Hard wrapping would occur for unsigned cells.
Counts:     +: 720          -: 79           >: 221          <: 212
Counts:     [: 9            ]: 84           .: 13           ,: 0
Total:         1338

inversed.ru (Peter Karpov)

Witaj świecie!

Opakowanie, 70 bajtów (wcześniej 78 1 ):

+[++[<+++>->+++<]>+++++++]<<<--.<.<--..<<---.<+++.<+.>>.>+.>.>-.<<<<+.

Bez opakowania, 77 bajtów (wcześniej 89?):

->+>>>+>>-[++++++[>+++++++++>+++++>+<<<-]<+]>>.>--.->++..>>+.>-[>.<<]>[>]<<+.

Autor twierdzi, że najkrótszy ręcznie kodowany „Hello World!” ma 89 bajtów, ale nie zawiera odniesienia. Niniejszym również twierdzę, że jest to rekord.

Witaj świecie!

Opakowanie, 65 bajtów (wcześniej 66 bajtów):

+++[>--[>]----[----<]>---]>>.---.->..>++>-----.<<<<--.+>>>>>-[.<]

W rzeczywistości jest to również ręcznie kodowane (najlepsze, co udało mi się znaleźć dzięki crunchowi, to 68 bajtów ). Pierwsza komórka jest inicjowana do 259 (3) i zmniejszana o 7 w każdej iteracji, zapętlając 37 razy. Następna komórka jest zmniejszana o 6, co daje 256 - 6,37 = 34 . Reszta komórek jest zmniejszana za każdym razem o 4, dodając jedną komórkę za każdym razem, a każda nowa komórka jest inicjowana do 252 (-4). Wynik jest następujący:

[  3,   0,   0,   0,   0,   0,   0, ...]
[252, 250, 248,   0,   0,   0,   0, ...]
[245, 244, 244, 248,   0,   0,   0, ...]
[238, 238, 240, 244, 248,   0,   0, ...]
[231, 232, 236, 240, 244, 248,   0, ...]
[224, 226, 232, 236, 240, 244, 248, ...]
...
[ 35,  64, 124, 128, 132, 136, 140, ...]
[ 28,  58, 120, 124, 128, 132, 136, ...]
[ 21,  52, 116, 120, 124, 128, 132, ...]
[ 14,  46, 112, 116, 120, 124, 128, ...]
[  7,  40, 108, 112, 116, 120, 124, ...]
[  0,  34, 104, 108, 112, 116, 120, ...]

1 Podane rozwiązanie (79 bajtów) można w prosty sposób zredukować o jeden:

-[>>+>+[++>-<<]-<+<+]>---.<<<<++.<<----..+++.>------.<<++.>.+++.------.>>-.<+.

39
To jest szalone. Jeden z was powinien przesłać 82-bajtową wersję do anarchy golfa.
Martin Ender

117
Najlepszym rozwiązaniem Java na to pytanie jest 76 bajtów. Jeszcze tylko 9 bajtów do udowodnienia, że ​​programiści Java powinni przejść na Brainfuck.
Level River St

9
@LevelRiverSt Jeden z małych liter jest o 2 bajty krótszy niż Java. Nadeszły czasy ostateczne.
Conor O'Brien,

13
„Jeszcze tylko 9 bajtów do udowodnienia, że ​​programiści Java powinni przejść na Brainfuck.” interface a{static void main(String[]A){System.out.print("No!");}}
dorukayhan


222

ArnoldC , 71 bajtów

IT'S SHOWTIME TALK TO THE HAND "Hello, World!" YOU HAVE BEEN TERMINATED

Tylko dla loli ..


4
Pracował dla mnie. Spróbuj
ustawić czas nadawania

72
Naprawdę muszę nauczyć się korzystać z tego języka.
Buzz

3
Czy spacja i znak nowej linii nie zajmują tej samej liczby bajtów? I technicznie, IT'S SHOWTIMEi TALK TO THE HANDpowinien być na pierwszej i ostatniej linii.
wizzwizz4,

5
@AlCode Ale jest bardziej poprawny i zajmuje taką samą liczbę bajtów, jest większa kompatybilność i wygląda ładniej. Dlaczego robię tyle zamieszania, jest to wyzwanie dla golfa na PPCG i jest zaskoczeniem, że twój kod jest czytelny i dobrze zrobiłeś dobrze golfową odpowiedź, która była czytelna i daje +1.
wizzwizz4

11
@ wizzwizz4 bardzo dziękuję, staram się być jak najbardziej profesjonalny z ArnoldC językiem przyszłości!
AlCode

203

Seed , 6016 4234 4203 bajtów

20 854872453003476740699221564322673731945828554947586276010721089172712854441839676581917455319274850944955030258951339804246125714958815519550291630078076933441706558540342671975808828643360922071900333028778314875248417953197990571991784126564752005357199892690656368640420204822142316716413192024742766282266114842280731756458212469988291309261528542889299297601723286769284159107438930448971911102280330101196758384815655479640836157495863547199726234352265518586460633795171196315255736880028338460236768181141732764911402112878175632130129852788301009582463631290071329795384336617491655825493435803011947670180368458659271192428341035912236946048939139042310380278430049252171822721598175984923434205610723412240162418996808671543770639111617709604242882388664919702606792443015941265168129550718541372361144081848761690730764968771245566074501485020726368378675085908872608679630368472956274468410052703615106090238423979678950131481176272880569100533049143775921798055136871254424261001442543122666701145111965968366507060931708140304772342855064834334129143038575569044150428480231956133612367393837580345180691911525531699573096952433882387811884727975431823620782822755161559988205401134640722220804177812794328129589949692446031008866917615922944976151073653201316255518389496411696741029209242119521978920200314572718584995265523235225587228975886710511855501710470163649632761488899317729943053884132314641377747687975638119132094777769497069556255954031537245957811105217875011509899497752696062748928963281605780942517262774976217663461063680912331030221981433051827519906741285738915397005702326447635845195923640649166530310494885569783989508000344280715868581532826832242144647203531393142251025361866506821695860883605004105862208004440476654027574832078603305884731766236740069411566854496824754558761536201352147934963241039597221404341132342297870517293237489233057335406510464277610336142382379135365550299895416613763920950687921780736585299310706573253951966294045814905727514141733220565108490291792987304210662448111170752411153136765318541264632854767660676223663544921028492602135525959428999005153729028491208277493747933069008199074925710651071766675870081314909460661981433426167330215548196538791617762566403934129026219366764038390123622134753742930729751695349588862441999672547791630729398908283091638866715502470152431589429837867944760012419885615525232399584379209285060418518373512154801760060312646951597932345591416241634668119867158079946680321131213357200382937049485606706114467095019612014749723443159443363662563254359712162432143334612180576945072905749883870150120687696027984317320305291407322779803583395375616762530641605634303022155218169343410634115050596030685041633824154135240376022159918501703555881290333205131375705406831260759974112248490451605422031345264183102048614606636275942039438138959188478277971377232005036301145411215067576576667743288951344423152531417111852584846747428443123174595987315325304540564683047858415059703724263652136185848573853965992798725654430360647040362341567082462847275277303225817689141675391972818943419663764371222973269129542760661385278009266471167618553065823580448848795731295589715602705860758954890415040763604082216728159486423396295188510311881004469017351709060492844398219491990895826924575575549615118821417543037296628825303328056839433114519945243963946989899508355224823109677424196639930153649890175062456649384605721510239142861693109687536600667811037619175927995599388547421689316110236566026931360164495251160997857372500940728057700473763884480342708897319990346726967220426504612260565552531158509215849649565188655100774748485416791517853427613458459889062942881409801879085054494129489535044719193283409051007851153504224002807392992520076910314763705776345053922387355156981872691537772657428096384535960466923475731297217863371650154415835785630016335858514130863258775100537612371430357576913148500310344278511588325852376442503898849856566716198848377379400158332792027967216204970114516984638014129252882482309132898416484525230488700253065644547798869056136044415413099076332059572505138116227535024546891015836838323022822272664771489129085797354578016574544759934333471793

Powstały program Befunge-98 (oparty na tym ) jest

"9!dlroW ,olleH"ck,@

35
Łał! Jak to znalazłeś?
ETHproductions

31
Co . To jest szalone.
Conor O'Brien

47
JAK TO BYŁO ZŁOTO?
Destructible Lemon

39
Czy dokonałeś inżynierii wstecznej w Mersenne Twister? Czy ma to wpływ na bezpieczeństwo?
primo

68
Dam ci kolejne +500 za szczegółowe (teoretyczne) wyjaśnienie.
primo

155

Mornington Crescent , 3614 3568 bajtów

Dzięki NieDzejkob za zapisanie 46 bajtów przy użyciu krótszych nazw linii.

Take Northern Line to Hendon Central
Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Gunnersbury
Take District Line to Victoria
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Gunnersbury
Take District Line to Paddington
Take District Line to Acton Town
Take Piccadilly Line to Holloway Road
Take Piccadilly Line to Acton Town
Take District Line to Acton Town
Take District Line to Gunnersbury
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Victoria
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take District Line to Upminster
Take District Line to Gunnersbury
Take District Line to Mile End
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Upminster
Take District Line to Mile End
Take District Line to Paddington
Take Circle Line to Paddington
Take District Line to Acton Town
Take Piccadilly Line to Heathrow Terminals 1, 2, 3
Take Piccadilly Line to Holborn
Take Central Line to Holborn
Take Central Line to Mile End
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Barking
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Gunnersbury
Take District Line to Barking
Take District Line to Gunnersbury
Take District Line to Paddington
Take Circle Line to Paddington
Take Circle Line to Wood Lane
Take Circle Line to Victoria
Take Circle Line to Victoria
Take District Line to Gunnersbury
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Gunnersbury
Take District Line to Paddington
Take Circle Line to Paddington
Take District Line to Mile End
Take Central Line to Fairlop
Take Central Line to Mile End
Take District Line to Barking
Take District Line to Upminster
Take District Line to Upminster
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Mile End
Take District Line to Gunnersbury
Take District Line to Paddington
Take Circle Line to Paddington
Take Circle Line to Hammersmith
Take District Line to Mile End
Take District Line to Richmond
Take District Line to Mile End
Take District Line to Paddington
Take Circle Line to Paddington
Take District Line to Richmond
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Stepney Green
Take District Line to Hammersmith
Take District Line to Stepney Green
Take District Line to Upney
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Upney
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Bank
Take Northern Line to Charing Cross
Take Bakerloo Line to Charing Cross
Take Bakerloo Line to Paddington
Take Circle Line to Bank
Take Circle Line to Bank
Take Northern Line to Mornington Crescent

Wypróbuj online!

Jest to z pewnością suboptymalne, ale jest o połowę mniejsze niż rozwiązanie na esolangach.

Hello, World jest konstruowany przez pocięcie następujących nazw stacji i połączenie wyników:

Hendon Central
▀▀
Holloway Road
  ▀▀▀
Heathrow Terminals 1, 2, 3
                       ▀▀
Wood Lane
▀▀
Fairlop
   ▀▀
Richmond
       ▀

Na koniec obliczam kod znaku !as (2<<4)+1 == 33. Wszystkie te części są połączone w Paddington i ostatecznie wydrukowane w Mornington Crescent.

Uwaga: język nie określa, czy możliwe jest podróżowanie do tej samej stacji dwa razy z rzędu, ale tłumacz na to pozwala, więc skorzystałem z niej.


44
To jest absolutnie genialne : D
Beta Decay

32
Kocham ten język. Przepraszam, podczas gdy ja programuję systemy w tym języku.
kot

4
Gdzie na ZIEMI ten język był przez całe moje życie?
ScottMcGready

30
@ScottMcGready między Camden Town a Euston.
Martin Ender

3
Mornington Crescent jest teraz na TIO. tio.run/#mornington-crescent
Dennis

123

zło , 70 bajtów

aeeeaeeewueuueweeueeuewwaaaweaaewaeaawueweeeaeeewaaawueeueweeaweeeueuw

Wykorzystuje następujące cztery polecenia:

a - increment the register
u - decrement the register
e - interweave the register's bits (01234567 -> 20416375)
w - write the value of the register as an ASCII character

61
To zło ...
David Grinberg,

61
Zwłaszcza, że ​​twoim awatarem jest Czarny Kapelusz.
TheDoctor,

5
czy możesz mi wyjaśnić proces przeplatania.
Kishan Kumar

4
@KishanKumar yes
grc

30
Jeśli przeczytasz ten program na głos, brzmi to jak dubstepowy bas.
Joe Z.

112

pieprzenie mózgu, 72 bajty

+[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.

Wypróbuj online!

I oryginalne rozwiązanie bez bajtów o wielkości 76 bajtów :

+[+[<<<+>>>>]+<-<-<<<+<++]<<.<++.<++..+++.<<++.<---.>>.>.+++.------.>-.>>--.

Wypróbuj online!

Inne najkrótsze znane (według mojej wiedzy) rozwiązania, które znalazłem

'Witaj świecie!' 77 bajtów:

+[+++<+<<->>>[+>]>+<<++]>>>>--.>.>>>..+++.>>++.<<<.>>--.<.+++.------.<<<-.<<.

Wypróbuj online!

'Witaj świecie!' 70 bajtów:

+[>>>->-[>->----<<<]>>]>.---.>+..+++.>>.<.>>---.<<<.+++.------.<-.>>+.

Wypróbuj online!


Zostały one znalezione przy użyciu programu c ++, który napisałem tutaj: https://github.com/ksabry/bfbrute

Uwaga: pierwotnie chciałem wyczyścić ten kod, zanim go opublikowałem, aby uczynić go w pewnym stopniu czytelnym i użytecznym, ale ponieważ nie dotarłem do niego od ponad roku, sądzę, że po prostu go opublikuję. W dużym stopniu wykorzystuje szablony i stałe czasowe kompilacji do wszelkich potencjalnych optymalizacji i ma sporo skomentowanych kodów z moich testów, ale nie ma pomocnych komentarzy, przepraszam, ale to trochę okropne.

W kodzie nie ma nic strasznie sprytnego, jego rdzeń jest brutalny, ale jest dość zoptymalizowany. Główną optymalizacją jest to, że najpierw iteruje wszystkie programy bez pętli (nie [lub ]) do określonej długości (obecnie 16) i buforuje tablicę wszystkich zmian, które wprowadzi w tablicy danych. Będzie przechowywał tylko jeden program dla każdej unikalnej tablicy zmian, więc na przykład tylko jedna >+<<->i <->>+<będzie przechowywany. Następnie iteruje wszystkie możliwe programy, które składają się z dowolnego programu w tej pamięci podręcznej, z dowolną kombinacją pętli między nimi. Po wykonaniu każdego programu wykonuje proste chciwe polowanie i dziobanie znaków i dołącza je na końcu programu.

Po przejrzeniu tego w przestrzeni wszystkich programów zauważyłem, że prawie wszystkie najkrótsze programy (do długości ~ 19) były w formie *[*[*]*]. Ograniczenie wyszukiwania do programów tego formularza znacznie przyspieszyło wyszukiwanie. Obecny rekordzista został znaleziony na długości 27. Ten faktycznie obliczono na długość 74, ale zauważyłem szczególną sekwencję, .>.>.>.która miała szczęście mieć 0 w komórce danych po prawej stronie, pozwalając na uproszczenie [.>]<jej obniżenia do 72.

Pozwoliłem mu działać przez jakiś czas i zakończyłem wyszukiwanie przy użyciu bieżących parametrów do długości 29, podejrzewam, że trudno będzie pokonać bieżący, po prostu idąc wyżej, myślę, że najbardziej obiecującym podejściem byłoby prawdopodobnie zwiększenie przestrzeni wyszukiwania w jakiś inteligentny sposób.


32
Jak do diabła to znalazłeś?
Dennis

2
@Dennis Prawdopodobnie opublikuję wyjaśnienie mojego procesu, kiedy będę miał szansę, wraz z kodem źródłowym, którego użyłem (po wyczyszczeniu)
KSab

32
Hej, pokonałeś Javę.
Poke

18
To jakieś urządzenie, nie wymaga nawet zawijania komórek ó_Ò
primo

5
Chciałbym zobaczyć algorytm za tym :)
musicman523

84

Piet, 90 kodów

wprowadź opis zdjęcia tutaj

To jest zdjęcie 30 na 3. Alternatywnie, przy rozmiarze kodu 10:

wprowadź opis zdjęcia tutaj

Używa 3-poziomowego układu, więc muszę tylko raz wskaźnik. Jeśli nadal można grać w golfa, prawdopodobnie mógłbym ogolić co najwyżej inną kolumnę, ponieważ jest tam push-pop no-op.

Edycja: 84 kodelowe rozwiązanie @ primo .


6
Próbujesz odebrać swoją nagrodę? Myślałem o tobie więcej Sp3000;)
Beta Decay

7
Hah, tylko dlatego, że ustawiłem nagrodę, nie oznacza, że ​​nie mogę dołączyć do zabawy: P
Sp3000,

9
Push-pop nie jest dla mnie żadną opcją. To jest to .
mbomb007

1
Czym do cholery jest ten „język”? Kocham to!
Zoltán Schmidt

8
„push-pop no-op” to teraz moja ulubiona fraza
BobTheAwesome

82

Stóg siana , 17 bajtów

Haystack to język programowania 2D, który działa, dopóki nie znajdzie igły w stogu siana |, wszystko podczas wykonywania operacji opartych na stosie. Wszystkie programy zaczynają się od lewego górnego rogu i mogą używać znaków kierunkowych ><^vdo poruszania się po programie. Kierunek jest dziedziczony, więc nie musisz używać >go, aby iść w prawo, kierunek zmieni się tylko, gdy trafi on inną postać kierunkową.

Domyślnie interpreter czyta od lewej górnej strony w prawo, dzięki czemu możemy po prostu wpisać „Witaj, świecie!” na stosie, użyj go odo wydrukowania, a następnie umieść igłę, aby zakończyć wykonywanie.

"Hello, World!"o|

Bonus: bardziej ekscytująca wersja:

v      >;+o|
v      "
v      !
v      d
v      l
v      r
>>"Hello, ">>>v
       W      v
       "      v
       ^<<<<<<<

Z ciekawości, co się stanie, jeśli umieścisz jedną z postaci w ciągu?
Random832

@ Random832 W ciągu znaków znaki kierunkowe są traktowane jako zwykłe znaki, tzn. Można je uwzględnić w ciągu.
Kade

38
> + O
bjb568

3
Chciałbym być w połowie tak bystry, jak wszyscy tutaj, ale w „dokumentacji” (czytaj: post na forum jakiegoś faceta) jest oto wynik liczbowy. Czy nie powinno być cna końcu? Czy jest gdziekolwiek odpowiednia dokumentacja? To jest bardzo interesujące!
Adwokat diabła,

2
@ Scott Bardzo późno, aby odpowiedzieć na to, ten post na forum to prawdopodobnie ja! owypisuje element najwyższego stosu w stanie, w jakim się znajduje, tzn. jeśli istnieje liczba, drukuje go. cpo prostu rzuciłoby to na char. Tak więc, jeśli masz ciąg znaków lub znak na górze stosu, obędzie to, czego chcesz :) W końcu te dokumenty zostaną zaktualizowane ..
Kade

70

Pomoc, WarDoq! , 1 bajt

H

WarDoq nie tylko pomaga! mają wbudowany typowy zapis frazy, nawet spełnia naszą zwykłą definicję języka programowania.

Wypróbuj w oficjalnym tłumaczu online (kod wchodzi w Input ).


7
HQ9 ++, w zasadzie, co? ;-)
AdmBorkBork

6
@TimmyD Nie, nie HQ9 ++ .
Dennis

30
Och, za głośne płacz. Czy w tym momencie jest coś, co nie jest esolangiem? :)
AdmBorkBork

97
"Space: Begin a comment. The next non-space character ends the comment and is interpreted as usual."Możesz więc mieć tylko komentarze do spacji? Przypuszczam, że nawet najbardziej użyteczny język na świecie musi mieć jedną niepotrzebną funkcję +1,
Level River St

29
@steveverrill Może jeśli zakładki są również uważane za komentarze, możemy mieć komentarze napisane jako programy Whitespace
Optimizer

66

MarioLANG , 259 249 242 240 235 bajtów

+>+>)+)+)+++)++++((((-[!)>->.
+"+"===================#+".")
+++!((+++++++++)++++++)<.---+
++=#===================")---.
++((.-(.)).+++..+++++++.<---
 !+======================---
=#>++++++++++++++.).+++.-!>!
  =======================#=#

Zostało to przetestowane w implementacji Ruby .

Po zaciemnieniu „Witaj, świecie!” w MarioLANG trochę zagrałem w golfa. Powyżej jest najkrótszy, jaki do tej pory znalazłem.

Tak jak poprzednio zacząłem od rozwiązania Brainfuck, które ustawia cztery komórki do najbliższej wielokrotności 10 znaków He,i spacji i przekształciłem je w MarioLANG . Następnie można nieco skrócić kod, korzystając z dodatkowej podłogi w pętli, która prawie o połowę zmniejsza szerokość pętli. Zauważ, że dno jest wykonywane tylko raz mniej niż góra, więc nie otrzymujesz już dokładnych wielokrotności początkowego licznika we wszystkich 4 komórkach.

Wreszcie chciałem wykorzystać zmarnowaną przestrzeń przed pętlą, więc dodałem kilka wind, aby wykorzystać tam przestrzeń pionową. I wtedy zdałem sobie sprawę, że mogę złożyć kod po pętli (patrz poprzednia wersja) poniżej pętli, aby wykorzystać trochę więcej miejsca w pionie, co pozwoliło zaoszczędzić pięć dodatkowych bajtów.

Prawdopodobnie jest to wciąż dalekie od ideału, ale myślę, że to znaczna poprawa w stosunku do naiwnego rozwiązania.

Metagolf

Czas na automatyzację ...

Zacząłem konfigurować solver w Mathematica, aby znaleźć optymalne rozwiązanie. Obecnie zakłada się, że struktura kodu jest stała: licznik ustawiony na 12, 4 komórki do drukowania, ze stałym przypisaniem do He,<space>i taką samą kolejnością tych komórek. To, co się zmienia, to liczba +s w pętli, a także niezbędne późniejsze poprawki:

n = 12;
Minimize[
 {
  3(*lines*)+
   12(*initialiser base*)+
   Ceiling[(n - 6)/2] 3(*additional initialiser*)+
   8(*loop ends*)+
   18(*cell moves*)+
   26(*printing*)+
   43*2(*steps between letters in one cell*)+
   -2(*edge golf*)+
   4 Max[4 + a + d + g + j + 2 Sign[Sign@g + Sign@j] + 2 Sign@j + 2,
     4 + b + e + h + k + 2 Sign[Sign@h + Sign@k] + 2 Sign@k] +
   2 (Abs@c + Abs@f + Abs@i + Abs@l),
  a >= 0 && d >= 0 && g >= 0 && j >= 0 &&
   b >= 0 && e >= 0 && h >= 0 && k >= 0 &&
   n*a + (n - 1) b + c == 72 &&
   n*d + (n - 1) e + f == 101 &&
   n*g + (n - 1) h + i == 44 &&
   n*j + (n - 1) k + l == 32
  },
 {a, b, c, d, e, f, g, h, i, j, k, l},
 Integers
 ]

Okazuje się, że dla początkowego licznika 12 moje ręcznie wykonane rozwiązanie jest już optymalne. Jednak użycie 11 zamiast tego oszczędza dwa bajty. Próbowałem wszystkich wartości liczników od 6 do 20 (włącznie) z następującymi wynikami:

6: {277,{a->7,b->6,c->0,d->16,e->1,f->0,g->0,h->9,i->-1,j->0,k->6,l->2}}
7: {266,{a->6,b->5,c->0,d->11,e->4,f->0,g->2,h->5,i->0,j->0,k->5,l->2}}
8: {258,{a->2,b->8,c->0,d->3,e->11,f->0,g->5,h->0,i->4,j->4,k->0,l->0}}
9: {253,{a->8,b->0,c->0,d->5,e->7,f->0,g->2,h->3,i->2,j->0,k->4,l->0}}
10: {251,{a->0,b->8,c->0,d->3,e->8,f->-1,g->4,h->0,i->4,j->3,k->0,l->2}}
11: {240,{a->1,b->6,c->1,d->1,e->9,f->0,g->4,h->0,i->0,j->3,k->0,l->-1}}
12: {242,{a->6,b->0,c->0,d->6,e->3,f->-4,g->0,h->4,i->0,j->0,k->3,l->-1}}
13: {257,{a->1,b->5,c->-1,d->6,e->2,f->-1,g->3,h->0,i->5,j->0,k->3,l->-4}}
14: {257,{a->1,b->4,c->6,d->0,e->8,f->-3,g->3,h->0,i->2,j->2,k->0,l->4}}
15: {242,{a->1,b->4,c->1,d->3,e->4,f->0,g->1,h->2,i->1,j->2,k->0,l->2}}
16: {252,{a->0,b->5,c->-3,d->4,e->2,f->7,g->0,h->3,i->-1,j->2,k->0,l->0}}
17: {245,{a->4,b->0,c->4,d->5,e->1,f->0,g->0,h->3,i->-4,j->0,k->2,l->0}}
18: {253,{a->4,b->0,c->0,d->1,e->5,f->-2,g->2,h->0,i->8,j->0,k->2,l->-2}}
19: {264,{a->0,b->4,c->0,d->5,e->0,f->6,g->2,h->0,i->6,j->0,k->2,l->-4}}
20: {262,{a->0,b->4,c->-4,d->5,e->0,f->1,g->2,h->0,i->4,j->0,k->2,l->-6}}

Uwaga: Ten solver zakłada, że ​​kod liniowy po pętli znajduje się w górnym wierszu, a powyższy kod to rozwiązanie złożone. Ogólne rozwiązanie może być krótsze, informując solver o złożeniu, ponieważ teraz dostaję 3 dodatkowe +s w pierwszej części za darmo, a kolejne 4 instrukcje kosztują tylko 1 bajt zamiast 2.


2
@ justhalf Powinieneś zobaczyć moją odpowiedź Pada. : P
Martin Ender

Martin Uwielbiam tę odpowiedź. Czy mógłbyś napisać o tym post na naszym oficjalnym forum ? Używamy tego samego, co edytor stosów. Nasz artykuł redakcyjny chciałby dodać go do wyboru pracowników .
Vitaliy Kaurov

61

Ciemny , 106 bajtów

+h hell
h$twist sign s
s$scrawl " Hello, World!
s$read
h$twist stalker o
o$stalk
o$personal
o$echo
h$empty

Pozwolę, że niektóre cytaty ze specyfikacji języka mówią o blasku tego esolangu:

Dark to język oparty na manipulowaniu całymi światami i wymiarami, aby osiągnąć cele i zbudować najlepszą możliwą rzeczywistość.

Ilekroć wystąpi błąd składniowy, poczytalność programu zmniejsza się o 1. [...] Jeśli poczytalność programu osiągnie zero, interpreter oszaleje.

Korupcja odwraca jeden bit w zmiennej, gdy występuje.

Kiedy mistrz umiera, wszystkie zmienne sług dołączone do tego mistrza również umierają. Jest to przydatne do grupowania i masowego zabijania zmiennych.

Zmusza zmienną do samobójstwa, uwalniając ją (pamiętaj jednak, że spowoduje rozkład).

Ustawia zmienną na losową wartość. Korzysta z globalnego generatora chaosu.

Jeśli prześladowca nie zostanie zainicjowany, wszelkie próby wykonania operacji we / wy spowodują przygnębiające komunikaty o błędach, które zostaną zapisane w konsoli.


37
Ten język jest taki metalowy.
Alex A.

6
Gdybyśmy musieli wymieniać języki programowania w kolejności szatańskiej, Ciemność byłaby zła.
LukStorms

35
w piekle jest piekło
Khaled.K

super zło, możesz nawet zebrać armię chodzących gotos
bobrobbob

59

Szef kuchni , 465 bajtów

H.

Ingredients.
72 l h
101 l e
108 l l
111 l o
44 l C
32 l S
87 l w
114 l r
100 l d
33 l X

Method.
Put X into mixing bowl.Put d into mixing bowl.Put l into mixing bowl.Put r into mixing bowl.Put o into mixing bowl.Put w into mixing bowl.Put S into mixing bowl.Put C into mixing bowl.Put o into mixing bowl.Put l into mixing bowl.Put l into mixing bowl.Put e into mixing bowl.Put h into mixing bowl.Pour contents of the mixing bowl into the baking dish.

Serves 1.

Przetestowano przy pomocy interpretera Ruby. Robi zupę alfabetu.

Starałem się być tak zgodny z oryginalną specyfikacją, jak tylko mogłem, więc nawet jeśli użyty przeze mnie interpreter pozwala upuścić thes w Pour contentsinstrukcji, nie zrobiłem tego.

Miska do miksowania jest dość droga, więc może być lepsze podejście. Próbowałem użyć konwersji bazowej do zakodowania wiadomości, ale niestety specyfikacja nie wyjaśnia, czy Divideużywa podziału na liczby całkowite, czy zmiennoprzecinkowe, a mój interpreter używa tego drugiego. Nie ma również operatora modulo, co też nie pomaga.


19
Jeśli ktoś mógłby grać w golfa w Chef, to Sp.
Alex A.

11
Teraz wypróbuj przepisy na golfa w prawdziwym życiu. : D
mbomb007

2
Lol, to nie tylko nie jest dobre do jedzenia, ale także wykorzystuje niestandardowe jednostki miary. XD
thepiercingarrow

59

Homespring , 58 bajtów

Universe net hatchery Hello,. World!  powers a b snowmelt 

Końcowa przestrzeń jest znacząca.

Pozwól, że opowiem ci historię. Kiedyś istniała elektrownia, która zasilała pobliską wylęgarnię łososi. Wylęgarnia łososia wykluła młodego bezdomnego łososia, który wyruszył w podróż w górę rzeki, by znaleźć źródło. Znalazła taką wiosnę, o poetyckiej nazwie „Witaj, świecie!”, Gdzie dojrzała i zrodziła nowego młodego łososia. Obie ryby pływały teraz w dół rzeki w poszukiwaniu szerokiego oceanu. Ale tuż przy ujściu rzeki znajdowała się sieć w rzece - dojrzała ryba została złapana i tylko młodej udało się przepłynąć i dotrzeć do oceanu i reszty wszechświata. W międzyczasie wylęgarnia wykluczyła więcej łososia, który również podróżował w górę rzeki i rozmnożył się, i tak dalej.

Jednak ogromne ilości topniejącego śniegu wędrowały po innym brzegu rzeki. I zaraz po naszym pierwszym młodym łososiu ze źródeł „Witaj, świecie!” dotarł do oceanu, topniejący śnieg uderzył we wszechświat i ... och ... zniszczył go. I żyli długo i szczęśliwie ... albo chyba nie.

To była właściwie semantyka powyższego programu. Homespring jest dziwny.


15
To jest ... dziwne ...
kirbyfan64sos

10
Znalazłem nowy ulubiony niszczyciel wszechświatów napędzany łososiem ... uh ... Mam na myśli "Witaj, świecie!" program. +1
ETHprodukcje

7
Za każdym razem, gdy do tego wracam, dobrze się śmieję. Dziękujemy za stworzenie możliwie najbardziej rozrywkowego Hello, World! program wszechczasów.
ETHprodukcje

2
To jest mój nowy ulubiony język.
Mega Man,


53

Piet, 84 kodeksów

Piet Hello World

28x3, tutaj pokazano z szerokością kodu 10.

Utworzono za pomocą PietDev , przetestowano z npiet . Układ programu jest następujący:

Układ pieta

Żółte wypełnienie wskazuje kody, w których ścieżka się pokrywa, pomarańczowe wypełnienie wskazuje kody, które muszą być tego samego koloru, do celów kontroli przepływu.

Aby pomóc w stworzeniu tego, napisałem podstawowy interpreter dla języka opartego na stosie z komendami podobnymi do pieta, które nazwałem „pasm” ( źródło ). Dane wyjściowe z tego interpretera (z tym wejściem ) są następujące:

    1 nop     blu1 []
    4 push 3  blu2 [3]
    5 dup     grn2 [3, 3]
    6 add     cyn2 [6]
    7 dup     ylw2 [6, 6]
    8 mul     grn1 [36]
    9 dup     red1 [36, 36]
   10 dup     blu1 [36, 36, 36]
   11 add     mgn1 [36, 72]
H  12 putc    blu0 [36]
   15 push 3  blu1 [36, 3]
   16 sub     mgn2 [33]
   17 dup     cyn2 [33, 33]
   20 push 3  cyn0 [33, 33, 3]
   21 mul     blu2 [33, 99]
   22 push 1  blu0 [33, 99, 1]
   23 add     mgn0 [33, 100]
   24 dup     cyn0 [33, 100, 100]
   25 push 1  cyn1 [33, 100, 100, 1]
   26 add     blu1 [33, 100, 101]
e  27 putc    cyn0 [33, 100]
   28 dup     ylw0 [33, 100, 100]
   32 push 4  ylw1 [33, 100, 100, 4]
   33 dup     mgn1 [33, 100, 100, 4, 4]
   34 add     red1 [33, 100, 100, 8]
   35 add     ylw1 [33, 100, 108]
   36 dup     mgn1 [33, 100, 108, 108]
l  37 putc    blu0 [33, 100, 108]
   38 dup     grn0 [33, 100, 108, 108]
l  39 putc    ylw2 [33, 100, 108]
   40 dup     mgn2 [33, 100, 108, 108]
   43 push 3  mgn0 [33, 100, 108, 108, 3]
   44 add     red0 [33, 100, 108, 111]
   45 dup     blu0 [33, 100, 108, 111, 111]
o  46 putc    cyn2 [33, 100, 108, 111]
   47 dup     ylw2 [33, 100, 108, 111, 111]
   48 dup     mgn2 [33, 100, 108, 111, 111, 111]
   53 push 5  mgn0 [33, 100, 108, 111, 111, 111, 5]
   54 div     ylw0 [33, 100, 108, 111, 111, 22]
   55 dup     mgn0 [33, 100, 108, 111, 111, 22, 22]
   56 add     red0 [33, 100, 108, 111, 111, 44]
   57 dup     blu0 [33, 100, 108, 111, 111, 44, 44]
,  58 putc    cyn2 [33, 100, 108, 111, 111, 44]
   59 dup     ylw2 [33, 100, 108, 111, 111, 44, 44]
   60 add     grn2 [33, 100, 108, 111, 111, 88]
   64 push 4  grn0 [33, 100, 108, 111, 111, 88, 4]
   65 dup     red0 [33, 100, 108, 111, 111, 88, 4, 4]
   66 mul     ylw2 [33, 100, 108, 111, 111, 88, 16]
   67 dup     mgn2 [33, 100, 108, 111, 111, 88, 16, 16]
   68 add     red2 [33, 100, 108, 111, 111, 88, 32]
   69 putc    mgn1 [33, 100, 108, 111, 111, 88]
   70 push 1  mgn2 [33, 100, 108, 111, 111, 88, 1]
   71 sub     red0 [33, 100, 108, 111, 111, 87]
W  72 putc    mgn2 [33, 100, 108, 111, 111]
o  73 putc    blu1 [33, 100, 108, 111]
   76 push 3  blu2 [33, 100, 108, 111, 3]
   77 add     mgn2 [33, 100, 108, 114]
r  78 putc    blu1 [33, 100, 108]
l  79 putc    cyn0 [33, 100]
d  80 putc    grn2 [33]
!  81 putc    ylw1 []

Nie są używane żadne polecenia wskaźnika, przełącznika ani przewijania. Nie marnuje się też żadnych kodów; w rzeczywistości dwa są ponownie wykorzystywane.


Gratulacje, dostałeś moją nagrodę :)
LegionMammal978,

@ LegionMammal978 Dzięki, praca nad tym była fajna. I wesołych świąt :)
primo,

7
Właśnie to powinien pokazać Hollywood na ekranach hakerów.
Hubert Grzeskowiak

50

Biała spacja , 192 150 146 bajtów

Białe znaki potrzebują tylko spacji, tabulatorów i linii, podczas gdy inne znaki są ignorowane.
Które mogą być kłopotliwe do wyświetlenia tutaj.
W poniższym kodzie spacje i tabulatory zostały zastąpione.
I „;” został umieszczony przed liniami dla jasności.
Aby uruchomić kod, najpierw zamień. oraz> spacje i tabulatory.

...;
..>>..>.>.;
..>>>>;
...>;
...>>>;
...>..;
..>>.>..;
..>>..>.>>;
..>>>>>>>;
...>..;
...>;
.;
...>>>.;
..>>...>>;
;
..;
.;
.;
>.>;
...>>.>.>>;
>...>;
..;
.;
;
;
..>;
;
;
;

Hexdump kodu

00000000: 2020 200a 2020 0909 2020 0920 0920 0a20
00000010: 2009 0909 090a 2020 2009 0a20 2020 0909
00000020: 090a 2020 2009 2020 0a20 2009 0920 0920
00000030: 200a 2020 0909 2020 0920 0909 0a20 2009
00000040: 0909 0909 0909 0a20 2020 0920 200a 2020
00000050: 2009 0a20 0a20 2020 0909 0920 0a20 2009
00000060: 0920 2020 0909 0a0a 2020 0a20 0a20 0a09
00000070: 2009 0a20 2020 0909 2009 2009 090a 0920
00000080: 2020 090a 2020 0a20 0a0a 0a20 2009 0a0a
00000090: 0a0a

Kod zestawu białych znaków:

push 0      ;null
push -74    ;! chr(33)
push -7     ;d chr(100)
push 1      ;l chr(108)
push 7      ;r chr(114)
push 4      ;o chr(111)
push -20    ;W chr(87)
push -75    ;  chr(32)
push -63    ;, chr(44)
push 4      ;o
push 1      ;l
dup         ;l
push -6     ;e chr(101)
push -35    ;H chr(72)
p:
 dup jumpz e
 push 107 add printc
 jump p
e:
 exit

Uwagi:

Musiałem napisać program, aby obliczyć, że dodanie 107 daje optymalną grę w golfa. Ponieważ wielkość bajtów, jaką przyjmuje liczba całkowita, zmienia się kod. : 4 + int (abs (log2 ($ n)))
Kod nadal będzie działał bez etykiety „e:” i części wyjściowej na whitespace.kauaveel.ee . Ale to może spowodować, że kod białych znaków będzie nieprawidłowy w innych kompilatorach białych znaków. Tak więc te bajty nie zostały oderwane od rozwiązania.

Należy zauważyć że

Jak zauważył Kevin Cruijssen w komentarzach, zezwalając na „wyjście przez błąd” według meta, biała spacja może zostać zakodowana w golfie do 126 znaków.

..>>..>.>.;
..>>>>;
...>;
...>>>;
...>..;
..>>.>..;
..>>..>.>>;
..>>>>>>>;
...>..;
...>;
.;
...>>>.;
..>>...>>;
;
..;
...>>.>.>>;
>...>;
..;
.;
;

Montaż:

push -74
push -7
push 1
push 7
push 4
push -20
push -75
push -63
push 4
push 1
dup
push -6
push -35
label_0:
push 107
add 
printc
jmp label_0

Wiem, że minęło trochę czasu i widzę, że wspominasz, że działa bez etykiety wyjścia w większości kompilatorów, ale możesz obniżyć ją do 129 bajtów , wychodząc z błędem używając SSN(wartość błędu) zamiast SSSN(push 0 ), co jest dozwolone zgodnie z meta . Wypróbuj online (z dodanym podświetleniem i objaśnieniami) lub wypróbuj online w trybie raw .
Kevin Cruijssen

@KevinCruijssen W końcu sprawdziłem twoją wersję. Jest to w zasadzie stara wersja z zespołem dup jumpz ei e: exitusuniętym. Ale przynajmniej na whitespace.kauaveel.ee ciągle się zapętla, aż przeglądarka narzeka. Wolę nie zmieniać mojej wersji na to, pomimo niższego golfa i meta pozwalającego na „wyjście przez błąd”. Ale możesz przesłać swoją wersję jako nową odpowiedź.
LukStorms

Nie, nie opublikuję oddzielnej odpowiedzi. Jest zasadniczo taki sam jak twój, tylko trochę krótszy z powodu wyjścia przez błąd. Właśnie zdałem sobie sprawę, że mogę obniżyć go do 126 zamiast 129, usuwając SSNna początku, w którym to przypadku występuje błąd z Can't do Infix Plus, gdy ma on tylko jeden przedmiot na stosie (107). ( Wypróbuj online. ) Zostawię tutaj swój komentarz, gdy ktoś ma taką samą sugestię. I myślę, że już dawałem +1 twojej odpowiedzi około rok temu. ;)
Kevin Cruijssen

1
@KevinCruijssen W takim przypadku rozwiązanie zostało odnotowane w odpowiedzi. Biała spacja jest jednym z najbardziej nieprawdopodobnych języków gry w golfa. Jednak ze względu na oszczędność bajtów warto wspomnieć o swoich odkryciach.
LukStorms

49

Java, 79

class H{public static void main(String[]a){System.out.print("Hello, World!");}}

Wcześniejsze wersje Javy mogły pozwalać na użycie bloku statycznego (51 bajtów), ale obecnie nie znam sposobu na obejście tej mainmetody.


7
Użyj enumzamiast class.
Thomas Eding

6
@ThomasEding Na jakim kompilatorze to faktycznie działa? Ja próbowałem to wskazówka na kilka, i nigdy nie byli w stanie uratować bajtów z nim.
Geobits

4
@Luminous Ah, mogło działać dla 1,5. Nie zamierzam go jednak instalować, aby się tego dowiedzieć, ale trzymaj się czegoś wydanego w ciągu ostatnich 10 lat. Jeśli nigdy więcej nie zobaczę Java 5, będzie to miłe życie :)
Geobits 1'15

2
@TheDoctor Z tego, co widziałem, przetwarzanie jest tu zwykle postrzegane jako oddzielny język. Powinieneś opublikować to jako odpowiedź lub przynajmniej poprosić o wyjaśnienia z PO.
Geobits

5
Użytkownik OptiFine zasugerował zapisanie 3 bajtów przy użyciu interfacei porzuceniu publicspecyfikatora. Odrzuciłem poniższe zasady edycji , ale ponieważ nie mogą komentować, pomyślałem, że dam Ci znać, abyś mógł z nich skorzystać, jeśli chcesz.
Martin Ender,

48

CSS, 30 bajtów

:after{content:"Hello, World!"

Kaskadowe arkusze stylów (CSS) nie są typowym językiem programowania, ale mogą całkiem dobrze naprawić ustalone wyniki. Odbywa się to poprzez utworzenie pseudoelementu po każdym elemencie z zawartością Hello, World!. Tak więc <html>wybrany jest tylko jeden element ( ), przy założeniu, że używamy najbardziej podstawowego dokumentu HTML, tj

<html><style>:after{content:"Hello, World!"</style></html>

Działa to w większości głównych przeglądarek, z godnym uwagi wyjątkiem Firefoksa, który stosuje selektor do elementów <html>i <body>. Dlatego też fragmenty stosu nie działają, ponieważ zawsze istnieje element ciała, który również jest stylizowany. Poniżej znajduje się nieco zmodyfikowana wersja do przetestowania.

* :after{content:"Hello, World!"


3
Możesz także użyć, * *aby wybrać body.
jimmy23013,

18
@ jimmy23013 To brzmi wspaniale nieefektywnie. Dzięki
NinjaBearMonkey

1
Z jakichkolwiek powodów * :afterwydawało się, że działa.
jimmy23013

12
Pytam siebie, która z liter w CSS jest skrótem dla „języka”.
Zaibis,

10
@zaibis prawdopodobnie ten sam list do PHP :)
fcalderan

48

HTML, 13 bajtów

Hello, World!

Tekst jest automatycznie wstawiany do <body>i wyświetlany.


159
Łał. To naprawdę hardcorowe umiejętności kodowania
BlueWizard

46
HTML nie jest językiem programowania, ale językiem znaczników (dlatego kończy się na ML).
CoDEmanX

31
Ale HTML nie jest drukowany w STDOUT.
Harshil Sharma

25
-1 HTML Nie spełnia wymagań poprawnego języka
Downgoat

123
-1 za mało jQuery
Valentin Lorentz

45

Kod maszynowy x86_64 dla systemu Linux, 32 bajty

Kiedy Linux rozpoczyna nowy proces, wszystkie rejestry (oprócz RSP) są zerowe, więc możemy uzyskać RAX = 1 tylko poprzez modyfikację niskiego bajtu. X86-64 System V ABI nie gwarantuje tego, ale tak właśnie robi Linux. Ten kod działa tylko jak _startw statycznym pliku wykonywalnym.

0000000000000000 <_start>:
   0:   e8 0d 00 00 00          call   12 <hello>
   5:   48 65 6c 6c 6f
   a:   2c 20 57 6f 72
   f:   6c 64 21 5e 40

0000000000000012 <hello>:
  12:   5e                      pop    rsi
  13:   40 b7 01                mov    dil,0x1
  16:   b2 0d                   mov    dl,0xd
  18:   b0 01                   mov    al,0x1
  1a:   0f 05                   syscall
  1c:   b0 3c                   mov    al,0x3c
  1e:   0f 05                   syscall

Instrukcja call wypycha na stos następny adres zawierający ciąg hello world. Wpisujemy adres ciągu rsi.

Następnie pozostałe argumenty są tworzone przez syscallDo sys_write, która drukuje ciąg.

Program kończy się od syscalldo sys_exit. sys_writezwraca liczbę zapisanych bajtów, więc górne bajty RAX mają zero po pierwszym syscall(chyba że zwrócił błąd), więc mov al, 60daje nam RAX = __NR_exittylko w 2 bajtach.

Możesz sprawić, by ten program działał poprawnie, zamykając jego stdout ( ./a.out >&-), więc sys_write()powróci -EBADF, drugi syscallpowróci -ENOSYS, a następnie wykonanie zakończy się niepowodzeniem. Ale nie musimy write()wdzięcznie obsługiwać błędów.


W szczególności działa to tylko w systemie Linux , gdzie __NR_writejest 1. Nie jest to standard w różnych systemach uniksowych x86-64. Jesteś również zależny od zachowania Linuksa polegającego na wyzerowaniu wszystkich rejestrów oprócz RSP przed wejściem w nowy proces (więc działa to tylko wtedy, gdy zbudujesz go jako statyczny plik wykonywalny, w przeciwnym razie dynamiczny linker pozostawi śmieci w górnych bajtach, raxa ty ' Dostanę -ENOSYS). X86-64 System V ABI mówi, że rejestry mogą przechowywać dowolne wartości śmieci przy wejściu _start, samo jądro Linux wybiera je zero, aby uniknąć wycieku informacji.
Peter Cordes,

Możesz zapisać bajt z mov al, 1/ mov edi, eax(2 bajty), zamiast potrzebować prefiksu REX dla DIL, ponieważ__NR_write == STDOUT_FILENO = 1
Peter Cordes

Działa to tylko w statycznym pliku wykonywalnym Linuksa, więc adres twojego łańcucha ma gwarantowaną minimalną 2G wirtualnej przestrzeni adresowej (domyślny model pamięci dla plików wykonywalnych innych niż PIE umieszcza wszystkie symbole, w których można je wykorzystać jako zero lub znak- rozszerzone bezpośrednie 32-bitowe). W ten sposób można użyć 5-bajtowego mov esi, msg(NASM) aka mov esi, OFFSET msg(GAS .intel_syntax) . Umieść swój ciąg po ostatnim syscall. call/popjest 1 bajt krótszy niż 64-bitowy LEA zależny od RIP, ale mov jest najlepszy.
Peter Cordes,

Źródło NASM dla wersji 30-bajtowej (sprawdzony rozmiar na moim pulpicie), tio.run/##TY8/…
Peter Cordes

42

Sześciokąt , 37 32 bajtów

Uwaga: dam nagrodę w wysokości 500 powtórzeń pierwszej osobie, która znajdzie prawidłowe rozwiązanie w sześciokącie o długości boku 3 lub możliwym do udowodnienia optymalnym rozwiązaniu długości boku 4. Jeśli nie możesz znaleźć takiego rozwiązania, ale uda mi się pobić mój wynik w sześciokącie o boku 4 (dzięki większej liczbie no-opów na końcu programu, które można pominąć w kodzie źródłowym), jestem również skłonny dać za to mniejszą nagrodę .

H;e;P1;@/;W;o;/l;;o;Q/r;l;d;2;P0

Wypróbuj online!

Z dumą prezentuję swój drugi język programowania 2D i (o ile mi wiadomo) pierwszy w historii język 2D na siatce heksagonalnej.

Kod źródłowy nie wygląda bardzo 2D, prawda? Cóż, białe znaki są opcjonalne w Hexagony. Najpierw kod źródłowy jest dopełniany do następnej wyśrodkowanej liczby heksagonalnej za pomocą no-ops ( .). Następna taka liczba to 37, więc na końcu wstawiamy pięć no-ops. Następnie kod źródłowy jest przestawiany na zwykły sześciokąt:

   H ; e ;
  P 1 ; @ /
 ; W ; o ; /
l ; ; o ; Q /
 r ; l ; d ;
  2 ; P 0 .
   . . . .

Można to również uruchomić. Wypróbuj online!

Sześciokąty mają wiele całkiem funkcyjnych funkcji, w tym 6 różnych wskaźników instrukcji i układ pamięci, który jest wykresem liniowym sześciokątnej siatki, ale ten kod używa tylko jednego adresu IP i jednej krawędzi pamięci, więc nie martwmy się tym na razie.

Oto przegląd odpowiednich poleceń:

  • Listy po prostu ustawiają bieżącą krawędź pamięci na wartość ASCII
  • ; wypisuje bieżącą wartość, modulo 256, jako bajt do STDOUT.
  • / to zwierciadło, które zachowuje się tak, jak można się spodziewać (powodując, że IP skręca o 120 stopni).
  • Cyfry działają tak jak w Labiryncie : mnożą bieżącą komórkę przez 10, a następnie dodają się.
  • @ kończy program.

Teraz ostatni haczyk polega na tym, że źródło otacza wszystkie 3 pary krawędzi. Ponadto, jeśli IP opuści siatkę przez jeden z sześciu rogów, istnieją dwa możliwe rzędy, do których można przeskoczyć. To, który zostanie wybrany, zależy od tego, czy bieżąca wartość jest dodatnia czy dodatnia. Poniższa wersja z adnotacjami pokazuje, gdzie adres IP jest wprowadzany ponownie za każdym razem, gdy opuszcza siatkę:

         H ; e ;     -> 1
5 ->    P 1 ; @ /    -> 4
3 ->   ; W ; o ; /   -> 2
1 ->  l ; ; o ; Q /
4 ->   r ; l ; d ;   -> 5
2 ->    2 ; P 0 .    -> 3
         . . . .

Jeśli więc usuniemy wszystkie zmiany kierunku, program sprowadza się do następującego kodu liniowego:

H;e;l;;o;Q2;P0;W;o;r;l;d;P1;@

Co znajduje się Q2, P0i P1? Listy są drukowane łatwo, ponieważ możemy po prostu ustawić krawędź na odpowiednią wartość. W przypadku przecinka, spacja i wykrzyknik to nie działa. Nie możemy też po prostu ustawić swoją wartość z 44, 32, 33, odpowiednio, ponieważ krawędź pamięć jest niezerowe, aby rozpocząć, a ze względu na semantykę poszczególnych cyfr, które sieją spustoszenie wszelkiego rodzaju. Gdybyśmy chcieli to zrobić, musielibyśmy zresetować wartość krawędzi do zera za pomocą czegoś takiego *, jak +,- , &lub ^pierwszy. Ponieważ jednak wartość jest pobierana modulo 256 przed wydrukowaniem, nie musimy ustawiać wartości dokładnie na 44, 32 lub 33. Na przykład Q2ustawimy wartość krawędzi na 81*10 + 2 = 812, która jest44po przyjęciu modulo 256. W ten sposób możemy zapisać bajt każdego z tych trzech znaków. (Niestety, to nie jest możliwe, aby dostać się tam z jednej cyfry od wartości komórka ma już. Amusingly, gdzie to nie praca jest , bo to może być również uzyskane z ).o w WorldW9

Możesz użyć tego skryptu CJam, aby znaleźć wszystkie kombinacje liter i cyfr, które dają dany znak.

Nie jestem pewien, czy jest to optymalne. Wątpię, czy można to zrobić w sześciokącie o długości boku 3 (gdzie miałbyś tylko 19 znaków), ale może być możliwe rozwiązanie tego w sześciokącie o długości boku 4 z mniej niż 32 poleceniami, takimi jak że na końcu siatki jest więcej no-opów.


1
Cholera, pobiłeś mnie do tego. Sam pracuję nad heksagonalnym językiem podobnym do kardynała.
ML

Jak znalazłeś to rozwiązanie? Ręcznie czy brutalnie? W każdym razie +1 :)
Adnan

1
Q2, P0I P1jest bardzo mądry. Nie znałem części modulo 256.
Adnan

1
@Adnan Osoba, która zasugerowała część mod-256 na GitHub, zrobiła to wraz z przykładem, że przejścia między wierszami mogą być następnie drukowane jako M8;(lub g4;), z czego korzystałem kilka razy od tego czasu. Do tej pory nigdy nie przyszło mi do głowy, aby ponownie przeczytać tę odpowiedź po dokonaniu tej zmiany.
Martin Ender

2
Uwaga: jakiś czas temu została zmniejszona do 31 . H;e;P;2Q/d;l;r/l;$@;o];o;W;03&;
Mitch Schwartz

38

Malbolge, 112 bajtów

('&%:9]!~}|z2Vxwv-,POqponl$Hjihf|B@@>,=<M:9&7Y#VV2TSn.Oe*c;(I&%$#"mCBA?zxxv*Pb8`qo42mZF.{Iy*@dD'<;_?!\}}|z2VxSSQ

Zobaczę, czy jest krótszy. Mam lepszy komputer od ostatniego razu, więc mogę generować nieco szybciej.

Na pokaz oto „Hello World!” bez przecinka.

(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc

37

Fourier , 15 bajtów

DUŻE ZMIANY w Fourier!

`Hello, World!`

Wypróbuj na FourIDE!

Tak, dni wpisywania kodu ASCII każdego znaku już minęły na zawsze: Fourier już trochę obsługuje ciągi. Gdy umieścisz ciąg znaków w backticks, ciąg ten zostanie wyprowadzony.

Zauważ, że nie możesz zrobić nic innego niż wyprowadzenie tego ciągu: nie możesz go zapisać w zmiennej, nie jest on przechowywany w akumulatorze i nie ma żadnych narzędzi do manipulacji ciągiem.


Tutaj znajdziesz wrak pociągu, który był starym Fourierem. ;)

72a101a+7aa+3a44a32a87a111a+3a-6a-8a33a

Wypróbuj online!

Teraz niektórzy z was prawdopodobnie będą mieli spotkali już Fouriera i być może znają ten język. Cały język oparty jest na akumulatorze: zmiennej globalnej, z której korzystają prawie wszyscy operatorzy.

Najważniejszą częścią kodu jest aoperator. Pobiera to wartość liczbową akumulatora i konwertuje go na znak przy użyciu kodu Pythonchr(accumulator) . To jest następnie drukowane do STDOUT.

Niestety nie miałem jeszcze okazji użyć Fouriera ( szturchanie , mrugnięcie, mrugnięcie ), głównie ze względu na brak łańcuchów i operatorów smyczkowych. Mimo to nadal nadaje się do wielu innych wyzwań (patrz sekcja przykładów na stronie EsoLangs).

Zauważ, że jest to krótszy czas niż mój wpis na listę Esolangs ponieważ tak naprawdę nie sądziłem, że mógłbym już grać w golfa. A potem, pisząc wyzwanie golfa Fouriera, zdałem sobie sprawę, że mogę iść nieco krócej.

Uwaga

Jeśli zastanawiasz się nad składnią zmiennych, Geobits napisał program, który używa zmiennych i ma tę samą długość:

72a101a+7aa+3~za44a32a87aza+3a-6a-8a/3a

Wypróbuj online!


Co jest do zrobienia? Czy to jest użyteczne?
CalculatorFeline

35

C-- , 155 bajtów

target byteorder little;import puts;export main;section"data"{s:bits8[]"Hello, World!\0";}foreign"C"main(){foreign"C"puts("address"s);foreign"C"return(0);}

Niestety, jedyny znany kompilator C - Quick C-- nie jest już obsługiwany. Budowanie to boli w szyję, ale jest możliwe ...


8
Naprawdę fascynujący język - nigdy wcześniej o nim nie słyszałam, a na pewno jest to ambitny projekt, który oni (byli / są) realizują. Ale jeśli chodzi o golfa kodowego, nie sądzę, że będzie to rywal. Mam na myśli ... cholera, ta rzecz przegrywa z Javą ...
AdmBorkBork

11
@TimmyD To naprawdę asembler. Jest powód, dla którego przegrywa z Javą ... :)
kirbyfan64sos

Mam dla Ciebie dobrą wiadomość. Choć sam projekt C-- wydaje się całkiem martwy, jeden wariant jest całkiem żywy. Glasgow Haskell Compiler (GHC) wykorzystuje C-- jako ostatni etap przed montażem lub LLVM, a ta wersja jest nadal aktywnie utrzymywana. Nie powinno być żadnych problemów z zainstalowaniem go (wraz z resztą GHC).
dfeuer

@dfeuer Rzeczywiście próbowałem wcześniej użyć ich zaplecza Cmm, ale miałem kilka dziwnych problemów i nigdy tak naprawdę nie zagłębiałem się w to dalej ¯ \\ _ (ツ) _ / ¯
kirbyfan64sos

Prawdopodobnie możesz uzyskać pomoc na listach mailowych Haskell. Spróbuj glasgow-haskell-users@haskell.org lub może haskell-cafe@haskell.org.
dfeuer

33

C, 30 bajtów

main(){puts("Hello, World!");}

Dość waniliowy, ale nie potrafię wymyślić powszechnie stosownego sposobu, aby zrobić to krócej (chyba że może zadziała jakaś surowa sztuczka asm?). Nadal bije większość esolangów!


3
Nie jest to warte osobnej odpowiedzi, ale w pełni zgodne z ISO odpowiedzi C89 i C99 mają odpowiednio 39 main(){puts("Hello, World!");return 0;}i 53 #include <stdio.h> int main(){puts("Hello, World!");}bajty. Nieco więcej, jeśli uważasz, że główny (void) jest wymagany.
Random832

20
@ Random832: dla tych pierwszych main(){return!puts("Hello, World!");}jest o dwa bajty krótszy.
Lynn

15
Program hjest o 29 bajtów krótszy. Uwaga: będziesz musiał go skompilować z -Dh='main(){puts("Hello, World!");}'tym, że w połowie trolluję, w połowie bawię się nadużyciami kompilatora.
matega

19
@matega To wyraźnie oszustwo. Aby nie oszukiwać, trzeba by plik zawierał tylko __FILE__(8 bajtów) i nazwać plik main(){puts("Hello, World!");}. Wtedy to zupełnie nie oszukuje;)
C0deH4cker

W rzeczywistości do 2017 r. Będą to odpowiednio 34 i 38 bajtów.
CalculatorFeline,

32

Nieczytelny , 843 755 732 666 645 629 577 bajtów

„” „” „” „” „„ ”„ ”„ ”„ „” „” „” „„ ”„ „” „” „” „” „” „” „” „” „” „” „„ ”„ ”„ ”„ ”„ „” „„ ”„ „” „„ ”„ ”„ ”„ ”„ ” „” „” „” „” „” „” „” „„ ”„ ”„ ”„ ”„ ”„ „” „” „” „” „” „” „„” „” „” „” „„ ”„ ”„ ”„ ”„ ”„ „” „„ ”„ „” „„ ”„ „” „” „” „” „” „” „” „„ ”„ ”„ ”„ ”„ ”„ ”„ ”„ „” „„ ”„ „” „” „” „” „” „” „” „” „„ ”„ ”„ „” „” „” „„ ”„ „” „„ ”„ ”„ ”„ ”„ ”„ „„” „” „” „” „„ ”„ ”„ ”„ ”„ ”„ ”„ ”„ „” „„ ”„ ”„ ”„ ”„ „” „” „” „” „” „„ ”„ ”„ ”„ ”„ ”„ ”„ ”„ „” „„ ”„ „” „” „” „” „” „” „” „” „” „” „” „” „” „” „” „” „„ ”„ „” „” „” „” „”„” „” „” „” „” „” „” „„ ”„ ”„ ”„ ”„ ”„ „” „” „” „” „” „” „” „” „” „” „„ ”„ ”„ ”„ „” „” „„ ”„ „” „„ ”„ ”„ „” „” „” „” „” „” „” „” „„ ”„ ”„ ”„ ”„” „” „” „” „” „„ ”„ ”„ ”„ ”„ „” „„ ”„ „” „„ ”„ „” „” „” „” „” „” „” „” „” „” „„ ”„ ”„ ”„ ”„ ”„ „” „” „” „” „” „”„” „” „” „” „” „„ ”„ ”„ ”„ ”„ „” „„ ”„ „” „„ ”„ „” „” „” „” „” „” „” „” „” „” „„ ”„ ”„ ”„ ”„ ”„ „” „” „” „” „” „„” „” „” „” „” „” „” „„ ”„ ”„ ”„ ”„ ”„ „” „” „” „” „” „”„” „” „” „” „” „” „” „„ ”„ ”„ ”„ ”„ ”„ „” „” „” „” „” „”

Nieczytelne programy powinny być wyświetlane czcionką o zmiennej szerokości, więc honorują nazwę języka. Jestem nieco rozczarowany, że moje bardziej wyrafinowane podejście okazało się znacznie dłuższe. Pętle są niesamowicie drogie w Nieczytelne ...

Wypróbuj online!

Jak to działa

Nieczytelny ma tylko dziesięć funkcji; sześć z nich jest używanych w tym kodzie:

'"        p Print.
'""       + Increment.
'"""      1 Return 1.
'""""""   : Set.
'"""""""  = Get.
'"""""""" - Decrement.

Po użyciu mojej notacji jednoznakowej i dodaniu spacji i komentarzy powyższy kod wygląda następująco. Instrukcje wieloliniowe są wykonywane od dołu do góry.

p+++                                        Print 3 + variable 2 (o).
 pp                                         Print variable 2 two times (l).
  :+1+++++++                                Save 8 + variable 3 in variable 2.
   p+                                       Print 1 + variable 3 (e).
    :++1+++++++++++++                       Save 13 + variable 4 in variable 3.
     :+++1+++++++++++++++                   Save 43 + variable 0 in variable 4.
      p++++++++++++++++++++++++++++         Print 28 + variable 0 (H).
       :-1++++++++++++                      Save 44 in variable 0.
        :1+++++++++++++++++++++++++++++++1  Save 32 in variable 1.
p=-1                                        Print variable 0 (,).
p=1                                         Print variable 1 ( ).
p=+++1                                      Print variable 4 (W).
p+++                                        Print 6 + variable 2 (r).
 p+++=+1                                    Print 3 + variable 2 (o).
p=+1                                        Print variable 2 (l).
p=++1                                       Print variable 3 (d).
p+=1                                        Print 1 + variable 1 (!).

Wygenerowałem rzeczywisty kod źródłowy, uruchamiając niekomentowaną wersję powyższego pseudokodu za pomocą tego programu CJam .


3
O czym mówisz? Jest dość czytelny!
Optymalizator

19
@Optimizer Naprawiono.
Dennis,

4
Nadal czytelne! (oczywiście mówię prawdę. Dlaczego mi nie uwierzysz?)
Optymalizator

5
Wydaje się, że ten język skorzystałby na lepszym kodowaniu huffmana - zarówno pod względem wielkości, jak i nieczytelności.
primo

30

Befunge 98 , 19 18 bajtów

Nowa odpowiedź (z podziemnego kolejki)

"ck,@!dlroW ,olleH

Wyjaśnienie

  • " uruchamia tryb strunowy
  • Wszystko, co następuje, jest odkładane na stos. Stos jest terazHello, World!@,kc
  • Po osiągnięciu końca tłumacz wraca na początek
  • Napotyka "ponownie, kończąc tryb strunowy
  • 12 jest wypychany na stos ( c)
  • k przyjmuje najwyższą wartość stosu i wykonuje następne polecenie, które wskaźnik instrukcji może zobaczyć wiele razy
  • ,wyskakuje wartość ze stosu i wysyła ją jako znak. Został on wykonany 12 razy przez ostatnią kinstrukcję i jeszcze raz, gdy tłumacz faktycznie czyta ,instrukcję
  • @ kończy program

Różnica w stosunku do starej odpowiedzi polega na tym, że sprytnie wykorzystujemy "postać, używając zachowania pętli Befunge, gdy trafi ona na koniec linii. Ponieważ może to być mniej intuicyjne, pozwalam również staremu. Być może zauważyłeś, że stos nadal będzie zawierał pewne postacie ( ck,@) z powodu tej fajnej sztuczki, pozostawiając trochę bałaganu, jeśli kiedykolwiek będziemy chcieli coś zrobić później.

Stara odpowiedź

"!dlroW ,olleH"ck,@

Działa to dla funge i befunge 98

Wyjaśnienie

  • Wszystko pomiędzy ""jest odkładane na stos. ( 'H'jest teraz na górze).
  • c (12) jest wypychany na stos
  • k przyjmuje najwyższą wartość stosu i wykonuje następne polecenie, które wskaźnik instrukcji może zobaczyć wiele razy.
  • ,wyskakuje wartość ze stosu i wysyła ją jako znak. Został on wykonany 12 razy przez ostatnią kinstrukcję i jeszcze raz, gdy tłumacz faktycznie czyta ,instrukcję
  • @ kończy program

2
Nie sądzę, że 93 mak
Sp3000

1
Dobrze, że teraz jest to tylko 98 można użyć cdo 93+.
PurkkaKoodari

3
W 18:"ck,@!dlroW ,olleH
metro

1
Uderza w, "aby rozpocząć ciąg, dodaje całą resztę linii do tego ciągu, owija się i uderza to samo, "aby zakończyć ciąg. Teraz cały program oprócz tego "został wypchnięty na stos, z !dlroW ,olleHna górze. Następnie drukuje 12 najlepszych znaków w taki sam sposób, jak twój i zatrzymuje się na @.
undergroundmonorail

1
W przypadku rozwiązania 18-bajtowego mój tłumacz tworzy „Witaj, świecie” (wiodąca przestrzeń, bez wykrzyknika). Anarchy Golf interpreter (forma wykorzystania, wybierz befunge-98, kod pasty, przedkłada) robi to samo.
primo

29

JSFuck , 6293 6289 6277 bajtów

Może to zostać wymienione jako jeden z najdłuższych „najkrótszych programów Hello, World! ” (Tak naprawdę nie wiem, czy jest to optymalne, ale jest to najkrótsze, jakie udało mi się uzyskać).

Ostrzeżenie: działa tylko w przeglądarce Firefox i Safari

[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]][([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]([(![]+[])[+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[!![]+!![]+!![]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(!![]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]()[+!![]+[!![]+!![]]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]][([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]+[])[!![]+!![]+[+[]]]+([][(!![]+[])[!![]+!![]+!![]]+([][[]]+[])[+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([![]]+[][[]])[+!![]+[+[]]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]]()+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(![]+[])[+!![]])()(!![])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]][([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(![]+[])[+!![]]+(!![]+[])[+[]]](([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]+[])[!![]+!![]+[+[]]]+(+[![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]][([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]+[])[!![]+!![]+[+[]]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(![]+[])[+[]])())[+!![]+[+!![]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]+(![]+[])[!![]+!![]]+([][[]]+[])[!![]+!![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]][([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+!![]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]+[])[!![]+!![]+[+[]]]+(![]+[])[+!![]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][(!![]+[])[!![]+!![]+!![]]+([][[]]+[])[+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([![]]+[][[]])[+!![]+[+[]]]+(!![]+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]]()+[])[!![]+!![]])()((+(+!![]+(!![]+[])[!![]+!![]+!![]]+(+!![])+(+[])+(+[])+(+[]))+[])[+[]]+![])[+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+([][[]]+[])[+!![]]+(!![]+[])[+[]]+([]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[+!![]+[+[]]]+(!![]+[])[+!![]]]()[+!![]+[!![]+!![]]]+(+[]+[![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]])[!![]+!![]+[+[]]]))()

Istnieje również nieco dłuższa wersja (+4 bajty), która działa również w Chrome i Microsoft Edge:

Dla tych, którzy nie są zaznajomieni z JSFuck, chodzi o pisanie JavaScript tak, jakby było tylko sześć znaków, i czasami może być dość szalony.

Ta tabela pokazuje, w jaki sposób postacie użyte w Hello, World! program jest zakodowany w JSFuck. Zwykły kod tekstowy jest po prostu alert("Hello, World!").

+----------+--------------------------------------+---------------------------+
|JavaScript|               write as               |           JSFuck          |
+----------+--------------------------------------+---------------------------+
|     a    | (false+[])[1]                        | (![]+[])[+!![]]           |
|     l    | (false+[])[2]                        | (![]+[])[!![]+!![]]       |
|     e    | (true+[])[3]                         | (!![]+[])[!![]+!![]+!![]] |
|     r    | (true+[])[1]                         | (!![]+[])[+!![]]          |
|     t    | (true+[])[0]                         | (!![]+[])[+[]]            |
|     (    | ([]+[]["fill"])[13]                  | 114 bytes                 |
|     "    | ([]+[])["fontcolor"]()[12]           | 539 bytes                 |
|     H    | btoa(true)[1]                        | 1187 bytes                |
|     o    | (true+[]["fill"])[10]                | 105 bytes                 |
|   space  | ([]["fill"]+[])[20]                  | 107 bytes                 |
|     W    | (NaN+self())[11]                     | 968 bytes                 |
|     d    | (undefined+[])[2]                    | ([][[]]+[])[!![]+!![]]    |
|     !    | atob((Infinity+[])[0]+false)[0]      | 1255 bytes                |
|     )    | (0+[false]+[]["fill"])[20]           | 114 bytes                 |
+----------+--------------------------------------+---------------------------+

Tutaj łańcuchy "fill", "fontcolor"itp musi być zapisana jako "f"+"i"+"l"+"l", "f"+"o"+"n"+"t"+"c"+"o"+"l"+"o"+"r"być zakodowany.

Globalne identyfikatory self, atobi btoanapisz jak Function("return self")().

Functionsamo powinno być []["fill"]["constructor"].

Przecinek ","jest trudny, nie jestem w 100% pewien, jak to działa, ale używa []["concat"]funkcji do utworzenia tablicy. Opublikuję aktualizację, gdy będę mieć czas na wykonanie dalszych testów.


Zakodowałem to za pomocą JScrewIt - podziękowania dla GOTO 0 za stworzenie tak zaawansowanego narzędzia:

  • Otwórz Firefoksa (możesz wybrać dowolną inną przeglądarkę, ale najkrótszy jest tylko kod Firefoksa).
  • Przejdź do JScrewIt : http://jscrew.it
  • Wejście: alert("Hello, World!")
  • Kod wykonywalny: zaznaczony
  • Kompatybilność: tylko ta przeglądarka

Różni się to od mojej odpowiedzi na to pytanie dotyczące obecności przecinka po „Cześć”.

Co ciekawe, składnia ES6

alert`Hello, World!`

zajmuje więcej bajtów do zakodowania (+1500 lub więcej) ze względu na większą złożoność kodowania dwóch odwrotnych znaków zamiast ("i ").


Dobrze działa w Chrome na Androida
Beta Decay

Działa również w Chrome na OS X
C0deH4cker

1
Wykonałeś tu świetną robotę! Pamiętaj, aby sprawdzić ostatnią aktualizację.
GOTO 0

4
@ GOTO0 Czekaj ... jesteś autorem JScrewIt, prawda?
ja i mój kot

1
Jak do cholery wywołujesz z tym funkcje?

29

Pada , 83 68 bajtów

~.O~Ow~q~Owo~O~Oww~Q~qwo~q~O~wQ~q~w~q~q~Q~Ow~Q~Q~wo~q~w.~q~w.~.wO~qw

Uważam, że jest to optymalne dla programu liniowego (tj. Takiego, który nie korzysta z operatorów przepływu sterowania ?i *). To może być ogólnie optymalne, ale nie wiem, jak korzystać z tych dodatkowych operatorów w tak małej ilości kodu (ani jak programowo odkrywać możliwości).

Język ostatnio przeszedł pewne zmiany po tym, jak zacząłem omawiać go z autorem przez e-mail. Jednak w zeszłym tygodniu napisałem implementację referencyjną dla bieżącego stanu specyfikacji języka, więc powyższy kod jest w rzeczywistości uruchamialny.

Metagolf

Początkowo wykorzystałem wyniki mojej referencyjnej implementacji do tego wyzwania i na tej podstawie stworzyłem ręcznie wykonane rozwiązanie. Było to jednak podejście heurystyczne.

Zamiast tego napisałem solver w Mathematica, który tak naprawdę wie o strukturach danych i operatorach Pada, aby znaleźć optymalne rozwiązanie. Średnio rośnie liniowo wraz z długością łańcucha (chociaż niektóre kombinacje znaków są nieco wolniejsze niż inne) i zajęło to około 1,5 godziny Hello, World!.

Jak więc zacząłem pisać solver. Po pierwsze zauważamy, że musimy wziąć pod uwagę tylko 6 operatorów: ~.oOqQ(oraz niezbędne wdla każdego z drukowanych znaków). Używanie stosów lub blokad bitowych nie jest przydatne w kodzie liniowym i nie wierzę w to ?i *można je skutecznie wykorzystać w mniej niż 68 bajtach.

Stan Pady (ignorując stosy i zamki) składa się z 7 przełączników i 8 bitów, ułożonych w następujący sposób:

       /
   /       \
 /   \   /   /
0 1 0 0 1 0 0 0

To możliwe stany. Moim pierwszym krokiem przetwarzania wstępnego było ustawienie ukierunkowanego wykresu stanów, w których każda krawędź odpowiada jednej operacji. Oznacza to, że wykres ma 32768 wierzchołków, z których każdy ma stopień zewnętrzny 6 (jedna krawędź wychodząca dla każdej z 6 rozważanych operacji). Możemy użyć tego wykresu, aby znaleźć najkrótszą ścieżkę między dowolnymi dwoma stanami (sam ten wykres może być bardzo przydatny do gry w golfa Pada).215 = 32768

Teraz dla każdej postaci chcemy osiągnąć stan, w którym wdrukuje tę postać. Ile jest takich stanów? wodczytuje bajt z bitu, na który jest upuszczany (cyklicznie). Istnieje więc 8 możliwych rotacji bitów znaku, które wszystkie mogą wydrukować ten znak. Dla każdego z tych obrotów wustawione są trzy przełączniki (w celu uzyskania spadku we właściwej pozycji). Pozostawia to 4 dowolne przełączniki. Mamy więc możliwe stany dla każdego w naszym kodzie.8 * 24 = 128w

Za ich pomocą możemy rozwiązać kolejny problem z grafem: zbuduj wykres, który ma wierzchołek źródłowy, następnie jedną „warstwę” dla każdego znaku i wierzchołek zlewu. Warstwy składają się ze 128 stanów dla każdego wierzchołka, węzeł źródłowy odpowiada początkowemu stanowi programu (wszystkie przełączniki w lewo i wszystkie bity są zerowe). Węzeł sink nie odnosi się w szczególności do żadnego stanu. Mamy skierowane krawędzie z każdego wierzchołka w jednej warstwie do każdego wierzchołka w następnej warstwie, gdzie ciężar krawędzi to odległość między dwoma stanami na naszym wcześniejszym wykresie. Wagi krawędzi od ostatniej warstwy do zlewu wynoszą wszystkie 0. Oznacza to, że możemy wstępnie obliczyć wszystkie te grubości krawędzi. Jest to najdroższy krok obliczeń i zajął 1,5 godziny Hello, World!.

Po skonfigurowaniu tego wykresu możemy dość szybko znaleźć najkrótszą ścieżkę od źródła do zlewu (zajęło mi 0,05 s na moim komputerze). Do Hello, World!pożądanych stanów należą:

0, 16960, 22052, 13828, 13828, 30389, 12487, 8307, 27299, 23450, 18922, 22778, 18682, 18459

gdzie najmniej znaczące 7 bitów odpowiada przełącznikom, a najbardziej znaczące 8 bitów bitom Pady.

Teraz wracamy do pierwszego wykresu i znajdujemy rzeczywiste krawędzie (tj. Operacje) odpowiadające najkrótszej ścieżce między każdą parą kolejnych stanów i kończymy każdą z nich za pomocą w. Voilà, optymalne rozwiązanie (oparte na powyższych założeniach).

Oto pełna Mathematica, jeśli ktoś chce metagolfować inny ciąg w Pada:

string = "Hello, World!";
width = StringLength@string;
getState[letter_, state_] := (
  {shift, switchState} = IntegerDigits[state - 1, 16, 2];
  bits = RotateRight[
    IntegerDigits[ToCharacterCode[letter][[1]], 2, 8], shift];
  switchState = IntegerDigits[switchState, 2, 4];
  switches = {-1, -1, -1, -1, -1, -1, -1};
  {top, middle, bottom} = IntegerDigits[shift, 2, 3];
  switches[[1]] = top;
  If[top < 1,
   switches[[2]] = middle;
   If[middle < 1,
    switches[[4]] = bottom,
    switches[[5]] = bottom
    ],
   switches[[3]] = middle;
   If[middle < 1,
    switches[[6]] = bottom,
    switches[[7]] = bottom
    ]
   ];
  For[i = 1, i <= 7, ++i,
   If[switches[[i]] < 0,
    switches[[i]] = First@switchState;
    switchState = Rest@switchState
    ]
   ];
  {bits, switches}
  )
encode[state_] := FromDigits[Join @@ state, 2]
decode[id_] := Partition[IntegerDigits[id, 2, 15], 8, 8, 1, {}]
getBitFromSwitches[switches_] := (
  If[switches[[1]] < 1,
   If[switches[[2]] < 1,
    1 + switches[[4]],
    3 + switches[[5]]
    ],
   If[switches[[3]] < 1,
    5 + switches[[6]],
    7 + switches[[7]]
    ]
   ]
  )
toggle[list_, index_] := ReplacePart[list, index -> 1 - list[[index]]]
stateEdges = Flatten@Table[
    {bits, switches} = decode@id;
    bit = getBitFromSwitches@switches;
    {
     Labeled[id \[DirectedEdge] encode@{bits~toggle~bit, switches}, 
      "~"],
     Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~1}, "."],
     If[switches[[1]] < 1,
      {
       Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~2}, 
        "o"],
       Labeled[
        id \[DirectedEdge] encode@{bits, switches~toggle~1~toggle~3}, 
        "q"],
       If[switches[[2]] < 1,
        Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~4}, 
         "O"],
        Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~5}, 
         "O"]
        ],
       If[switches[[3]] < 1,
        Labeled[
         id \[DirectedEdge] 
          encode@{bits, switches~toggle~1~toggle~3~toggle~7}, "Q"],
        Labeled[
         id \[DirectedEdge] 
          encode@{bits, switches~toggle~1~toggle~3~toggle~6}, "Q"]
        ]
       },
      {
       Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~3}, 
        "o"],
       Labeled[
        id \[DirectedEdge] encode@{bits, switches~toggle~1~toggle~2}, 
        "q"],
       If[switches[[3]] < 1,
        Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~6}, 
         "O"],
        Labeled[id \[DirectedEdge] encode@{bits, switches~toggle~7}, 
         "O"]
        ],
       If[switches[[2]] < 1,
        Labeled[
         id \[DirectedEdge] 
          encode@{bits, switches~toggle~1~toggle~2~toggle~5}, "Q"],
        Labeled[
         id \[DirectedEdge] 
          encode@{bits, switches~toggle~1~toggle~2~toggle~4}, "Q"]
        ]
       }
      ]
     }
    ,
    {id, 0, 2^15 - 1}];
stateGraph = 
  Graph[# & @@@ stateEdges, EdgeLabels -> Rule @@@ stateEdges];
uid = 0;
layers = Join[{{{uid++, 0}}}, 
   Table[{uid++, encode@getState[#, i]}, {i, 128}] & /@ 
    Characters@string, {{{uid++, -1}}}];
edges = Flatten[Table[
      from \[DirectedEdge] to
      ,
      {from, #},
      {to, #2}
      ] & @@@ Partition[layers, 2, 1], 2];
Timing[weights = (
     {from, to} = Last /@ List @@ #;
     If[to < 0,
      0,
      GraphDistance[stateGraph, from, to]
      ]
     ) & /@ edges;]
characterGraph = Graph[edges, EdgeWeight -> weights];
Timing[path = 
  Last /@ Most@
    FindShortestPath[characterGraph, {0, 0}, layers[[-1]][[1]]]]
(PropertyValue[{stateGraph, #}, EdgeLabels] & /@ 
      DirectedEdge @@@ 
       Partition[FindShortestPath[stateGraph, ##], 2, 1] <> "w" & @@@ 
   Partition[path, 2, 1]) <> ""

Ciekawy język do metagolfa na =). Zastanawiam się, jaka jest twoja codzienna praca? oO
justhalf

4
@ justhalf Jestem obecnie w stanie zawieszenia między studiami magisterskimi i doktoranckimi (więc zdecydowanie mam za dużo czasu, jeśli to twoja implikacja;)). (Na ogół jest to jednak bardziej dyskusja na czacie :))
Martin Ender

Pada oznacza, gdy w Bahasa Indonezja / malajski. Czy to jest istotne?
XiKuuKy

@XiKuuKy afaik, język nazywa się Pada, ponieważ oznacza po chorwacku „spadanie”.
Martin Ender

I ta odpowiedź na (patrz tutaj ). Prawdopodobnie możesz połączyć 2 odpowiedzi w jednym, aby opisać ten cudowny problem Hello World w ogóle.
Vitaliy Kaurov,
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.