Привет, мир! с ограниченным повторением символов


79

На языке по вашему выбору напишите программу, которая точно выводит символы, Hello world!за которыми следует новая строка. Код:

  • не следует использовать какой-либо символ более двух раз (буквенно-цифровой, символ, пробел ... что-нибудь)
  • не следует использовать какие-либо внешние ресурсы
  • не должен использовать какой-либо пользовательский ввод
  • не должен ничего выводить

Пример правильной программы на Python:

print("He%so world!"%(2*'l'))

Пример неверной программы на Python (символ «r» используется три раза):

print("Hel"+chr(108)+'o world!')

Победителем считается тот, кто наберет наибольшее количество голосов через 14 дней.

РЕДАКТИРОВАТЬ: Победитель был выбран! Спасибо всем за вашу работу над этим вопросом!


25
Как насчет повторяющейся буквы o в «действительном» примере с python. Там также эти: - "'()
Адам Спейт

15
@AdamSpeight что ты имеешь ввиду? Буква используется только дважды, согласно спецификации.
Джош

5
@AdamSpeight ... что буквально то же самое.
VisioN

4
Я думаю, вы имеете в виду, что персонаж не должен появляться более двух раз, то есть он не должен повторяться более одного раза.
Майкл Кей

56
Я предполагаю , что Brainfuck вне вопроса ...
jub0bs

Ответы:


61

Рубин (1,9+)

Так как это конкурс популярности, давайте попробуем не использовать ЛЮБОГО из персонажей «Hello world!» при использовании других символов только максимум два раза:

puts("S\107VsbG8gV29ybGQhCg".unpack(?m))

Это 40 символов между прочим.

удар

И этот использует магию Юникода.

Примечания:

  • Хотя оригинальные символы появляются в другом месте (в отличие от примера ruby), напечатанная строка содержит только символы, отличные от ascii.
  • Два из трех пробелов на самом деле являются вкладками, поэтому нет символов utf-8, которые появляются более 2 раз
  • В двоичном виде некоторые октеты появляются более 2 раз, надеюсь, это не противоречит правилам. Я пытаюсь решить их, хотя.

Код:

echo '𝓗𝐞𝑙𝒍𝓸 𝓦𝗈𝖗𝖑𝘥¡'|iconv -t  asCIi//TRANSLIT

Для тех, у кого не установлен правильный шрифт, это выглядит так:

код как изображение

Вот hexdump:

00000000  65 63 68 6f 20 27 f0 9d  93 97 f0 9d 90 9e f0 9d  |echo '..........|
00000010  91 99 f0 9d 92 8d f0 9d  93 b8 e2 80 8a f0 9d 93  |................|
00000020  a6 f0 9d 97 88 f0 9d 96  97 f0 9d 96 91 f0 9d 98  |................|
00000030  a5 c2 a1 27 7c 69 63 6f  6e 76 09 2d 74 09 61 73  |...'|iconv.-t.as|
00000040  43 49 69 2f 2f 54 52 41  4e 53 4c 49 54 0a        |CIi//TRANSLIT.|
0000004e

Вы должны запустить его на машине, где кодировка по умолчанию - utf-8. Я пытался на OSX10.8, используя iTerm2 со следующей средой:

bash работает в iTerm2

PHP 5.4

Это использует zLib: (к сожалению, он использует символы eи o)

<?=gzuncompress('x▒▒H▒▒▒W(▒/▒IQ▒!qh');

HexDump:

