Das Microsoft FAT-Dateisystem verfügt über eine Verzeichnistabelle, die angibt, welche "Dateien" sich in welchen "Ordnern" auf der Festplatte befinden. Für die Zeit haben diese Einträge viele Informationen in eine kleine Menge von Bits gepackt. Es gibt eine Reihe von technischen Spezifikationen im Wiki für Neugierige, aber die Herausforderung hier wird sich auf eine "einfache" Dekodierung eines Eintrags konzentrieren.
Jeder Eintrag besteht aus einem 32-Byte-Binärwort, das in mehrere Abschnitte unterteilt ist. Aus Konsistenzgründen verwenden wir die MS-DOS 5.0-Version, die Bytes sind als Big Endian geordnet und wir nennen Byte ganz 0x00
links und Byte ganz 0x1F
rechts.
Nachfolgend finden Sie eine kurze schematische Darstellung der relevanten Abschnitte und die Ausgabe für jeden Abschnitt (in Fettdruck ).
- Die ersten 11 Bytes sind der Dateiname im ASCII-Format (hierher kommt der berühmte 8.3-Dateiname - 8 Bytes für den Dateinamen, 3 Bytes für die Erweiterung). Dies ist eine reine ASCII-Codierung und sollte als ASCII mit einem Punkt (.) Dazwischen ausgegeben werden .
- Hinweis: Sowohl die 8- als auch die 3-Teile sind mit Leerzeichen aufgefüllt, um eine Eingabe in voller Länge zu ermöglichen. Die Ausgabe sollte Leerzeichen ignorieren (dh nicht ausgeben).
- Die Dateierweiterung kann leer sein (dh alle Leerzeichen). In diesem Fall sollte die Ausgabe nicht den Punkt ausgeben .
- Da ASCII nur die unteren 7 Bits verwendet, werden die Bytes alle vorangestellt
0
.
- Das nächste Byte (0x0b) ist eine Bitmaske der folgenden Art:
- 0x01 Read Only - RO ausgeben
- 0x02 Hidden - Ausgabe von H
- 0x04 System - Ausgang S
- 0x08 Volume Label - Ausgabe VL . Die Dateigröße (unten) sollte unabhängig von ihrem tatsächlichen Eintrag als 0 ausgegeben werden .
- 0x10-Unterverzeichnis - SD ausgeben . Die Dateigröße (unten) sollte unabhängig von ihrem tatsächlichen Eintrag als 0 ausgegeben werden .
- 0x20 Archiv - Ausgabe A
- 0x40 Gerät - für diese Herausforderung ignoriert.
- 0x80 Reserviert - für diese Herausforderung ignoriert.
- Da dies eine Bitmaske ist, sind mehrere Flags möglich - alle zutreffenden Ausgaben sollten in beliebiger Reihenfolge miteinander verkettet werden. Zum Beispiel
0xff
könnte es seinROHSVLSDA
(oder irgendeine andere Kombination).
- Die nächsten zwei Bytes (0x0c und 0x0d) werden unter MS-DOS 5.0 nicht verwandt.
- Die nächsten zwei Bytes (0x0e und 0x0f) sind die Erstellungszeit wie folgt:
- Die Bits 15 bis 11 sind die Stunden im 24-Stunden-Format - Ausgabe 00 bis 23
- Die Bits 10 bis 5 sind die Minuten - Ausgabe 00 bis 59
- Die Bits 4 bis 0 sind die Sekunden / 2 - Ausgabe von 00 bis 58 (beachten Sie, dass die Sekunden nur eine Auflösung von zwei Sekunden haben).
- Zur Verdeutlichung:
hhhhhmmmmmmsssss
wenn Big-Endian geschrieben.
- Die nächsten zwei Bytes (0x10 und 0x11) sind das Erstellungsdatum wie folgt:
- Die Bits 15 bis 9 geben die Jahresausgabe 1980 für
0
bis zu 2107 für an127
- Bits 8 bis 5 sind die Monate - Ausgabe 1 bis 12 (mit oder ohne führende Null)
- Bits 4 bis 0 sind der Tag - Ausgabe 0 bis 31 (mit oder ohne führende Null)
- Zur Verdeutlichung:
yyyyyyymmmmddddd
wenn Big-Endian geschrieben.
- Die Bits 15 bis 9 geben die Jahresausgabe 1980 für
- Die nächsten zwei Bytes (0x12 und 0x13) sind das letzte Zugriffsdatum. Wir ignorieren diesen Teil für diese Herausforderung, während wir in MS-DOS 5.0 verwandt werden.
- Die nächsten zwei Bytes (0x14 und 0x15) werden von MS-DOS 5.0 nicht verwandt.
- Die nächsten zwei Bytes (0x16 und 0x17) sind die letzte geänderte Zeit und folgen demselben Format wie die oben angegebene Erstellungszeit.
- Die nächsten zwei Bytes (0x18 und 0x19) sind das letzte Änderungsdatum und folgen demselben Format wie das Erstellungsdatum oben.
- Die nächsten zwei Bytes (0x1a und 0x1b) sind der Cluster-Speicherort der Datei auf der Festplatte. Wir ignorieren diesen Teil für diese Herausforderung.
- Die letzten vier Bytes (0x1c, 0x1d, 0x1e und 0x1f) stellen die Dateigröße dar - werden als Ganzzahl ohne Vorzeichen ausgegeben , sofern nicht die VL- oder SD- Flags gesetzt sind ( siehe oben). In diesem Fall wird ausgegeben
0
.
Visuelle Darstellung
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
Eingang
- Ein einzelnes 32-Byte-Wort (dh 256 Bit) in einem beliebigen Format.
- Dies kann eine Zeichenfolge von
1
und0
, wie mehrere vorzeichenloseint
, ein Array von Booleschen Werten usw. sein. - Bitte geben Sie in Ihrer Antwort an, welches Format Sie für die Eingabe verwenden.
- Sie können nicht mehrere Eingaben vornehmen (dh ein Array, das in die relevanten Byte-Größen unterteilt ist), es sei denn, dies ist die einzige Möglichkeit für Ihre Sprache, Eingaben vorzunehmen. Das Parsen der Eingabe ist Teil der Herausforderung.
- Dies kann eine Zeichenfolge von
- Sie können davon ausgehen, dass die Eingabe gültig ist (zum Beispiel müssen Sie keine Datumsprüfung durchführen, um zu überprüfen, ob das Datum gültig ist).
- Nicht verwendete Bytes können alle
0
, alle1
usw. sein, solange sie vorhanden sind. In den folgenden Beispielen habe ich all0
für die nicht verwendeten Bytes verwendet.
Ausgabe
Entweder gedruckt auf dem Bildschirm oder zurückgegeben:
- Der Dateiname als ASCII-Zeichenfolge
- Die Dateiattribute als ASCII-Zeichenfolge
- Die Erstellungszeit und das Erstellungsdatum, mit entsprechenden Trennzeichen (Doppelpunkte, Schrägstriche, etwas zur Unterscheidung der Komponenten)
- Die geänderte Uhrzeit und das geänderte Datum, ebenfalls mit entsprechenden Trennzeichen
- Die Dateigröße
Bei der Ausgabe kann es sich um eine durch Leerzeichen oder Zeilenumbrüche getrennte Einzelzeichenfolge, separate Elemente in einem Array usw. handeln. Bitte geben Sie in Ihrer Antwort an, wie Ihre Ausgabe formatiert ist.
Regeln
- Standard-E / A-Formate sind zulässig.
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
- Standardlücken sind verboten.
- Dies ist Code-Golf , daher gelten alle üblichen Golfregeln und der kürzeste Code gewinnt.
- Built-Ins, die genau diese Funktion ausführen, sind verboten.
Beispiele
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
quelle
SD S
ein gültiges Flag gesetzt?Antworten:
Verilog,
513670617 BytesLäuft mit IVerilog. Es werden keine speziellen Kompilierungsflags benötigt.
Dies ist ein Monster aus verschachtelten Definitionen, Bit-Twiddling und dem Ärger, dass die Bitreihenfolge aufgrund der Endianness umgedreht werden muss (andernfalls wird die Zeichenfolge entweder nicht gedruckt oder die Zahlenbitreihenfolge ist falsch). Die Eingabe erfolgt über den
i
Port. Dies ist die übliche Art der Eingabe in ein Verilog-Modul.$display
wird zum Drucken nach Standard verwendet. 6 Bytes könnten gespeichert werden, wenn für den Zeitstempel keine führenden Nullen erforderlich wären.Demo
Testbench (nicht bewertet):
Beispiellauf:
quelle
Python,
485, 479, 442, 438, 431, 429, 418, 402, 395, 391, 370 Bytes.Dank Cᴏɴᴏʀ O'Bʀɪᴇɴ, der mich daran erinnerte, dass ich einem Buchstaben Funktionen zuweisen kann, wurden 19 Byte gespeichert.
Dank des Vorschlags von FryAmTheEggman, den Bitmaskenfilter zu bereinigen, wurden 6 Byte eingespart.
21 Bytes gespart, dank W0lfs fantastischer Ruby-Antwort, die mich dazu zwingt, noch ein bisschen Golf zu spielen. ;)
Dies ist ein absolutes Monster. Ich bin mir ziemlich sicher, dass ich es noch ein bisschen kürzen kann, aber es wird fast so, als würde ich Golf spielen.
quelle
int
einen char zuweisen ? oder vielleicht machen Sie eine Funktion, die durchführtstr int
.or 'SD'
kann entfernt werden, denke ichHaskell,
781710BytesVielen Dank an BlackCap für die Vereinfachung
Dies ermöglicht zusätzlich, dass nach der Eingabe Müll (wie ein Newline-Zeichen) erscheint.
quelle
Java,
17211587157315601511 Bytes:Übernimmt Eingaben im Format einer 32-Byte-Binärzeichenfolge. Ausgaben im Format einer durch Leerzeichen getrennten Zeichenfolge. Dies kann eine sehr sein sehr lange Antwort, aber ich bin noch nicht enttäuscht. Ich bin nur froh, dass ich dies in Java implementieren konnte. Ich werde trotzdem versuchen, so viel wie möglich Golf zu spielen.
Probieren Sie es online! (Ideone)
quelle
Ruby, 344 Bytes
Die etwas besser lesbare Version finden Sie hier .
Online-Test: http://ideone.com/Fww1Rw
quelle
JavaScript (ES6), 369
Weniger golfen
Prüfung
quelle
Script error.
. Aber aus irgendeinem Grund scheint es in Firefox perfekt zu funktionieren. Ich frage mich, warum ...PHP ,
301288 BytesProbieren Sie es online!
Die Eingabe ist eine 32-Byte-Wortfolge über
STDIN
, die an ausgegeben wirdSTDOUT
.-13 Bytes als eigenständiges Programm.
quelle
Stax , 111 Bytes
Führen Sie es aus und debuggen Sie es
quelle
Perl, 249 Bytes
Nimmt 32 Bytes als Eingabe, Ausgabe wird durch Zeilenumbrüche getrennt.
unpack
ist perfekt für diese Art der Analyse von Binärstrukturen.Einige Höhepunkte:
unpack
.@{[]}
ermöglicht das Interpolieren von Code in einer Zeichenfolge. Tatsächlich wird eine Arrayreferenz erstellt, die dann dereferenziert wird."$str1"x!!$str2
ist eine gute Möglichkeit,$str1
nur zurückzugeben, wenn$str2
es sich um eine nicht leere Zeichenfolge handelt.Unten finden Sie eine Version, die mit echten Verzeichniseinträgen mit Little-Endian-Feldern funktioniert und nur das richtige Auffüllen des Dateinamens und der Erweiterung ignoriert (z. B.
" ppcg"
werden die anfänglichen Leerzeichen nicht entfernt) (254 Byte).quelle