"Привіт Світ!"


419

Отже ... е-е ... це трохи бентежно. Але у нас немає простого слова "Привіт, світ!" виклик ще (незважаючи на 35 варіантів, позначених , і підрахунок). Хоча це не найцікавіший гольф коду в загальних мовах, пошук найкоротшого рішення в певних езоланг може бути серйозною проблемою. Наприклад, наскільки мені відомо, невідомо, чи було знайдено найкоротше можливе рішення Brainfuck.

Крім того, хоча вся Вікіпедія (запис у Вікіпедії була видалена, але є копія на archive.org ), esolangs та Rosetta Code мають списки "Привіт, світ!" програм, жодна з них не зацікавлена ​​у тому, щоб мати найкоротший для кожної мови (є також цей сховище GitHub ). Якщо ми хочемо стати важливим сайтом у спільноті з кодом гольфу, я думаю, що ми повинні спробувати створити кінцевий каталог найкоротших "Привіт, світ!" програми (подібно до того, як наша основна проблема з квотою містить деякі найкоротші відомі лайки на різних мовах). Тож давайте зробимо це!

Правила

  • Кожне подання повинно бути повноцінною програмою.
  • Програма не повинна брати жодного вводу та друкувати Hello, World!в STDOUT (цей точний байтовий потік, включаючи написання великої літери та пунктуації) плюс необов'язковий кінцевий новий рядок, і більше нічого.
  • Програма не повинна нічого писати на STDERR.
  • Якщо хтось хоче зловживати цим, створивши мову, де друкується порожня програма Hello, World!, а потім вітаю, вони просто проклали шлях для дуже нудної відповіді.

    Зауважте, що повинен бути перекладач, щоб подати заявку можна перевірити. Дозволяється (і навіть рекомендується) писати цього перекладача самостійно для раніше не виконаної мови.

  • Подання оцінюються в байтах у відповідному (попередньому) кодуванні, як правило (але не обов'язково) UTF-8. Деякі мови, як-от папки , трохи складні, якщо засумніватися, будь ласка, запитайте про Meta .
  • Мова йде не про пошук на мові з найкоротшим «Hello, World!» програма. Йдеться про пошук найкоротшого "Привіт, світ!" програма на будь-якій мові. Тому я не буду позначати жодну відповідь як "прийняту".
  • Якщо ваша обрана мова є тривіальним варіантом іншої (потенційно більш популярної) мови, на яку вже є відповідь (подумайте, діалекти BASIC або SQL, оболонки Unix або тривіальні похідні Brainfuck типу Alphuck), подумайте про додавання примітки до існуючої відповіді, що те саме або дуже схоже рішення є найкоротшим в іншій мові.

В якості бічної зауваження, будь ласка , не зволікайте нудних (але дійсних) відповідей мовами, де гольфу не так вже й багато - вони все ще корисні для цього питання, оскільки він намагається скласти каталог максимально повний. Однак, зробити в першу чергу upvote відповіді на мовах , в яких автори на насправді повинні були докласти зусиль в гольф коду.

Для натхнення перегляньте колекцію Hello World .

Каталог

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо перерахувати штрафні санкції для перекладача), переконайтесь, що фактичний бал є останнім номером у заголовку:

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

Ви також можете зробити ім'я мови посиланням, яке з’явиться у фрагменті:

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


2
@isaacg Ні, це не так. Я думаю, що було б кілька цікавих мов, де не очевидно, чи можливо тестування на первинність.
Мартін Ендер

6
Якщо та сама програма, як, наприклад "Hello, World!", найкоротша у багатьох різних і не пов'язаних між собою мовах, її слід розміщувати окремо?
aditsu

2
@ mbomb007 Ну, це за замовчуванням приховано, оскільки три блоки коду займають багато місця. Я міг би їх мінімізувати таким чином, щоб вони були по одному рядку, але я б краще тримати код підтримуваним у разі появи помилок.
Мартін Ендер

7
@ETHproductions "На відміну від наших звичних правил, не соромтесь використовувати мову (або мовну версію), навіть якщо вона новіша, ніж ця проблема". Опублікування мови та реалізація перед публікацією, безумовно, було б корисно.
Мартін Ендер

2
@MartinEnder ... Майже. Якщо два рішення BF мають однаковий розмір, той, що має менший лексикографічний порядок, займе меншу кількість байтів в Унар. Звичайно, найменший унарний розчин, перекладений на BF, гарантовано є найменшим.
користувач202729

Відповіді:


442

Застряг, 0 байт

Ну, не можна отримати коротше цього ... Порожня програма виведеться Hello, World!в Stuck .


57
Чорт, я спізнився на 20 хвилин! : P
Каде

33
Noooo c'mon найшвидший пістолет на заході ефект;)
Beta Decay

30
@Zuck Добре так, Стюк був створений для кодового гольфу, як і CJam / GolfScript / Pyth. Hello, World!Справа була тільки те , що я помістив як заповнювач на ранній стадії розвитку. Я не збирався залишати його так довго, просто ніколи не обіймався його видаленням.
Каде

132
Я намагався придумати коротше рішення, але я застряг.
Кіос

51
-1 байт у jQuery. Ви пробували jQuery?
10 відповідей

244

PHP, 13 байт

Hello, World!

Так. Це працює.


261
Як завжди в PHP, вам завжди цікаво, як це може працювати
Fatalize

95
Це, звичайно, працює, тому що його немає <?phpв коді, що змушує його взагалі не інтерпретувати PHP :)
Лінн

58
Це означає, що це лише відповідь на HTML ...
Нельсон,

82
@Nelson ні, це не так. PHP не обов'язково повинен бути розміщений у HTML. І плюс, HTML не друкується до stdout
georgeunix

26
Це найсмішніша відповідь коли-небудь
Олівер Ні

241

Brainfuck, 78 байт

Безпрограшний виграш: Якщо хтось може покращити цей показник, я передаю йому рахунок (+500). @KSabзнайшов рішення на 76 байт!

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

Спробуйте в Інтернеті!

Перші 28 байт --<-<<+[+[<+>--->->->-<<<]>]ініціалізують стрічку із наступним відношенням рецидивування (мод 256):

f n = 171 · (-f n-1 - f n-2 - f n-3 + 1) , при f 0 = 57 , f 1 = 123 , і f 2 = 167 .

Коефіцієнт 171 виникає тому, що 3 -1 ≡ 171 (мод 256) . При перекладі поточного значення одна комірка назад (через <+>---) віднімає 3 кожного разу ефективно множує значення на 171.

При n = 220 значення для перекладу дорівнює нулю, ітерація припиняється. Десять байтів, що передують точці зупинки, такі:

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

Тут містяться всі компоненти, необхідні для Hello, World!вишукування, з невеликими налаштуваннями.

Я також знайшов альтернативне 78-байтне рішення:

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

Спробуйте в Інтернеті!

Я вважаю цей варіант кращим, ніж перший з кількох причин: він використовує менше клітин, що залишилися від дому, він змінює менше клітин у загальній складності та швидше припиняється.


Детальніше

Рецидивні відносини мають напрочуд стислі уявлення у Brainfuck. Загальний макет такий:

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

що представляє:

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

з

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 тощо.

Додатково, <+>може бути змінено, щоб помножити діапазон на постійну, не впливаючи на точку зупинки, і термін може бути доданий перед >{k}зміщенням діапазону на постійну, знову ж таки, не впливаючи на точку зупинки.