00000000  3c 3f 3d 67 7a 75 6e 63  6f 6d 70 72 65 73 73 28  |<?=gzuncompress(|
00000010  27 78 9c f3 48 cd c9 c9  57 28 cf 2f ca 49 51 e4  |'x..H...W(./.IQ.|
00000020  02 00 21 71 04 68 27 29  3b                       |..!q.h');|
00000029

+1

Вот код ruby ​​2.0, который я использовал для проверки дубликатов:

d=ARGF.read
p [d.split(//),d.unpack('C*')].map{|x|x.inject(Hash.new(0)){|i,s|i[s]+=1;i}.select{|k,v|v>2}}

2
Хотя я всегда ценю хитрость Unicode, ваша попытка bash, похоже, не соответствует спецификации вопроса. «написать программу, которая точно выводит символы, Hello world!за которыми следует новая строка»
FireFly

14
@FireFly: это удовлетворяет это. iconv с целевой кодировкой ascii//translitтранслитерирует символы юникода в базовый формат ascii. И, конечно, echo добавит новую строку, так что эта соответствует спецификации (если мы не учитываем сходство октетов)
SztupY

5
В моей системе я получаю Hello World?вместоHello World!
marinus

1
@SztupY о, ты прав, мой плохой. Очень умно, мне это нравится!
FireFly

1
Сколько бонусных баллов вы бы получили, если бы ваша программа проверки дубликатов также соответствовала повторяющейся спецификации? :-)
corsiKa

55

Вы должны использовать более выразительные языки.

Китайский,  6 4   3 знака

喂世!

Запуск гугл переводчика на этом производит Hello world!

(спасибо @sreservoir и @Quincunx за обновление)


33
+1 за изменение правил ... "На языке по вашему выбору ..."
WallyWest

4
Любить это. Но как именно это программа?
Пьер Арло

3
На самом деле вы можете смотреть на нее как на программу на языке гугл-перевода - для китайского языка как его подъязыка :)
Томас

2
+1. Хорошая идея. 世界 = Shì jiè = Мир. 你好 = nǐ hǎo = Привет. "Мир, привет!" переводится как «Привет, мир!». Это может быть игра в гольф еще немного:你好世!
Джастин

2
можно играть дальше, 喂世!за счет ... ну, больше ничего не тратится.
muhmuhten

45

HQ9 +, 1 символ

H

сохраняя это простым :)


7
HQ9 + выводит запятую хотя;)
Джош

8
Я бы все еще не давал ваш ответ ... в конце концов, это конкурс популярности, правила для ветра!
Джош

26
@Josh Это одно из редких событий, когда я пропускаю кнопку понижения комментариев. Если мы отбросим правила, то ничего не останется, чтобы оправдать соревнование вообще.
Говард

5
@ Как я чувствую себя грязным. Я проголосовал за ваш комментарий Джоша
Cruncher

22
Все print Hello Worldвопросы на самом деле who can submit a HQ9+ answer fasterвопросы.
Тотемедли

44

С, 192 символа

#
#
/*$$@``*/ATION_[]={9.};main(BBCDDEEFFGGHJJKKLLMMPPQQRRSSUUVVWWXXYYZZabbdefgghhjjkkmpqqsstuuvvwxyyzz) {printf("He%clo \
world!%c\
",2^7&!8.&~1|~-1?4|5?0x6C:48:6<3>2>=3<++ATION_[0],'@'^79-5);}

Так как это не гольф, я решил немного повеселиться и попробовать использовать каждого персонажа ровно два раза (добавив как можно меньше комментариев, потому что это скучно). Я понимаю, что я не очень хорошо справлялся, так как мой код также содержит массу скучного «мертвого» кода (не в буквальном смысле, а в смысле символов-заполнителей, используемых только для того, чтобы выполнить требование). Во всяком случае, это было удивительно сложно (но весело) с ограничением в два символа, поэтому, к сожалению, я не смог придумать ничего более интересного. Это дало мне идею для новой проблемы, хотя ...

(Обновлено за комментарий @ ugoren.)


3
Творчески впечатляет. Мне это нравится.
Джош

