System plików Microsoft FAT ma tabelę katalogów, która reprezentuje „pliki”, w których „folderach” na dysku. Na razie wpisy te wypełniały wiele informacji niewielką ilością bitów. Dla ciekawskich istnieje wiele specyfikacji technicznych na Wiki , ale wyzwanie polega na „prostym” dekodowaniu wpisu.
Każdy wpis składa się z 32-bajtowego słowa binarnego, podzielonego na kilka sekcji. Aby zachować spójność w tym wyzwaniu, będziemy używać wersji MS-DOS 5.0, bajty są uporządkowane jako duże endiany , a bajty nazywamy 0x00
skrajnie lewe, a bajty 0x1F
skrajnie prawe.
Poniżej znajduje się krótki schemat odpowiednich sekcji i jaki powinien być wynik dla każdej sekcji ( pogrubioną czcionką ).
- Pierwsze 11 bajtów to nazwa pliku w formacie ASCII (stąd pochodzi słynna nazwa pliku 8.3 - 8 bajtów dla nazwy pliku, 3 bajty dla rozszerzenia). Są to proste kodowania ASCII i powinny być wyprowadzane jako ASCII z kropką (.) Pomiędzy .
- Uwaga: zarówno 8, jak i 3 części są wypełnione spacjami, aby umożliwić wejście na całej długości. Dane wyjściowe powinny ignorować spacje (tzn. Nie wypisywać ich).
- Rozszerzenie pliku może być puste (tzn. Wszystkie spacje), w którym to przypadku wynik nie powinien wypisywać kropki .
- Ponieważ ASCII używa tylko 7 niższych bitów, wszystkie bajty będą miały wiodące
0
.
- Następny bajt (0x0b) jest maską bitową następujących elementów:
- 0x01 Tylko do odczytu - wyjście RO
- 0x02 Ukryty - wyjście H
- 0x04 System - wyjście S
- 0x08 Etykieta woluminu - wyjście VL . Rozmiar pliku (poniżej) powinien być wyprowadzany jako 0 , niezależnie od jego rzeczywistego wpisu.
- 0x10 Podkatalog - wyjście SD . Rozmiar pliku (poniżej) powinien być wyprowadzany jako 0 , niezależnie od jego rzeczywistego wpisu.
- 0x20 Archiwum - wyjście A
- 0x40 Urządzenie - zignorowane dla tego wyzwania.
- 0x80 Zarezerwowane - zignorowane dla tego wyzwania.
- Ponieważ jest to maska bitowa, możliwych jest wiele flag - wszystkie odpowiednie dane wyjściowe powinny być łączone w dowolnej kolejności. Na przykład
0xff
może byćROHSVLSDA
(lub dowolną inną kombinacją).
- Następne dwa bajty (0x0c i 0x0d) nie są używane w MS-DOS 5.0.
- Następne dwa bajty (0x0e i 0x0f) to następujący czas utworzenia:
- Bity od 15 do 11 to godziny w formacie 24-godzinnym - dane wyjściowe od 00 do 23
- Bity od 10 do 5 są minutami - wyjście od 00 do 59
- Bity od 4 do 0 to sekundy / 2 - wyjście od 00 do 58 (zauważ, że sekundy są w rozdzielczości dwóch sekund)
- Dla wyjaśnienia:
hhhhhmmmmmmsssss
przy pisaniu big-endian.
- Następne dwa bajty (0x10 i 0x11) to data utworzenia w następujący sposób:
- Bity od 15 do 9 to rok produkcji 1980 dla
0
maksymalnie 2107 dla127
- Bity od 8 do 5 to miesiące - dane wyjściowe od 1 do 12 (z wiodącym zerem lub bez zera)
- Bity od 4 do 0 to dzień - wyjście od 0 do 31 (z wiodącym zerem lub bez zera)
- Dla wyjaśnienia:
yyyyyyymmmmddddd
przy pisaniu big-endian.
- Bity od 15 do 9 to rok produkcji 1980 dla
- Następne dwa bajty (0x12 i 0x13) to data ostatniego dostępu. W wersji MS-DOS 5.0 ignorujemy tę część tego wyzwania.
- Następne dwa bajty (0x14 i 0x15) nie są używane przez MS-DOS 5.0.
- Następne dwa bajty (0x16 i 0x17) to czas ostatniej modyfikacji, zgodny z tym samym formatem, co czas utworzenia powyżej.
- Następne dwa bajty (0x18 i 0x19) to data ostatniej modyfikacji, zgodna z tym samym formatem, co data utworzenia powyżej.
- Następne dwa bajty (0x1a i 0x1b) to lokalizacja klastra pliku na dysku. W przypadku tego wyzwania ignorujemy tę część.
- Ostatnie cztery bajty (0x1c, 0x1d, 0x1e i 0x1f) to rozmiar pliku - wyjście jako liczba całkowita bez znaku , chyba że ustawione są flagi VL lub SD (powyżej), w takim przypadku wyjście
0
.
Reprezentacja wizualna
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
Wkład
- Jedno 32-bajtowe słowo (tj. 256 bitów) w dowolnym dogodnym formacie.
- Może to być ciąg znaków
1
i0
, jako kilka znaków bez znakuint
, tablica wartości boolowskich itp. - Podaj w odpowiedzi, jakiego formatu używasz do wprowadzania danych.
- Nie można pobierać wielu danych wejściowych (tj. Tablicy wstępnie podzielonej na odpowiednie rozmiary bajtów), chyba że jest to jedyny sposób, w jaki Twój język może wprowadzić dane. Analiza danych wejściowych jest częścią wyzwania.
- Może to być ciąg znaków
- Możesz założyć, że dane wejściowe są prawidłowe (na przykład nie musisz sprawdzać daty, aby sprawdzić, czy data jest poprawna).
- Nieużywane bajty mogą być wszystkie
0
, wszystkie1
itd., O ile są obecne. W poniższych przykładach użyłem wszystkich0
dla nieużywanych bajtów.
Wydajność
Wydrukowano na ekranie lub zwrócono następujące informacje:
- Nazwa pliku jako ciąg ASCII
- Atrybuty pliku jako ciąg ASCII
- Czas utworzenia i data utworzenia, z odpowiednimi separatorami (dwukropki, ukośniki, coś, co odróżnia składniki)
- Zmodyfikowana godzina i data modyfikacji, ponownie z odpowiednimi separatorami
- Rozmiar pliku
Dane wyjściowe mogą być pojedynczym ciągiem oddzielonym spacją lub znakiem nowej linii, oddzielnymi elementami w tablicy itp. W odpowiedzi należy określić sposób formatowania danych wyjściowych.
Zasady
- Standardowe formaty We / Wy są dopuszczalne.
- Dopuszczalny jest pełny program lub funkcja.
- Standardowe luki są zabronione.
- To jest gra w golfa , więc obowiązują wszystkie zwykłe zasady gry w golfa i wygrywa najkrótszy kod.
- Wbudowane, które wykonują dokładnie tę funkcję, są zabronione.
Przykłady
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
byłby prawidłowy zestaw flag?