Інші приклади

Послідовність Фібоначчі

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

N-гональні номери

Трикутні числа

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

Визначається як f n = 2 · f n-1 - f n-2 + 1 , при f 0 = 0 , f 1 = 1 .

Квадратні числа

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

П’ятикутні числа

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

тощо.


BF Crunch

Я опублікував код, який використовував для пошуку деяких із цих рішень на github . Потрібна .NET 4.0 або новіша версія.

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.

Вихідна інформація подається в три рядки:

  1. Загальна довжина знайденої програми та сегмент ініціалізації.
  2. Шлях пройдений, починаючи з поточного покажчика стрічки. Кожному вузлу відповідає один символ виводу, представлений у вигляді (вказівник, вартість).
  3. Використовуваний сегмент стрічки.

Наприклад, кінцевий результат для 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

Це відповідає повній програмі:

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

Інші записи

Привіт Світ!

Обгортання, 78 байт :

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

або

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

Не обертаючий, 87 байт (раніше 92 байти (мітчі) ):

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

Привіт Світ!

Обертання, 80 байт :

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

Не обертаючий, 81 байт (раніше 92 байти (хіроза) ):

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

Привіт Світ!

Обертання, 74 байти :

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

Незагортання, 84 байти :

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

Версія Esolangs

Привіт, світ! \ N

Обгортання, 76 байт :

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

Для цього використовується одна клітина, що залишилася від дому, і таким чином вважатиметься 77.

Незагортання, 83 байти :

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

Rdebath затверджений . profilebf вихід:

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 (Петро Карпов)

Привіт Світ!

Обтікання, 70 байт (раніше 78 1 ):

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

Не обертаючи, 77 байт (раніше 89?):

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

Автор стверджує, що найкоротший від руки "Здрастуй, світ!" становить 89 байт, але не містить посилань. Я також вимагаю запису про це.

Привіт Світ!

Обертання, 65 байт (раніше 66 байт):

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

Це насправді також закодовано вручну (найкраще, що я міг знайти, коли я розчавив, це 68 байт ). Перша комірка ініціалізується на 259 (3) і зменшується на 7 кожної ітерації, петлю в 37 разів. Наступну комірку зменшують на 6, в результаті чого стає 256 - 6 · 37 = 34 . Решту клітин кожен раз зменшують на 4, додаючи кожну ітерацію по одній клітині, при цьому кожна нова клітина ініалізується до 252 (-4). Результат такий:

