Le scénario
Dernièrement, vous avez remarqué un comportement étrange avec votre éditeur de texte préféré. Au début, il semblait ignorer des caractères aléatoires dans votre code lors de l'écriture sur le disque. Au bout d'un moment, vous avez remarqué un motif. les caractères avec des valeurs ASCII impaires étaient ignorés. Lors d'une inspection plus poussée, vous avez découvert que vous ne pouvez écrire correctement dans des fichiers que si chaque huitième bit est à zéro. Vous devez maintenant savoir si vos précieux fichiers ont été affectés par cet étrange bogue.
La tâche
Vous devez écrire un programme complet qui détermine si un fichier contient des octets impairs (démontrant qu'il n'est pas corrompu). Mais à cause de votre éditeur de texte, vous ne pouvez pas écrire d'octets impairs dans votre code source. Vous pouvez assumer tout codage préexistant pour la saisie, mais vous devez toujours vérifier chaque octet, pas seulement les caractères.
Contribution
Votre programme prendra le contenu de ou le chemin d'accès à un fichier à partir de stdin ou de la ligne de commande.
Sortie
Votre programme affichera sur stdout soit une valeur de vérité si le fichier donné contient un octet impair, soit une erreur si tous les huit bits sont nuls.
Critères
Ceci est le code de golf, le programme le plus court qui termine la tâche gagne. Pour être une soumission valide, chaque huitième bit du code source des fichiers doit être égal à zéro. Je recommanderais d'inclure une copie des fichiers binaires de votre code source dans votre soumission.
Les failles standard s'appliquent.
Cas de test
(En codage ASCII) Entrée:
"$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
Output:
falsy
Input:
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
Output:
truthy
Input:
LOREMIPSVMDOLORSITAMETCONSECTETVRADIPISCINGELITSEDDOEIVSMODTEMPORINCIDIDVNTVTLABOREETDOLOREMAGNAALIQVA
VTENIMADMINIMVENIAMQVISNOSTRVDEXERCITATIONVLLAMCOLABORISNISIVTALIQVIPEXEACOMMODOCONSEQVAT
DVISAVTEIRVREDOLORINREPREHENDERITINVOLVPTATEVELITESSECILLVMDOLOREEVFVGIATNVLLAPARIATVR
EXCEPTEVRSINTOCCAECATCVPIDATATNONPROIDENTSVNTINCVLPAQVIOFFICIADESERVNTMOLLITANIMIDESTLABORVM
Output:
truthy
Conseils
Choisir la langue judicieusement, ce défi peut ne pas être possible dans toutes les langues
La commande Unix
xxd -b <file name>
imprimera les fichiers binaires d’un fichier sur la console (avec quelques éléments de formatage supplémentaires).Vous pouvez utiliser d'autres codages que l'ASCII, tels que UTF-8, à condition que toutes les autres règles soient suivies.
la source
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
sont les caractères ASCII imprimables interdits, pour ceux qui s'en soucient. Les caractères imprimables ASCII autorisés sont" $&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
[CR]
contient le bit impair. J'espérais que WhiteSpace était en sécurité, mais hélas[TAB]
. Si vous voulez aller à l'ancienne, EBCDIC vous donne trois voyelles.Réponses:
GS2 , 4 octets
Essayez-le en ligne!
Hexdump
Comment ça fonctionne
la source
Befunge, 36 octets
Je sais que c'est une vieille question, mais je voulais essayer car je pensais que ce serait un défi intéressant à Befunge.
Essayez-le en ligne!
Il sort
1
si l'entrée est corrompue (c'est-à-dire qu'elle contient un octet impair) et0
si elle est OK.Explication
Le problème est de savoir comment déterminer les octets impairs sans avoir accès aux commandes
/
(divide) ou%
(modulo). La solution consistait à multiplier la valeur par 128 (la séquence28*8**
), puis à écrire ce résultat dans le champ de lecture. Sur un interpréteur strictement standard, les cellules playfield sont signées 8 bits, ainsi un nombre impair multiplié par 128 est tronqué à -1 alors qu'un nombre pair devient 0.L'autre astuce consistait à lire le retour -1 ou 0 du champ de lecture sans avoir accès à la
g
commande (get). Pour contourner ce problème, écrivez la valeur au milieu d'une séquence de chaîne existante (" "
), puis exécutez cette séquence pour envoyer la valeur incluse dans la pile. À ce stade, déterminer l'étrangeté de l'octet est un simple test inférieur à zéro.Un dernier aspect intéressant à discuter est le résultat. Dans le cas faux, nous atteignons la
>$.
séquence avec une seule valeur sur la pile, donc$
efface la pile en rendant la.
sortie égale à zéro. Dans le cas réel, nous suivons le chemin20`:>$.
. Etant donné que deux est supérieur à zéro, la comparaison place un un dans la pile et:
crée une copie afin de$
ne pas le laisser tomber avant la sortie.la source
CJam (11 octets)
Démo en ligne
Dénuder les astuces pour éviter les octets impairs, cela réduit à
qui lit l'entrée, mappe un ET bit par bit avec
1
, puis effectue une conversion de base, donnant zéro si et seulement si tous les ET étaient nuls.la source
:(
Fichier .COM imprimable, 100 octets
Hexdump:
Utiliser une définition très vague de source comme quelque chose qui peut être raisonnablement typé par un humain et inspiré du fichier de test antivirus standard EICAR (plus d’informations sur "Amusons-nous avec le fichier de test EICAR" chez Bugtraq).
En utilisant uniquement des octets ASCII non impairs imprimables (remarque: les opcodes affectant les mots tendent à être impairs, le bit W est le lsb de certains opcodes), il construit un fragment de code chez SP (que nous plaçons commodément juste après notre code de génération) , et l’exécution finit par tomber dans le code généré.
Il utilise le fait que la pile contient initialement un pointeur proche du début de la PSP et que le début de la PSP contient l'
INT 20h
instruction (plus d'informations à ce sujet à l' adresse https://stackoverflow.com/questions/12591673/ ).Source réelle:
la source
MATL , 7 octets
Le code source utilise le codage UTF-8. Donc, les octets source sont (en décimal)
L'entrée est un nom de fichier, pris comme une chaîne entre guillemets simples. La sortie est le nombre d'octets impairs dans le fichier, ce qui est vrai si et non nul.
Explication
la source
CJam,
181715 octetsSuppose que les paramètres régionaux sont définis sur Latin-1. Essayez-le en ligne!
Comment ça fonctionne
La solution simple va comme suit.
Malheureusement, les caractères
q
eti
ne peuvent pas apparaître dans le code source. Pour contourner ce problème, nous allons créer une partie du code source ci-dessus de manière dynamique, puis évaluer la chaîne.la source
Pyth,
20 à13 octetsOu en binaire:
Essayez-le en ligne
Comment ça fonctionne
L'entier résultant est vérité (différent de zéro) si et seulement si l'un des octets était impair.
la source
Gelée , 13 octets
S'attend à l'entrée en tant qu'argument de ligne de commande cité. Essayez-le en ligne!
Hexdump
la source
O%2¬Ạ¬
.Retina , 106 octets
Supprime tous les caractères autorisés, puis fait correspondre les caractères restants. Les valeurs de vérité seront le nombre de caractères trouvés. Les valeurs de Falsey seront
0
.Essayez-le en ligne
Puisque
.
ne correspond pas aux nouvelles lignes par défaut, je n'ai pas à les supprimer.la source
Perl 5+
-p0
, 136 octetsSemblable à d'autres réponses, cela supprime tous les octets pairs et laisse tous les octets impairs (ce qui est la vérité).
Essayez-le en ligne!
la source
-0
ne fait rien aux nouvelles lignes. Cela détermine seulement comment scinder l'entrée, cela ne supprime aucun caractère.-0
, je voulais faire tout le bloc en bloc, mais ça ne devrait pas avoir d'importance, mais je ne peux pas contourner ça ... Dommage! Je vais nettoyer ces commentaires. Merci de m'avoir mis au courant!Japt , 10 octets
Essayez-le en ligne!
La page de codes de Japt est ISO-8859-1. Le code donne
false
quand lui-même est entré comme une chaîne, donc une soumission valide.Déballé et comment ça marche
Ne pas avoir
String.c
(obtenir charcode, ou mapper sur charcodes) était une douleur, mais heureusement il y aNumber.d
(convertir le nombre en char).Il s'avère que Japt l'emporte sur CJam, Pyth et Jelly :)
Sans cette restriction, il y a deux façons de le faire sur 6 octets (en revenant à égalité avec CJam et Jelly):
"000..000"
est converti au nombre 0 (falsy) quelle que soit sa durée. D'un autre côté, tout ce qui contient 1 est converti en un non nuldouble
, ouInfinity
s'il est trop gros (les deux en vérité).Une approche plus simple qui donne directement
true
oufalse
.Ou, une solution de 5 octets est même possible avec l'aide de
-d
flag:la source