Сценарий
В последнее время вы замечали странное поведение в вашем любимом текстовом редакторе. Сначала казалось, что он игнорирует случайные символы в вашем коде при записи на диск. Через некоторое время вы заметили шаблон; символы с нечетными значениями ASCII игнорировались. При дальнейшей проверке вы обнаружили, что вы можете правильно записывать файлы, только если каждый восьмой бит равен нулю. Теперь вам нужно знать, была ли эта ценная ошибка затронута на ваших ценных файлах.
Задание
Вы должны написать полную программу, которая определяет, содержит ли файл какие-либо нечетные байты (демонстрируя, что он не поврежден). Но из-за вашего текстового редактора вы не можете писать какие-либо нечетные байты в вашем исходном коде. Вы можете принять любую существующую кодировку для ввода, однако вы все равно должны проверять каждый отдельный байт, а не только символы.
вход
Ваша программа будет извлекать содержимое или путь к файлу из стандартного ввода или командной строки.
Выход
Ваша программа выведет на стандартный вывод либо истинное значение, если данный файл содержит нечетный байт, либо ложное значение, если каждый восьмой бит равен нулю.
критерии
Это код гольф, самая короткая программа, которая завершает задачу, побеждает. Чтобы быть верным представлением, каждый восьмой бит в исходном коде файла должен быть нулем. Я бы порекомендовал включить копию ваших двоичных файлов исходного кода в ваше представление.
Применяются стандартные лазейки .
Тестовые случаи
(В кодировке ASCII) Вход:
"$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
Output:
falsy
Input:
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
Output:
truthy
Input:
LOREMIPSVMDOLORSITAMETCONSECTETVRADIPISCINGELITSEDDOEIVSMODTEMPORINCIDIDVNTVTLABOREETDOLOREMAGNAALIQVA
VTENIMADMINIMVENIAMQVISNOSTRVDEXERCITATIONVLLAMCOLABORISNISIVTALIQVIPEXEACOMMODOCONSEQVAT
DVISAVTEIRVREDOLORINREPREHENDERITINVOLVPTATEVELITESSECILLVMDOLOREEVFVGIATNVLLAPARIATVR
EXCEPTEVRSINTOCCAECATCVPIDATATNONPROIDENTSVNTINCVLPAQVIOFFICIADESERVNTMOLLITANIMIDESTLABORVM
Output:
truthy
подсказки
Мудро выбирайте язык, эта задача может быть невозможна на любом языке
Команда Unix
xxd -b <file name>
выведет двоичные файлы файла на консоль (вместе с некоторыми дополнительными средствами форматирования)Вы можете использовать другие кодировки, отличные от ASCII, такие как UTF-8, при условии соблюдения всех других правил
источник
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
являются запрещенными печатными символами ASCII, для тех, кто заботится. Допустимые печатные символы ASCII" $&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
[CR]
есть нечетный бит. Я надеялся, что WhiteSpace был в безопасности, но увы[TAB]
. Если вы хотите пойти в старую школу, EBCDIC дает вам три гласных.Ответы:
GS2 , 4 байта
Попробуйте онлайн!
HexDump
Как это устроено
источник
Befunge, 36 байт
Я знаю, что это старый вопрос, но я хотел попробовать, потому что думал, что это будет интересным испытанием в Befunge.
Попробуйте онлайн!
Он выводит,
1
если вход поврежден (то есть содержит нечетный байт), и0
если все в порядке.объяснение
Проблема заключается в том, как определить нечетные байты, не имея доступа к командам
/
(split) или%
(modulo). Решением было умножить значение на 128 (последовательность28*8**
), а затем записать этот результат в игровое поле. В строго стандартном интерпретаторе ячейки игрового поля имеют 8-битные значения со знаком, поэтому нечетное число, умноженное на 128, усекается до -1, а четное число становится 0.Другой трюк заключался в чтении -1 или 0 обратно с игрового поля без доступа к команде
g
(get). Обходным путем для этого было записать значение в середину существующей строковой последовательности (" "
), а затем выполнить эту последовательность, чтобы поместить вложенное значение в стек. В этот момент определение нечетности байта является простым тестом с нулевым значением.Последний аспект, который стоит обсудить, - это результат. В ложном случае мы достигаем
>$.
последовательности с одним значением в стеке, поэтому$
очищаем стек, делая.
вывод равным нулю. В истинном случае мы идем по пути20`:>$.
. Так как два больше нуля, сравнение помещает единицу в стек и:
создает дублирующую копию, поэтому$
не удаляет ее, пока не получит вывод.источник
CJam (11 байт)
Онлайн демо
Убирая уловки, чтобы избежать лишних байтов, это сводится к
который считывает входные данные, отображает побитовое И с
1
, а затем выполняет базовое преобразование, давая ноль, если все И были равны нулю.источник
:(
Печатный файл .COM, 100 байт
HexDump:
Использование очень свободного определения источника как того, что может быть разумно набрано человеком, и вдохновлено стандартным тестовым файлом антивируса EICAR (дополнительную информацию см. В разделе «Давайте повеселимся с тестовым файлом EICAR» в Bugtraq).
Используя только пригодные для печати нечетные байты ASCII (примечание: коды операций, влияющие на слова, обычно бывают нечетными, бит W - это символ некоторых кодов операций), он создает фрагмент кода в SP (который мы обычно устанавливаем сразу после нашего генерирующего кода) и выполнение заканчивается падением на сгенерированный код.
Он использует тот факт, что стек изначально содержит указатель, близкий к началу PSP, и что начало PSP содержит
INT 20h
инструкцию (дополнительную информацию об этом см. На странице https://stackoverflow.com/questions/12591673/ ).Реальный источник:
источник
MATL , 7 байт
Исходный код использует кодировку UTF-8. Таким образом, исходные байты (в десятичном формате)
Входными данными является имя файла, взятое как строка, заключенная в одинарные кавычки. Выходные данные - это число нечетных байтов в файле, которое действительно, если не равно нулю.
объяснение
источник
CJam,
181715 байтовПредполагается, что языковой стандарт установлен на Latin-1. Попробуйте онлайн!
Как это устроено
Простое решение состоит в следующем.
К сожалению, символы так
q
иi
не могут появиться в исходном коде. Чтобы обойти эту проблему, мы собираемся динамически создать часть исходного кода выше, а затем оценить строку.источник
Pyth,
2013 байтовИли в двоичном виде:
Попробуйте онлайн
Как это устроено
Полученное целое число является истинным (ненулевым), если любой из байтов был нечетным.
источник
Желе , 13 байт
Ожидает ввод в качестве аргумента командной строки в кавычках. Попробуйте онлайн!
HexDump
источник
O%2¬Ạ¬
.Сетчатка , 106 байт
Удаляет все разрешенные символы, затем сопоставляет любые оставшиеся символы. Истинными значениями будут количество найденных символов. Ложные значения будут
0
.Попробуйте онлайн
Поскольку
.
по умолчанию новые строки не совпадают, мне не нужно их удалять.источник
Perl 5 +
-p0
, 136 байтПодобно другим ответам, это удаляет все четные байты и оставляет любые нечетные байты (что является правдой).
Попробуйте онлайн!
источник
-0
ничего не делает с переводами строки. Он только определяет, как разделить ввод, но не удаляет символы.-0
, я хотел сделать весь блок в виде комка, но это не должно иметь значения, но я не могу обойти это ... Жаль! Я уберу эти комментарии. Спасибо за головы, хотя!Japt , 10 байт
Попробуйте онлайн!
Кодовая страница Джапта - ISO-8859-1. Код дает,
false
когда сам вводится в виде строки, следовательно, допустимая отправка.Распаковано и как это работает
Не иметь
String.c
(получить код или карту поверх кодов) было больно, но, к счастью, естьNumber.d
(преобразовать число в символ).Оказывается, что Джапт выигрывает у CJam, Pyth и Jelly :)
Без ограничения, есть несколько способов сделать это в 6 байтов (снова в одном ряду с CJam и Jelly):
"000..000"
преобразуется в число 0 (ложь) независимо от того, как долго это. С другой стороны, все, что содержит 1, преобразуется в ненулевое значениеdouble
, илиInfinity
если оно слишком большое (оба истинные).Более простой подход, который напрямую дает
true
илиfalse
.Или 5-байтовое решение возможно даже с помощью
-d
флага:источник