[  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 Наведений розчин (79 байт) можна тривільно зменшити на одиницю:

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

39
Це горіхи. Один із вас має подати 82-байтну версію в гольф анархії.
Мартін Ендер

117
Найкраще рішення Java для цього питання - 76 байт. Всього лише 9 байт, щоб довести розробники Java, повинні перейти на Brainfuck.
Рівень річки Св.

9
@LevelRiverSt Малі букви на 2 байти коротші, ніж у Java. Кінцеві часи настали.
Conor O'Brien

13
"Для підтвердження розробників Java слід перейти до Brainfuck ще лише 9 байтів." interface a{static void main(String[]A){System.out.print("No!");}}
снідакайхан


222

ArnoldC , 71 байт

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

Тільки для lols ..


4
Працювали для мене. Спробуйте перевести його на перший рядок, і вас припинили на останньому рядку
JelloDude

72
Мені справді потрібно навчитися користуватися цією мовою.
Buzz

3
Хіба пробіл та нова лінія не займають однакову кількість байтів? І технічно, IT'S SHOWTIMEі TALK TO THE HANDмає бути на першому та останньому рядках.
wizzwizz4

5
@AlCode Але це більш правильно і займає однакову кількість байтів, і сумісність є більше, і це виглядає приємніше, і чому я роблю шум, це виклик коду для гольфу на PPCG, і це несподівано, що ваш код читається і добре Зробив ти добре відповідь на гольф, яку можна було прочитати і поставити +1
wizzwizz4

11
@ wizzwizz4 велике спасибі, я намагаюся бути максимально професійним з ArnoldC мовою майбутнього!
AlCode

203

Насіння , 6016 4234 4203 байт

20 854872453003476740699221564322673731945828554947586276010721089172712854441839676581917455319274850944955030258951339804246125714958815519550291630078076933441706558540342671975808828643360922071900333028778314875248417953197990571991784126564752005357199892690656368640420204822142316716413192024742766282266114842280731756458212469988291309261528542889299297601723286769284159107438930448971911102280330101196758384815655479640836157495863547199726234352265518586460633795171196315255736880028338460236768181141732764911402112878175632130129852788301009582463631290071329795384336617491655825493435803011947670180368458659271192428341035912236946048939139042310380278430049252171822721598175984923434205610723412240162418996808671543770639111617709604242882388664919702606792443015941265168129550718541372361144081848761690730764968771245566074501485020726368378675085908872608679630368472956274468410052703615106090238423979678950131481176272880569100533049143775921798055136871254424261001442543122666701145111965968366507060931708140304772342855064834334129143038575569044150428480231956133612367393837580345180691911525531699573096952433882387811884727975431823620782822755161559988205401134640722220804177812794328129589949692446031008866917615922944976151073653201316255518389496411696741029209242119521978920200314572718584995265523235225587228975886710511855501710470163649632761488899317729943053884132314641377747687975638119132094777769497069556255954031537245957811105217875011509899497752696062748928963281605780942517262774976217663461063680912331030221981433051827519906741285738915397005702326447635845195923640649166530310494885569783989508000344280715868581532826832242144647203531393142251025361866506821695860883605004105862208004440476654027574832078603305884731766236740069411566854496824754558761536201352147934963241039597221404341132342297870517293237489233057335406510464277610336142382379135365550299895416613763920950687921780736585299310706573253951966294045814905727514141733220565108490291792987304210662448111170752411153136765318541264632854767660676223663544921028492602135525959428999005153729028491208277493747933069008199074925710651071766675870081314909460661981433426167330215548196538791617762566403934129026219366764038390123622134753742930729751695349588862441999672547791630729398908283091638866715502470152431589429837867944760012419885615525232399584379209285060418518373512154801760060312646951597932345591416241634668119867158079946680321131213357200382937049485606706114467095019612014749723443159443363662563254359712162432143334612180576945072905749883870150120687696027984317320305291407322779803583395375616762530641605634303022155218169343410634115050596030685041633824154135240376022159918501703555881290333205131375705406831260759974112248490451605422031345264183102048614606636275942039438138959188478277971377232005036301145411215067576576667743288951344423152531417111852584846747428443123174595987315325304540564683047858415059703724263652136185848573853965992798725654430360647040362341567082462847275277303225817689141675391972818943419663764371222973269129542760661385278009266471167618553065823580448848795731295589715602705860758954890415040763604082216728159486423396295188510311881004469017351709060492844398219491990895826924575575549615118821417543037296628825303328056839433114519945243963946989899508355224823109677424196639930153649890175062456649384605721510239142861693109687536600667811037619175927995599388547421689316110236566026931360164495251160997857372500940728057700473763884480342708897319990346726967220426504612260565552531158509215849649565188655100774748485416791517853427613458459889062942881409801879085054494129489535044719193283409051007851153504224002807392992520076910314763705776345053922387355156981872691537772657428096384535960466923475731297217863371650154415835785630016335858514130863258775100537612371430357576913148500310344278511588325852376442503898849856566716198848377379400158332792027967216204970114516984638014129252882482309132898416484525230488700253065644547798869056136044415413099076332059572505138116227535024546891015836838323022822272664771489129085797354578016574544759934333471793

Отримана програма Befunge-98 (заснована на цьому ) є

"9!dlroW ,olleH"ck,@

35
Оце Так! Як ти це знайшов?
ETHproductions

31
Що . Це божевільно.
Conor O'Brien

47
ЯК ВИ ЗДОРОВИЛИ ЦЕ?
Зруйнований лимон

39
Ви зробили інженерний твістер Mersenne? І чи має це наслідки безпека?
прим

68
Я дам вам ще +500 для детального (теоретичного) пояснення.
примо

155

Морнінгтон Півмісяць , 3614 3568 байт

Завдяки NieDzejkob за збереження 46 байт, використовуючи короткі назви рядків.

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

Спробуйте в Інтернеті!

Це, звичайно, неоптимально, але це половина розміру розчину на езоланг.

Hello, World будується за допомогою нарізки наступних назв станцій та об'єднання результатів:

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

Нарешті, я обчислюю код символу !як (2<<4)+1 == 33. Усі ці частини з'єднані в Паддінгтоні і нарешті надруковані в Морнінгтон Півмісяць.

Примітка . Мова не вказує, чи можна їхати на ту саму станцію двічі поспіль, але перекладач це дозволяє, тому я скористався нею.


44
Це абсолютно геніально : D
бета-розпад

32
Я люблю цю мову. Вибачте, поки я програмую системи на цій мові.
кіт

4
Де на Землі ця мова була все життя?
ScottMcGready

30
@ScottMcВже між Камден таун та Естоном.
Мартін Ендер

3
Mornington Crescent зараз у TIO. tio.run/#mornington-crescent
Денніс

123

зло , 70 байт

aeeeaeeewueuueweeueeuewwaaaweaaewaeaawueweeeaeeewaaawueeueweeaweeeueuw

Він використовує наступні чотири команди:

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
Це зло ...
Девід Грінберг

61
Тим більше, що ваш аватар - Чорна Шапочка.
TheDoctor

5
Ви можете пояснити мені процес переплетення.
Кішан Кумар

4
@KishanKumar так
grc

30
Якщо ви читаєте цю програму вголос, це звучить як бас дубстепу.
Джо З.

112

мозковий ебать, 72 байти

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

Спробуйте в Інтернеті!

І оригінальне 76 -байтне розгортаюче рішення:

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

Спробуйте в Інтернеті!

Інші найкоротші відомі (наскільки мені відомо) рішення, які я знайшов

'Привіт Світ!' 77 байт:

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

Спробуйте в Інтернеті!

'Привіт Світ!' 70 байт:

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

Спробуйте в Інтернеті!


Вони були знайдені за допомогою програми c ++, про яку я писав тут: https://github.com/ksabry/bfbrute

Примітка. Спочатку я хотів очистити цей код перед тим, як опублікувати його, щоб зробити його справді дещо читабельним та зручним для користування, але оскільки я його не обійшов понад рік, я вважаю, що просто опублікую його як є. Він широко використовує шаблони та компілює постійні часу для будь-яких потенційних оптимізацій, і в ньому є маса коментованих кодів з мого тестування, але корисних коментарів не так шкода, але це трохи жахливо.

Нічого страшного розумного в коді немає, він є грубим форсером в його суті, однак він досить оптимізований. Основна оптимізація полягає в тому, що спочатку вона проходить через всі програми без циклів (немає [або ]) до заданої довжини (16 зараз) і кешує масив усіх змін, які він внесе в масив даних. Він буде зберігати лише одну програму для унікального масиву змін, наприклад, лише одну >+<<->і <->>+<зберігатиметься. Потім він повторює всі можливі програми, які складаються з будь-якої програми в цьому кеші з будь-якою комбінацією циклів між ними. Після виконання кожної програми він виконує просте жадне полювання та клювання персонажів та додає це до кінця програми.

Запустивши це через простір усіх програм, я помітив, що майже всі найкоротші програми (до довжини ~ 19) мали форму *[*[*]*]. Обмеження пошуку програм такої форми значно пришвидшило пошук. Поточний власник рекорду був знайдений на довжині 27. Цей фактично обчислювався довжиною 74, але я помітив певну послідовність, .>.>.>.яка пощастило мати 0 в комірці даних справа, що дозволяє спростити його [.>]<зведення до 72.

Я дозволяю йому працювати досить довго і завершив пошук з поточними параметрами до довжини 29, я підозрюю, що буде важко перемогти поточний, просто піднявшись вище, я думаю, що найбільш перспективним підходом, мабуть, буде збільшення простору пошуку в якийсь розумний спосіб.


32
Як на Землі ви це виявили?
Денніс

2
@Dennis Я, мабуть, опублікую пояснення свого процесу, коли отримаю можливість, разом із вихідним кодом, який я використав (як тільки я прибираю його)
KSab

32
Гей, ти побив Яву.
Піка

18
Це якесь - то пристрій, воно навіть не вимагає обгорткового клітку його
прима


84

Піт, 90 коделів

введіть тут опис зображення

Це зображення розміром 30 на 3. Як варіант, у розмірі 10 коделів:

введіть тут опис зображення

Використовує 3-високий макет, так що мені потрібно вказувати лише один раз. Якщо це все-таки гольф, я, мабуть, можу поголитися не більше іншого стовпця, оскільки там є пуш-поп-но-оп.

Редагувати: 84 кодового рішення @ primo .


6
Намагаєтесь взяти власну винагороду? Я думав більше про вас Sp3000;)
Бета-розпад

7
Так, лише те, що я встановив щедрість, не означає, що я не можу приєднатися до веселощів: P
Sp3000

9
"Пуш-поп" для мене не є опором. Це ось це .
mbomb007

1
Що за чорт ця "мова"? Я це люблю!
Золтан Шмідт

8
"push-pop no-op" зараз моя улюблена фраза
BobTheAwesome

82

Стог сіна , 17 байт

Стог сіна - це 2D мова програмування, яка виконується, поки не знайде голку в стозі сіна |, і все це виконує операції на основі стека. Усі програми починаються з верхнього лівого кута і можуть використовувати символи спрямованості ><^vдля переміщення по програмі. Напрямок успадковується, тому вам не потрібно продовжувати користуватися, >щоб рухатись направо, напрямок змінюватиметься лише тоді, коли він потрапить на інший напрямковий характер.

За замовчуванням перекладач читає вгорі зліва направо, тому ми можемо просто поставити "Привіт, світ!" на пачку, використовуйте oдля її друку, після чого поставте голку, щоб закінчити виконання.

"Hello, World!"o|

Бонус: Більш захоплююча версія:

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

Щось із цікавості, що станеться, якщо включити одного з символів у рядок?
Випадково832

@ Random832 У рядку спрямовані символи розглядаються як звичайні символи, тобто ви можете включати їх у рядок.
Каде

38
> + Про
bjb568

3
Мені б хотілося, щоб я був наполовину розумнішим за всіх тут, але в "документації" (читайте: повідомлення на форумі якогось хлопця) зазначено, що oвиходить як число. Чи не повинно бути cв кінці? Чи є десь відповідна документація? Це супер цікаво!
Адвокат диявола

