Le système de fichiers Microsoft FAT possède une table de répertoires pour représenter les "fichiers" dans quels "dossiers" sur le disque. Pour le moment, ces entrées regroupaient de nombreuses informations en une petite quantité de bits. Il y a un tas de spécifications techniques sur Wiki pour les curieux, mais le défi ici va se concentrer sur un décodage "simple" d'une entrée.
Chaque entrée se compose d'un mot binaire de 32 octets, divisé en plusieurs sections. Pour assurer la cohérence de ce défi, nous utiliserons la version MS-DOS 5.0, les octets sont classés en gros caractères et nous appelons l'octet 0x00
le plus à gauche et l'octet 0x1F
le plus à droite.
Vous trouverez ci-dessous un bref schéma des sections pertinentes et quel devrait être le résultat de chaque section (en gras ).
- Les 11 premiers octets sont le nom du fichier au format ASCII (c'est de là que vient le fameux nom de fichier 8.3 - 8 octets pour le nom de fichier, 3 octets pour l'extension). Ce sont des encodages ASCII simples et doivent être sortis en ASCII avec un point (.) Entre .
- Remarque: les parties 8 et 3 sont rembourrées avec des espaces pour faire une entrée pleine longueur. La sortie doit ignorer les espaces (c'est-à-dire ne pas les sortir).
- L'extension de fichier peut être vide (c'est-à-dire tous les espaces), auquel cas la sortie ne doit pas sortir le point .
- Comme ASCII n'utilise que les 7 bits inférieurs, les octets auront tous un interligne
0
.
- L'octet suivant (0x0b) est un masque de bits de ce qui suit:
- 0x01 Lecture seule - sortie RO
- 0x02 Caché - sortie H
- 0x04 Système - sortie S
- 0x08 Étiquette de volume - sortie VL . La taille du fichier (ci-dessous) doit être sortie en tant que 0 , quelle que soit son entrée réelle.
- Sous-répertoire 0x10 - sortie SD . La taille du fichier (ci-dessous) doit être sortie en tant que 0 , quelle que soit son entrée réelle.
- Archive 0x20 - sortie A
- Périphérique 0x40 - ignoré pour ce défi.
- 0x80 Réservé - ignoré pour ce défi.
- Puisqu'il s'agit d'un masque de bits, plusieurs indicateurs sont possibles - toutes les sorties applicables doivent être concaténées ensemble dans n'importe quel ordre. Par exemple,
0xff
pourrait êtreROHSVLSDA
(ou toute autre combinaison).
- Les deux octets suivants (0x0c et 0x0d) ne sont pas utilisés sous MS-DOS 5.0.
- Les deux octets suivants (0x0e et 0x0f) sont le temps de création comme suit:
- Les bits 15 à 11 sont les heures au format 24 heures - sortie 00 à 23
- Les bits 10 à 5 sont les minutes - sortie 00 à 59
- Les bits 4 à 0 sont les secondes / 2 - sortie 00 à 58 (notez que les secondes ne sont qu'en résolution de deux secondes)
- Pour plus de précision:
hhhhhmmmmmmsssss
lorsqu'il est écrit en big-endian.
- Les deux octets suivants (0x10 et 0x11) sont la date de création comme suit:
- Les bits 15 à 9 sont l'année - sortie 1980 pour
0
jusqu'à 2107 pour127
- Les bits 8 à 5 sont les mois - sortie 1 à 12 (avec ou sans zéro devant)
- Les bits 4 à 0 sont le jour - sortie 0 à 31 (avec ou sans zéro devant)
- Pour plus de précision:
yyyyyyymmmmddddd
lorsqu'il est écrit en big-endian.
- Les bits 15 à 9 sont l'année - sortie 1980 pour
- Les deux octets suivants (0x12 et 0x13) sont la dernière date d'accès. Bien qu'utilisé dans MS-DOS 5.0, nous ignorons cette partie pour ce défi.
- Les deux octets suivants (0x14 et 0x15) ne sont pas utilisés par MS-DOS 5.0.
- Les deux octets suivants (0x16 et 0x17) sont la dernière heure modifiée, suivant le même format que l'heure de création ci-dessus.
- Les deux octets suivants (0x18 et 0x19) sont la dernière date modifiée, suivant le même format que la date de création ci-dessus.
- Les deux octets suivants (0x1a et 0x1b) sont l'emplacement de cluster du fichier sur le disque. Nous ignorons cette partie pour ce défi.
- Les quatre derniers octets (0x1c, 0x1d, 0x1e et 0x1f) sont la taille du fichier - sortie sous forme d' entier non signé , sauf si les indicateurs VL ou SD sont définis (ci-dessus), auquel cas la sortie
0
.
Représentation visuelle
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
Contribution
- Un seul mot de 32 octets (c'est-à-dire 256 bits), dans le format qui convient.
- Il peut s'agir d'une chaîne de
1
et0
, comme plusieursint
s non signés , d'un tableau de valeurs booléennes, etc. - Veuillez spécifier dans votre réponse le format que vous utilisez pour la saisie.
- Vous ne pouvez pas accepter plusieurs entrées (c'est-à-dire un tableau prédécoupé dans les tailles d'octets appropriées) à moins que ce soit le seul moyen pour votre langue de saisir des données. L'analyse de l'entrée fait partie du défi.
- Il peut s'agir d'une chaîne de
- Vous pouvez supposer que l'entrée est valide (par exemple, vous n'avez pas besoin de vérifier la date pour vérifier que la date est valide).
- Les octets non utilisés peuvent être tous
0
, tous1
, etc., tant qu'ils sont présents. Dans les exemples ci-dessous, j'ai utilisé tout0
pour les octets inutilisés.
Sortie
Soit imprimé à l'écran ou retourné, ce qui suit:
- Le nom de fichier sous forme de chaîne ASCII
- Les attributs de fichier sous forme de chaîne ASCII
- L'heure et la date de création, avec des séparateurs appropriés (deux-points, des barres obliques, quelque chose pour distinguer les composants)
- L'heure et la date modifiées, toujours avec des séparateurs appropriés
- La taille du fichier
La sortie peut être une chaîne unique séparée par des espaces ou une nouvelle ligne, des éléments séparés dans un tableau, etc. Veuillez spécifier dans votre réponse comment votre sortie est formatée.
Règles
- Les formats d'E / S standard sont acceptables.
- Un programme complet ou une fonction sont acceptables.
- Les failles standard sont interdites.
- Il s'agit de code-golf , donc toutes les règles de golf habituelles s'appliquent et le code le plus court l'emporte.
- Les éléments intégrés qui remplissent exactement cette fonction sont interdits.
Exemples
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
la source
SD S
un ensemble de drapeaux valide?Réponses:
Verilog,
513670617 octetsFonctionne avec IVerilog. Aucun indicateur de compilation spécial n'est nécessaire.
Il s'agit d'un monstre de définitions imbriquées, de twiddling de bits et de la gêne d'avoir à inverser l'ordre des bits en raison de l'endianité (sinon la chaîne ne s'imprime pas ou l'ordre des bits numériques est incorrect). L'entrée est prise par le
i
port, qui est la manière habituelle de prendre l'entrée dans un module Verilog.$display
est utilisé pour imprimer en sortie standard. 6 octets pourraient être enregistrés si des zéros non significatifs n'étaient pas requis pour l'horodatage.Démo
Banc d'essai (non noté):
Exemple d'exécution:
la source
Python,
485, 479, 442, 438, 431, 429, 418, 402, 395, 391, 370 octets.Enregistré 19 octets grâce à Cᴏɴᴏʀ O'Bʀɪᴇɴ me rappelant que je peux assigner des fonctions à une lettre.
6 octets enregistrés grâce à la suggestion de FryAmTheEggman de nettoyer le filtre de masque de bits.
Enregistré 21 octets grâce à la réponse Ruby impressionnante de W0lf me forçant à jouer au golf un peu plus. ;)
Ceci est un monstre absolu. Je suis sûr que je peux le réduire un peu plus, mais ça se rapproche assez du golf.
la source
int
à un char? ou peut-être créer une fonction qui fonctionnestr int
.or 'SD'
peut être supprimé, je penseHaskell,
781710 octetsMerci à BlackCap pour une simplification
Cela permet en outre aux ordures (comme un caractère de nouvelle ligne) d'apparaître après l'entrée.
la source
Java,
17211587157315601511 octets:Prend l'entrée au format d'une chaîne binaire de 32 octets. Sorties au format d'une chaîne séparée par des espaces. C'est peut-être une réponse très très longue, mais je ne suis toujours pas déçu. Je suis juste content d'avoir pu implémenter cela en Java. Je vais quand même essayer de jouer au golf autant que possible.
Essayez-le en ligne! (Ideone)
la source
Rubis, 344 octets
La version légèrement plus lisible est disponible ici .
Test en ligne: http://ideone.com/Fww1Rw
la source
JavaScript (ES6), 369
Moins golfé
Tester
la source
Script error.
. Mais pour une raison quelconque, Firefox semble fonctionner parfaitement. Je me demande pourquoi ...PHP ,
301288 octetsEssayez-le en ligne!
L'entrée est une chaîne de mots de 32 octets via
STDIN
, la sortie versSTDOUT
.-13 octets en tant que programme autonome.
la source
Stax , 111 octets
Exécuter et déboguer
la source
Perl, 249 octets
Prend 32 octets en entrée, la sortie est séparée par des retours à la ligne.
unpack
est parfait pour ce type d'analyse de structure binaire.Quelques faits saillants:
unpack
.@{[]}
permet d'interpoler du code dans une chaîne. Il crée en fait une référence de tableau qui est ensuite déréférencée."$str1"x!!$str2
est un bon moyen de renvoyer$str1
uniquement s'il$str2
s'agit d'une chaîne non vide.Vous trouverez ci-dessous une version qui fonctionne sur de vraies entrées de répertoire, avec des champs en petits caractères, et en ignorant uniquement le remplissage droit sur le nom de fichier et l'extension (donc, par exemple,
" ppcg"
son espace initial n'a pas été supprimé) (254 octets)la source