Buenas tardes Golfgeneers.
Esta es una pregunta razonablemente larga y detallada. Dado lo que estaba pidiendo, tenía que serlo. Si tiene alguna pregunta, por favor hágala. Si hay algo que no está claro, avíseme para que pueda solucionarlo. Esto probablemente está en el lado más duro de codegolf.
Estamos construyendo una computadora liviana y necesitamos el sistema de archivos más liviano posible. Se elegirá el código más corto.
Estamos proporcionando un disco duro de última generación de 65536 bytes. Por el bien de este prototipo, será un archivo de imagen directo, que su programa puede asumir que existe, y está en la ubicación que más le convenga, es decir, un archivo binario que represente todo el disco duro. Puede suponer que esta imagen ya está 'formateada', es decir. si su programa depende de que algo esté en el archivo para funcionar, puede ser. Si necesita que el estado vacío inicial sea distinto de ceros, indique qué es.
No hay límite de memoria en cuanto a la RAM utilizada por su aplicación.
Los comandos de entrada y salida requerirán una interfaz con el disco duro real. Al igual que la imagen de disco, su programa puede suponer que el archivo de entrada existe y está donde quiera que esté. Del mismo modo, su programa puede emitir donde sea conveniente. Sin embargo, debe cerrar el archivo después de ejecutar el comando de entrada o salida.
No se le proporciona un formato que debe usar para la imagen del disco; puede desarrollar el suyo propio. Debe ser capaz de almacenar hasta 248 archivos. Cualquier archivo mayor de 256 bytes puede contar como un archivo nuevo en aras de este límite por cada 256 bytes o parte del mismo. Un archivo puede tener hasta 63488 bytes. Básicamente, debe ser tan capaz como un disco duro con 248 sectores de 256 bytes cada uno.
El razonamiento detrás de estos tamaños aparentemente es darle 2048 bytes de 'administración' - para almacenar detalles de los archivos. Cada archivo / carpeta debe ser accesible con un nombre de 4 caracteres alfanuméricos, que pueden ser sensibles a mayúsculas o minúsculas según su preferencia. Si su programa admite nombres de 4 o menos caracteres, entonces hay una bonificación de un multiplicador de 0.95.
Su programa debe aceptar, a través de stdin, los siguientes comandos. Los parámetros estarán separados por un espacio. El comando será terminado por una nueva línea.
- L: enumere los nombres para stdout de todos los archivos actuales y sus tamaños en bytes, separados por nuevas líneas.
- C ab - Copie el archivo a al nuevo archivo b.
- D a - Eliminar archivo a
- R ab - Renombra el archivo a con un nuevo nombre b
- I a: agrega el archivo de entrada (consulte la nota anterior) como archivo a
- O a - Emite el archivo a al archivo de salida
Los siguientes errores se pueden informar a STDOUT o STDERR como razones válidas para que un comando no se ejecute. Puede elegir imprimir solo ERR # donde # es el número del error:
- 1 - El archivo no existe
- 2 - El archivo ya existe
- 3 - Sin espacio *
* Tenga en cuenta que su programa no puede emitir esto solo porque no tiene espacio continuo. Si todavía tiene sectores disponibles, debe desfragmentar el disco para que funcione.
Un sistema de carpetas es opcional; sin embargo, obtendrá una bonificación de un multiplicador de 0.8 a su puntaje. Si admite más de 1 nivel de directorio, obtendrá una bonificación de un multiplicador de 0.7 (no además del 0.8). Para la bonificación, debes tener
- L, R, C y D solo funcionan dentro del directorio actual. L debe enumerar las carpetas en el directorio actual, así como los archivos.
- El nuevo comando M ab mueve el archivo a a la carpeta b. Si b es '.', Mueve el archivo al director principal
- El nuevo comando G a va a la carpeta a. Si a es '.', Va a la carpeta principal
- R también debe cambiar el nombre de las carpetas
- D también debe eliminar carpetas, y cualquier archivo / carpeta dentro de ellas
- C también debe copiar carpetas, y cualquier archivo / carpeta dentro de ellas
Los siguientes errores adicionales se pueden informar a STDOUT o STDERR como razones válidas para que un comando no se ejecute.
- 4 - La carpeta no existe
- 5 - Archivo, no se requiere carpeta - donde, I y O requieren nombres de archivo, y se proporcionó una carpeta
Tu puntaje es:
- El tamaño, en bytes, de su código fuente
Multiplicado por
- 0,95 si admite nombres de 4 o menos caracteres
- 0.8 si admite un solo nivel de carpetas
- 0.7 si admite varios niveles de carpetas
- 0.95 si admite comandos (no necesariamente nombres de archivo) en minúsculas o mayúsculas
Buena suerte.
fuente
Respuestas:
Ruby, puntaje 505.4 (560 caracteres)
Notas:
F
en el directorio actual.F
debe existir y puede ser creada / formateado mediante el siguiente comando:IO.write('F',(([""]*248)+([0]*248)+[""]).pack('A4'*248+'s'*248+'A63488'))
.I
en el directorio actual, el archivo de salida esO
.Bonificaciones:
El código aún no está totalmente desarrollado, pero ya muestra que, para obtener una puntuación sustancialmente mejor, probaría un enfoque completamente diferente.
Sesión de prueba (solo se muestra STDIN / STDOUT pero, por supuesto, cada comando se antepone llamando al programa anterior):
fuente
Tcl, puntaje 487,711 (772 bytes)
Bonificaciones (tengo que atraparlos a todos):
Limitaciones conocidas:
F
ya debe existir. Vacío o espacio en blanco está bien.i
, el archivo de salida eso
y el sistema de archivos está enF
eval puts [expr 1+2]
I
(tampoco es mi idea, yG
no crea)G
no valida el directorioAlgunos hacks:
eval puts $c
-> directorio actual, separado por espacios.exit
- sin comentarios.lappend c .
-> cambia al subdirectorio.
fuente
Python 2.7 373 (413 bytes)
El disco se guarda en formato Python pickle-Format: para crear un disco vacío, debe colocar estos dos bytes '}'. al principio y, opcionalmente, 65534 llenar bytes después. Admite nombres de archivo grandes arbitrarios (* 0.95), comandos en mayúsculas y minúsculas (* 0.95) y enlaces duros (:-).
fuente