Привет мир с изюминкой

17

Ваша цель : написать фрагмент кода, который приведет к классическому результату «Привет, мир!» распечатывается на STDOUT или эквивалентный.

Правила : Код должен быть полностью напечатан ASCII. Весь код должен быть функциональным - удаление любого символа подсчета должно изменить результат или привести к тому, что код не будет работать. Все переменные должны использоваться после присваивания. Символьные и строковые литералы должны быть необходимы для вывода - то есть замена любого символьного литерала или любого символа в строковом литерале другим символом должна быть способна изменить результат (а не посредством эффекта escape-последовательности - замена символа обратной косой чертой или эквивалент)

(ПРИМЕЧАНИЕ: окончательное правило было отредактировано в)

Скоринг : это то, где это становится интересным. Наивысший балл выигрывается в зависимости от количества символов в соответствии с типичными правилами боулинга. Но повторное использование символов приведет к вычету очков. В частности ...

  1. Повторное использование любого буквенно-цифрового символа (az, AZ, 0-9) приведет к вычету 3 балла за повтор (первое использование не приводит к вычету).
  2. Повторное использование базовой пунктуации ([!? .-, ": ';]) - включая скобки - приведет к вычету 2 баллов за повтор.
  3. Повторное использование других символов ASCII {`~ @ # $% ^ & * _ + = | \ /> <} - включая фигурные скобки - приведет к вычету 4 баллов за повтор.
  4. Повторное использование пробелов, табуляции и переносов приведет к вычету 1 балла за повтор. Таким образом, только первое использование пробела, табуляции или новой строки будет засчитываться в общую сумму.

Примечание: комментарии не учитываются в общем количестве, хотя символы, отмечающие начало / конец комментария, учитываются. Например, в C / C ++, если у вас есть /* This is a comment */, то он будет считать две косые черты и две звездочки, но ничего между ними.

Некоторые примеры (примечание: использование Julia в качестве примера языка) ...

print("Hello, world!");

Всего видимых символов: 22
Содержит пробел: +1
Повторные буквенно-цифровые цифры: -12 для ллора
Повторная пунктуация: -2 для "
Окончательного результата: 22 + 1-12-2 = 9

print("Hel",char(108),"o, wor",0x108,"d!"); # 0x108 makes a Uint8 that prints as ASCII

Всего символов: 43 (не считается ни одного символа после #, который является символом комментария).
Содержит пробел: +1
Повторные буквенно-цифровые цифры: -18 для rr1008
Повторная пунктуация: -24 для () "" "" ",,,,,
Final оценка: 43 + 1-24-18 = 2

xy=STDOUT
m="Hello, world!"
print(xy,m);

Всего видимых символов: 37
Содержит символ новой строки : +1
Содержит пробел: +1
Повторные буквенно-цифровые цифры: -18 для ксиллора
Повторная пунктуация: -4 для ",
Повторные другие ASCII: -4 для =
Окончательный счет: 37 + 1 + 1-18-4 -4 = 13

Пара недействительных кусков кода ...

x=2;print("Hello,world!")  

Проблема: xназначена, но не используется.

print("Hello,"*" world!")  

Проблема: *не нужна, результат будет без нее.

k=1
if k>0
  print("Hello, world!")
else
  print("abcghjmquvxyzABCDEFGIJKLMNOPQRSTUVWXYZ_+*-&|")
end  

Проблема: вторая printкоманда не будет запущена. Кроме того, удаление символов в кавычках во второй printкоманде не изменит вывод.

x="Hello, world!";
print(x)  

Проблема: удаление новой строки не изменит результат и не приведет к ошибке (в Julia точка с запятой необходима, только если несколько команд находятся в одной строке, в противном случае просто подавляется возвращаемое значение).

print("Hellos\b, world!")  

Проблема: sперсонаж не влияет на результат, так как он стирается \b. Это допустимо, если выполняется с помощью code ( "Hello",char(100),"\b, world!"), но не может быть выполнено с помощью строковых литералов или символьных литералов.

Удобный счет-калькулятор - http://jsfiddle.net/4t7qG/2/ - благодаря Doorknob

Глен О
источник
1
Кажется, очень близко к codegolf.stackexchange.com/questions/19477/… и codegolf.stackexchange.com/questions/18721/…
Кайл Канос
1
Это имеет отношение к вашей дискуссии. Meta.codegolf.stackexchange.com/questions/777/…
Мартин Эндер,
3
Я создал JSFiddle, где вы можете поместить свой код, и он автоматически определит ваш счет. Не могли бы вы со мной отредактировать ссылку на нее в посте?
Дверная ручка
1
@Dennis - если ваша программа создает новую строку из-за этой команды, нет проблем (например, println в Julia печатает, а затем добавляет новую строку в конце). Но это не должно быть частью строки.
Глен О
1
@ACarter - в основном, да. Но ограничения и выводы делают его нетривиальным.
Глен О

Ответы:

17

Perl - 96

(Довольно хорошо, учитывая теоретический максимум 97 баллов)

s{}[Hel0o, w3$=d!];y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(
    6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)+print

(Обратите внимание, что вторая строка начинается с фактического \tсимвола табуляции)

Код длиной 98 символов содержит каждый символ ascii ровно один раз, плюс дополнительный -.
98 - 2 = 96

Здесь нет строковых литералов, но удаление любого отдельного символа нарушает работу программы.

деобфускации

В этой программе есть 3 оператора (на самом деле 2, но я использовал их +как разделитель операторов)

  1. s{}[Hel0o, w3$=d!]
    Это очень натянутый случай оператора sed. Это чаще пишется как s/a/b/, или s:a:b:, но Perl позволяет гораздо больше фантазии здесь:, s(a)(b) s(a)^b^ s(a)[b]и даже s qaqbq.
    Он заменяет пустую строку (внутри {}) на Hel0o w360d!(внутри []) ( $=интерполирует до 60по умолчанию). Из-за отсутствия ~=оператора он работает $_.

  2. y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)
    Это также очень растянутый случай, но trоператора, который также называется y( y< >( )).
    Давайте посмотрим на таблицу замены:
    " # %&'*.124578:?@BCDEFGIJKLMNOQ /-9
    \n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cA k-u
    я переместил некоторые символы, чтобы существующая строка не была разбита. Единственная реально работающая часть здесь /-9-> k-u. Он заменяется 0на l, 3с o, и 6с r.
    Опять же из-за отсутствия ~=оператора, он работает $_
    так что теперь у нас есть полная фраза в $_переменной.

  3. print
    Отсутствие аргументов заставляет его печатать только $_переменную.

МНИИП
источник
Я недостаточно знаю Perl, чтобы это прокомментировать - каков набор символов между <и +?
Глен О
@GlenO Only /-9и k-uфактически используются для преобразования строки. Остальное - мусор одинакового размера . Если вы удалите только один символ, наборы будут смещены, и программа не выдаст «Hello, world!» больше.
Мниип
В таком случае, каким образом выполняется «мусор»? То есть, как это работает? Если это просто заполнитель, который перепрыгивает код, то это эквивалентно неработающему коду в условном выражении.
Глен О
3
@GlenO Это не так. Для спецификации: <...> removal of any single counting character must change the result or cause the code to not function.удаление 1 символа в любом месте нарушает его. Вы можете заставить его работать, удалив 2 символа, но это не в правилах.
Мниип
2
All code must be functional, Вы явно нарушаете правила, по крайней мере. Я не говорю "это нарушает правила", но это определенно сомнительно.
Глен О
7

Этот ответ был создан до добавления правила о строковых литералах и не участвует в конкурсе.

#include <iostream>
int main(){std::cout<<56+"  !$%^&*?12347890-_QWERTYUIOPASDFGJKLZXVBNM,.qypfghjk:zvbHel\x6Co, world!";}

Это совершенно законно. : P Если вы удалите какой-либо символ из этой строки, он напечатает ello, world!.

HolyBlackCat
источник
Пожалуйста, включите оценку вашего кода в свой ответ.
ProgramFOX
Также это не изменит ваш счет, но пробелы вокруг <<должны быть удалены.
Мартин Эндер
1
Хммм ... хотя я и аплодирую вашему ответу, он в первую очередь выявил небольшую дыру в моих ограничениях. Я собираюсь дать вам голос, и я рад, что другие будут делать то же самое, если им это нравится, но я буду редактировать с дополнительным ограничением.
Глен О
1
Хорошо, в дополнение к моему предыдущему комментарию я добавил ограничение о том, что строковые и символьные литералы должны быть релевантными - замена символов внутри них должна иметь возможность изменить результат. Это позволяет использовать if 'x'>'w'методы, но блокирует "k \ bH", например, "H". Не стесняйтесь вносить второй ответ после добавленного ограничения.
Глен О
4

CJam, 94

{'H"EJO, WoRLD!"el96A+c/~_-3=0$@}"# 
`&^<>|;:?.()[]\1aBCdfFgGhiIjkKmMnNpPqQrsStTuUvVwxXyYzZ"254b87%*

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

  • 100 символов
  • повторный выпуск: -0 ()
  • повторная пунктуация: -6 ("" ")
  • повторил другое: -0 ()
  • повторяющиеся пробелы: -0 ()

Общий балл: 94

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

"#  
`&^<>|;:?.()[]\1aBCdfFgGhiIjkKmMnNpPqQrsStTuUvVwxXyYzZ"
:A,,{_A\<A@)>+254b87%}%`

Он печатает массив, показывающий, сколько раз Hello, world! будет напечатан, если символ, соответствующий индексу, будет удален.

Деннис
источник
Когда я запускаю его по вашей ссылке, он выдает "Hello, world!" шесть раз подряд. Кроме того, что делает строка символов?
Глен О
Я предполагаю, что перевод строки - это ошибка - удаление заставляет его работать.
Глен О
Копировать-вставить вопрос. Там должен быть табулятор прямо перед LF. Похоже, SE не позволит мне сделать это ... Строка считается числом base-254 ( 254b). Модуль конечного результата 7 должен быть равен 1, поэтому предыдущий блок кода выполняется один раз. Мне понадобится модуль, чтобы сделать каждый символ необходимым.
Деннис
Ну, после добавления в закладке недостающего (который делает «исправить» код), удаляя Z, то T, или , возможно , несколько других символов не меняет результата.
Глен О
Я ужасно неправильно истолковал часть вашего вопроса. Это исправлено сейчас.
Деннис
3

Руби, 28 41

Просто чтобы начать ответы с решения в духе вопроса:

print"He#{?l*2}o, "+'world!'if[$`&(9<=>6)^7|~8-5/3.1%0x4]

Скоринг (думаю, я понял это правильно):

  • 57 символов
  • повторный выпуск: -12 ( orli)
  • повторная пунктуация: -4 ( "')
  • повторил другое: -0
  • повторный пробел: -0
Дверная ручка
источник
Выглядит хорошо для меня, с точки зрения выигрыша. Не нужно включать штрафы, которые не применяются, но не вредно, включая их.
Глен О
.В 3.1могут быть удалены без проблем. Как может xв 0x4или -в 8-5.
3

PHP, 1 (да, одно очко!)

Использование магических символов для генерации контрольной суммы, которая в двоичной форме соответствует «Ад», «o, w», «orld» и «!».

Обычно я люблю находить лазейки, но на этот раз я решил играть в духе и намерении конкурса. Каждый персонаж и его позиция имеет важное значение для вывода. Единственное место , где вы можете заменить имена переменных , которые не являются буквальные значения, пробелы между phpи foreachкоторые PHPрассматривает в качестве эквивалента, и использование 'против" которых PHPтрактует как подобные.

<?php foreach(array('_MC:`~+V4@SbHR/l[J','dN#UB`5!Rv^NG@D}','9gm6L&-kuD','8OM97g.q]XQ0')as$j)print(hash("crc32",$j,1))?>

К вашему сведению, вот некоторые другие интересные магические строки и хэши:

E.D}S:  Hell
9UDIRQ: Hell
N\7&*`%:    orld
UWX[E^O:    orld
mAHzDEb:    !   
uLJ7Ck&:    Hell
B+bG5mYJ:   Hell
:OvMzuOR:   !   
TgYR9g!6k:  o, w
NkFN`!8mI:  o, w
N#VA\j~}J[: Hell
vEl*]@0XQ5: o, w
9gm6L&-kuD: orld
*}{Xg@HN`\: !   
Pj@Y44uA6YJ:    Hell
|7OX0VF8gv}:    !   
DLRJAjgMj}\:    !   
!0bT*D}O4Lw:    orld
YGN97^v7ZY`:    Hell
++~bL/kP:|]W:   o, w
8OM97g.q]XQ0:   !   
l^m-DqZ^g[&+:   !   
Ewu]Rv~*DHQ7:   Hell
JIqjgF|S!\`8l:  Hell
b4l!MEG7vTu6/:  Hell
+B:zEq*J\k-Cm:  !   
_}E7wZD76^`Y9AU:    orld
q:Nq-~+_S7~N9Hz:    !   

источник
Функции кода еще , если я удалить \t, \nили пространство. Не эксперт по PHP, но также ;кажется необязательным.
Мниип
@mniip - изменения сделаны. Я не знал, что точка с запятой была необязательной в некоторых случаях.
3

Befunge-98 , 97 баллов!

"v!dlrow ,h
B[CDEFGIJkLMNOPH
$<QRSTUV@|5cg1fe':-%\64*ab+7_/89}{0  j2
WXYZK`.=#>]
s()impq	n 3~
Atuxz&;y^ ?

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

Вкладка находится между qи n.

Использует трюк, аналогичный предыдущему ответу Befunge, чтобы заполнить строки оставшимися символами, но избегает использования повторяющихся символов в разделе выполнения. Удаление любого из неисполняемых символов приводит к тому, что исполняемые части оказываются не на своем месте, обычно заканчивая бесконечными циклами или печатая неправильный вывод.

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

Действительно, единственная исполняющая часть выглядит так:

"v!dlrow ,h
         k     H
$<      @|5cg1fe':-%\64*ab+7
         >]
        ^ ?

Сначала для добавления , world!в стек используется строковый литерал . Это позволяет избежать двух "с.

$<      @|5cg1fe':-%\64*ab+7

Это добавляет Helloв стек, используя различные методы, чтобы избежать дублирования символов.$выскакивает лишнее пространство, вызванное литералом строки переноса.

7+добавляет 7 к hконцу строкового литерала для создания o . ba*46\%:вычисляет 111, значение ASCII lи дублирует его.

'e добавляет е в стек.

f1g получает персонажа в 1,15, который является H

Затем он повторно использует ,строку для распечатки целого Hello, world!. Все остальное - просто изменение направления для перехода к финалу @.

Джо Кинг
источник
1

Руби, 78

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

puts('Hello, world!')if%["\#$&*+-/:;<>?@ABCDEFGIJKLMNOPQRSTUVWXYZ^_`abcghjknqvxyz{|}~123].sum==4980
histocrat
источник
3
Проблема в том, что все, что ifможет быть удалено, в том числе и после .
Seequ
@TheRare - в этом нет ничего плохого, если ifфункция действительно работает, а материал после нее все еще подчиняется правилам.
Глен О
@GlenO Но разве это не считается "сменным кодом"? Просто puts('Hello, world!')бы сработало. Я думаю, что правила требуют уточнения, если это законно.
Seequ
@TheRare - задним числом, я, вероятно, должен был использовать широкое «подмножество кода не должно быть способным к тому же выводу», но я не думаю, что я должен продолжать изменять правила. Пока они стоят, пока код функционален и не является произвольным, и следует другим правилам, он является законным. По крайней мере, этот метод решения недостижим в большинстве языков (редактирование, которое я сделал, закрыло лазейку, которая работает в большинстве языков).
Глен О
@GlenO Ты судья. Просто попросите меня удалить эти комментарии, если вы считаете, что они не нужны.
Seequ
1

PHP, 2257

Лазейка: обратная косая черта была исключена из спецификации и калькулятора очков!

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

Отличная особенность обратной косой черты в PHPтом, что их нужно экранировать, так что счет автоматически удваивается! Вы можете удвоить, утроить и т. Д. Счет, умножив количество обратных слешей, но не хотите быть жадным, и я думаю, что он может превысить пределы того, что вы можете ввести.

<?php foreach(array('\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\')as$x)print(chr(substr_count($x,"\\")))?>

источник
Это явно не что иное, как опечатка в описании, а не лазейка. Более того, вы уже знали это. В описании явно говорится «другие символы ASCII». К тому времени, когда вы прочитаете это, оно будет отредактировано, чтобы включить его.
Глен О
В частности, обратная косая черта была в источнике вопроса, но я не понял, что он рассматривал это как escape-последовательность.
Глен О
Это не изменение правил, это исправление незначительной опечатки. Обратная косая черта была в правилах, она просто не отображалась (чтобы убедиться в этом, нажмите кнопку «отредактировано», затем нажмите «Уценка рядом»). А другие не используют лазейки, они используют особенности своих языков.
Глен О
1

Befunge - 87

"dlrow ,olleH"bk,                                                                   v
!#$%&'()*+-./0123456789:;  <=>?ABCDEFGIJKLMNOPQRSTUVWXYZ[\]^_`acfghijmnpqstuvxyz{|}~@

Первая строка стоит четыре очка из-за всех повторений, но во второй строке нет повторяющихся символов. Единственный строковый литерал в этом коде dlrow ,olleH, который переворачивается и печатается как вывод. Удаление какого-либо одного символа приведет к отключению vв конце первой строки от @в конце второй, что приведет к тому, что программа никогда не прекратит работу. Если vсамо по себе будет удалено, то код перейдет в бесконечный цикл, выводящий правильный вывод.

pppery
источник
0

Точность !!, -138 (и да, это отрицательно 138)

Хотя это, возможно, не лучший результат, который я когда-либо получал в PPCG, я сомневаюсь, что он может быть выше, чем в Acc !!

108
Write 72
Write 101
Count i while i-2 {
	Write _
}
Write _+3
Write 44
Write 32
Write 119
Write 111
Write 114
Write _
Write 100
Write 33

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

FantaC
источник