2
@Scott Super пізно відповісти на це, що повідомлення на форумі, мабуть, я! oвиводить елемент верхнього стека таким, яким він є, тобто якщо число є, воно друкує це. cпросто кинув би це на чар. Отже, якщо у вас є рядок або значок у верхній частині стека o, як ви хочете :) Врешті ці документи будуть оновлені ..
Kade

70

Допоможіть, WarDoq! , 1 байт

H

Не тільки допомагає, WarDoq! мати вбудований для найбільш поширених написань фрази, це навіть задовольняє наше звичайне визначення мови програмування.

Спробуйте це в офіційному онлайн-перекладачі (код вводиться Input ).


7
Отже, HQ9 ++, по суті, так? ;-)
AdmBorkBork

6
@TimmyD Ні, не HQ9 ++ .
Денніс

30
Ой за плач вголос. Чи є щось, що не є езолангом на даний момент? :)
AdmBorkBork

97
"Space: Begin a comment. The next non-space character ends the comment and is interpreted as usual."Тож ви можете мати лише коментарі з пробілів ??? Я думаю, що навіть найкорисніша мова у світі повинна мати одну невикористовувану функцію +1,
Level River St

29
@steveverrill Можливо, якщо вкладки також розглядаються як коментарі, тоді у нас можуть бути коментарі, написані як програми Whitespace
Optimizer

66

MarioLANG , 259 249 242 240 235 байт

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

Це було перевірено в реалізації Ruby .

Після обдумування "Привіт, світ!" в MarioLANG я трохи заглянув у гольф. Наведене вище є найкоротшим, що я знайшов поки що.

Як і раніше, я почав з рішення Brainfuck, яке встановлює чотири комірки до найближчого кратного 10 символів He,та пробілу та перетворює його в MarioLANG . Потім можна трохи скоротити код, скориставшись допоміжним підлогою в циклі, який майже вдвічі зменшує ширину петлі. Зауважте, що нижня частина виконується лише в один раз менше верхньої, тому ви більше не отримуєте точних кратних чисел початкового лічильника у всіх 4 клітинках.

Нарешті, я хотів використати витрачений простір перед петлею, тому я додав купу ліфтів, щоб використати там вертикальний простір. І тоді я зрозумів, що можу скласти код після циклу (див. Попередню редакцію) під циклом, щоб скористатися ще деяким вертикальним пробілом, що дозволило зберегти ще п’ять байтів.

Це, мабуть, ще далеко не ідеально, але, на мою думку, це гідне вдосконалення щодо наївного рішення.

Метагольф

Час для автоматизації ...

Я почав налаштовувати вирішувач в Mathematica, щоб знайти оптимальне рішення. В даний час передбачається, що структура коду є фіксованою: лічильник встановлений на 12, 4 комірки для друку, з фіксованим призначенням He,<space>і таким же порядком цих комірок. Вона залежить від кількості +s в циклі, а також необхідних виправлень після цього:

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
 ]

Виявляється, що для початкового лічильника 12 моїх рішення вже виготовлено вручну. Однак використання 11 замість цього економить два байти. Я спробував усі лічильники від 6 до 20 (включно) із такими результатами:

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}}

Примітка. Цей вирішувач передбачає, що лінійний код після циклу знаходиться у верхньому рядку, а вищевказаний код - це рішення, що складене. Можливо, буде коротше загальне рішення, зробивши так, щоб вирішувач дізнався про складку, тому що тепер я отримую ще 3 +с у першій частині безкоштовно, а наступні 4 інструкції коштують лише 1 байт замість 2.


2
@justhalf Ви повинні побачити мою відповідь Пада. : P
Мартін Ендер

Мартін Я люблю цю відповідь. Чи можете ви розглянути можливість публікації про це на нашому офіційному форумі ? Ми використовуємо те саме, що і редактор stackexchange. Наша редакція хотіла б додати її до Staff Picks .
Віталій Кауров

61

Темний , 106 байт

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

Я просто дозволю кілька цитат з мовної специфікації говорити про блиск цього езолангу:

Темний - це мова, заснована на маніпулюванні цілими світами та вимірами для досягнення цілей та побудови найкращої можливої ​​покрученої реальності.

Щоразу, коли виникає синтаксична помилка, розумність програми зменшується на 1. [...] Якщо розумність програми досягає нуля, інтерпретатор стає божевільним.

Корупція перетворює один біт у змінну, коли вона виникає.

Коли господар помирає, всі змінні сервіси, приєднані до цього господаря, також гинуть. Це корисно для групування та масового вбивства змінних.

Примушує змінну вбивати себе, звільняючи її (хоча пам’ятайте, що вона залишить занепад).

Встановлює змінну на випадкове значення. Використовує глобальний генератор хаосу.

Якщо сталкер не ініціалізований, будь-які спроби виконати IO призведуть до пригнічення повідомлень про помилки, які потрібно записати на консоль.


37
Ця мова настільки металева.
Олексій А.

6
Якби нам довелося перераховувати мови програмування в порядку зла, Темний би змістив зло.
LukStorms

35
в пекло привіт
Халед.К

супер зло, ви навіть можете зібрати армію пішохідних
готосів

59

Шеф-кухар , 465 байт

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.

Тестували з перекладачем Ruby. Робить алфавітний суп.

Я намагався бути максимально сумісним з оригінальною специфікацією, так як міг, тому, хоча перекладач, який я використовував, дозволяє вам скинути thes в Pour contentsінструкції, я цього не робив.

Чаша для перемішування є досить дорогою, тому може бути кращий підхід. Я спробував використовувати базове перетворення для кодування повідомлення, але, на жаль, специфікація не уточнює, Divideвикористовує ціле чи поділ з плаваючою точкою, а інтерпретатор, який у мене є, використовує останнє. Немає також оператора модуля, який також не допомагає.


19
Якщо хтось міг би гольфу в шеф-кухаря, це Sp.
Алекс А.

11
Тепер спробуйте рецепти гольфу в реальному житті. : D
mbomb007

2
Лол, це не тільки не добре їсти, але також використовує нестандартні вимірювальні одиниці. XD
thepiercingarrow

59

Домашня пружина , 58 байт

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

Простий простір є значним.

Дозвольте розповісти вам історію. Колись тут була електростанція, яка живила сусідній виловлювач лосося. Вилупитель лосося вилупив молодого безпритульного лосося, який вирушив у дорогу нагору, щоб знайти джерело. Вона знайшла таку весну з поетичною назвою "Здрастуй, світ!", Де вона дозріла та породила нового молодого лосося. Обидві риби зараз пливли вниз за течією в пошуках широкого океану. Але трохи недалеко від гирла річки, в річці була сітка - зріла риба була спіймана, і лише молода встигла проскочити через океан та решту Всесвіту. Тим часом, інкубатор вилупив більше лосося, який також подорожував вгору за течією, породив і так далі і так далі.

Однак величезна кількість талого снігу рухалася вниз по іншому краю річки. І тільки після нашого першого молодого лосося із джерел "Привіт, світ!" досягли океану, снігопади потрапили у Всесвіт і ... е ... знищили його. І вони жили щасливо колись після цього ... або, мабуть, цього не зробили.

Це насправді була семантика вищезгаданої програми. Домашня пружина дивна.


15
Це ... дивно ...
kirbyfan64sos

