Ваша задача - написать непустую компьютерную программу, состоящую из некоторой последовательности байтов. Если мы выберем определенный байт в программе и удалим все его экземпляры из программы, измененная программа должна вывести удаленный байт.
Например, если бы наша программа
aabacba
Тогда bcb
бы вывел a
, aaaca
надо бы вывести b
и aababa
вывел бы c
.
Неважно, что делает неизмененная программа.
Ответы будут оцениваться в байтах с целью минимизации количества байтов.
code-golf
source-layout
radiation-hardening
Мастер пшеницы
источник
источник
Ответы:
zsh,
603594566561548440415399378370 байтЗависит от coreutils +
dc
.Попробуйте онлайн!
Это было ... путешествие.
Этот ответ состоит из трех частей. Первые 4 строки обрабатывают определенные особые случаи, чтобы упростить следующий код. Следующие 2 строки и последняя строка, по сути, выполняют одно и то же, но ровно одна запускается с удалением любого символа. Они написаны в основном с дополнительными наборами символов, так что удаление любого символа нарушает только один, позволяя другому продолжать функционировать.
Глядя на первую часть, мы сначала справимся
ec\nho \\n
ca t<<<$'\x20'
(с последующим,exi t
чтобы избежать запуска более позднего кода, который привел бы к постороннему выводу)$
удаление сd$c -e8BC6P
(8BC6
=9226
is36*256 + 10
, а 36 и 10 - байтовые значения$
символов и новой строки соответственно; мы используем шестнадцатеричные цифры в десятичном формате, чтобы избежать необходимости включать их в большой комментарий в строке 6)0
удаление сd0c -eKp
(K
получает десятичную точность, которая0
по умолчанию)В следующей части используются только символы (кроме мусора в конце второй строки)
$'\01234567v;
, пробел и перевод строки. Из них четыре были учтены, поэтому остаток ('\1234567v
) не может быть в последней строке. Развернув восьмеричные экранированные$'\123'
символы ( представляет символ ASCII со значением 123 8 ), мы получим:Первая строка перебирает все символы, используемые в программе, и ищет каждый из них в своем собственном исходном коде (
$0
это имя файла выполняемого скрипта), печатая любой символ, который не найден.Вторая строка выглядит немного странно и, кажется, делает то же самое, что и
exit
с кучей nops. Однако кодированиеexit
как восьмеричное напрямую приводит к тому$'\145\170\151\164'
, что не содержит2
или3
. Нам на самом деле нужно сделать это менее устойчивым к удалению. Это потому, что если какой-либо из'\014567v
них удаляется, ломая первую строку, вторая строка также разрывается, что позволяет выполнить оставшуюся часть кода. Однако нам нужно, чтобы он также ломался, если2
или3
удаляется, чтобы строки 3 и 4 могли работать. Это достигается путем подковывания в:
и;
, которые имеют 2 и 3 в восьмеричном представлении соответственно.Мусор в конце строки 2 просто необходим для того, чтобы каждый печатный символ ASCII появлялся хотя бы один раз, так как для этого требуется проверка, циклически проходящая по каждому из них.
Если
exit
не был вызван в первом разделе (то есть он был поврежден путем удаления одного из'\01234567v
), мы переходим ко второму, в котором мы должны выполнить то же самое, не используя ни один из этих символов. Последняя строка аналогична декодированной первой строке, за исключением того, что мы можем сократить диапазон цикла, чтобы сохранить несколько байтов, поскольку мы уже знаем, что все символы, кроме'\01234567v
, были охвачены. Он также имеет0# $#
перед ним, который комментирует его и не дает ему производить посторонний вывод, если0
или$
были удалены.источник
Сетчатка , 1 байт
Попробуйте онлайн!
Когда все экземпляры одиночного byte (
1
) удалены, вывод будет1
. Достаточно просто.источник
1
для пустой программы? Несмотря на это, я думаю, что рассматриваемые ответы используют различные подходы и поведения. ИМО ответ по полиглоту оправдан, только если подход остается прежним. (Объективно, это не полиглот, поскольку фактический код отличается от приведенных ниже.) Не стесняйтесь голосовать, как хотите, но действительный ответ - действительный ответ. Я оставлю свой ответ таким, какой он есть, я не хочу размещать на нем коллекцию ответов.Lenguage, 216173027061157310 байт
216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2
, Есть216173027061157310 - 144115617572598740
$
s,216173027061157310 - 144115241762960340
#
s и216173027061157310 - 144115194786755540
пробелы.144115617572598740
#
с и пробелы кодируют следующую программу BF:Попробуйте онлайн!
144115241762960340
$
с и пробелы кодируют следующую программу BF:Попробуйте онлайн!
144115194786755540
$
с и#
с кодируют следующую программу BF:Попробуйте онлайн!
Редактировать: Сохранено 72057832274401770 байт благодаря @Nitrodon.
источник
U
и байт 127? Попробуйте онлайн! Или даже просто nul byte и soh?U
был самый короткий печатный байт ASCII, который мог быть выведен. Я не хотел использовать непечатаемые байты.Желе , 1 байт
Полностью отличается от ответа Retina. свистки
Попробуйте онлайн!
источник
Полиглот * , 1 байт (в ожидании подтверждения )
Попробуйте онлайн! (используя Треугольность)
*: Это работает в (довольно широком) разнообразии языков (за исключением esolangs, таких как 4,> <> и тому подобное, и некоторых других исключений). Идентичен ответу Jelly в исходном коде, но метод ввода / вывода отличается - вывод осуществляется через код выхода. При удалении
0
из исходного кода они остаются с пустой программой, которая часто не вызывает ошибок и дает код выхода 0 в большинстве языков.источник
sed , 1 байт
Попробуйте онлайн!
Полностью отличается от ответа Retina или ответа Jelly.
источник
Унарный (неконкурентный), 96 байт
Вот
xxd
свалка.Более широкое определение унарного языка допускает любые символы в его исходном коде. Но я не нашел компилятор или интерпретатор, который бы работал для этого. Поэтому я отметил этот ответ как неконкурентный. Если вы можете найти тот, который размещен до того, как задан этот вопрос, я сделаю ссылку на него.
источник