Что мы забыли?


31

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

Например, если бы наша программа

aabacba

Тогда bcbбы вывел a, aaacaнадо бы вывести bи aababaвывел бы c.

Неважно, что делает неизмененная программа.

Ответы будут оцениваться в байтах с целью минимизации количества байтов.


4
Поскольку этот вызов не помечен как quine, можем ли мы прочитать наш собственный исходный код?
Деннис

1
@ Деннис Конечно. Будь моим гостем
Wheat Wizard

2
Если все байты в нашей программе представляют собой цифры, мы можем вывести через код выхода?
Мистер Xcoder

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

2
Должен был указать более 1 байта вместо непустого : P. Или то, что сказал Notts90.
Волшебная Урна Осьминога

Ответы:


70

zsh, 603 594 566 561 548 440 415 399 378 370 байт

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

Зависит от coreutils + dc.

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

Это было ... путешествие.

Этот ответ состоит из трех частей. Первые 4 строки обрабатывают определенные особые случаи, чтобы упростить следующий код. Следующие 2 строки и последняя строка, по сути, выполняют одно и то же, но ровно одна запускается с удалением любого символа. Они написаны в основном с дополнительными наборами символов, так что удаление любого символа нарушает только один, позволяя другому продолжать функционировать.

Глядя на первую часть, мы сначала справимся

  • удаление новой строки с ec\nho \\n
  • удаление пробела с помощью ca t<<<$'\x20'(с последующим, exi tчтобы избежать запуска более позднего кода, который привел бы к постороннему выводу)
  • $удаление с d$c -e8BC6P( 8BC6= 9226is 36*256 + 10, а 36 и 10 - байтовые значения $символов и новой строки соответственно; мы используем шестнадцатеричные цифры в десятичном формате, чтобы избежать необходимости включать их в большой комментарий в строке 6)
  • 0удаление с d0c -eKp( Kполучает десятичную точность, которая 0по умолчанию)

В следующей части используются только символы (кроме мусора в конце второй строки) $'\01234567v;, пробел и перевод строки. Из них четыре были учтены, поэтому остаток ( '\1234567v) не может быть в последней строке. Развернув восьмеричные экранированные $'\123'символы ( представляет символ ASCII со значением 123 8 ), мы получим:

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

Первая строка перебирает все символы, используемые в программе, и ищет каждый из них в своем собственном исходном коде ( $0это имя файла выполняемого скрипта), печатая любой символ, который не найден.

Вторая строка выглядит немного странно и, кажется, делает то же самое, что и exitс кучей nops. Однако кодирование exitкак восьмеричное напрямую приводит к тому $'\145\170\151\164', что не содержит 2или 3. Нам на самом деле нужно сделать это менее устойчивым к удалению. Это потому, что если какой-либо из '\014567vних удаляется, ломая первую строку, вторая строка также разрывается, что позволяет выполнить оставшуюся часть кода. Однако нам нужно, чтобы он также ломался, если 2или 3удаляется, чтобы строки 3 и 4 могли работать. Это достигается путем подковывания в :и ;, которые имеют 2 и 3 в восьмеричном представлении соответственно.

Мусор в конце строки 2 просто необходим для того, чтобы каждый печатный символ ASCII появлялся хотя бы один раз, так как для этого требуется проверка, циклически проходящая по каждому из них.

Если exitне был вызван в первом разделе (то есть он был поврежден путем удаления одного из '\01234567v), мы переходим ко второму, в котором мы должны выполнить то же самое, не используя ни один из этих символов. Последняя строка аналогична декодированной первой строке, за исключением того, что мы можем сократить диапазон цикла, чтобы сохранить несколько байтов, поскольку мы уже знаем, что все символы, кроме '\01234567v, были охвачены. Он также имеет 0# $#перед ним, который комментирует его и не дает ему производить посторонний вывод, если 0или $были удалены.


5
Вау, очень впечатляет, учитывая количество разных персонажей! Определенно ожидая увидеть это объяснение.
Кевин Круйссен

3
@KevinCruijssen вот и ты :)
Дверная ручка

1
@ Doorknob, если это не выиграет у вас 548 интернетов, я не знаю, что делает. Честно говоря, 603-байтовая версия так же впечатляет, ха!
Волшебная урна осьминога

3
Пока единственный интересный ответ.
htmlcoderexe

21

Сетчатка , 1 байт

1

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

Когда все экземпляры одиночного byte ( 1) удалены, вывод будет 1. Достаточно просто.


6
Я просматривал TIO, чтобы найти что-то вроде этого - вы меня опередили. Кстати, это полиглот, работает с
улитками

ИМО, этот ответ должен быть обновлен до ответа полиглота в качестве первого (возможно, с вечно неполным списком языков), а два других должны быть забыты. О, и это также работает в Си .

@Rogem Я не уверен, что вы подразумеваете под "это работает на C." у вас есть компилятор C, который выводит 1для пустой программы? Несмотря на это, я думаю, что рассматриваемые ответы используют различные подходы и поведения. ИМО ответ по полиглоту оправдан, только если подход остается прежним. (Объективно, это не полиглот, поскольку фактический код отличается от приведенных ниже.) Не стесняйтесь голосовать, как хотите, но действительный ответ - действительный ответ. Я оставлю свой ответ таким, какой он есть, я не хочу размещать на нем коллекцию ответов.
Конор О'Брайен,

11

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?
Джо Кинг,

@JoKing Я не знал, что это Uбыл самый короткий печатный байт ASCII, который мог быть выведен. Я не хотел использовать непечатаемые байты.
Нил

Даже не используя преимущества обтекания ячеек или непечатаемых символов, вы можете уменьшить это значение до 216173027061157310 байт, включив символ пробела в качестве третьего отдельного байта.
Нитродон

7
Я не могу удержаться от голоса из-за «Редактировать: Сохранено 72057832274401770 байт ...»
Мистер Листер


9

Полиглот * , 1 байт (в ожидании подтверждения )

0

Попробуйте онлайн! (используя Треугольность)

*: Это работает в (довольно широком) разнообразии языков (за исключением esolangs, таких как 4,> <> и тому подобное, и некоторых других исключений). Идентичен ответу Jelly в исходном коде, но метод ввода / вывода отличается - вывод осуществляется через код выхода. При удалении 0из исходного кода они остаются с пустой программой, которая часто не вызывает ошибок и дает код выхода 0 в большинстве языков.


3

sed , 1 байт



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

Полностью отличается от ответа Retina или ответа Jelly.


Я не вижу никакого кода. Разве это не сделает ответ 0 байтов? Как это работает?
Мачта

15
@Mast Есть новая строка ..... у вас будут проблемы с чтением программ, написанных в Whitespace, если вы будете продолжать так думать.
user202729

3

Унарный (неконкурентный), 96 байт

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

Вот xxdсвалка.

Более широкое определение унарного языка допускает любые символы в его исходном коде. Но я не нашел компилятор или интерпретатор, который бы работал для этого. Поэтому я отметил этот ответ как неконкурентный. Если вы можете найти тот, который размещен до того, как задан этот вопрос, я сделаю ссылку на него.


4
Это самая маленькая унарная программа, которую я когда-либо видел.
Draco18s
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.