Эта идея не моя, хотя я не знаю, откуда она взялась. Однажды я встретил его на конкурсе по программированию очень давно (1998, если я правильно помню). Задача состоит в том, чтобы написать программу на вашем любимом языке, который выводит 2012
и только 2012
. Загвоздка в том , что программа должна еще выход 2012
после любого одного из его персонажей изменяется. Модификация может быть либо вставкой, удалением или заменой. Конечно, модификация будет такой, что программа все еще синтаксически допустима.
Поскольку я не знаю всех языков программирования, я должен попросить аудиторию помочь мне и проверить представленные ответы.
Добавлено: Многие отмечают, что мое определение приемлемых модификаций слишком расплывчато. Вот моя вторая попытка: разрешенные изменения оставят вашу программу синтаксически действительной и не приведут к ее аварийному завершению. Там, я думаю, это должно охватывать все ошибки времени компиляции, компоновки и выполнения. Хотя я уверен, что на каком-то языке в любом случае будет какой-то странный случай, поэтому, когда это произойдет, мы рассмотрим его индивидуально.
Ответы:
C, 53 символа
Немного дольше, чем отвечает язык сценариев, и следует тому же основному принципу. Полагается на тот факт, что из-за ограничений синтаксиса C единственные буквы, которые можно было бы изменить, не делая программу недействительной, находятся внутри строк!
Изменить: сбрил 4 символа.
Reedit: Прочность увеличена, сбрил одного персонажа.
Повторное редактирование: длиннее, но надежнее. Просто попробуйте
&
сейчас! (Правильно на этот раз).Обновление: немного укорочено; побеждает большинство подходов, замеченных до сих пор.
Обновить: заменено int на void; должен победить последний возможный подход, чтобы сломать это, я могу думать.Обновить: я думаю о другом подходе; замена последнегоa
(может гнить) на0
; использование двухбуквенных имен должно решить эту проблему.Обновить: последнее обновление отменено; предполагается, что изменения, вызывающие ошибки во время выполнения, запрещены;
a
будет работать просто отлично.Обновление: возвращение назад немного больше; пытаясь разыменовать
*a
также приведет к ошибке; поэтому использовать егоvoid
для исключения ошибки компиляции не нужно.Обновить: и окончательное сокращение; это полагается на строку
"2012"
, размещенную по одному адресу (который является общим); и что литеральные строки доступны только для чтения (также распространены).Обновление: это стоило мне двух персонажей, но я победил вашу маленькую точку с запятой!
источник
register void
;register
Есть , чтобы предотвратить&
;void
есть предотвратить*
.;
междуputs
и(
.2012
! (Я использовал только печатные символы ASCII для тестов на вставку и замену, но я сомневаюсь, что расширение репертуара помогло бы.)==
на!=
троичный, это никуда вас не приведет ; вместо выводаa
теперь выводит"2012"
.Хаскелл, 19
или, как полная программа,
29
Для немного большего удовольствия:
Чтобы получить тот, который не может быть изменен таким способом, который приводит к простой ошибке времени выполнения, мы можем закодировать информацию в длинах списков, которые не могут быть изменены, используя только односимвольные изменения, т.е.
Чтобы сделать его более изменяемым (безопасным), мы также можем использовать само число в качестве элемента списка - просто нужно сделать его строками, чтобы не поменять запятые на плюс ':
Поскольку эта строка является просто результатом выражения, мы также можем снова заменить ее этим - не проблема благодаря ленивости Хаскелла
6472Эти
init
действия , как «минус один, но неотрицательное» здесь.Мы также можем включить систему типов в схему избыточности, а затем записать число таким образом, чтобы его можно было изменить с помощью односимвольных изменений ...
(
GHCi> twothousandandtwelve
≡>"2012"
)Теперь вы можете изменить любой вариант
u
наp
обратный, но это всегда испортит глубину укладки списков во втором элементе кортежа и, таким образом, вызовет ошибку во время компиляции.Эта идея может быть расширена таким образом, чтобы целые тексты можно было компактно кодировать, легко читать и редактировать, и при этом не было возможности изменять отдельные символы.
И еще один ...
источник
a=map(head.show.length)[[a,a],[],[a],[a,a]]
решения вставьтеa
между[]
. Мне действительно нравится этот пост, хотя! Очень умные решения.[a]
->[]
в решении с 64 символамиJavaScript
Я полагаю, что это доказательство ошибки времени выполнения, любое одно изменение должно привести либо к ошибке компиляции, либо к одному предупреждению о 2012.
Изменить: Код будет делать ошибку во время выполнения на что-то вроде
if("alert(2012 "==r)
, я переместил раздел попробовать, чтобы справиться с этим.Изменить: Хороший Vilx-, но это поправимо :-) Теперь есть несоответствие скобок для вставки этой точки с запятой.
Изменить: Но тогда запятая может сделать то же самое, что и точка с запятой, то есть множество опций, я думаю, что я это исправил, но сейчас очень много кода.
Изменить: немного упростил.
Изменить: еще один в бесконечной серии исправлений.
Изменить: Это вроде более длинный и сложный, чем пуленепробиваемый, но он должен по крайней мере заботиться о
~eval
и!eval
.источник
q-")"
возвращаетсяNaN
, в который eval конвертируется"NaN"
перед его вычислением, что просто возвращает его обратноNaN
. Странная вещь, но технически законная, так что это не вызывает улова.;
междуeval
и(
.~
передeval
причинами, он будет повторяться2012
дважды, а не один раз. Не уверен, что это не подчиняется правилам или нет: P!
послеeval(
ломает его.Perl, 49 символов
На основании ответа JB , но этот на самом деле удовлетворяет спецификации . Полная проверка указывает на то, что каждое удаление, вставка или замена одного символа либо оставляет выходные данные без изменений, либо вызывает сбой программы при запуске (как указано ненулевым возвращаемым значением и выводом в stderr), по крайней мере, до тех пор, пока вставки и замены ограничены печатными символами ASCII.
(Без ограничения задача невозможна в Perl: малоизвестная особенность парсера Perl заключается в том, что он останавливается, когда встречает символ Ctrl-D или Ctrl-Z, поэтому вставка любого из них перед любым поворотом файла это в действительную программу Perl, которая ничего не делает.)
Изменить: сбрил еще один символ, заменив
1==print
на0-print
.источник
print
начинает возвращаться'true'
вместо 1 :-Pprint
в любой версии Perl 5 нет планов по изменению возвращаемого значения , даже если это явно не задокументировано .)Brainfuck
Я пытаюсь убедить себя в том, что это возможно, и я вполне уверен, что, возможно, слишком сильно растянул его. Я сделал несколько предположений о моей среде:
К сожалению, если вы станете более строгими, я боюсь, что это будет невозможно. Вот мое решение:
По сути, вы можете изменить выходной код или код подтверждения, но не оба. Один из них гарантированно работает. Если один из них этого не сделает, он «рухнет».
источник
python2
Мне пришлось немного изменить тестовый скрипт Рэя, чтобы проверить это, так как редирект stdout ломал его. Передача пустых диктов в exec позволяет избежать загрязнения пространства имен.
источник
Brain-Flak , 44 + 3 = 47 байт [Не конкурирует]
Это использует
-A
флаг Brain-Flak и выводит символы2012
в STDOUTПопробуйте онлайн!
Альтернатива, 50 байтов
Попробуйте онлайн!
объяснение
Любая односимвольная модификация любого из вышеуказанных кодов приведет к ошибке программы.
источник
СиСи , не конкурирующая
Наконец я думаю, что нашел один из моих языков, который работает. Это ужасно долго, и язык новее, чем вопрос, но он все еще ощущается как достижение.
О Сиси
Sisi - это игрушечный язык, вдохновленный сборкой и QBasic. Это хорошо для этой задачи, потому что ее синтаксис чрезвычайно ограничен.
set
,print
,jump
, иjumpif
.set
утверждениях. Они могут содержать (максимум) одну операцию, которая должна быть двоичной. В частности: изменениеprint xx
наprint -xx
является синтаксической ошибкой.Программа
Ядром программы является эта часть:
Мы храним
2012
вxx
, затем проверяем, было ли это успешно, и сохраняем результат теста вy
. Еслиy
это правда, перейдите к строке 55. (Переход к несуществующим номерам строк просто перемотка вперед на следующую строку.)Радиационная закалка
y
false, скачок не происходит, а в строке 4 устанавливаетсяxx
значение 2012.xx
будет установлено значение 2012, независимо от того, предпринимаем мы переход или нет.print
рано или поздно доставит ее на линию 955. Невозможно с помощью одной модификации перейти назад (создать цикл) или выйти из конца программы.0
, поэтому изменение вродеprint ax
не является ошибкой. Уродливое, но эффективное решение - строки 828-954, которые присваивают 2012 году каждой возможной переменной с расстоянием редактирования 1 отxx
. Это гарантирует, что любая модификация финалаprint xx
все еще будет печатать 2012 год.xx
снова.источник
питон
Немного многословно (теперь с исправлением этой надоедливой точки с запятой между
print
и(
!):источник
pop()
Пустой набор сам по себе не является ошибкой, но он вызывает ошибку.pop
выходных данных<built-in method pop of set object at 0xb6fe93ac> ()
T-SQL 2012, 55
источник
Я сделал скрипт Python, чтобы судить обо всех решениях Python. Скрипт разбивает первое и третье решения Python, используя множество различных методов.
И второе решение, использующее лямбду, чтобы защитить себя, нерушимо.Второе решение Python находится на Python 3. Я изменил его в формат Python 2, а затем судья программа сломала его.Вот сценарий судьи.
источник
p2
всегда выдает исключение для Python2. Выходные данные никогда не 2012. Ваша программа судьи не будет работать под Python3, поскольку она использует операторы print.p2
это в Python 3.Mathematica, 23 символа
Запись: "/." означает «заменить»
источник
/.
на//
(постфиксная форма).Javascript -
68, 77, 84, 80 символовВот решение, которое должно работать в этом году :)
Вот тестовая скрипка .
Update 1: Исправлена ошибка , при которой Eval (+ а) сломал его (благодаря электронному бизнесу).
Обновление 2: исправлено для «|» дело (еще раз спасибо eBusiness).
Обновление 3: исправлено для случая «>» (еще раз спасибо eBusiness). И сломался для дела «1» :(
источник
eval(+a)
и многие другие модификации работают отлично, но не очень.eval(+a)
случай, который теперь должен быть исправлен. Кроме того, мне не удалось найти один из случаев модификации, когда он работает нормально, но не выводит 2012, поэтому не могли бы вы привести пример?eval(0)
и,eval(-a)
например, делает то же самое.||
на|
.alert
наaler=
.Рубин 1,9 - 43 символа
Не проверено, поэтому откололись.
источник
Excel, 14 символов (немного изменяет):
Любое допустимое изменение массива повлияет на содержимое обеих ячеек, и попытка изменить только одну ячейку вызовет сообщение об ошибке.
Конечно, это не работает, если вы придерживаетесь мнения, что на самом деле это только одна формула, а не две формулы, которые должны быть идентичными.
источник
Java 7
Объяснение:
a
значение2012
).a
каким-либо образом изменено, оно будет проходить по следующему пути: 1 → 3 → 5 (и будет возвращеноb
неизменное значение2012
).b
каким-либо образом изменено, оно будет проходить по следующему пути: 1 → 3 → 4 (и будет возвращеноa
неизменное значение2012
).a.equals(b)
@ 1 изменено наa.equals(a)
,b.equals(b)
или!a.equals(b)
оно все равно будет идти по тому же пути: 1 → 2 (и будет возвращеноa
неизменное значение2012
).a
@ 2 изменено на,b
оно все равно будет идти по следующему пути: 1 → 2 (и будет возвращеноb
неизменное значение2012
).a
b
в строках 3, 4 или 5 либо изменилось на противоположное, он все равно будет идти по следующему пути: 1 → 2 (и вернетa
неизмененное значение2012
)a
неизменное значение2012
)M
вclass M
илиa
вmain(String[]a)
другой действительный символ может быть сделано без каких-либо изменений в функциональности кода.Попробуйте все эти модификации здесь, чтобы убедиться, что они все еще печатают 2012 год.
Если вы можете найти какой-либо способ нарушить его, следуя правилам ОП, я бы хотел знать, поэтому я могу придумать что-нибудь, чтобы это исправить.
В отличие от большинства аналогичных вопросов, в которых модифицируется один символ, этот вопрос позволяет сохранить базовую структуру рассматриваемого языка программирования, поэтому Java может, наконец,
конкурировать за одинввод (давайте посмотрим правде в глаза, Java почти никогда не выиграет это SE xd).источник
a
? Будет ли программа по-прежнему выходить в 2012 году или в 2012 году?-
передa
илиb
. Вот скриншот ошибки компиляции.Рубин 1.9
Я строю эту короткую, но простую программу, которую вам предлагается нарушить в соответствии с вышеуказанными правилами. Я даже не смог найти позицию, в которой выход изменился бы (без нарушения кода), если был
#
вставлен символ a , чтобы закомментировать оставшуюся часть строки.источник
irb
добавлением минуса передrx
результатами в действительной программе, которая выводит-2012
...puts
вputc
причинах этого для вывода?
в Ruby 1.9.Скала, 95
(или 54, если пропустить не значащие части)
источник
(...),("2012")
похоже, сломал его.C #
Конечно, это не так просто, не так ли? ...
Хорошо, что я скучаю?
источник
if (result += "2012")
он выводился20122012
?if
оператора, а не строки.;
послеelse
делает его выводит два раза.PHP, 30
источник
<?=$i=2012;$i==2012?-$i:2012;?>
<?#$i=2012;$i==2012?$i:2012;?>
Решение против этого: вставить новую строку после$i=2012
.Такси , 396 байтов
Отформатированный для людей, это:
Из прочтения других ответов, кажется, решение состоит в том, чтобы выбрать хрупкий язык, установить значение, проверить значение, распечатать значение.
источник
SmileBASIC
Сначала включаем строгий режим. Это заставляет вас объявлять все переменные перед их использованием и предотвращает такие вещи, как изменение? A $ на? B $.
Затем создается строковая переменная с именем «A $», и ее значение устанавливается равным «@ 2012». Чтобы убедиться, что значение A $ не было перепутано, программа попытается перейти к метке, и единственная метка в программе - @ 2012.
Теперь A $ определенно равен «@ 2012», но перед его печатью необходимо удалить @. SHIFT () удаляет первый элемент в строке или массиве (как pop (), но с другого конца). Чтобы отбросить значение, возвращаемое SHIFT, оно передается в блок IF / THEN, который ничего не делает. На всякий случай, если кто-то пытается закомментировать эту строку, мы объявляем переменную «B», которая используется позже. Если VAR закомментирован, последняя строка выдаст ошибку неопределенной переменной.
Теперь печатается A $, и есть еще один VAR для предотвращения комментариев. Последняя строка просто гарантирует, что переменные B и C были объявлены.
источник
?-A$VAR C
- это может быть вывод-2012
??B$VAR C
:? :)Хаскелл, 65
Perl, 84
Неудачный подход:
источник
$&
на что-то вроде$0
.nub$filter(\x->x==2012||x==2012)(2012:[2012])
может быть безопасным для решения на Haskell.use English
в Perl, это будет исправить. Я думаю, что несколько исправлений работают на Haskell, включая переключение на строки.print
с*rint
,prin:
,p:int
или#rint
, предваряя=
к первой линии, или даже заменитьs/.*/
сs/./
илиy/.*/
(которые будут устранены путем инициализации$ARG
к2012
начать с). Кроме того, ваш$SUBSEP
трюк по-прежнему не защищает от вставки*
перед конечной точкой с запятой, но гораздо более простым решением является удаление этой ненужной точки с запятой.PHP,
4348источник
-
между?
и$a
результатами-2012
печати.date()
, но программа должна работать и после 2012 года. ;)-
между? и абс. ;-)Рубин (
5736)РЕДАКТИРОВАТЬ И еще один в 36 символов.
Я думаю, что использование строк довольно безопасно, потому что этот минус больше не работает.
РЕДАКТИРОВАТЬ следующую попытку (36 символов) [не берите в голову, добавляя
-
послеp
результатов в-2012
]p [2012,2012] .find (2012) .first || 2012Этот будет работать только в этом году, но также и для подобных конкурсов в будущем :) (15.chars)
Обратите внимание, что эта замена также работает:
57 символов Если учесть переводы строк, то это тоже 76 символов.
источник
#
в начале строки. Последнее решение - введите новую строку раньшеp
. (Примечание: я сам не знаю Руби, так что, возможно, я ошибаюсь).$><<
илиputs
вместо. Как бы то ни было, я больше не буду пробовать это, я сдался :)Q, 23
,
и т.д
источник
-
)? -{$[-2012~m:2012;m;2012]}
-{$[2012~m:-2012;m;2012]}
-{$[2012~m:2012;m;-2012]}
q){$[-2012~m:2012;m;2012]}` 2012
-q){$[2012~m:-2012;m;2012]}` 2012
-q){$[2012~m:2012;m;-2012]}` 2012
;m;
то вроде;1;
или;x;
.Хм .. позвольте мне попробовать:
128 символов без пробелов.
источник
System.out.println(-i)
(Для первого println). Также ломается, например, заменяя первоеprintln(i)
на напримерprintln(1)
. Также может быть нарушен при измененииi == j
наi += j
(или - = и т. Д.).PHP
Я надеюсь, что это нерушимо :)
источник
echo(printf("%s",$a)==4)?die(3
и я получаю20123
.."2012"
на."FAIL"
. :)Groovy: 26
источник
x=2012;print x^2012?2012:-x
-
?-
попытка изменить ваш код одним символом, чтобы он больше не работал.x=2012;print x^=2012?2012:x
(меняется^
на^=
) меняет вывод на 0.Lua
источник
-
признаков?2012
на другое, утверждение выдаст ошибку. Хм ... ну, я полагаю, вы заслуживаете очков творчества за нарушение правил. А если серьезно, это не так, как это было задумано.