10
Я знайшов новий улюблений есмінчик Всесвіту, що працює на лососі ... е ... я маю на увазі "Привіт, світ!" програма. +1
ETHproductions

7
Кожного разу, коли я повертаюся до цього, я добре сміюся. Дякуємо, що створили, можливо, найвеселіший привіт, світ! програма всіх часів.
ETHproductions

2
Це моя нова улюблена мова.
Mega Man


53

Піт, 84 коделі

Піет Привіт Світ

28x3, тут показано шириною 10 коделів.

Створено з PietDev , протестовано на npiet . Макет програми такий:

Макет пієтів

Жовта заливка позначає коделі, де шлях перекривається, а оранжевий - це коделі, які повинні бути одного кольору для цілей контрольного потоку.

Щоб допомогти у створенні цього, я написав рудиментарний інтерпретатор для мови на основі стека з командами, схожими на piet, які я назвав "pasm" ( джерело ). Вихід цього інтерпретатора (з цього вводу ) такий:

    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 []

Не використовуються команди вказівника, комутатора або рулону. Не витрачаються також жодні коделі; насправді два використовуються повторно.


З повагою, ви отримали мою нагороду :)
LegionMammal978

@ LegionMammal978 Спасибі, над цим було весело працювати. І з Різдвом Христовим :)
примі

7
Це те, що голлівуд повинен показувати на "хакерських" екранах.
Губерт Ґжесков'як

50

Пробіл , 192 150 146 байт

Білий простір потребує лише пробілів, вкладок та каналів ліній, а інші символи ігноруються.
Що може бути складно відобразити тут.
Тож у коді нижче пробіли та вкладки були замінені.
І ';' для наочності було поставлено перед лінійками подачі.
Щоб запустити код, спочатку замініть. та> пробілами та вкладками.

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

Шестнадцятковий код

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

Код складання білого простору:

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

Зауваження:

Мені довелося написати програму просто для того, щоб порахувати, що додавання 107 дає оптимальний гольф для вироку. Оскільки байт, який ціле число приймає в коді, змінюється. : 4 + int (abs (log2 ($ n)))
Код все одно буде працювати без мітки "e:" та виходу з частини whitespace.kauaveel.ee . Але це може зробити код пробілу недійсним для інших компіляторів пробілів. Тож ці байти не розігралися з рішення.

Це слід зазначити

Як в коментарях зазначив Кевін Кройсейсен, дозволяючи "помилково вийти", відповідно до мета, пробіли можуть бути кодовані ще до 126 символів.

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

Збірка:

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

Я знаю, що минуло деякий час, і я бачу, що ви згадуєте, що він працює без позначки виходу на більшості компіляторів, але ви можете знизити його до 129 байт , вийшовши з помилкою, використовуючи SSN(значення помилки) замість SSSN(натисніть 0 ), що дозволено відповідно до мета . Спробуйте в Інтернеті (з додаванням виділення та пояснення) або спробуйте в режимі он-лайн .
Кевін Кройсейсен

@KevinCruijssen Я нарешті перевірив вашу версію. Це в основному стара версія з збіркою dup jumpz eі e: exitвилученою. Але принаймні на whitespace.kauaveel.ee він продовжує циклічно, поки браузер не скаржиться. Я вважаю за краще не змінювати свою версію на цю, незважаючи на нижчий гольф і мета, що дозволяють "вийти помилково". Але ви можете безкоштовно надіслати свою версію як нову відповідь.
LukStorms

Ні, я не публікую окрему відповідь. Це в основному те саме, що і ваше, лише крихітний коротше через вихід помилково. Я також щойно зрозумів, що можу знизити його до 126 замість 129, видаливши SSNна початку, і в цьому випадку він помиляється з програмою Can't do Infix Plus, коли у стеку є лише один елемент (107). ( Спробуйте в Інтернеті. ) Я просто залишу тут свій коментар, коли хтось має таку саму пропозицію. І я вже поставив +1 у вашій відповіді приблизно рік тому, я думаю. ;)
Кевін Круїссен

1
@KevinCruijssen У цьому випадку ваше рішення вже було відмічено у відповіді. Білий простір - це одна з найбільш малоймовірних мов для гри в гольф. Але заради економії байтів ваші висновки варто згадати.
LukStorms

49

Ява, 79

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

Більш ранні версії Java можуть дозволяти вам використовувати статичний блок (51 байт), але на даний момент я не знаю способу обійти mainметод.


7
Використовуйте enumзамість class.
Томас Едінг

6
@ThomasEding На якому компіляторі це працює? Я спробував цю пораду на кількох, і ніколи не зміг зберегти байти за допомогою неї.
Геобіт

4
@Luminous Ah, це могло б працювати 1,5. Я не збираюся його встановлювати, щоб дізнатись, але дотримуюся чогось випущеного за останні 10 років. Якщо я більше ніколи не побачу Java 5, це буде приємне життя :)
Geobits

2
@TheDoctor З того, що я бачив, тут Обробка зазвичай розглядається як окрема мова. Ви повинні опублікувати це як відповідь або хоча б попросити роз'яснення в ОП.
Геобіт

5
Користувач OptiFine запропонував зберегти 3 байти за допомогою специфікатора interfaceта канавки public. Я відхилив наступну політику редагування, але оскільки вони не можуть коментувати, я подумав, що повідомляю вас, щоб ви могли використовувати її, якщо хочете.
Мартін Ендер

48

CSS, 30 байт

:after{content:"Hello, World!"

Таблиці стилів каскадного стилю (CSS) не є типовою мовою програмування, але вона може робити фіксований вихід досить добре. Це робиться шляхом створення псевдоелемента після кожного елемента зі змістом Hello, World!. Отже, <html>вибрано лише один елемент ( ), це передбачає, що ми використовуємо найосновніший HTML-документ, тобто

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

Це працює в більшості основних браузерів, за винятком Firefox, який застосовує селектор до елементів <html>та <body>елементів. Це також, чому фрагменти стека не працюють, тому що завжди є елемент тіла, який також стає стильним. Нижче наведена трохи змінена версія для тестування.

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


3
Ви також можете використовувати * *для вибору body.
jimmy23013

18
@ jimmy23013 Це звучить надзвичайно неефективно. Спасибі
NinjaBearMonkey

1
З будь-яких причин * :afterтакож, здавалося, працює.
jimmy23013

12
Я запитую себе, який з букв у CSS є абревіатурою для "мови".
Зайбіс

10
@zaibis той самий лист для PHP, мабуть :)
fcalderan

48

HTML, 13 байт

Hello, World!

Текст автоматично вставляється в <body>і відображається.


159
Ого. Ось такі справді хардкорні навички кодування
BlueWizard

46
HTML - це не мова програмування, а мова розмітки (тому він закінчується ML).
CoDEmanX

31
Але HTML не надруковано в STDOUT.
Харшил Шарма

25
-1 HTML Не відповідає вимогам до дійсної мови
Downgoat

123
-1 недостатньо jQuery
Валентин Лоренц

45

машинний код x86_64 для Linux, 32 байти

Коли Linux запускає новий процес, всі регістри (крім RSP) дорівнюють нулю, тому ми можемо отримати RAX = 1, змінивши лише низький байт. Система x86-64 System V ABI не гарантує цього, але Linux це насправді робить. Цей код працює лише як _startу статичному виконуваному файлі.

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

