Давайте определим нетронутую программу как программу, которая сама по себе не имеет ошибок, но выдаст ошибку, если вы измените ее, удалив любую смежную подстроку из N символов, где 1 <= N < program length
.
Например, трехсимвольная программа Python 2
`8`
это нетронутая программа ( спасибо, Sp ), потому что все программы, возникающие в результате удаления подстрок длины 1, вызывают ошибки (на самом деле синтаксические ошибки, но любой тип ошибок будет делать):
8`
``
`8
а также все программы, возникающие в результате удаления подстрок длины 2, вызывают ошибки:
`
`
Например, `8
если бы программа была без ошибок, `8`
она не была бы нетронутой, потому что все результаты удаления подстроки должны содержать ошибки.
Ваша задача в этой задаче - написать самую короткую нетронутую программу, которая не требует ввода, но выдает одно из следующих пяти слов:
world
earth
globe
planet
sphere
Какое слово вы выберете, зависит только от вас. Отдельное слово плюс необязательный завершающий перевод новой строки должны быть напечатаны на stdout (или ближайшей альтернативе вашего языка). Самая короткая программа в байтах побеждает.
Примечания:
- Требуется отдельная программа, а не функция.
- Слова чувствительны к регистру; вывод
World
илиEARTH
не допускается. - Предупреждения компилятора не считаются ошибками.
- Подпрограммы с ошибками могут принимать входные данные или давать выходные данные или делать что-либо еще, если они всегда в конечном итоге дают ошибку.
Вот фрагмент стека, в котором будет перечислено, какие программы должны выдавать ошибку, учитывая потенциально нетронутую программу:
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function go() { var s = $('#i').val(), e = []; for (var i = 1; i < s.length; i++) { for (var j = 0; j <= s.length - i; j++) { e.push(s.substring(0, j) + s.substring(j + i)); } } $('#o').val(e.join('\n---\n')); }</script>Program:<br><textarea id='i' rows='16' cols='80'>`8`</textarea><br><button onclick='go()' type='button'>Go</button><br><br>Programs that should error: (--- separated)<br><textarea id='o' rows='16' cols='80'></textarea><br>
источник
Ответы:
Rail , 24 байта
Я думаю, что это работает. И это и кратко и читабельно (насколько Rail идет).
$'main'
мы получаемInternal Error: Crash: No 'main' function found
.#
, программа не может завершиться корректно, поэтому она всегда завершается сCrash: No valid move
. Я считаю, что невозможно удалить подстроку так, чтобы дорожка образовала допустимый (бесконечный) цикл.#
, она будет отсоединена от конца пути, поэтому поезд рухнет (с той же ошибкой, что и выше).#
, она также отсоединит#
от конца дорожки (и, возможно, даже от начала дорожки от точки входа$
). Итак, опять та же ошибка.Что касается фактической программы: каждая железнодорожная программа должна иметь
$'main'
(или более длинный вариант, но мы здесь играем в гольф) в качестве точки входа в функцию, и поезд начинает$
движение на юго-восток. Все в этой первой строке может быть частью трека, поэтому удаление'main'
трека это:-
И/
просто куски рельса , которые мы должны позволить поезду взять эти 45 ° поворотов.[world]
толкает строкуworld
иo
печатает ее.#
отмечает конец дорожки - единственный способ безопасно завершить программу Rail.Интересно, что это решение возможно только потому, что Rail позволяет трекам проходить
main
линию - если это невозможно,#
это будет после первой новой строки, и код всегда можно будет сократить докоторая является действительной программой, которая ничего не делает. (Не пробелы между
'
и#
не влияют на это.)Также довольно интересно: если бы я только играл в гольф для печати задач,
world
это не было бы намного короче или проще:источник
/
от#
.$
от начала пути, поэтому поезд немедленно падает (Rail ожидает, что путь продолжится к юго-востоку от$
).Funciton (
186136 байт в UTF-16)Эта программа печатает «мир».
Большинство подстрок, которые вы удаляете из этого, помешает ему стать полным полем, на которое парсер будет жаловаться. Единственные возможные удаления, которые оставляют полную коробку:
Большинство из них удаляют свисающий конец в правом верхнем углу коробки, который является выходным разъемом. Без этого незакрепленного конца коробка - просто комментарий:
Эта программа больше не является допустимой, потому что синтаксический анализатор ожидает программу только с одним выводом:
Единственная возможность, которая оставляет выходной соединитель, является последней из вышеперечисленных, которая оставляет это:
Однако это число не кодирует допустимую строку Unicode в эзотерическом UTF-21 Funciton. Попробуйте запустить это, вы получите:
Таким образом, эта программа является нетронутой.
источник
Visual C ++ -
9695 байтСвойства:
int main()
без ошибки компиляции.a
на всех средствmain()
не получает{
, убравb
вообще означает , что наша линия не заканчивается в;
, убрав<
средствоstd::cout<'w'
вызывает ошибку, и устранение<<
причинstd::cout'w'
,'w''o'
и т.д.I(a)
,I(b)
которые никогда не совпадают иI
которые расширяются до(
; с другой стороны, используяI(,
причины<<<<
,,)
удаляет точку с запятой (исключая любые другие ошибки).std::cout
не наталкиваясь на ведущий<<
, и, следовательно, не можете удалить любой из#include<iostream>
в начале без ошибки компиляции.''
есть ошибка пустого символа и'w,
т. Д. ... попробуйте превратить все в один символ.)
или(
на другой стороне, например, вы не можете делать что-то вродеI('w',I('r'
.Компилируется онлайн с использованием Visual C ++ .
Еще раз это не исчерпывающее доказательство. Если вы думаете, что вы можете заставить его работать без раздела, обязательно дайте мне знать.
В предыдущих версиях использовался значительно иной подход, и оказалось, что он не является нетронутым, поэтому я убрал эти оценки.
Проверка:
Следующая программа подтвердила, что эта версия является нетронутой с использованием
cl
компилятора из Visual C ++ 2010. Хотела, я потрудился написать это раньше:источник
/c
опция автоматически включается и компилируется (как будто создается библиотека, а не программа). Если вы установите флажок запуска, который сайт не включает/c
, вы не получите сообщение об успешном завершении, а вместо этого найдете естественное «LINK: фатальная ошибка LNK1561: должна быть определена точка входа».Python 3,
7933open(1,'w')
открывает стандартный вывод, затем мы печатаем строку.write
возвращает количество написанных символов. Это используется для защиты от удаления подстроки: удаление части строки приводит к возвращению чего-то, отличного от 5, а затем 5 минус это значение оценивается как true. Но это вызывает выполнениеif
-body иa
не определено.Это основано на умных нетронутых Quine Андерс Kaseorg здесь .
Поскольку необходимо проверить только одно утверждение, оно намного короче старого решения, но также и менее общее.
Старое решение:
Чтобы убедиться, что это действительно нетронутая программа:
Некоторые ключевые моменты:
q
, что выполнено, требуется утверждение внеq
. Вtry
решает , что хорошо, требуя , по крайней мере , два заявления, ни один из которых может быть удален полностью.q
выполнено, происходит путем оценкиr
в конце.q
не был изменен достигается за счетeval(q[17:])
, который должен оценить,None
дляq
быть выполнена.if
Состояние немного сложнее , чтобы получить право. Чтобы убедиться, что он был оценен, у него есть приятный побочный эффект настройкиe
, который необходимо установитьr
. (Именно по этой причине я использовал Python 3, такexpr
как функция делает чудеса для побочных эффектов на уровне выражения.)источник
Хаскелл, 61
Любой тип ошибки в порядке? В этом случае:
Хаскелл, 39
источник
JavaScript,
747335 байтОказывается, ответ был намного проще, чем я думал ...
объяснение
источник
a="world"
, не ошибкаif(a="world")["bol"+a[4]]
не ошибка.Java 8, 301 байт
Потому что на каждый вопрос нужен ответ Java.
расширенный
объяснение
public static main(String[]a){}
требуется.Самая тяжелая часть:
final
ключевое слово удалено, вторая строка оценивается как1/(8-8)
, вызывая/ by zero
исключение.источник
System.out.print()
метода не существует . Есть дляprintln()
, но не дляprint()
. Так что, если вы удалитеd='d'
его, вы получитеThe method print(boolean) in the type PrintStream is not applicable for the arguments ()
ошибку (и если вы удалитеd=
его, вы получитеThe blank final field d may not have been initialized
ошибку).Функцион ,
143142136 байтСчет в UTF-8 как обычно, так как UTF-16 будет на два байта больше (из-за спецификации).
Итак, я некоторое время обдумывал ответ Funciton, и я подумал, что это будет невозможно, потому что вы всегда можете удалить полную строку, а код все равно будет формировать действительный блок. Затем я поговорил с Тимви об этом, и он понял, что вы можете просто поместить все число в одну строку, так что его удаление сломало бы программу из-за отсутствия выходного разъема.
Но литералы в одной строке общеизвестно дороги, как из-за большего количества символов, так и из-за большего количества символов не-ASCII. И его упоминание о блоке "пустой комментарий" заставило меня задуматься ...
Итак, я придумал это более эффективное решение, которое использует дополнительный пустой блок комментариев, который разрывается, когда вы пытаетесь удалить что-нибудь, что оставило бы буквальный блок в такте:
Это оставляет два варианта (спасибо Стиву за указание на это):
19342823075080880373
декодируется, соответствующая строка будет содержать кодовую точку,0x18D53B
которая не является допустимым символом Unicode,System.Char.ConvertFromUtf32
сбой сArgumentOutOfRangeException
.508088037380718711
будет содержать две недопустимые кодовые точки0x1B0635
и0x140077
, что приведет к тому же исключению.Обратите внимание, что даже без пустого блока комментария удаление второй строки приведет к неверной кодовой точке. Но комментарий блок предотвращает , что мы берем линию от внутри второй линии, чтобы получить целое число , как
193428037380718711
, например, что не вызвало бы ошибку.источник
Руби, 36
Мы назначаем
s="planet"
, а затем записываем эту строку в STDOUT. Это возвращает количество написанных символов. Мы переписываем это с помощью 6, чтобы, если было написано что-либо кроме 6 символов, мы получили ненулевое целое число. Затем мы разрезаемs
этот индекс. Только 0-ый символs
, «p», является допустимой строкой кода (без операции). Мы передаем этоeval
, используя(*[argument])
синтаксис, который эквивалентен просто(argument)
за исключением того, что он недействителен вне вызова метода.Оригинальность проверена программно на Ruby 1.9.3 и 2.2
источник
*
?C #,
128118101 байтМысль о злоупотреблении смежным правилом подстроки.
Код
Почему это работает
class h
иstatic void Main()
требуются.'w','o','r','l','d'
вызывает ошибку, потому что массив символов инициализируется с длиной1*5
.До игры в гольф и разлуки
Проверено с
https://ideone.com/wEdB54
РЕДАКТИРОВАТЬ:
#if !x
вместо#if x #else
.=>
синтаксис func.#if!x
вместо#if !x
. Кредиты @JohnBot.=>
синтаксиса func дополнительное условие preproc может быть удалено.источник
static
наMain
.Main
в элемент функции Expression работоспособных и 2 больше, удаляя пробелы до состояния препроцессора:class h{static void Main()=>System.Console.Write(new char[1\n#if!l\n*5]{'w','o','r','l','d'\n#if!o\n});\n#endif\n}\n#endif
. По моим подсчетам это 115MATLAB,
373633 байтаПоскольку я не уверен, что нам разрешено выводить ans = , мне пришлось найти обходной путь для правильного вывода. Использование fprintf само по себе не сработало, потому что, что бы я ни пытался, он просто отказывался от ошибок. Использование disp само по себе не было вариантом, так как он принимал бы только 1 аргумент, и сам этот аргумент, очевидно, также выполнялся бы без ошибок.
Если нет проблем также включить ans = в вывод, тогда MATLAB может быть выполнен с 20 байтами :
источник
> <> , 17 байт
Попробуйте онлайн!
Отпечатки "земля".
Единственный способ выйти из
><>
программы без ошибки - это выполнить;
символ, что является проблемой, так как вы можете просто удалить все символы до этого, чтобы это;
был первый выполненный символ. Вы можете обойти это, используяp
команду, чтобы изменить программу для включения;
во время выполнения. Удаление любого фрагмента кода приводит к;
тому, что никогда не создается, что приводит к ошибкам из-за неверных инструкцийB
,h
а также из-заt
переполнения стека и бесконечных циклов, из-за которых в конечном итоге заканчивается память. Мне нужно было только убедиться, что все бесконечные циклы заполняют стек.Все варианты были протестированы с использованием этого фрагмента Python:
добавлен (слегка измененная версия) официальный интерпретатор fish.py создателем> <>. Из 152 возможных подпрограмм 92 ошиблись из-за недопустимых инструкций, 18 из-за переполнения стека и 42 из-за нехватки памяти.
Забавные факты, в первой версии этого
e"ooooo6-c0pAhtra
было несколько странных подпрограмм, которым удалось использовать команду put, чтобы поместить вместо[
очищенной стека команду, которая очистит стекA
. Кроме того, «земля» - единственная из фраз, которая будет работать с этим методом, потому что первая букваe
является допустимой инструкцией в><>
. В противном случае"
команда должна быть размещена в начале программы, и допустимая подпрограмма может быть"
сама по себе.источник
Руби, 34
Это имеет несколько компонентов:
eval(*[
expr])
заимствован из ответа гистократа и является чистым , так как проверка возвращаемого значения expr является допустимой программой ruby, которая не выдает ошибку.method(*arr)
это рубиновый синтаксис, который вызываетmethod
со значениями вarr
качестве аргументов. Причина, по которой это необходимо здесь, заключается в том, что он действителен только в качестве параметров метода, поэтому, если онeval
будет удален,(*[expr])
это будет синтаксической ошибкой. Если expr удален,eval
жалуется на нехватку аргументов$>.write("world")-1
не может быть искажен за исключением внутри строки и вычитания.$>.write("world")
записывает «world» в STDOUT и возвращает количество записанных символов, затем вычитает 1. Поэтому, если программа не повреждена, значение будет ровно 4 . Если он искажен (либо-1
удален, либо укорочена строка), он вернет один из -1,0,1,2,3 или 5 . Любое другое искажение приводит к синтаксической ошибке.Вызов
chr
номера возвращает символ, представленный этим номером. Таким образом, при вызове результата из приведенного выше примера он возвращает -1 и в противном случае возвращает односимвольную строку.Я на самом деле не уверен, почему это так, но кажется, что ruby интерпретируется
\x04
как символ пробела, что означает, что выражение допустимо (пустые программы ruby ничего не делают). Однако любые другие символы (\x00
-\x03
и\x05
) приводят кInvalid char '\x01' in expression
. Я нашел это, просто перебирая возможную математику, которую я мог сделать с возвращенным числом. Ранее я использовалгде «планета» плюс символ новой строки были 7 символов, умноженные на 16, чтобы получить 112
p
, единственная однобуквенная функция в ruby, определенная по умолчанию. Когда нет аргументов, это фактически неПохвальный отзыв:
$><<"%c"*5%%w(w o r l d)
очень близко, но не нетронутый. Удаление"%c"*5%
результатов без ошибок. Мини-объяснение:$>
является stdout и<<
является функцией, вызываемой для него."%c"*5
генерирует строку формата"%c%c%c%c%c"
, которая затем пытается отформатировать (%
) массивом:%w(w o r l d)
это более короткая версия['w','o','r','l','d']
. Если в массиве слишком мало или слишком много элементов, так что он не соответствует строке формата, возникает ошибка. Ахиллесова пята такова"%c"*5
, и%w(w o r l d)
может существовать независимо, и ей$><<
нужен только аргумент. Так что есть несколько разных способов превратить эту программу в двоюродных братьев без ошибок.Подтверждено с помощью этого:
источник
Python 3 , 43 байта
Попробуйте онлайн!
Как это устроено
Для защиты от удаления подстрок мы используем
open(1,"w").write
вместоprint
. В Python 3write
возвращает количество написанных символов, которое мы проверим,5
чтобы убедиться, что ни одна часть строки не была удалена. Мы делаем это, просматривая возвращаемое значение в словаре{5:[]}
и циклически перебирая результат сfor[]in…:a
, что завершится ошибкой, если мы не получим пустую итерацию илиfor
оператор будет удален.источник
Javascript (Node.js),
9395 байтПроверьте его собственный размер дважды, поэтому, если какой-либо символ отсутствует, выдается ошибка. Длина составляет 156, потому что Node.js зависит
function (exports, require, module, __filename, __dirname) {
от кода во время выполнения.Спасибо Мартину Бюттнеру за указание на ошибку. Исправлено сейчас.
источник
Perl 5.10+,
7163 байтаПечать
world
с завершающим переводом строки. Запустите так:Это зависит от количества байтов исходного кода, поэтому
file
должно содержать приведенный выше код и ничего больше (без шебанга, без завершающего перевода строки). Perl 5.10+ требуется дляsay
и определенного оператора//
.Создать Perl-программу с Perl невероятно сложно, потому что:
Любой идентификатор bareword (например
foo
,a
,_
) является допустимым заявление сno strict 'subs';
(по умолчанию). Это означает, что программа не может ни начинаться, ни заканчиваться буквой, цифрой или подчеркиванием.Как объясняет Черст , «идентификаторы, указанные посредством символьной разыменования, не имеют абсолютно никаких ограничений на свои имена». Это означает , что программа не может начинаться с любого из сигилы
$
,@
,%
или*
, так как удаление всех , кроме первого и последнего символа всегда будет оставлять правильное имя переменной.Многие встроенные функции (включая большинство функций, способных генерировать выходные данные) работают
$_
по умолчанию, поэтому вызовы часто будут работать, даже если вы удалите аргумент (например,say"world"
vs.say
).Как это устроено
Это решение было вдохновлено ответом Науака Node.js , который проверяет собственную длину, чтобы убедиться, что символы не были удалены.
Программа имеет два раздела, один внутри скобок, а другой внутри блока:
Первый раздел читает исходный файл и умирает, если его длина менее 63 символов. Второй раздел проверяет, что
read
выполнено успешно. Если один из разделов будет удален (с или без заключающих в него скобок или фигурных скобок), другой раздел вызовет исключение.Удаление средней или левой или правой части программы приведет к дисбалансу скобок и / или фигурных скобок, что приведет к синтаксической ошибке.
Если первый
die
изменяются (сd
,e
,di
,de
, илиie
, что все действительные идентификаторы), то проверка длины становится:который оценивает:
Это берет ссылку на строку и пытается разыменовать ее как массив, выдавая ошибку:
Если какой-либо другой оператор будет изменен, проверка длины не удастся, и программа умрет.
Проверено нетронутой со следующей программой:
источник
Ruby + coreutils,
332726 байтПопробуйте онлайн!
Обратные пометки в ruby выполняют команду внутри них и возвращают все, что программа поместила в STDOUT в виде строки.
#{expr}
Синтаксис позволяет встраивание выражений в строках и обратных кавычках. Эта программа может быть переписана (нетрадиционно) как:IO#write
возвращает количество записанных байтов, поэтому, если строка укорочена, она не будет правильным числом.#{}
встраивание автоматически превращает число в строку. Если какая-то часть будет удалена, и это не приведет к синтаксической ошибке, будет выполнена неправильная команда. Если часть"world"
удалена, то один изbase04
сквозныхbase54
будет пытаться запустить.Требуется новая строка, внутри или вне строки. В противном случае первые 5 символов (
`base
) могут быть удалены, что делает всю строку комментария. Также между первым обратным трюком и должен быть один или несколько символов#
, в противном случае их{
можно удалить, чтобы сделать все это комментарием оболочки .exec
Заменяет текущий процесс ruby указанной командой. Смотрите мой другой ответ для объясненияmeth(*[])
синтаксиса и необходимости его.(s="ec%co earth")
присваивает строку "ec% co earth" переменнойs
. Назначения возвращают то, что было назначено, поэтому строка также возвращается."format string %d" % 5
является синтаксическим сахаромsprintf("format string %d",5)
, однако пробелы вокруг%
не являются необходимыми.s[10]
получает символ в строке с индексом 10. При отсутствии искажения этот символ является «h», последней буквой в строке. Однако удаление любых символов в строке означает, что строка короче, поэтому в индексе 10 нет символа, поэтомуs[10]
возвращаетсяnil
и"%c" % nil
вызывает ошибку.если
%s[10]
удалено, то ruby пытается запустить команду,ec%co earth
которая не работает.Изменение
10
к1
или0
также приводит к неизвестной команде (либоeceo
илиecco
). Полностью удалить его технически не является синтаксической ошибкой, поскольку он вызывает метод#[]
для строки, но затем жалуется на недостаточное количество аргументов.Замечание по решению этой проблемы в целом: у вас должна быть некоторая обертка, которая проверяет код внутри в абстрактном смысле, оставаясь при этом самой чистой. Например, программа с разделением в конце (
blablabla/somevar
) никогда не будет работать, потому что разделение всегда можно удалить (blablabla
). Вот некоторые из таких оболочек, которые я использовал до сих пор:eval(*[
код, который])
использовал гистократ и в моем первом ответе. Проверяет, что вывод является действительной программой rubyexec(*[
код,])
использованный выше, подтверждает, что ответ является допустимой командой`#{
код}`
Синтаксис backtick также запускает команду (и поэтому подтверждает, что она действительна), однако STDOUT записывается как строка, а не выводится как родительский процесс '(Ruby's) STDOUT.
Из-за этого я не смог использовать его для этого ответа,РЕДАКТИРОВАТЬ: я сделал это работает. Ограничения изложены выше.Редактировать: Спасибо @histocrat за указание на некоторые недостатки
источник
write
началом строки, но я не думаю, что это влияет на чистоту. Также на моей машинеbase64
будет висеть ожидание ввода, что может противоречить правилам.$>.write"world"
работает, спасибо! Что касается base64, ожидающего ввода, то, похоже, он зависит от системы. TIO работает нормально. Это делает его еще более неясным относительно того, следует ли он правилам.PowerShell, (97 байт + 5 для имени программы) = 102 байт
Проверяет себя, прежде чем разрушить себя ... дважды.
Ожидаю , что будут сохранены как
c.ps1
и выполняются из локального каталога как таковые:PS C:\Tools\Scripts\Golfing\> .\c.ps1
.Псевдоним
gc
сокращенGet-Content
и похож наcat
чтение файла (в данном случае наш путь выполнения.\c.ps1
). Мы получаем.Length
файл, устанавливаем его$a
и проверяем, не равен ли он 97 с-eq97
. Если оно равно (т. Е. Программа не была изменена), мы печатаем"world"
и выполняем недопустимую командуa
. Это заставляетcatch
вступать в силу, что позволяет нам проверить себя снова. На этот раз, если наш код не равен 97, мы бросаем недопустимую команду, поэтому наша программа допустила ошибку и напечатала текст ошибки на выходе. У нас тогдаclear()
ошибка иexit
нормально.Очевидно, что если подделать одно
if
утверждение, в другом возникнет ошибка. Если подделать какую-либо часть"world";
, перваяif
вызовет ошибку. Поскольку он должен быть смежным, мы не можем удалить обаif
утверждения. Строки в середине приведут к несоответствующим круглым скобкам или к выполнению второго{a}
.try
/catch
Чтобы поймать ошибку от первогоif
заявления , чтобы мы могли должным образом очистить его. Внешние"$( )"
препятствуют тому, чтобы последовательности от любого конца были отрезаны. И последнее;a
, чтобы не допустить того, чтобы части середины были обрезаны, что привело бы к действительным программам (например"it}a)";a
, которые будут печатать,it}a)
а затем выдают ошибку).Есть несколько особых обстоятельств:
gc
,gc<space>
илиgc .\
удаляются, программа, в конечном счете ошибки с некоторым привкусом амбулаторной ошибки памяти (из - за повторные вызовы самостоятельного выполнения) и , вероятно , аварией оболочка (и , возможно, компьютер). Не проверено.<space>.\c.ps1
или.\c.ps1
удалены, программа остановится и запросит ввод пользователя. Независимо от того, что вводит пользователь, программа все равно выдаст ошибку, поскольку счетчик размеров будет неправильным.$
конце и заканчивается перед последним"
, программа выдаст все, что осталось, и затем выдаст ошибку, посколькуa
она недопустима.Проверено со следующим:
(Спасибо Мартину за его обширную помощь!)
источник
C (gcc) (Linux,
-Werror=undef
), 66 байтПопробуйте онлайн!
Отличный вызов! Это было обманчиво сложно, но я уверен, что теперь у меня есть действующая программа!
Использует команду препроцессора, так что никакие символы новой строки не могут быть удалены, так как закрывающая скобка к
main
включена только в том случае, если__LINE__==6
. Это также не дает вамmain
полностью очиститься , так как это оставляет#endif
плавающим (поэтому важно, чтобы он находился#endif
за пределамиmain
).Я использовал это
#else
потому, что убедился в том, что нет версии, в__LINE__==6
которой нельзя удалить подстроку, и она все еще остается верной, поскольку6
и__LINE__
сами по себе, и правдивы. Он также использует-Werror=undef
так, что что-то вроде#ifdef(LINE__)
не оценивается как ложное, но является ошибкой.С gcc (по крайней мере в Linux)
puts
возвращает количество напечатанных символов (включая завершающий символ новой строки), поэтому удаление любой части строкиputs("...")/6
возвращает0
, что1/0
вызывает исключение с плавающей запятой. Обратите внимание, что это исключение не вызывается, если1/0
оно не назначено чему-либо, поэтомуa=
требуется.Никакая другая часть любой строки не может быть удалена без создания ошибки, обычно ошибки синтаксиса или ошибки компоновки.
В качестве бонуса это дает 86-байтовое решение для C ++ довольно просто, просто добавьте
#include <cstdio>
и объявитеa
какint
. Попробуйте онлайн! (C ++)источник
1/
, выходя из новой строки, и он все равно будет работать .1
я предполагал на предыдущей строчке, я верю.=1
. Я думаю, что вам нужно поставить 1 на одной линии.PHP, 73 байта
Explination
Я предполагаю, что конфигурация php.ini по умолчанию. Так что short_tags отключен. Это означает, что вы не можете удалить
=
тег из открывающего тега.Это в принципе
<?=unserialize('s:5:"world"');
.Если вы удалите какую-либо часть сериализованной строки, вы получите ошибку.
Вы можете просто удалить,
unserialize
и скрипт просто выведет сериализованную строку. Чтобы преодолеть это, я используюcall_user_func
. Удаление одного из параметров приведет к ошибке.Однако вы можете удалить
un
, чтобы вызватьserialize
функцию. Таким образом, мы вынимаем «нс». Удаление любых символов не приведет к неправильному имени функции.Мы будем использовать inline, если использовать переменную с тегом output. Вместо использования
&&
мы используем '|' чтобы предотвратить удаление одного&
или удаления$f
назначенияВы можете удалить
='ns')&&($f="u{$p}erialize"
и в конечном итоге($p)?$f:''
. Поэтому я добавляю дополнительные скобки вокруг$f="u{$p}erialize"
.Запись
Технически вы можете удалить открывающие теги, не вызывая ошибки. Однако это уже не PHP-скрипт, а просто текстовый файл.
источник
Matlab (77)
попробуй
Примечание:
Следуя совету @ Optimiser по разработке CPR или чего-то
arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),
подобного , я столкнулся с непредвиденной подстрокой, которая не привела к какой-либо ошибке компиляции при удалении, пример: удаление из этого предыдущего редактированияfeval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world')
не приводит к ошибке! Кроме того, для последнего же издания былиbsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)
иbsxfun(@(a,b)a,'world',1:5)
, если вы спросили о том, как я, находя их в моей выходной консоли, я плакал, как ребенок, так что вот программа:Пример нетрадиционной программы
редактировать:
источник
SmileBASIC, 63 байта
источник
Груша , 17 байт
Эта программа содержит байты с установленным старшим битом (которые не являются допустимыми UTF-8 и, следовательно, не могут быть опубликованы в TIO), поэтому вот
xxd
обратимый hexdump:объяснение
Это просто
print'world'
с добавленной контрольной суммой. Я подтвердил методом грубой силы, что ни одно из возможных удалений не дает программе правильную контрольную сумму, поэтому вы получаете ошибку после любого возможного удаления.Довольно скучно, но связывает нынешнего лидера, поэтому я чувствовал, что это стоит опубликовать.
источник