Файловая система Microsoft FAT имеет таблицу каталогов для представления, какие «файлы» находятся в каких «папках» на диске. Пока что эти записи втиснули много информации в небольшое количество битов. На Wiki есть куча технических спецификаций для любопытных, но задача здесь будет сосредоточена на «простом» декодировании записи.
Каждая запись состоит из 32-байтового двоичного слова, разбитого на несколько разделов. Для обеспечения согласованности в этом вызове мы будем использовать версию MS-DOS 5.0, байты упорядочены с прямым порядком байтов , и мы называем байт 0x00
самым левым, а байт 0x1F
- самым правым.
Ниже приведена краткая схема соответствующих разделов, и что должно быть на выходе для каждого раздела ( выделено жирным шрифтом ).
- Первые 11 байтов - это имя файла в формате ASCII (отсюда и происходит известное имя файла 8.3 - 8 байтов для имени файла, 3 байта для расширения). Это прямое кодирование ASCII и должно быть выведено как ASCII с точкой (.) Между .
- Примечание: как 8, так и 3 части заполнены пробелами для полной записи. Вывод должен игнорировать пробелы (т.е. не выводить их).
- Расширение файла может быть пустым (т. Е. Все пробелы), и в этом случае выходные данные не должны выводить точку .
- Поскольку в ASCII используются только младшие 7 битов, все байты будут иметь начальные символы
0
.
- Следующий байт (0x0b) является битовой маской следующего:
- 0x01 Только чтение - вывод RO
- 0x02 Hidden - выход H
- 0x04 Система - выход S
- 0x08 Volume Label - выходной ВЛ . Размер файла (ниже) должен быть выведен как 0 , независимо от его фактической записи.
- Подкаталог 0x10 - вывод SD . Размер файла (ниже) должен быть выведен как 0 , независимо от его фактической записи.
- 0x20 Архив - выход А
- Устройство 0x40 - игнорируется для этой задачи.
- 0x80 Reserved - игнорируется для этой задачи.
- Поскольку это битовая маска, возможны несколько флагов - все применимые выходные данные должны объединяться вместе в любом порядке. Например,
0xff
может бытьROHSVLSDA
(или любая другая комбинация).
- Следующие два байта (0x0c и 0x0d) не используются в MS-DOS 5.0.
- Следующие два байта (0x0e и 0x0f) представляют собой время создания следующим образом:
- Биты с 15 по 11 - это часы в 24-часовом формате - выходные данные с 00 по 23
- Биты с 10 по 5 - минуты - вывод с 00 до 59
- Биты с 4 по 0 являются секундами / 2 - выводят от 00 до 58 (обратите внимание, что секунды имеют разрешение только в две секунды)
- Для пояснения:
hhhhhmmmmmmsssss
когда написано big-endian.
- Следующие два байта (0x10 и 0x11) представляют собой дату создания следующим образом:
- Биты 15 до 9 в год - выпуск 1980 для
0
до 2107 для127
- Биты с 8 по 5 - месяцы - выходные данные с 1 по 12 (с начальным нулем или без него)
- Биты с 4 по 0 - это день - вывод от 0 до 31 (с или без нуля в начале)
- Для пояснения:
yyyyyyymmmmddddd
когда написано big-endian.
- Биты 15 до 9 в год - выпуск 1980 для
- Следующие два байта (0x12 и 0x13) являются последней датой доступа. При использовании в MS-DOS 5.0 мы игнорируем эту часть для этой задачи.
- Следующие два байта (0x14 и 0x15) не используются MS-DOS 5.0.
- Следующие два байта (0x16 и 0x17) являются последним измененным временем, следуя тому же формату, что и время создания, описанному выше.
- Следующие два байта (0x18 и 0x19) - это дата последнего изменения, которая соответствует формату, указанному выше.
- Следующие два байта (0x1a и 0x1b) являются расположением кластера файла на диске. Мы игнорируем эту часть для этого вызова.
- Последние четыре байта (0x1c, 0x1d, 0x1e и 0x1f) - это размер файла - выводится как целое число без знака , если только не установлены флаги VL или SD (см. Выше), в этом случае выводится
0
.
Визуальное представление
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
вход
- Одно 32-байтовое слово (то есть 256 бит) в любом удобном формате.
- Это может быть как строка
1
и0
, как несколько беззнаковыхint
с, массив значений булевых и т.д. - Пожалуйста, укажите в своем ответе, какой формат вы используете для ввода.
- Вы не можете получить множественный ввод (т. Е. Массив, предварительно разбитый на соответствующие размеры в байтах), если только это не единственный способ для вашего языка принять ввод. Разбор входных данных является частью проблемы.
- Это может быть как строка
- Вы можете предположить, что ввод действителен (например, вам не нужно выполнять проверку даты, чтобы убедиться, что дата действительна).
- Неиспользуемые байты могут быть всеми
0
, всеми1
и т. Д., Только если они присутствуют. В приведенных ниже примерах я использовал все0
для неиспользуемых байтов.
Выход
Либо распечатывается на экране, либо возвращается следующее:
- Имя файла в виде строки ASCII
- Атрибуты файла в виде строки ASCII
- Время создания и дата создания, с соответствующими разделителями (двоеточия, косые черты, что-то, чтобы различать компоненты)
- Измененное время и измененная дата, опять же с соответствующими разделителями
- Размер файла
Выводом может быть одна строка, разделенная пробелами или новая строка, отдельные элементы в массиве и т. Д. Пожалуйста, укажите в своем ответе, как форматируется ваш вывод.
правила
- Стандартные форматы ввода / вывода являются приемлемыми.
- Допустимы либо полная программа, либо функция.
- Стандартные лазейки запрещены.
- Это код-гольф , поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код.
- Встроенные модули, выполняющие именно эту функцию, запрещены.
Примеры
0111000001110010011011110110011101110010011000010110110101101101011010010110111001100111000001100000000000000000101000100100010001001000110101000000000000000000000000000000000010100010010001000100100011010100000000000000000000000000000000001101000000000000
programm.ing HS 20:18:08 2016/06/20 20:18:08 2016/06/20 53248
0010000000100000001000000010000001110000011100000110001101100111001000000010000000100000000101000000000000000000010111010110110000111101100111110000000000000000000000000000000010100010010001000100100011010100000000000000000011110000000100111111001011100001
ppcg SDS 11:43:24 2010/12/31 20:18:08 2016/06/20 0
источник
SD S
ли установлен правильный флаг?Ответы:
Verilog,
513670617 байтРаботает с использованием IVerilog. Никаких специальных флагов компиляции не требуется.
Это монстр вложенных определений, сдвиговых битов и раздражения от необходимости переворачивать битовый порядок из-за порядкового номера (в противном случае либо строка не печатается, либо неправильный порядок числового бита). Ввод осуществляется через
i
порт, который является обычным способом ввода данных в модуль Verilog.$display
используется для печати в стандартный формат. Можно сохранить 6 байтов, если для метки времени не требуются начальные нули.демонстрация
Тестовый стенд (не забит):
Пример выполнения:
источник
Python,
485, 479, 442, 438, 431, 429, 418, 402, 395, 391, 370 байтов.Сохранено 19 байтов благодаря Cᴏɴᴏʀ O'Bʀɪᴇɴ, напомнившему мне, что я могу назначать функции письму.
Сохранено 6 байтов благодаря предложению FryAmTheEggman очистить фильтр битовой маски.
Сэкономили 21 байт благодаря удивительному ответу W0lf на Ruby, заставившему меня еще немного поиграть в гольф. ;)
Это абсолютный монстр. Уверен, я смогу сократить это немного больше, но это довольно близко к игре в гольф.
источник
int
на чар? или, может быть, сделать функцию, которая выполняетstr int
.or 'SD'
можно убрать, я думаюHaskell,
781710 байтСпасибо BlackCap за некоторое упрощение
Это дополнительно позволяет мусору (например, символу новой строки) появляться после ввода.
источник
Ява,
17211587157315601511 байт:Принимает ввод в формате 32-байтовой двоичной строки. Выводится в формате разделенной пробелами строки. Это может быть очень очень длинный ответ, но я все еще не разочарован. Я просто счастлив, что смог реализовать это на Java. Я все еще буду стараться играть в гольф столько, сколько смогу.
Попробуйте онлайн! (Ideone)
источник
Рубин, 344 байта
Чуть более читаемая версия доступна здесь .
Онлайн тест: http://ideone.com/Fww1Rw
источник
JavaScript (ES6), 369
Меньше гольфа
Тест
источник
Script error.
. Но по какой-то причине в Firefox он работает идеально. Интересно, почему ...PHP ,
301288 байтПопробуйте онлайн!
Ввод представляет собой 32-байтовую строку слова через
STDIN
, вывод вSTDOUT
.-13 байт как отдельная программа.
источник
Stax , 111 байт
Запустите и отладьте его
источник
Perl, 249 байт
Принимает 32 байта в качестве ввода, вывод отделяется переводом строки.
unpack
идеально подходит для этого вида анализа двоичной структуры.Некоторые основные моменты:
unpack
.@{[]}
позволяет интерполировать код в строку. Это фактически создает ссылку на массив, который затем разыменовывается."$str1"x!!$str2
хороший способ вернуть,$str1
только если$str2
непустая строкаНиже приведена версия, которая работает с реальными записями каталога, с полями с прямым порядком байтов и игнорирует только заполнение справа по имени файла и расширению (например
" ppcg"
, без удаления начальных пробелов) (254 байта).источник