Votre objectif est d'écrire un programme ou une fonction qui prend en entrée une chaîne représentant le chemin d'accès à un fichier et génère une valeur vraie si ce fichier n'est pas vide et ne contient aucun octet non nul - c'est-à-dire que tous les bits sont 0 - - et une valeur de falsey sinon.
Je me rends compte que c'est un problème très simple et je suppose que je pourrais pirater quelque chose, mais je soupçonne qu'il doit y avoir une manière courte et élégante de le faire, et cela m'a donné l'idée d'en faire un défi.
C'est le code-golf , donc le code le plus court en octets gagne. (Ma préférence irait à la solution la plus rapide, mais cela dépend trop de l'implémentation ...)
Questions connexes : remplir un fichier avec des zéros
Motivation : Il s'agit uniquement de dire d'où vient le problème, au cas où vous seriez intéressé. Vous n'avez pas besoin de le lire.
Les images ISO de CD et de DVD, copiées avec "dd" ou d'autres moyens, se terminent souvent par une séquence de blocs inutiles ne contenant que des octets nuls. Les techniques standard pour supprimer ces blocs sont connues et simples (voir /unix/74827/ ) mais elles peuvent parfois supprimer des données utiles non nulles car le support peut mentir sur sa propre taille. Je veux donc vérifier que les blocs supprimés ne contiennent que des octets nuls. La suppression de ces blocs est importante pour définir une version normalisée des images ISO.
la source
'
.GNU sed -zn , 5 octets
Le fichier d'entrée est transmis à sed en tant que paramètre de ligne de commande. Sortie en tant que code retour standard du shell - c'est-à-dire que 0 est VRAI, 1 est FAUX.
Fonctionne normalement
sed
sur les enregistrements d'entrée délimités par des sauts de ligne ("lignes" AKA).-z
change cela en enregistrements d'entrée délimités nul. Si des enregistrements d'entrée correspondent à l'.
expression régulière, alorsq
avec le code de sortie 1.Essayez-le en ligne!
la source
DOS, 37 octets
Il ouvre le fichier nommé sur la ligne de commande, renvoie 0 s'il est vide ou contient des valeurs non nulles, sinon renvoie 1.
la source
Attaché , 24 octets
Essayez-le en ligne!
Explication
Il s'agit d'une composition de 4 fonctions, exécutées l'une après l'autre:
FileRead
- prend un nom de fichier en entrée, retourne le contenu de ce fichierOrds
- renvoie les points de code ASCII de chaque caractère dans une listeMax&0
- cela équivaut à, à l' argumentx
,Max[x, 0]
; à son tour, cela calcule le maximum de toutes les entrées dansx
et0
(donnant0
pour la liste vide)Zero
- c'est un prédicat qui vérifie si ce nombre est bien 0, et renvoie ce booléen.la source
@_@
)C (plateforme 32 bits), 65 octets
Suppose que les tailles des pointeurs sont identiques, ce qui est presque toujours vrai. Renvoie un
0
code de sortie en cas de succès (le fichier ne contient que desNUL
caractères), sinon une autre valeur.Le comportement n'est pas défini si l'argument de ligne de commande n'est pas un chemin d'accès à un fichier lisible.
la source
int**v
? Je ne peux pas trouver un compilateur où cela ne se produise pas sans cela. En outre, vous pouvez économiser un peu en faisant intentionnellement des erreurs , mais je ne sais pas si c'est la meilleure approche.sizeof(void*) == sizeof(int)
(ou plus généralement "plate-forme 32 bits") puis ... sur uneamd64
plate-forme, essayez de compiler avec-m32
;)-m32
): Essayez-le en ligne!Utilitaires Bash + GNU, 26 octets
Le nom du fichier d'entrée est donné en tant que paramètre de ligne de commande. Sortie en tant que code retour standard du shell - c'est-à-dire que 0 est VRAI, 1 est FAUX.
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 30 octets
Essayez-le en ligne!
Explication
Solution alternative, 22 octets
Si des fichiers vides sont censés passer, cela peut être raccourci comme suit:
Essayez-le en ligne!
la source
Java, 149 octets
la source
Perl 5, 20 octets
$\=0;exit<>=~/^\0+$/
Prend un nom de fichier dans la ligne de commande args et renvoie la réponse dans le code de sortie du programme
la source
Python 3, 59 octets
Renvoie 0 pour réussite (tous les octets sont nuls).
Renvoie 1 en cas d'échec (au moins un octet différent de zéro ou un fichier de longueur nulle).
la source
APL (Dyalog Unicode) , 14 octets
Programme complet. Demande le nom de fichier depuis stdin.
Essayez-le en ligne!
⍞
invite pour le nom de fichier11 ¯1⎕MAP
mappez ce fichier à un tableau de bits compressé⌈/
maximum (réduction); plus petit flotteur s'il est vide, sinon 0 ou 10=
est égal à zéro?la source
Haskell, 49 octets
Évidemment, si l'importation n'est pas incluse, elle est de 26 octets.
la source
readFile
au lieu degetContets
. Je pense que vous pouvez lire le fichier comme une chaîne normale, comparer=='\0'
(ou mieux<'\1'
) et vous débarrasser de laimport
. Comme vous pouvez utiliser une fonction anonyme, vous pouvez laisser tomber lef x=
et aller Pointfree:(all(<'\1')<$>).readFile
.readFile
, ce qui générera une exception lors de la rencontre d'une séquence Unicode non valide. Bon point concernant le pointfree.JavaScript (ES8), 52 octets
Prend une URL comme argument et renvoie une promesse qui se résout
true
si le fichier n'est pas vide et ne contient aucun octet nul.la source
Zsh , 35 octets
Essayez-le en ligne! Sorties via code de sortie.
Lisez, divisez les caractères et au niveau du bit ou chaque point de code ensemble.
Si le fichier est vide, le corps de la boucle n'est jamais exécuté et la boucle renvoie donc true. Si les valeurs de vérité-fausse peuvent être échangées, l'interlignage
!
peut être supprimé pour une sauvegarde de 2 octets.la source