Інструкція про дзвінки натискає на стек наступну адресу, яка містить привіт світовий рядок. Ми вставляємо адресу рядка в rsi.

Тоді інші аргументи налаштовані для syscallTo sys_write, який друкує рядок.

Програма закінчується з syscallдо sys_exit. sys_writeповертає кількість записаних байтів, тому верхні байти RAX дорівнюють нулю після першого syscall(якщо тільки він не повернув помилку), тому mov al, 60нам надається RAX = __NR_exitвсього в 2 байти.

Ви можете зробити цю програму segfault, закривши її stdout ( ./a.out >&-), тому sys_write()повернеться -EBADF, друга syscallповернеться -ENOSYS, і тоді виконання відпаде від кінця. Але нам не потрібно write()граціозно обробляти помилки.


Зокрема, це працює лише в Linux , де __NR_writeє 1. Це не стандартно для різних систем x86-64 Unix. Ви також залежите від поведінки Linux при нулюванні всіх регістрів, крім RSP, до вступу в новий процес (так що це працює лише в тому випадку, якщо ви будуєте його як статичний виконуваний файл, інакше динамічний лінкер залишить сміття у верхніх байтах raxі ви ' отримаю -ENOSYS). Система x86-64 System V ABI говорить, що регістри можуть містити довільні значення сміття при вході до _start, ядро ​​Linux вибирає нуль їх, щоб уникнути витоку інформації.
Пітер Кордес

Ви можете зберегти байт з mov al, 1/ mov edi, eax(2 байти), замість того, щоб потрібен префікс REX для DIL, тому що__NR_write == STDOUT_FILENO = 1
Пітер Кордес,

Це працює лише в статичному виконуваному файлі Linux, тому гарантовано, що адреса вашої рядка міститиме 2G віртуального адресного простору (модель пам’яті за замовчуванням для не-PIE-файлів ставить усі символи, де вони можуть використовуватися як нульові або знакові- розширені 32-бітні прямі). Таким чином, ви можете використовувати 5-байтну mov esi, msg(NASM) ака mov esi, OFFSET msg(GAS .intel_syntax) . Покладіть рядок після останньої syscall. call/popна 1 байт коротший, ніж LEA, що стосується 64-розрядних RIP, але найкращий Mov.
Пітер Кордес

Джерело NASM для 30- байтної
Пітер Кордес,

42

Шестикутник , 37 32 байт

Зверніть увагу: я даю суму в розмірі 500 повторень першому, хто знайде дійсне рішення в шестикутнику довжиною бічної сторони 3 або, очевидно, оптимальним рішенням бічної довжини 4. Якщо ви не можете знайти таке рішення, але вдається перемогти мою оцінку в шестикутник довжиною в бік (отримавши більше відсутніх операцій в кінці програми, які можуть бути опущені з вихідного коду), я також готовий видати меншу суму за це .

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

Спробуйте в Інтернеті!

Я з гордістю представляю свою другу 2D мову програмування та (наскільки мені відомо) першу в історії 2D мову на шестикутній сітці.

Вихідний код виглядає не дуже 2D, чи не так? Ну, пробіл у шестикутнику необов’язковий. По-перше, вихідний код додається до наступного по центру шестикутним числом без знаків ( .). Наступне таке число - 37, тому в кінці ми вставляємо п’ять відсутніх. Потім вихідний код переставляється в звичайний шестикутник:

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

Це також можна виконати. Спробуйте в Інтернеті!

У шестикутника є дуже гарна функція, включаючи 6 різних вказівників на інструкції та макет пам’яті, що є лінійним графіком шестикутної сітки, але цей код використовує лише один IP та один край пам’яті, тому давайте не турбуємось про це наразі.

Ось огляд відповідних команд:

  • Листи просто встановлюють поточну межу пам'яті на їх значення ASCII
  • ; друкує поточне значення, модуль 256, як байт STDOUT.
  • / це дзеркало, яке поводиться так, як ви очікували (змушує IP повороту на 120 градусів).
  • Цифри працюють так само, як і в Лабіринті : вони множать поточну комірку на 10, а потім додають себе.
  • @ припиняє програму.

Тепер остаточна уловка полягає в тому, що джерело обмотується навколо всіх 3 пар ребер. Крім того, якщо IP залишає сітку через один з шести кутів, до цього можна перейти два можливі рядки. Який із них обраний, залежить від того, чи є поточне значення позитивним чи непозитивним. У наведеній нижче примітці показано, де IP повторно вводиться кожного разу, коли він виходить з сітки:

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

Отже, якщо ми видалимо всі зміни напрямку, ця програма зводиться до наступного лінійного коду:

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

Що з Q2, P0і P1? Букви друкуються легко, тому що ми можемо просто встановити край відповідному значенню. Для коми, пробілу та знака оклику це не працює. Ми також не можемо просто встановити їх значення з 44, 32, 33відповідно, тому що край пам'яті відмінна від нуля , щоб почати с, і з - за семантики окремих цифр , які будуть сіяти всякого роду спустошення. Якщо ми хочемо , щоб зробити це, ми повинні були б скинути значення країв до нуля з чим - то , як *, +, -, &або ^першим. Однак, оскільки значення приймається за модулем 256 перед друком, нам не потрібно встановлювати значення точно на 44, 32 або 33. Наприклад, Q2буде встановлено крайове значення 81*10 + 2 = 812, яке є44коли приймається по модулю 256. Таким чином ми можемо зберегти байт на кожному з цих трьох символів. (На жаль, це ніколи не потрапити туди можна з однією цифрою від значення осередки вже. Цікаво, де це робота є oв World, тому що це може також бути отриманий з W9.)

Ви можете використовувати цей скрипт CJam для пошуку всіх буквено -цифрових комбінацій, які призводять до заданого символу.

Я не впевнений, чи оптимально це. Я сумніваюся, що це можливо зробити в шестикутнику довжиною бічної сторони 3 (де у вас є лише 19 символів), але це може бути можливим вирішити в шестикутнику зі стороною 4 довжиною менше 32 команд, наприклад що в кінці сітки є більше відсутніх.


1
Чорт, ти побив мене до цього. Я сам працюю над шестикутною мовою, подібною до кардинальної.
ML

Як ви знайшли це рішення? Від руки чи грубої сили? У всякому разі, +1 :)
Аднан

1
Q2, P0І P1дуже розумний. Я не знав частини модуля 256.
Аднан

1
@Adnan Людина, яка запропонувала частину mod-256 на GitHub, насправді зробила це разом із прикладом, що потім стрічкові канали можуть бути надруковані як M8;(або g4;), якими я користувався пару разів. Мені просто ніколи не спадало на думку переглядати цю відповідь після того, як я внесла цю зміну.
Мартін Ендер

2
Примітка: деякий час тому було скорочено до 31 . H;e;P;2Q/d;l;r/l;$@;o];o;W;03&;
Мітч Шварц

38

Malbolge, 112 байт

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

Я буду бачити, чи є коротший. Отримав кращий комп’ютер з минулого разу, тому я можу генерувати трохи швидше.

Для шоу ось "Здрастуйте, світ!" без коми.

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

37

Фур’є , 15 байт

ВЕЛИЧІ ЗМІНИ Фур’є!

`Hello, World!`

Спробуйте це на FourIDE!

Так, дні друку ASCII-коду кожного символу минули назавжди: тепер Фур'є начебто підтримує рядки. Якщо ви вкладете рядок у зворотні посилання, ця рядок буде виведена.