Косая черта `\`, заканчивающаяся в третьей и четвертой строках, делает ее продолжением строки, а не переводом строки. И четвертая строка заканчивается EOF, что делает его законным.
Джош

1
Я думаю, что вы можете легко раскомментировать ., используя его для дробей. Также вы можете объявить массив и использовать [].
Угорен

@ugoren хороший звонок о .; Я думал только об использовании его для доступа к структуре. <s> Что касается объявлений массива, то у меня нет ,s из-за printfвызова, и у меня тоже нет ;s, поэтому я не уверен, как я могу объявить один. </ s> Да, я мог бы заменить ATION_. ..
FireFly

44

Команда Vim (18 нажатий клавиш)

iHeEsc3alEscio WorRightd!Enter

Не повторяет нажатие клавиши более двух раз.

Это своего рода нарушает правило «пользовательского ввода», так как это все еще пользователь, который должен вводить эту последовательность, но я полагаю, если вы сохраните ее в виде макроса или nnoremap, это будет засчитано, поскольку вы просто запускаете ее без явного выполнения каких-либо действий. вход, чтобы это произошло.

Он также nocompatibleдолжен быть установлен, что может считаться использованием внешних ресурсов, поэтому я предоставил еще один вариант ниже:


Команда Vim (21 нажатие клавиши)

iHeEsc3alEscio WorCtrl+[$ad!Enter

Этот вариант не требует nocompatibleустановки, хотя он работает Escтри раза, используя Ctrl+[вместо него.


16
Если вы говорите о персонажах Right, Escи Enter, они не в буквальном смысле этих символов. Vim имеет дело с нажатиями клавиш, которые я считаю эквивалентными персонажам для целей этого конкурса (и правила «не повторяйся более двух раз»). Я использую только iнажатие клавиши дважды, и <Right>нажатие клавиши один раз. Что касается E, я никогда не использую это вообще - но я использую <Esc>дважды и <Enter>один раз.
Джо З.

6
Теперь я разочарован тем, что в Emacs нет команды Mx hello-world ...
RemcoGerlich

4
Даже если это так, это три lс.
Джо З.

1
Вы должны отметить, что вы должны :set nocompatible.
Jazzpi

1
Удивительно, но я сам нашел использование Rightне очень вим-у.
Gefei

29

Пит - Никаких персонажей!

Привет, мир в Пите


7
Я бы посчитал кодеки «символами».
Paŭlo Ebermann

3
@ PaŭloEbermann Что бы вы назвали уникальным коделом? Например разные формы? цвета? размеры? какая-то их комбинация?
Приближается к

1
@ValekHalfHeart определение уникального codel дано в спецификациях языка : это блок codel, который можно упростить как один цветной пиксель.
plannapus

@plannapus В таком случае, я не думаю, что этот вызов технически возможен в Пите. Я могу придумать что-то творческое, хотя.
Приближается к

@ValekHalfHeart О, это не была критика этого ответа: я люблю это! В любом случае, этот вызов не был кодегольфом.
plannapus

26

Perl, 29 символов

Этот ответ включает в себя х-рейтинг засорения!

say"07-8*d<#B+>!"^xRATEDkL0GZ

Perl, 23 символа

Более короткий, но не порно обуви. :-( Та же основная идея, хотя ...

say'0@@lo World!'^"x%,"

Perl, 20 символов

Скучный ...

say"Hello Wor\x6Cd!"

7
Эм .... кудрявый? +1 :)
Джош


19

Скриптинг , 11 символов

丟낆녬닆묬긅덯댦롤긐뤊

Я видел эту прекрасную программу HelloWorld в списке программ esolang Hello World .


5
Вау! Поздравляю, вы первый, кто опубликовал что-либо о любом из моих esolangs за пределами esolangs.org :) (или, по крайней мере, первый, о котором я узнал)
Timwi

18

Scala: 34 29 символов

Я горжусь собой за это:

printf("He%c%co world!\n",108,108)

Было действительно трудно преодолеть дубликаты «я», «к», кавычки и скобки. Затем я обнаружил старую printfфункцию Java , которая с радостью преобразует числа в буквы при %cналичии спецификатора формата.

Обновить

MrWonderful сделал замечательную вещь, указав, что целую кучу символов можно сохранить, используя мой второй 'l' в строке вручную!

printf("Hel%co world!\n",108)

4
@KCaloux, Поскольку вам разрешено до 2 'l, не будет ли printf ("Hel% co world \ n", 108) на 28 лучше?
MrWonderful

@MrWonderful Я думаю, что вы абсолютно правы! (Также я только что понял, что забыл включить «!»)
KChaloux

Насколько я понимаю, это недействительная запись, хотя и хорошая попытка. printfсодержит rкак делает world. То же самое касается письма, oкоторое используется более одного раза. Это основано на моей интерпретации следующего утверждения из ОП «Пример неверной программы на Python (символ« r »используется три раза): print("Hel"+chr(108)+'o world!')»
javatarz

@JAnderton У меня была программа на Ruby, которая анализировала мой сценарий, чтобы убедиться, что в нем нет символов, включенных более двух раз. Прочитайте это снова. Есть 2 rs, а не 3. Один в "printf" и один в "мире". Причина, по которой питон является недействительным, заключается в том, что он включает в себяchr
KChaloux

16

Python 3 [38 байт]

exec('import '+chr(95)*2+"h\x65llo__")

Я бы не рассматривал import __hello__как внешний ресурс.


15

Perl: 34 символа

$_="He12o wor3d!
";s{\d}{l}g;print

Образец прогона:

bash-4.1# perl -e '$_="He12o wor3d!
> ";s{\d}{l}g;print'
Hello world!

(Ничего страшного. Размещено хотя бы раз в моей жизни s///с этими причудливыми разделителями.)


15

PHP, 33 символа

Мне просто нравится, сколько PHP прощает и понимает!

<?=Hel.str_rot13("yb jbe").'ld!';

До того, как он был удален (или, если он все еще там, я полностью ослеп), я увидел комментарий, в котором говорилось: «Нет мозгов * ck?: D». Ну, как вы знаете, написать BrainF * ck практически невозможно. Но мне удалось закодировать это, только для lulz.

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

Если у вас нет интерпретатора BF, приведенный выше код просто печатает PHP: P


Я не знал, что даже такой код действителен! Тег php не закрыт, а строка Helне заключена в кавычки. Кроме того, я никогда не слышал str_rot13раньше.
Айкан Яшит

1
@ AycanYaşıt закрывающий тег php не требуется в EOF, и если вы помещаете строку без кавычек, она предполагает, что это необъявленная константа с тем же содержимым, что и ее имя, и выдает предупреждение
Einacio

1
Вы можете избежать предупреждения (и сохранить первое .), поставив Helперед <?=.
Paŭlo Ebermann

4
@ PaŭloEbermannHel<?=str_rot13("yb jbe")?>ld!
MirroredFate

2
@ PaŭloEbermann Я бы сказал, что использовать это как обман, так как это больше не чистый PHP.
Vereos

13

HTML скрипка - 21 символ

Hel&#108;o World!<br>

Это включает в себя завершающий перевод строки?
Джош

Дох ... пропустил это требование! Я добавлю фото там.
Briguy37

7
@netinept: Он попросил новую строку, а не \nтак, я бы сказал, имеет <br>значение
Крис

1
Но персонаж rповторяется в решении. Я неправильно истолковал требования?
javatarz

2
«l» и «o» тоже, но каждый символ может использоваться не более двух раз.
XEM

12

Рубин: 27 символов

puts [:Hel,'o wor',"d!"]*?l

Образец прогона:

bash-4.1# ruby <<ENDOFSCRIPT
> puts [:Hel,'o wor',"d!"]*?l
> ENDOFSCRIPT
Hello world!

Рубин: 25 символов

(На основании комментария Ваче.)

puts 'He'+?l*2+"o world!"

Рубин: 23 персонажа

(Копия ответа Powershell Данко Дурбича .)

puts"He#{?l*2}o world!"

puts 'He'+'l'*2+'o world!'на один символ короче!
Ди-

3
Но имеет 6 "'" s…
manatwork

ха-ха, я был так сосредоточен на буквенных символах, что никогда не замечал этого. неважно!
Ди-

1
Уберите пробел после пут и сделайте его 23. -puts"He#{?l*2}o world!"
Zero Fiber

1
@SampritiPanda, pвключает в себя цитаты в выводе. Я предпочитаю строго придерживаться требуемого формата вывода. Но вы правы, пространство не нужно. Спасибо.
manatwork

12

JavaScript, 66 символов

alert('Hel'+window.atob("\x62G8gd29ybGQhCg=="));//rH+in.\x689yQhC;

Вдохновленный FireFly, каждый символ, используемый этим кодом, используется ровно дважды.


Я думаю, что вам разрешено использовать некоторые символы только один раз, и вы можете оставить комментарий.
Джон Дворак

2
@JanDvorak - ну, конечно, он мог бы сделать это таким образом - но я думаю, что это решение заслуживает одобрения из-за кровожадности использования каждого персонажа ровно дважды. :-)
Боб Джарвис

6
+1, но легко использовать каждый символ ровно дважды, если просто добавить тарабарщину в качестве комментария.
Камило Мартин

11

C - 43 персонажа

main(){printf("Hel%co World!%c",'k'+1,10);}

Выход

Hello World!

Количество персонажей

' ' Count: 1    '!' Count: 1    '"' Count: 2    '%' Count: 2    ''' Count: 2
'(' Count: 2    ')' Count: 2    '+' Count: 1    ',' Count: 2    '0' Count: 1
'1' Count: 2    ';' Count: 1    'H' Count: 1    'W' Count: 1    'a' Count: 1
'c' Count: 2    'd' Count: 1    'e' Count: 1    'f' Count: 1    'i' Count: 2
'k' Count: 1    'l' Count: 2    'm' Count: 1    'n' Count: 2    'o' Count: 2
'p' Count: 1    'r' Count: 2    't' Count: 1    '{' Count: 1    '}' Count: 1

Вам не нужно и mainт. Д.?
FireFly

@FireFly Я так думаю! Он сказал, чтобы написать программу.
Кирк Бэкус

Это C, но не C ++. C ++ не имеет неявного int (и вы не можете сэкономить другого i).
Бен Фойгт

@BenVoigt Okie dokie!
Кирк Бэкус


9

nginx.conf

return  200 "He&#x6clo wo&#x72ld!\n";

В бою:

% curl -6 http://localhost/ | lynx -dump -stdin
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    21  100    21    0     0  20958      0 --:--:-- --:--:-- --:--:-- 21000

   Hello world!

%

В этом решении есть 4 пробела ...
Джош

3
@ Джош, на самом деле, их 5. Но разве ты не считаешь, что две из первых четырех являются вкладками, а последняя - неразрывным пробелом? :-)
CNST

Это подходит для меня!
Джош

@ Джош, на самом деле, теперь, когда мы используем HTML, больше не нужно set. Теперь в нем всего 3 пробела, любой из которых может быть табуляцией!
CNST

Очень красиво сделано.
Джош

9

Команда Emacs (15 нажатий клавиш)

He<Ctrl-3>l<Left>o wor<End>d!<Enter>

Если тот ответ vim является законным, то это должно быть тоже :)

Шутки в сторону, макросом тоже может стать :)

Если оставить в стороне больше чепухи, я, вероятно, смогу выжать еще немного, но на данный момент это кажется достаточно хорошим (поскольку оно превосходит vim).

PS, пожалуйста, игнорируйте всю мою ерунду (я (редко, но) тоже использую vim!).


2
Я все еще думаю vim> emacs.
Джо З.

6

Befunge 98

a"!dlrow ol":'e'Hck,@

Вот версия, где каждый персонаж появляется дважды.

bka!e:dw"H@!dlrow  ol":'e'Hbk,a,@

Оставляет кучу мусора в стеке.

В качестве бонуса каждый персонаж имеет что-то сделанное с IP.


6

Malbolge

(=<`#9]~6ZY32Vw/.R,+Op(L,+k#Gh&}Cdz@aw=;zyKw%ut4Uqp0/mlejihtfrHcbaC2^W\>Z,XW)UTSL53\HGFjW

