Привет, мир! (Любой другой персонаж)


129

Напишите программу, которая печатает «Hello, World!». Но также, если вы берете только первый, третий, пятый и т. Д. Символы вашей программы, полученная программа все равно должна вывести «Hello, World!».

Если ваша программа:

abc
def

Должно появиться «Hello, World!», Но так должно

acdf

Нет решений с менее чем 2 символами.


2
Может ли быть пробел вокруг выхода?
vroomfondel

18
Удивительный первый пост!
Адам

11
Видя все ответы с «HHeelllloo» напомнил мне говорить о китах.
Брайан Минтон

32
Профессиональный совет для избежания "Hello, World!" Встроенные модули в таких задачах, как это: используйте несколько другую строку аналогичной сложности, как «Привет, земляне!»
Мартин Эндер

6
«Нет решений с количеством символов менее 2». Удивительно.
Роберт Грант

Ответы:


195

Python 3 , 61 байт

rant="partisn't"
print(("HHeelllloo,,  WWoorrlldd!!"""[::2]))

Попробуйте онлайн!

Злоупотребление тем, что printявляется функцией в Python 3 :)

Наименьшее партизанское решение вы найдете здесь на PPCG.

становится

rn=print
rn("Hello, World!"[:])

48
Это прекрасно.
musicman523

1
@ musicman523 Но в этом случае REPL не окружает текст одинарными кавычками.
officialaimm

1
@officialaimm Да, я полагаю, так и есть
musicman523

1
@ yamboy1 Попробуйте удалить все остальные письма
vroomfondel

1
Я не знал, на [:]самом деле работал: о Ницца!
HyperNeutrino

56

Кардинал , 29 байт

%
"
H
e
l
l
o
,
 
W
o
r
l
d
!

Попробуйте онлайн!

Удаление любого другого символа удаляет все переводы строки, что все еще приводит к Hello, World!:

%"Hello, World!

Попробуйте онлайн!

Причина, по которой это работает, заключается в том, что %создается четыре указателя инструкций, перемещающихся в каждом из четырех основных направлений. IP-адреса, которые оставляют исходный код, просто удаляются. Таким образом, в первом случае остается только IP, выходящий на юг, а во втором случае остается только IP, выходящий на восток, все остальные просто отбрасываются. В любом случае, выполненная программа тогда просто "Hello, World!. В "переключается в режим строки , где каждая ячейка просто печатаемые на STDOUT. Нам не нужно завершать строку, потому что выход из исходного кода все еще завершает программу.