Зауважте, що ви не можете зробити нічого, крім виведення цієї рядка: ви не можете зберігати її в змінній, вона не зберігається в акумуляторі і немає інструментів маніпуляції з рядками.


Тут ви можете знайти крах поїзда, який був старим Фур'є. ;)

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

Спробуйте в Інтернеті!

Зараз, хтось із вас, мабуть, раніше познайомився з Фур’є і, можливо, досить добре знайомий з мовою. Вся мова заснована на акумуляторі: глобальній змінній, яку використовують майже всі оператори.

Найважливіша частина коду - aоператор. Це приймає числове значення акумулятора і перетворює його в символ, використовуючи код Python chr(accumulator). Потім він друкується до STDOUT.

На жаль, у мене ще не було можливості використовувати Fourier ( натискання, натискання , підморгування ), головним чином через його відсутність рядків та рядкових операторів. Незважаючи на це, він все ще є корисним для багатьох інших проблем (див. Розділи з прикладами його сторінки EsoLangs).

Зауважте, що це коротше мого вступу до списку Esolangs, оскільки я насправді не думав, що більше можу гольфу. І тоді, коли писав виклик з гольфу на Фур'є, я зрозумів, що можу піти трохи коротше.

Примітка

Якщо вам було цікаво про синтаксис змінної, Geobits написав програму, яка використовує змінні та має однакову довжину:

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

Спробуйте в Інтернеті!


Що можна використовувати? Це як придатне для використання?
CalculatorFeline

35

C-- , 155 байт

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);}

На жаль, єдиний відомий компілятор C-- Quick C-- більше не підтримується. Це біль в шиї , щоб побудувати, але це можливо ...


8
Дійсно захоплююча мова - я ніколи не чув про неї раніше, і це, звичайно, амбітний проект, який вони (робили / виконують) роблять. Але з точки зору коду гольфу, я не думаю, що він буде суперником. Я маю на увазі ... бо, ця річ програє Яві ...
AdmBorkBork,

11
@TimmyD Це дійсно асемблер. Є причина, що вона програє Java ... :)
kirbyfan64sos

Я маю для вас добрі новини Хоча сам проект C-- здається досить мертвим, один варіант є досить живим. Компілятор Глазго Хаскелл (GHC) використовує C-- як останню стадію перед складанням або LLVM, і ця версія все ще активно підтримується. Встановити його (разом з рештою GHC) не повинно.
dfeuer

@dfeuer Дійсно, я раніше намагався використовувати їхній сервер Cmm, але у мене виникли деякі дивні проблеми, і я ніколи не заглядав у нього набагато далі ¯ \\ _ (ツ) _ / ¯
kirbyfan64sos

Можливо, ви можете отримати допомогу в списках розсилки Haskell. Спробуйте glasgow-haskell-users@haskell.org або, можливо, haskell-cafe@haskell.org.
dfeuer

33

C, 30 байт

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

Досить ванільний, але я не можу придумати загальнозміцнюючий спосіб зробити це коротше (хіба, може, якийсь сирий трюк з приводу може спрацювати?). Все-таки б'є більшість езоланг!


3
Окремої відповіді не варто, але відповіді на відповідність стандартам C89 та C99 повністю ISO - 39 main(){puts("Hello, World!");return 0;}та 53 #include <stdio.h> int main(){puts("Hello, World!");}байти відповідно. Трохи більше, якщо ви вважаєте, що потрібно головне (недійсне).
Випадково832

20
@ Random832: для першої на main(){return!puts("Hello, World!");}два байти коротше.
Лінн

15
Програма hна 29 байт коротша. Примітка: вам доведеться скласти це, коли -Dh='main(){puts("Hello, World!");}'я наполовину тролінгую, наполовину забавляю себе зловживанням компілятором.
matega

19
@matega Це явно обман. Щоб це не було обманом, вам доведеться змусити файл містити лише __FILE__(8 байт) і назвати файл main(){puts("Hello, World!");}. Тоді це зовсім не обман;)
C0deH4cker

Власне, за правилами 2017 року це було б відповідно 34 та 38 байт.
CalculatorFeline

32

Нечитабельна , 843 755 732 666 645 629 577 байт

"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Програми, які не можна прочитати, повинні відображатися шрифтом змінної ширини, тому вони шанують назву мови. Я трохи розчарований, що мої більш досконалі підходи виявилися набагато довшими. Петлі шалено дорогі в Нечитабельному ...

Спробуйте в Інтернеті!

Як це працює

Нечитабельний має лише десять функцій; шість із них використовуються в цьому коді:

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

Після використання моєї однозначної нотації та додавання пробілів та коментарів, наведений вище код виглядає наступним чином. Багаторядкові виписки виконуються знизу вгору.

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

Я створив фактичний вихідний код, запустивши некомментовану версію вищевказаного псевдокоду через цю програму CJam .


3
Про що ти говориш? Це досить читабельно!
Оптимізатор

19
Виправлено @Optimizer.
Денніс

4
Ще читається! (звичайно, я кажу правду. Чому ви мені не повірите?)
Оптимізатор

5
Відчуваєш, що ця мова виграє від кращого кодування Хаффмана - як за розміром, так і за нечитабельністю.
прима

30

Befunge 98 , 19 18 байт

Нова відповідь (з підземногомонорельса)

"ck,@!dlroW ,olleH

Пояснення

  • " запускає рядковий режим
  • Все, що випливає, висувається до стека. Стек заразHello, World!@,kc
  • Після удару в кінці перекладач повернеться до початку
  • Він "знову зустрічається , закінчуючи рядовий режим
  • 12 висувається до стека ( c)
  • k приймає верхнє значення стека і виконує наступну команду, покажчик інструкції може бачити це багато разів
  • ,з'являється значення зі стека та видає його як значок. Він був виконаний 12 разів останньою kінструкцією, і ще один раз, коли перекладач фактично читає ,інструкцію
  • @ закінчує програму

Відмінність від старої відповіді полягає в тому, що ми вміло повторно використовуємо "персонажа, використовуючи циклічну поведінку Бефуге, коли він потрапляє в кінець рядка. Оскільки це може бути менш інтуїтивно зрозумілим, я даю і старий. Крім того, ви, можливо, помітили, що стек все ще містить деякі символи ( ck,@) через цей приємний трюк, залишаючи деякий безлад, якщо ми колись хотіли щось зробити після цього.

Стара відповідь

"!dlroW ,olleH"ck,@

Це працює для funge та befunge 98

Пояснення

  • Все між собою ""висувається до стека. ( 'H'зараз на вершині.)
  • c (12) висувається до стека
  • k приймає верхнє значення стека і виконує наступну команду, покажчик інструкції може бачити це багато разів.
  • ,з'являється значення зі стека та видає його як значок. Він був виконаний 12 разів останньою kінструкцією, і ще один раз, коли перекладач фактично читає ,інструкцію
  • @ закінчує програму

2
Я не думаю, що у 93 єk
Sp3000

1
Добре, що зараз це 98 тільки ви можете використовувати cдля 93+.
PurkkaKoodari

3
У 18:"ck,@!dlroW ,olleH
підземниймонорельс