К сожалению, кажется, что это печатается Hello, world.вместо Hello world!\n:( Попробуйте онлайн! Впечатляет, но недействительно.
DLosc

5

На самом деле я не люблю обманывать: P

питон

print("!dlrow os%eH"[::-1]%('l'*2))

2
Вы должны указать, что это для python2. В python3 вы получаете обратную строку в качестве вывода, а затем a TypeError.
Бакуриу

1
Для использования в Py3K аргумент print должен быть заключен в скобки. print("!dlrow os%eH"[::-1]%('l'*2))работать в обеих (Python2 и Py3K) версиях.
AMK

4

GolfScript

'He

o world!'n/"l"*

Подставляет две новые строки (к счастью, третья, необходимая для подстановки, предоставляется встроенным n), используя оба типа строкового литерала, чтобы избежать четырехкратных копий кавычки. Поскольку lэто единственный символ, встречающийся более двух раз в исходной строке, это не так уж сложно.


Вы забыли "!"
Говард

@ Ховард, пропустил это. К сожалению.
Питер Тейлор

Письмо о повторяется также
Адам Спейт

1
@AdamSpeight: Буква только в два раза o. Правила гласят, что нельзя иметь персонажа более двух раз .
ProgramFOX

4

Хм.

В C, учитывая эти правила, мы можем иметь только одно #define(из-за iи n) и самое большее два вызова функции ИЛИ определения ( (и )).

Я предполагаю, что есть только один способ сделать это (хотя я, вероятно, ошибаюсь):

main(){puts("Hello w\x6fr\154d!");}

Вам все еще нужно вывести завершающий символ новой строки. Выполнить этот вызов в Си сложно ...
Джош

1
@ Джош, я просто должен использовать puts()вместо printf().
Оберон

2
Но что случилось с oв world?
VisioN

@VisioN В старом наброске того же кода (до того, как я понял, насколько сложно было написать такую ​​программу), я использовал другое «о» в другом месте. Но это не код-гольф , так что, думаю, это не нужно исправлять.
Оберон

4
На самом деле, я не уверен, почему каждый ответ отображает количество символов.
Оберон

4

BASH

printf 'Hel\x6co world!\n'

Cred @manatwork

echo $'Hel\x6c\x6f world!'

Первый из них имеет 3 «е» и 3 «о».
manatwork

@manatwork: Gag; спасибо;)
Runium

