Ваша цель : написать фрагмент кода, который приведет к классическому результату «Привет, мир!» распечатывается на STDOUT или эквивалентный.
Правила : Код должен быть полностью напечатан ASCII. Весь код должен быть функциональным - удаление любого символа подсчета должно изменить результат или привести к тому, что код не будет работать. Все переменные должны использоваться после присваивания. Символьные и строковые литералы должны быть необходимы для вывода - то есть замена любого символьного литерала или любого символа в строковом литерале другим символом должна быть способна изменить результат (а не посредством эффекта escape-последовательности - замена символа обратной косой чертой или эквивалент)
(ПРИМЕЧАНИЕ: окончательное правило было отредактировано в)
Скоринг : это то, где это становится интересным. Наивысший балл выигрывается в зависимости от количества символов в соответствии с типичными правилами боулинга. Но повторное использование символов приведет к вычету очков. В частности ...
- Повторное использование любого буквенно-цифрового символа (az, AZ, 0-9) приведет к вычету 3 балла за повтор (первое использование не приводит к вычету).
- Повторное использование базовой пунктуации ([!? .-, ": ';]) - включая скобки - приведет к вычету 2 баллов за повтор.
- Повторное использование других символов ASCII {`~ @ # $% ^ & * _ + = | \ /> <} - включая фигурные скобки - приведет к вычету 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
Ответы:
Perl - 96
(Довольно хорошо, учитывая теоретический максимум 97 баллов)
(Обратите внимание, что вторая строка начинается с фактического
\t
символа табуляции)Код длиной 98 символов содержит каждый символ ascii ровно один раз, плюс дополнительный
-
.98 - 2 = 96
Здесь нет строковых литералов, но удаление любого отдельного символа нарушает работу программы.
деобфускации
В этой программе есть 3 оператора (на самом деле 2, но я использовал их
+
как разделитель операторов)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
по умолчанию). Из-за отсутствия~=
оператора он работает$_
.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
.Опять же из-за отсутствия
~=
оператора, он работает$_
так что теперь у нас есть полная фраза в
$_
переменной.print
Отсутствие аргументов заставляет его печатать только
$_
переменную.источник
/-9
иk-u
фактически используются для преобразования строки. Остальное - мусор одинакового размера . Если вы удалите только один символ, наборы будут смещены, и программа не выдаст «Hello, world!» больше.<...> removal of any single counting character must change the result or cause the code to not function.
удаление 1 символа в любом месте нарушает его. Вы можете заставить его работать, удалив 2 символа, но это не в правилах.All code must be functional
, Вы явно нарушаете правила, по крайней мере. Я не говорю "это нарушает правила", но это определенно сомнительно.Этот ответ был создан до добавления правила о строковых литералах и не участвует в конкурсе.
Это совершенно законно. : P Если вы удалите какой-либо символ из этой строки, он напечатает
ello, world!
.источник
<<
должны быть удалены.if 'x'>'w'
методы, но блокирует "k \ bH", например, "H". Не стесняйтесь вносить второй ответ после добавленного ограничения.CJam, 94
Попробуйте онлайн! Обратите внимание, что должен быть табулятор прямо перед переводом строки. SE не любит табуляторы, поэтому вам придется вставить его вручную.
Общий балл: 94
Я использовал следующий код, чтобы проверить, что ни один из символов внутри строки не может быть удален:
Он печатает массив, показывающий, сколько раз Hello, world! будет напечатан, если символ, соответствующий индексу, будет удален.
источник
254b
). Модуль конечного результата 7 должен быть равен 1, поэтому предыдущий блок кода выполняется один раз. Мне понадобится модуль, чтобы сделать каждый символ необходимым.Z
, тоT
, или , возможно , несколько других символов не меняет результата.Руби,
2841Просто чтобы начать ответы с решения в духе вопроса:
Скоринг (думаю, я понял это правильно):
orli
)"'
)источник
.
В3.1
могут быть удалены без проблем. Как можетx
в0x4
или-
в8-5
.PHP, 1 (да, одно очко!)
Использование магических символов для генерации контрольной суммы, которая в двоичной форме соответствует «Ад», «o, w», «orld» и «!».
Обычно я люблю находить лазейки, но на этот раз я решил играть в духе и намерении конкурса. Каждый персонаж и его позиция имеет важное значение для вывода. Единственное место , где вы можете заменить имена переменных , которые не являются буквальные значения, пробелы между
php
иforeach
которыеPHP
рассматривает в качестве эквивалента, и использование'
против"
которыхPHP
трактует как подобные.К вашему сведению, вот некоторые другие интересные магические строки и хэши:
источник
\t
,\n
или пространство. Не эксперт по PHP, но также;
кажется необязательным.Befunge-98 , 97 баллов!
Попробуйте онлайн!
Вкладка находится между
q
иn
.Использует трюк, аналогичный предыдущему ответу Befunge, чтобы заполнить строки оставшимися символами, но избегает использования повторяющихся символов в разделе выполнения. Удаление любого из неисполняемых символов приводит к тому, что исполняемые части оказываются не на своем месте, обычно заканчивая бесконечными циклами или печатая неправильный вывод.
Как это устроено
Действительно, единственная исполняющая часть выглядит так:
Сначала для добавления
, world!
в стек используется строковый литерал . Это позволяет избежать двух"
с.Это добавляет
Hello
в стек, используя различные методы, чтобы избежать дублирования символов.$
выскакивает лишнее пространство, вызванное литералом строки переноса.7+
добавляет 7 кh
концу строкового литерала для созданияo
.ba*46\%:
вычисляет 111, значение ASCIIl
и дублирует его.'e
добавляет е в стек.f1g
получает персонажа в 1,15, который являетсяH
Затем он повторно использует
,
строку для распечатки целогоHello, world!
. Все остальное - просто изменение направления для перехода к финалу@
.источник
Руби, 78
Я чувствую, что больше правил нарушает, не совсем точно, каким будет патч. Принимает длинную строку и проверяет сумму результата, поэтому любое удаление или изменение приведет к сбою программы. Вероятно, может быть немного оптимизирован, чтобы удалить дублирование некоторых букв и получить пробелы там.
источник
if
может быть удалено, в том числе и после .if
функция действительно работает, а материал после нее все еще подчиняется правилам.puts('Hello, world!')
бы сработало. Я думаю, что правила требуют уточнения, если это законно.PHP, 2257
Лазейка: обратная косая черта была исключена из спецификации и калькулятора очков!
Этот код подсчитывает количество появлений обратной косой черты в каждой строке и печатает эквивалент ASCII. Замена любого обратного слеша другим символом или удаление обратного слеша либо вызывает ошибку разбора, либо изменяет результат.
Отличная особенность обратной косой черты в
PHP
том, что их нужно экранировать, так что счет автоматически удваивается! Вы можете удвоить, утроить и т. Д. Счет, умножив количество обратных слешей, но не хотите быть жадным, и я думаю, что он может превысить пределы того, что вы можете ввести.источник
Befunge - 87
Первая строка стоит четыре очка из-за всех повторений, но во второй строке нет повторяющихся символов. Единственный строковый литерал в этом коде
dlrow ,olleH
, который переворачивается и печатается как вывод. Удаление какого-либо одного символа приведет к отключениюv
в конце первой строки от@
в конце второй, что приведет к тому, что программа никогда не прекратит работу. Еслиv
само по себе будет удалено, то код перейдет в бесконечный цикл, выводящий правильный вывод.источник
Ачето , 3
Наконец-то удалось получить положительный балл!
Попробуйте онлайн!
источник
∑
не в печати ASCIIТочность !!, -138 (и да, это отрицательно 138)
Хотя это, возможно, не лучший результат, который я когда-либо получал в PPCG, я сомневаюсь, что он может быть выше, чем в Acc !!
Попробуйте онлайн!
источник