Su objetivo es escribir un programa o función que tome como entrada una cadena que represente la ruta a un archivo, y genere un valor verdadero si ese archivo no está vacío y no contiene bytes no nulos, es decir, todos los bits son 0 - - y un valor falsey de lo contrario.
Me doy cuenta de que es un problema muy simple y creo que podría hackear algo, pero sospecho que debe haber una forma corta y elegante de hacerlo, y eso me dio la idea de desafiarlo.
Este es el código de golf , por lo que gana el código más corto en bytes. (Mi preferencia iría a la solución más rápida, pero eso depende demasiado de la implementación ...)
Preguntas relacionadas : Rellene un archivo con ceros
Motivación : Esto es solo para saber de dónde viene el problema, en caso de que esté interesado. No necesitas leerlo.
Las imágenes ISO de CD y DVD, copiadas con "dd" u otros medios, a menudo terminan con una secuencia de bloques inútiles que contienen solo bytes nulos. Las técnicas estándar para eliminar estos bloques son conocidas y simples (consulte /unix/74827/ ) pero a veces pueden eliminar datos útiles no nulos porque el medio puede mentir sobre su propio tamaño. Por lo tanto, quiero verificar que los bloques eliminados contengan solo bytes nulos. Eliminar estos bloques es importante para definir una versión normalizada de imágenes ISO.
fuente
'
es.GNU sed -zn , 5 bytes
El archivo de entrada se pasa a sed como un parámetro de línea de comandos. Salida como un código de retorno de shell estándar, es decir, 0 es VERDADERO, 1 es FALSO.
Normalmente
sed
funciona en registros de entrada delimitados por nueva línea ("líneas" AKA).-z
cambia esto a registros de entrada delimitados por nul. Si algún registro de entrada coincide con la.
expresión regular, entoncesq
uit con el código de salida 1.Pruébalo en línea!
fuente
DOS, 37 bytes
Abre el archivo nombrado en la línea de comando, devuelve 0 si está vacío o contiene un valor distinto de cero; de lo contrario, devuelve 1.
fuente
Adjunto , 24 bytes
Pruébalo en línea!
Explicación
Esta es una composición de 4 funciones, ejecutadas una tras otra:
FileRead
- toma un nombre de archivo como entrada, devuelve el contenido de ese archivoOrds
- devuelve los puntos de código ASCII de cada carácter en una listaMax&0
- esto es equivalente a, por argumentox
,Max[x, 0]
; esto a su vez calcula el máximo de todas las entradas enx
y0
(dando lugar0
a la lista vacía)Zero
- este es un predicado que verifica si este número es de hecho 0 y devuelve ese booleano.fuente
@_@
)C (plataforma de 32 bits), 65 bytes
Asume que los tamaños de los punteros son todos iguales, lo cual es casi siempre cierto. Regresa con un
0
código de salida en caso de éxito (el archivo contiene soloNUL
caracteres), algún otro valor de lo contrario.El comportamiento no está definido si el argumento de la línea de comando no es una ruta a un archivo legible.
fuente
int**v
? No puedo encontrar un compilador donde esto no sea predeterminado sin hacerlo. Además, puede ahorrar un poco por error intencional , pero no sé si este es el mejor enfoque.sizeof(void*) == sizeof(int)
(o más generalmente "plataforma de 32 bits") entonces ... en unaamd64
plataforma, intente compilar con-m32
;)-m32
): ¡ Pruébelo en línea!Bash + utilidades GNU, 26 bytes
El nombre de archivo de entrada se proporciona como un parámetro de línea de comandos. Salida como un código de retorno de shell estándar, es decir, 0 es VERDADERO, 1 es FALSO.
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 30 bytes
Pruébalo en línea!
Explicación
Solución alternativa, 22 bytes.
Si se supone que pasan los archivos vacíos, esto se puede acortar a:
Pruébalo en línea!
fuente
Java, 149 bytes
fuente
Perl 5, 20 bytes
$\=0;exit<>=~/^\0+$/
Toma un nombre de archivo en argumentos de línea de comando y devuelve la respuesta en el código de salida del programa
fuente
Python 3, 59 bytes
Devuelve 0 para el éxito (todos los bytes cero).
Devuelve 1 por falla (al menos un byte distinto de cero o archivo de longitud cero).
fuente
APL (Dyalog Unicode) , 14 bytes
Programa completo Solicita el nombre de archivo de stdin.
Pruébalo en línea!
⍞
solicitud de nombre de archivo11 ¯1⎕MAP
asignar ese archivo a una matriz de bits empaquetada⌈/
máximo (reducción); flotador más pequeño si está vacío, de lo contrario 0 o 10=
es cero igual a eso?fuente
Haskell, 49 bytes
Obviamente, si la importación no está incluida, entonces es de 26 bytes.
fuente
readFile
lugar degetContets
. Creo que puedes leer el archivo como una cadena normal, compararlo=='\0'
(o mejor<'\1'
) y deshacerte de élimport
. Como se puede utilizar una función anónima, se puede eliminar elf x=
e ir pointfree:(all(<'\1')<$>).readFile
.readFile
, lo que arrojará una excepción al encontrar una secuencia Unicode no válida. Buen punto con respecto al punto libre.JavaScript (ES8), 52 bytes
Toma una url como argumento y devuelve una promesa que se resuelve
true
si el archivo no está vacío y no contiene bytes nulos.fuente
Zsh , 35 bytes
Pruébalo en línea! Salidas a través del código de salida.
Leer, dividir en caracteres y bit a bit, o cada punto de código juntos.
Si el archivo está vacío, el cuerpo del bucle nunca se ejecuta y, por lo tanto, el bucle devuelve la verdad. Si los valores de verdad-falsedad se pueden intercambiar, el inicio
!
se puede eliminar para guardar 2 bytes.fuente