El sistema de archivos FAT de Microsoft tiene una tabla de directorio para representar qué "archivos" están en qué "carpetas" en el disco. Por el momento, estas entradas concentraron mucha información en una pequeña cantidad de bits. Hay un montón de especificaciones técnicas en Wiki para los curiosos, pero el desafío aquí se centrará en una decodificación "simple" de una entrada.
Cada entrada consta de una palabra binaria de 32 bytes, dividida en varias secciones. Para mantener la coherencia en este desafío, utilizaremos la versión 5.0 de MS-DOS, los bytes se ordenan como big endian y llamamos byte 0x00
como el más a la izquierda y byte 0x1F
como el más a la derecha.
A continuación se muestra un breve esquema de las secciones relevantes y cuál debería ser el resultado de cada sección (en negrita ).
- Los primeros 11 bytes son el nombre del archivo en formato ASCII (de aquí proviene el famoso nombre de archivo 8.3: 8 bytes para el nombre del archivo, 3 bytes para la extensión). Estas son codificaciones ASCII directas y deben enviarse como ASCII con un punto (.) Entre ellas .
- Nota: tanto las partes 8 como las 3 están acolchadas con espacios para hacer una entrada de longitud completa. El resultado debe ignorar los espacios (es decir, no generarlos).
- La extensión del archivo puede estar vacía (es decir, todos los espacios), en cuyo caso la salida no debería mostrar el punto .
- Dado que ASCII solo usa los 7 bits inferiores, todos los bytes tendrán un inicio
0
.
- El siguiente byte (0x0b) es una máscara de bits de lo siguiente:
- 0x01 Solo lectura - salida RO
- 0x02 Oculto - salida H
- Sistema 0x04 - salida S
- 0x08 Etiqueta de volumen - salida VL . El tamaño del archivo (a continuación) debe aparecer como 0 , independientemente de su entrada real.
- Subdirectorio 0x10 - salida SD . El tamaño del archivo (a continuación) debe aparecer como 0 , independientemente de su entrada real.
- Archivo 0x20 - salida A
- Dispositivo 0x40: ignorado para este desafío.
- 0x80 reservado: ignorado para este desafío.
- Como se trata de una máscara de bits, son posibles varios indicadores: todas las salidas aplicables se deben concatenar juntas en cualquier orden. Por ejemplo,
0xff
podría serROHSVLSDA
(o cualquier otra combinación).
- Los siguientes dos bytes (0x0c y 0x0d) no se utilizan en MS-DOS 5.0.
- Los siguientes dos bytes (0x0e y 0x0f) son el tiempo de creación de la siguiente manera:
- Los bits 15 a 11 son las horas en formato de 24 horas - salida 00 a 23
- Los bits 10 a 5 son los minutos: salida 00 a 59
- Los bits 4 a 0 son los segundos / 2 - salida 00 a 58 (tenga en cuenta que los segundos son solo en resolución de dos segundos)
- Para aclarar:
hhhhhmmmmmmsssss
cuando se escribe big-endian.
- Los siguientes dos bytes (0x10 y 0x11) son la fecha de creación de la siguiente manera:
- Los bits 15 a 9 son el año: salida 1980 para
0
hasta 2107 para127
- Los bits 8 a 5 son los meses: salida 1 a 12 (con o sin cero a la izquierda)
- Los bits 4 a 0 son el día - salida 0 a 31 (con o sin cero a la izquierda)
- Para aclarar:
yyyyyyymmmmddddd
cuando se escribe big-endian.
- Los bits 15 a 9 son el año: salida 1980 para
- Los siguientes dos bytes (0x12 y 0x13) son la última fecha de acceso. Si bien se usa en MS-DOS 5.0, ignoramos esta parte para este desafío.
- MS-DOS 5.0 no utiliza los siguientes dos bytes (0x14 y 0x15).
- Los siguientes dos bytes (0x16 y 0x17) son la última hora modificada, siguiendo el mismo formato que la hora de creación, arriba.
- Los siguientes dos bytes (0x18 y 0x19) son la última fecha de modificación, siguiendo el mismo formato que la fecha de creación, arriba.
- Los siguientes dos bytes (0x1a y 0x1b) son la ubicación del clúster del archivo en el disco. Estamos ignorando esta porción para este desafío.
- Los cuatro bytes finales (0x1c, 0x1d, 0x1e y 0x1f) son el tamaño del archivo, que se genera como un entero sin signo , a menos que se establezcan los indicadores VL o SD (arriba), en cuyo caso se generará
0
.
Representación visual
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
Entrada
- Una sola palabra de 32 bytes (es decir, 256 bits), en cualquier formato que sea conveniente.
- Esto podría ser como una cadena de
1
y0
, como variosint
s sin signo , una matriz de valores booleanos, etc. - Especifique en su respuesta qué formato está utilizando para la entrada.
- No puede tomar entradas múltiples (es decir, una matriz previamente dividida en los tamaños de bytes relevantes) a menos que esa sea la única forma en que su idioma pueda ingresar. Analizar la entrada es parte del desafío.
- Esto podría ser como una cadena de
- Puede suponer que la entrada es válida (por ejemplo, no necesita realizar una verificación de fecha para verificar que la fecha sea válida).
- Los bytes que no se usan pueden ser todos
0
, todos1
, etc., siempre que estén presentes. En los ejemplos a continuación, utilicé todo0
para los bytes no utilizados.
Salida
Ya sea impreso en pantalla o devuelto, lo siguiente:
- El nombre del archivo como una cadena ASCII
- El archivo se atribuye como una cadena ASCII
- El tiempo de creación y la fecha de creación, con separadores apropiados (dos puntos, barras, algo para distinguir los componentes)
- La hora modificada y la fecha modificada, nuevamente con los separadores apropiados
- El tamaño del archivo
La salida puede ser una cadena individual separada por espacios o por líneas nuevas, elementos separados en una matriz, etc. Especifique en su respuesta cómo se formatea su salida.
Reglas
- Los formatos estándar de E / S son aceptables.
- Un programa completo o una función son aceptables.
- Las lagunas estándar están prohibidas.
- Este es el código de golf , por lo que se aplican todas las reglas habituales de golf y gana el código más corto.
- Las incorporaciones que realizan exactamente esta función están prohibidas.
Ejemplos
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
fuente
SD S
sería un conjunto de banderas válido?Respuestas:
Verilog,
513670617 bytesSe ejecuta con IVerilog. No se necesitan banderas especiales de compilación.
Este es un monstruo de definiciones anidadas, cambios de bits y la molestia de tener que cambiar el orden de los bits debido a la endianidad (de lo contrario, la cadena no se imprime o el orden de los números es incorrecto). La entrada se toma a través del
i
puerto, que es la forma habitual de llevar la entrada a un módulo Verilog.$display
se utiliza para imprimir a la salida estándar. Se podrían guardar 6 bytes si los ceros iniciales no fueran necesarios para la marca de tiempo.Manifestación
Banco de pruebas (sin puntuación):
Ejemplo de ejecución:
fuente
Python,
485, 479, 442, 438, 431, 429, 418, 402, 395, 391, 370 bytes.Ahorré 19 bytes gracias a Cᴏɴᴏʀ O'Bʀɪᴇɴ recordándome que puedo asignar funciones a una letra.
Guardado 6 bytes gracias a la sugerencia de FryAmTheEggman de limpiar el filtro de máscara de bits.
Ahorré 21 bytes gracias a la increíble respuesta de Ruby de W0lf que me obligó a jugar un poco más. ;)
Este es un monstruo absoluto. Estoy bastante seguro de que puedo reducirlo un poco más, pero se está acercando bastante al golf.
fuente
int
a un personaje? o tal vez hacer una función que realicestr int
.or 'SD'
se puede eliminar, creoHaskell,
781710bytesGracias a BlackCap por alguna simplificación
Esto además permite que la basura (como un carácter de nueva línea) aparezca después de la entrada.
fuente
Java,
17211587157315601511 bytes:Toma entrada en el formato de cadena binaria de 32 bytes. Salidas en el formato de una cadena separada por espacios. Esta puede ser una respuesta muy larga, pero todavía no estoy decepcionado. Estoy feliz de haber podido implementar esto en Java. Sin embargo, todavía intentaré jugar al golf tanto como pueda.
¡Pruébelo en línea! (Ideone)
fuente
Rubí, 344 bytes
La versión ligeramente más legible está disponible aquí .
Prueba en línea: http://ideone.com/Fww1Rw
fuente
JavaScript (ES6), 369
Menos golf
Prueba
fuente
Script error.
. Pero por alguna razón en Firefox parece funcionar perfectamente. Me pregunto por qué ...PHP ,
301288 bytesPruébalo en línea!
La entrada es una cadena de palabras de 32 bytes vía
STDIN
, salida aSTDOUT
.-13 bytes como un programa independiente.
fuente
Stax , 111 bytes
Ejecutar y depurarlo
fuente
Perl, 249 bytes
Toma 32 bytes como entrada, la salida está separada por nuevas líneas.
unpack
es perfecto para este tipo de análisis de estructura binaria.Algunos puntos destacados:
unpack
.@{[]}
permite interpolar código en una cadena. Realmente crea una referencia de matriz que luego se desreferencia."$str1"x!!$str2
es una buena manera de regresar$str1
solo si$str2
es una cadena no vacía.A continuación se muestra una versión que funciona en entradas de directorio reales, con campos little-endian, y solo ignora el relleno derecho en el nombre de archivo y la extensión (por lo tanto, por ejemplo
" ppcg"
, no se elimina su espacio en blanco inicial) (254 bytes)fuente