В Bash можно пропустить -e, используя специальный $'…'синтаксис: echo $'Hel\x6c\x6f world!'.
manatwork

4

C - 46 символов

main(){printf("He%clo wor%cd!\x0d",'l',108);}

Распечатывает:

Привет, мир!


Если вы стремитесь к гольфу, main(){printf("He%clo world!%c",108,10);}должны работать, и сэкономит вам несколько символов.
FireFly

@FireFly ты прав, ты бы спас мне 3 символа. Ваше предложение тоже отлично работает.
Филипп Кинкейд

4

Фуга

Из esolang wiki:

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

И вы можете слушать исходный код .


11
Я бы сказал, что это неверно. Я вижу более 4 средних букв в правой руке.
Джастин

4
Не говоря уже о последовательности из четырех последовательных G в 9-й мере.
Джо З.

Вы написали это или только сделали это? Учитывая, что вы ссылаетесь на MIDI-архив esolang.
FireFly

4
-1 за плагиат. Это из esolang wiki . Вы не цитируете это. Редактировать: отменено, теперь цитируется esolang wiki.
Джастин

-1 за использование одной и той же ноты более 2 раз.
Эрик Outgolfer

4

PHP

32 символа

Обратите внимание, что я не использую символ более двух раз, так как l! = L

He<?=strtolower("LLO WOR");?>ld!

Также обратите внимание, что, несмотря на то, что Stack Overflow удаляет его в представлении, после !.


1
Вы используете три пробела, но я думаю, это можно исправить, удалив те, что рядом с тегами PHP! : P
Vereos

1
Это было быстро, хотя я понял, прежде чем читать ваш комментарий (из другого ответа на самом деле)
Francisco Presencia

Разве вывод «Н» не должен быть прописным?
Дэвид Кэри

Совершенно верно, пропустил это тоже):
Франциско Presencia

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