1
Він натискає "на початковий рядок, додає весь решту рядка до цього рядка, обертається навколо і натискає той самий, "щоб закінчити рядок. Тепер вся програма, за винятком тієї, що "була висунута до стека, з !dlroW ,olleHвершиною. Потім він друкує 12 найкращих символів так само, як це робить і зупиняється @.
підземниймонорельс

1
Для 18-байтового рішення мій інтерпретатор створює "Hello, World" (провідний пробіл, без вигуків). Перекладач Anarchy Golf (використовуйте форму, виберіть Befunge-98, код вставки, уявити) робить те ж саме.
примо

29

JSFuck , 6293 6289 6277 байт

Це може згадати як одну з найдовших "найкоротших програм Hello, World! " (Насправді я не знаю, чи оптимально це, але це найкоротший, який мені вдалося отримати).

Попередження: працює лише у Firefox та Safari

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

Існує також трохи довша версія (+4 байти), яка також працює в Chrome і Microsoft Edge:

Для незнайомих з JSFuck мова йде про те, щоб писати JavaScript так, ніби було лише шість символів, і це часом може отримати досить божевільний характер.

У цій таблиці показано, як символи використовуються в Hello, World! Програма кодується в JSFuck. Простий текстовий код просто 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                 |
+----------+--------------------------------------+---------------------------+

Ось рядки "fill", "fontcolor"і т.д. , повинні бути записані в вигляді "f"+"i"+"l"+"l", який "f"+"o"+"n"+"t"+"c"+"o"+"l"+"o"+"r"повинен бути закодований.

Глобальні ідентифікатори self, atobі btoaпишуться як Function("return self")().

Functionсама повинна бути []["fill"]["constructor"].

Кома ","складна, я не на 100% впевнений, як вона працює, але вона використовує []["concat"]функцію для створення масиву. Я опублікую оновлення, коли встигну зробити ще тести.


Я кодував це за допомогою JScrewIt - кредитів GOTO 0 для створення такого складного інструменту:

  • Відкрийте Firefox (Ви можете обрати будь-який інший браузер, але код Firefox лише найкоротший.)
  • Перейдіть до JScrewIt : http://jscrew.it
  • Вхід: alert("Hello, World!")
  • Код, що виконується: відмічений
  • Сумісність: лише цей браузер

Це відрізняється від моєї відповіді на це питання наявністю коми після «Привіт».

Цікаво, що синтаксис ES6

alert`Hello, World!`

займає ще більше байтів для кодування (+1500 або більше) через більш високу складність кодування двох задників, а не ("та ").


Добре це працює в Chrome на Android
Beta Decay

Працює в Chrome і на OS X
C0deH4cker

1
Ви тут зробили чудову роботу! Обов’язково перевірте останнє оновлення.
GOTO 0

4
@ GOTO0 Зачекайте ... ви автор JScrewIt, правда?
я та моя кішка

1
Як чорт ви називаєте функції з цим?

29

Пада , 83 68 байт

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

Я вважаю, що це оптимально для лінійної програми (тобто тієї, яка не використовує операторів управління потоком ?та *). Це може бути оптимальним в цілому, але я не знаю, як використовувати ці додаткові оператори в такій малій кількості коду (або як програмно вивчити можливості).

Мова останнім часом зазнала деяких змін після того, як я почав обговорювати її з автором електронною поштою. Однак я написав посилання на реалізацію поточного стану мовної специфікації минулого тижня, тому наведений вище код насправді можна виконати.

Метагольф

Спочатку я використав результати моєї базової реалізації для цього виклику і створив на основі цього рішення, виготовлене вручну. Однак це був лише евристичний підхід.

Тому замість цього я написав вирішення в Mathematica, який насправді знає про структури даних Pada та оператори, щоб знайти оптимальне рішення. У середньому він росте лінійно з довжиною струни (хоча деякі комбінації символів трохи повільніше, ніж інші) і займає близько 1,5 годин Hello, World!.

Тож як я пішов писати розв’язувач. По-перше, ми помічаємо, що нам потрібно розглянути лише 6 операторів: ~.oOqQ(плюс необхідні wдля кожного з друкованих символів). Використання стеків або бітових блокувань не є корисним у лінійному коді, і я не вірю в це, ?і *його можна ефективно використовувати менш ніж у 68 байт.

Стан Pada (ігноруючи стеки та блокування) складається з 7 комутаторів і 8 біт, розташованих так:

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

Так це можливі штати. Моїм першим кроком попередньої обробки було встановити спрямований графік станів, коли кожному краю відповідає одна операція. Тобто на графіку є 32768 вершин, кожна з яких має ступінь 6 (по одному вихідному краю для кожної з 6 розглянутих операцій). Ми можемо використовувати цей графік, щоб знайти найкоротший шлях між будь-якими двома державами (сам цей графік може бути дуже корисним для гольфу в Паду).215 = 32768

Тепер для кожного персонажа ми хочемо досягти стану, коли він wдрукує цього символу. Скільки таких держав? wчитає байт з біту, на який він скидається (циклічно). Отже, існує 8 можливих обертів бітів символу, які можуть надрукувати цей символ. Для кожного з цих обертів фіксуються три вимикачі (для того, щоб зробити wпадіння у правильному положенні). Це залишає 4 довільних вимикача. Таким чином, ми маємо можливі стани для кожного в нашому коді.8 * 24 = 128w

За допомогою них ми можемо вирішити ще одну проблему графіка: побудувати графік, який має вихідну вершину, потім один «шар» для кожного символу та вершину мийки. Шари складаються з 128 станів для кожної вершини, вихідний вузол відповідає початковому стану програми (всі перемикання вліво, а всі біти дорівнюють нулю). Вузол мийки, зокрема, не відповідає стану. Ми маємо спрямовані ребра від кожної вершини в одному шарі до кожної вершини в наступному шарі, де вага краю - це відстань між двома станами в попередньому графіку. Ваги країв від останнього шару до раковини дорівнюють 0. Тобто ми можемо попередньо обчислити всі ці ваги. Це найдорожчий крок обчислення, який займав 1,5 години Hello, World!.

Завдяки цьому графіку ми зможемо знайти найкоротший шлях від джерела до раковини досить швидко (на моїй машині знадобилося 0,05 с). Для Hello, World!бажаних станів:

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

де найменш значущі 7 біт відповідають перемикачам, а найбільш значущі 8 біт - бітам Пади.

Тепер ми повернемося до першого графа і знаходимо фактичні ребра (тобто операції), що відповідають найкоротшому шляху між кожною парою наступних станів, і закінчуємо кожне з них a w. Voilà, оптимальне рішення (виходячи з вищенаведених припущень).

Ось повна Mathematica, якщо хтось коли-небудь захоче метагольф інший рядок у 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]) <> ""

Цікава мова зробити метагольф на =). Це змушує мене замислитися, яка твоя денна робота? оо
justhalf

4
@justhalf В даний час я перебуваю в ступіні між магістерською і докторською студією (тому у мене, безумовно, занадто багато часу на руках, якщо це було вашим наслідком;)). (Це, як правило, більше обговорення для чату :))
Мартін Ендер

Пада означає, що в Багасі Індонезія / Малайська. Це актуально?
XiKuuKy

@XiKuuKy afaik, мову називають падою, тому що в хорватській мові це означає "падіння".
Мартін Ендер

І ця відповідь на (див. Тут ). Напевно, ви можете поєднати дві відповіді в одну, щоб описати цю чудову проблему Hello World загалом.
Віталій Кауров
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.