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
źródło
SD S
byłby prawidłowy zestaw flag?Odpowiedzi:
Verilog,
513670617 bajtówDziała przy użyciu IVerilog. Nie są potrzebne specjalne flagi kompilacji.
Jest to potwór z zagnieżdżonych definicji, skręcania bitów i irytacji z powodu konieczności zmiany kolejności bitów z powodu endianizmu (w przeciwnym razie albo łańcuch nie zostanie wydrukowany, albo kolejność bitów liczbowych będzie niepoprawna). Dane wejściowe są pobierane przez
i
port, co jest zwykłym sposobem wprowadzania danych do modułu Verilog.$display
służy do drukowania w standardowym formacie. Można zapisać 6 bajtów, jeśli początkowe zera nie byłyby wymagane dla znacznika czasu.Próbny
Testbench (nie oceniono):
Przykładowy przebieg:
źródło
Python,
485, 479, 442, 438, 431, 429, 418, 402, 395, 391, 370 bajtów.Zapisałem 19 bajtów dzięki Cᴏɴᴏʀ O'Bʀɪᴇɴ przypominając mi, że mogę przypisać funkcje do litery.
Zaoszczędzono 6 bajtów dzięki sugestii FryAmTheEggman, aby wyczyścić filtr maski bitowej.
Zaoszczędź 21 bajtów dzięki niesamowitej odpowiedzi Ruby W0lf, zmuszając mnie do gry w golfa. ;)
To absolutny potwór. Jestem pewien, że uda mi się to trochę zmniejszyć, ale zbliża się do gry w golfa.
źródło
int
chara? lub może wykonać funkcję, która wykonujestr int
.or 'SD'
nimi można usunąćHaskell,
781710 bajtówDzięki BlackCap za pewne uproszczenia
Pozwala to dodatkowo wyświetlać śmieci (jak znak nowej linii) po wprowadzeniu.
źródło
Java,
17211587157315601511 bajtów:Pobiera dane wejściowe w formacie 32-bajtowego ciągu binarnego. Dane wyjściowe w formacie ciągu rozdzielanego spacjami. To może być bardzo długa odpowiedź, ale nadal nie jestem rozczarowany. Cieszę się, że udało mi się to zaimplementować w Javie. Mimo to będę się starał grać w golfa jak najwięcej.
Wypróbuj online! (Ideone)
źródło
Rubinowy, 344 bajty
Nieco bardziej czytelna wersja jest dostępna tutaj .
Test online: http://ideone.com/Fww1Rw
źródło
JavaScript (ES6), 369
Mniej golfa
Test
źródło
Script error.
. Ale z jakiegoś powodu w Firefoksie wydaje się działać idealnie. Zastanawiam się, dlaczego ...PHP ,
301288 bajtówWypróbuj online!
Dane wejściowe są 32-bajtowym ciągiem znaków przez
STDIN
, dane wyjściowe doSTDOUT
.-13 bajtów jako samodzielny program.
źródło
Stax , 111 bajtów
Uruchom i debuguj
źródło
Perl, 249 bajtów
Pobiera 32 bajty jako dane wejściowe, dane wyjściowe są oddzielone znakami nowej linii.
unpack
jest idealny do tego rodzaju analizy struktury binarnej.Niektóre najważniejsze:
unpack
.@{[]}
pozwala interpolować kod w ciągu. W rzeczywistości tworzy odwołanie do tablicy, które jest następnie usuwane z dereferencji."$str1"x!!$str2
to dobry sposób na zwrócenie$str1
tylko wtedy, gdy$str2
jest niepusty ciąg.Poniżej znajduje się wersja, która działa na prawdziwych pozycjach katalogu, z polami little-endian, i ignoruje tylko prawidłowe dopełnianie nazwy pliku i rozszerzenia (więc np.
" ppcg"
Nie ma usuniętej początkowej białej spacji) (254 bajty)źródło