Обратите внимание, что та же идея работает в пчелином воске , используя *вместо %и `вместо "(это потому, что пчелиный воск был в значительной степени вдохновлен кардиналом, но использует гексагональную сетку).

Попробуйте онлайн! (вертикальный) | | Попробуйте онлайн! (горизонтальный)



31

На самом деле , 2 байта

HH

Объяснение:

H, как и следовало ожидать, толкает Hello, World!в стек.

Основная программа ( HH) встретит первую Hи протолкнет Hello, World!в стек. На втором H, однако, он попытается использовать два аргумента (поскольку стек должен быть пустым, чтобы выдвинуть Hello, World!) и потерпит неудачу. Однако эта ошибка будет проигнорирована, а затем Hello, World!будет неявно напечатана.

Вторая программа ( H) будет Hello, World!нажата один раз, и это будет напечатано косвенным образом.

Это похоже на двухбайтовый ответ Fatalize, но на самом деле это не «обман».

Попробуйте онлайн!


4
Хорошее решение, но я думаю, что это не должно учитываться, поскольку оно слишком похоже на односимвольное решение.
Лев Тененбаум

32
@LeoTenenbaum Почему бы и нет? Это соответствует правилам прекрасно.
Okx

2
То, что вы объясняете, не соответствует действительности, Hбудет только выдвигать Hello, World!пустой стек, а если стек не пустой, он будет ожидать 2 аргумента, поэтому будет ошибка, и ошибки будут игнорироваться. И на самом деле нет неявно не печатать только самый верхний элемент.
Эрик Outgolfer

@EriktheOutgolfer Ой. Починю.
Okx

Вот почему на самом деле мой любимый язык игры в гольф. Это на идеальном уровне глупо.
RShields

22

Луа , 89 байт

--- [ [
print("Hello, World!")
--[[ ] ]
pCrAiLnCtU(L"AHTeOlRlFoE,L IWNoEr:lDd !:"D)
---]]

Попробуйте онлайн! Как показывает подсветка синтаксиса, это массовое злоупотребление комментариями.

Alternate:

--[[pit"el,Wrd"
-[]]print("Hello, World!")--]

Попробуйте онлайн!

И для удобства, программа для преобразования программы в любую другую символьную форму: попробуйте онлайн!


Мне нравится этот! Формат комментариев Lua похож на T-SQL, я собираюсь попробовать его для этого языка.
BradC

3
Такая хитрость должна работать для любого языка с блочными комментариями и
CalculatorFeline

2
CALCULATORFELINE: D: D
Riking

2
HHeelllloo WWoorrlldd!!скучно: P
CalculatorFeline

19

Сетчатка , 39 байт


HHeelllloo,,  WWoorrlldd!!


(.).x?
$1

Попробуйте онлайн!

Взятие каждого другого персонажа дает:


Hello, World!
()x
1

Попробуйте онлайн!

Первая программа создает строку с дублированием приветствия. Затем он заменяет каждую пару символов первым. Существует также пустой этап, который заменяет все пустые строки на пустые строки между ними, но это ничего не делает. Вторая программа не соответствует букве "х", поэтому она не заменяет ничего после создания приветствия.

Возможно, еще более забавно, если третий этап немного меняется, первый набор символов не обязательно должен быть одним и тем же сообщением. Это может привести ко многим решениям одинаковой длины, таким как полный и наполовину .


17

Древесный уголь , 25 байт

H→e→l→l→o→,→ →W→o→r→l→d→!

Попробуйте онлайн!

Если вы удаляете четные символы, вы просто удаляете команды стрелок, которые указывают направление следующего текста и оставляют следующий код:

Hello, World!

Попробуйте онлайн!

Это также печатает приветствие.


17

Haskell , 85 байт

{--}main=putStr"Hello, World!"--} m a i n = p u t S t r " H e l l o ,   W o r l d ! "

Попробуйте онлайн!

Каждый второй персонаж удаляется:

{-mi=uSrHlo ol!-}main=putStr"Hello, World!"

Попробуйте онлайн!

Это использует два формата комментариев в Haskell: {- -}для встроенных или многострочных комментариев и --для комментирования остальной части строки.


16

Javascript, 67 байт

/**/alert`Hello, World`// * / a l e r t ` H e l l o ,   W o r l d `

Каждое второе письмо удаляется:

/*aetHlo ol`/*/alert`Hello, World`

Так же, как ответ Хаскелла Лайкони, это использует комментарии.


Хороший ответ, +1! Сэкономили 2 байта, создав порт ответа в моем ответе на Java 8 , и дополнительный байт, когда я изменился // * /на //**/(что, к сожалению, невозможно в вашем случае из-за /**/alert`Hello, World` нечетного количества байтов, а не даже как в моем случае .
Кевин Cruijssen

14

Брахилог , 4 байта

Ḥ~wḤ

Попробуйте онлайн!

объяснение

~wзаписывает свою правую переменную STDOUTи игнорирует левый аргумент есть "Hello, World!", так что это печатает Hello, World!.

Если мы возьмем только первый и третий символы, мы получим Ḥw. В этом случае wзаписывает свою левую переменную и игнорирует правую переменную, поэтому он также печатает Hello, World!.

2 байта

ḤḤ

Попробуйте онлайн!

Технически это правильный ответ, но он объединяет выходную переменную программы вместо печати в STDOUT, так что я думаю, что 4-байтовая программа больше соответствует духу задачи.


Я не думаю, что двухбайтовый ответ является «технически» действительным, поскольку состояние вызова печатается .
Okx

1
@Okx печатать, как на листе бумаги?
theonlygusti

@theonlygusti Это означает, что печать для STDOUT.
Okx

5
@ theonlygusti Вздох ... это то, что подразумевается под печатью по умолчанию.
Okx

3
@Okx Вы пытаетесь быть педантичным, чтобы сделать решение недействительным, но на самом деле в этом нет ничего недействительного. Задача говорит только «результат».
theonlygusti

11

Haskell, 102 байта

Полная программа:

main= putStr"Hello, World!";;
putSt   x ="p u t S t r  \" H e l l o ,   W o r l d !\"";
mmaaiin = main

и с каждым другим удаленным символом:

mi=ptt"el,Wrd";ptt x=putStr "Hello, World!";main=mi

Вы можете удалить 2 байта, удалив пробелы между p u t S t rи \".
Sriotchilism О'Зайк

11

машинный код x86, 162 байта

демонстрация

PROG.COM Загрузите и запустите его в эмуляторе MS-DOS , например , DOSBox .

90 B3 B4 B4 02 90 90 B3 B2 B2 48 90 90 B3 CD CD 21 90 90 B3 B2 B2 65 90 
90 B3 CD CD 21 90 90 B3 B2 B2 6C 90 90 B3 CD CD 21 90 90 B3 CD CD 21 90 
90 B3 B2 B2 6F 90 90 B3 CD CD 21 90 90 B3 B2 B2 2C 90 90 B3 CD CD 21 90 
90 B3 B2 B2 20 90 90 B3 CD CD 21 90 90 B3 B2 B2 77 90 90 B3 CD CD 21 90 
90 B3 B2 B2 6F 90 90 B3 CD CD 21 90 90 B3 B2 B2 72 90 90 B3 CD CD 21 90 
90 B3 B2 B2 6C 90 90 B3 CD CD 21 90 90 B3 B2 B2 64 90 90 B3 CD CD 21 90 
90 B3 B2 B2 21 90 90 B3 CD CD 21 90 90 B3 CD CD 20 90

после удаления MINI.COM Скачать

90 B4 02 90 B2 48 90 CD 21 90 B2 65 90 CD 21 90 B2 6C 90 CD 21 90 CD 21 
90 B2 6F 90 CD 21 90 B2 2C 90 CD 21 90 B2 20 90 CD 21 90 B2 77 90 CD 21 
90 B2 6F 90 CD 21 90 B2 72 90 CD 21 90 B2 6C 90 CD 21 90 B2 64 90 CD 21 
90 B2 21 90 CD 21 90 CD 20

Как запустить?

Установите DOSBox для Ubuntu / Debian

sudo apt install dosbox

Запустить его

dosbox

В DOSBOX

mount c /home/user/path/to/your/directory
c:
PROG.COM
MINI.COM

Как это работает?

Коды работы машины представляют собой инструкции на языке ассемблера .

В MS-DOS для печати char вы будете устанавливать регистры и делать прерывания. Регистр AH будет 0x02, регистр DL содержит ваш символ. Вектор прерывания 0x21.

mov ah,0x2  ;AH register to 0x2 (B4 02)
mov dl,0x48 ;DL register to "H" (B2 48)
int 0x21    ;0x21 interrupt     (CD 21)

Крошечная модель MS-DOS COM-файла - хороший выбор, потому что у нее нет заголовков . Он ограничен 64 КБ, но в нашем случае это не имеет значения.

Для остановки программы используйте прерывание 0x20

int 0x20    ;0x20 interrupt     (CD 20)

магия

Если вы хотите выполнить команду кода операции 0xAB с одним параметром 0xCD , вы пишете

AB CD

В PROG.COM

90 B3 AB AB CD 90
nop         ; No operation (90)
mov bl,0xb4 ; BL register to AB (B3 AB)
AB CD command (AB CD)
nop         ; No operation (90)

В MINI.COM

90 AB CD
nop         ; No operation (90)
AB CD command (AB CD)

Это равные машинные коды, если вы не используете регистр BL .

Генератор

Преобразовать текстовый файл с шестнадцатеричным в шестнадцатеричный двоичный файл

cat hex_file | xxd -r -p > exec.com


Удалите все `90 90` для -52 байтов.
NieDzejkob

Также ноп в самом конце никогда не будет достигнут.
NieDzejkob

10

Pyth , 31 байт

p% 2"HHeelllloo,,  WWoorrlldd!!

Попробуйте онлайн!

становится

p "Hello, World!

Спасибо @CalculatorFeline за указание на ошибку и удаление одного байта.


Персонажи начинали с первого, а не второго. Вы можете бросить ведущий пробел.
CalculatorFeline

Ах, спасибо @CalculatorFeline. Я прочитал «Взять» как «Удалить» в спецификации.
vroomfondel


7

05AB1E , 29 байт

”™ ,ï‚‚ï ! ”# ¦2 ä ø¨øJð ý

Попробуйте онлайн!

объяснение

”™ ,ï‚‚ï ! ”                # push the string "Weekly Hello , Changed World ! "
               #               # split on spaces
                               # RESULT: ['Weekly','Hello',',','Changed','World','!','']
                ¦              # remove the first element (Weekly)
                 2ä            # split in 2 parts
                               # RESULT: [['Hello', ',', 'Changed'], ['World', '!', '']]
                   ø           # zip
                               # RESULT: [['Hello', 'World'], [',', '!'], ['Changed', '']]
                    ¨          # remove the last element
                     ø         # zip
                               # RESULT: [['Hello', ','], ['World', '!']]
                      J        # join each inner list
                       ðý      # join on space

После удаления всех остальных символов у нас остается код

”Ÿ™,‚ï!” 2äøøðý

Попробуйте онлайн!

объяснение

”Ÿ™,‚ï!”       # push the string "Hello, World!"
        2ä     # split in 2 parts
               # RESULT: ['Hello, ', 'World!']
          ø    # zip, as the string has an odd length the space is lost
               # RESULT: ['HW', 'eo', 'lr', 'll', 'od', ',!']
           ø   # zip again
               # RESULT: ['Hello,', 'World!']
            ðý # join on space

7

Mathematica, 62 байта

P0r0i0n0t0@0"0H0e0l0l0o0,0 0W0o0r0l0d0!0"Print@"Hello, World!"

Он возвращает "0H0e0l0l0o0,0 0W0o0r0l0d0!0" Null P0r0i0n0t0[0]и печатает Hello, World!как побочный эффект. При запуске в качестве программы (не в REPL) возвращаемое значение не будет напечатано.

После удаления любого другого персонажа:

Print@"Hello, World!"rn@Hlo ol!

Он возвращает Null ol! rn[Hlo]и печатает Hello, World!.


7

Желе , 26 25 байт

““3ḅaė;œ»ḷ“ 3 ḅ a ė ; œ »

Попробуйте онлайн!

После удаления каждого второго символа у нас остается следующий код.

“3a;»“3ḅaė;œ»

Попробуйте онлайн!

Как это устроено

““3ḅaė;œ»ḷ“ 3 ḅ a ė ; œ »  Main link.

““3ḅaė;œ»                  Index into Jelly's dictionary to yield
                           ["", "Hello, World!"]. 
          “ 3 ḅ a ė ; œ »  Index into Jelly's dictionary to yield.
                          " FullERebitingBEfluffiest adoptable".
         ḷ                 Take the left result.
“3a;»“3ḅaė;œ»  Main link.

“3a;»          Index into Jelly's dicrionary to yield " N-".
               Set the argument and the return value to the result.
     “3ḅaė;œ»  Index into Jelly's dicrionary to yield "Hello, World!".
               Set the return value to the result.

7

Кубически v2.1 , 222 байта

+0503 @@6 :22 //1 +050501 @@6 :55 +0502 @@6@6 :33 //1 +050502 @@6 :55 +03 //1 +04 @@6 :55 //1 +03 @@6 :55 +01 //1 +0504 @@6 :33 //1 +050502 @@6 :55 +01 //1 +050502 @@6 :55 +0502 @@6 :11 //1 +050501 @@6 :55 +01 //1 +03 @@6

Попробуйте онлайн!

Каждое другое письмо:

+53@6:2/1+551@6:5+52@66:3/1+552@6:5+3/1+4@6:5/1+3@6:5+1/1+54@6:3/1+552@6:5+1/1+552@6:5+52@6:1/1+551@6:5+1/1+3@6

Попробуйте онлайн!



6

Помогите, WarDoq! 2 байта

Hi

Попробуйте онлайн!

Hпечатает Hello, World!, iэто не оп.

Помогите, WarDoq! Можно добавить два числа и проверить на простые числа, поэтому он считается допустимым языком программирования для этой мета-записи .


почему это было отвергнуто?
Уриэль

NOP и массивные пространства против духа.
RShields

1
+1 из-за новизны того, как результирующий исходный код повторно подчеркивает сообщение, которое получает вывод.
TOOGAM


6

PHP, 53 байта

#
echo date(
$e_c_h_o='\H\e\l\l\o\,\ \W\o\r\l\d\!
');

При удалении любого другого персонажа:

#eh ae
echo'Hello, World!';

6

Октава, 49 45 байт

Сохранено 4 байта, поскольку Octave не требует скобок для индексации.

'HHeelllloo,,  WWoorrlldd!! ' (1:2 : 3 ^ 3)''

Попробуйте онлайн!

И сокращенный:

'Hello, World!'(:    )'

Попробуйте онлайн!

Объяснение:

В исходном коде буквы в строке продублированы, поэтому мы оставляем их Hello, World!при удалении каждой секунды. Некоторые пробелы добавляются, чтобы обеспечить сохранение скобок и апострофов.

Индексирование действительно 1:2:end. Есть 27 символов, и мы не можем использовать endили, 27поскольку мы должны удалить символ, поэтому мы идем 3 ^ 3вместо этого. Когда мы удаляем каждый третий символ, происходит индексация (:)(и некоторые дополнительные пробелы).

(:)означает «сгладить и превратить в вертикальный вектор» . Итак, нам нужно транспонировать его, используя '. Нам не нужно транспонировать строку в исходном коде, но двойное транспонирование работает, поэтому первая строка транспонируется дважды с использованием '', а вторая - только один раз.


6

APL (Дьялог) , 35 34 байта

-1 спасибо мартину эндеру

'0H0e0l0l0o0,0 0W0o0r0l0d0!0'~  0

Попробуйте онлайн!

'0H0e0l0l0o0,0 0W0o0r0l0d0!0' сообщение с нулями в качестве сменных символов-заполнителей

~ Кроме

 отформатированный (stringified)

0 число ноль

Оставляя только странные символы, это становится 'Hello, World!' .


5

T-SQL, 75 байт

---
PRINT 'Hello, World!'
/*
-P-R-I-N-T-'-H-e-l-l-o-,- -W-o-r-l-d-!-'
---*/

Одно- и многострочные комментарии, основанные на LUA-версии CalculatorFeline .

После удаления всех четных символов, некоторые из которых являются переносами строк:

--PIT'el,Wrd'/
PRINT'Hello, World!'--/

5

Javascript, 73 байта

a ='a0l0e0r0t0`0H0e0l0l0o0,0 0W0o0r0l0d0!0`0/0/';eval(a.replace(/0/g,''))

Создает строку aс содержимым a0l0e0r0t0`0H0e0l0l0o0,0 0W0o0r0l0d0!0`0/0/, затем удаляет все, 0что нужно дать alert`Hello, World!`//, то есть eval«d».

Взятие любого другого персонажа программы дает

a=alert`Hello, World!`//;vlarpae//,')

который предупреждает, Hello, Worldиспользуя синтаксис строки шаблона, так же, как это было в eval'd в полной программе, затем сохраняет результат вызова aи включает проницательный комментарий //;vlarpae//,').


5

> <> , 47 байт

Оригинал:

| v~" H e l l o ,   W o r l d ! "

~o<< ;!!!? l

После удаления каждого второго символа:

|v"Hello, World!"
o<;!?l

Попробуйте их онлайн: оригинал , модифицированный

Оригинальная программа выдвигает персонажей "Hello, World!" в стек (в обратном порядке) с вкраплением пробелов, затем поочередно печатает символ и удаляет его, пока длина стека не станет равной нулю. Вторая программа делает то же самое, за исключением того, что инструкции по удалению ~пропали.

Если вы не возражаете против остановки с ошибкой, мы можем взять лист из книги Кардинала Мартина Эндера : модифицированный код

\"!dlroW ,olleH"!#o#

и оригинал такой же, но с символами новой строки, вставленными между всеми символами, для 39 байтов. Попробуйте их онлайн: оригинальные , модифицированные .


5

,,,, 34 байта

 2"Hteoltlaol,l yWhourmladn!! "⟛

При удалении четных символов ...

 "Hello, World!"

объяснение

Со всеми персонажами:

 2"..."⟛

               no-op
 2             push 2 to the stack
  "..."        push "Hteoltlaol,l yWhourmladn!! " to the stack
       ⟛      pop 2 and the string and push every 2nd character of the string
               implicit output

Без четных символов:

 "..."

               no-op
 "..."         push "Hello, World!" to the stack
               implicit output

5
Это означает, что вам не нужно говорить, что это не конкуренция.
FryAmTheEggman

2
Но вы должны хранить все четные символы ... (0-индексированные) ...
HyperNeutrino

Упс, исправлено. Просто добавьте еще одного персонажа.
полностью человек

4

Brainfuck, 155 байт

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

Попробуйте онлайн!

Каждый второй персонаж удаляется:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.