Écrivez un programme / fonction qui prend deux entiers compris entre et inclus, et retourne si les formes binaires des nombres sont exactement un bit différentes.
Par exemple, et ont des formes binaires 00000001
et 00000000
, qui sont séparées d'un bit. De même, et sont 010011000
et 000011000
, donc ils retournent vrai.
Cependant , votre code doit être vierge , de sorte que si un bit de votre programme est retourné, il devrait générer une erreur. Par exemple, si votre programme était le seul octeta
(01100001
), alors les 8 programmes modifiés possibles:
á ! A q i e c `
doit lancer une erreur. Assurez-vous que vous modifiez par octets (par exemple, le á
haut représente réellement l'octet , pas le caractère réel sur deux octets á
).
Cas de test:
0,1 => Truthy
1,0 => Truthy
152,24 => Truthy
10,10 => Falsey
10,11 => Truthy
11,12 => Falsey
255,0 => Falsey
Règles:
- Fournissez un cadre de test qui peut vérifier que votre programme est correctement vierge, car il y aura beaucoup de programmes possibles (nombre d'octets * 8), ou bien une preuve complète de pureté.
- Veuillez vous assurer que votre programme est valide avant de le publier.
- La sortie doit être véridique / falsey (dans tous les cas, c'est bien), ou bien deux valeurs distinctes sans erreur
- Les erreurs peuvent être l'exécution, le compilateur, l'interpréteur, etc.
+1
s que la majorité de mes solutions récentes! : \Réponses:
Python 2 , 35 octets
Essayez-le en ligne!
Utilise le contrôle de puissance de deux
n&-n==n
, éliminant lesn==0
faux positifs.Pour référence, ce sont les paires d'opérateurs binaires à un caractère qui sont séparées d'un bit, ce qui les rend difficiles à utiliser:
Heureusement,
&
et^
n'en font pas partie.Notez également que cela
==
peut devenir<=
et+
peut devenir le caractère de commentaire#
.Python 2 , 41 octets
Essayez-le en ligne!
Prendre TFeld
lambda a,b:bin(a^b).count('1')==1
et le rendre vierge en changeant les 1 en+True
et==
versis
. Merci à Jo King pour 1 octet.la source
Python 2 ,
726750 octetsEssayez-le en ligne!
-5 octets, merci à Jo King
Renvoie
True
/False
pour pour vérité / falsey.Le programme est fondamentalement le même que
lambda a,b:bin(a^b).count('1')==1
, mais sans chiffres et autres caractères qui fonctionnent lorsqu'ils sont inversés.Fonctionne en s'assurant que presque tout est une fonction nommée (qui sont toutes assez vierges)
Le test vierge à la fin retourne un seul bit (pour chaque bit) et essaie la fonction sur une entrée. Si cela fonctionne (correct ou non), cette variation est imprimée. Aucun programme imprimé = fonction vierge.
la source
Java 8,
68615645 octets-11 octets grâce à @EmbodimentOfIgnorance , en remplaçant constant
java.awt.Font.BOLD
par-~(a^a)
.Essayez-le en ligne.
Explication:
La fonction de base la plus courte serait:
Essayez-le en ligne.
Ceci est modifié afin qu'il n'y ait pas de chiffre,,
=
ni l'un des+/*
opérandes qu'il contient pour les calculs numériques (donc la+
concaténation de chaîne est correcte):Le
+""
et.equals
sont à comparer auString.equals(String)
lieu deint==int
.REMARQUE:
Integer.equals(int)
pourrait être utilisé ici, mais serait plus d'octets, car les deux.bitCount
etjava.awt.Font.BOLD
sont primitifsint
au lieu deInteger
-objets, donc un supplémentnew Integer(...)
serait nécessaire pour transformer l'un des deux en unInteger
-objet, avant de pouvoir utiliser le.equals
.la source
java.awt.Font.BOLD
, maisObjects.equals
c'est un bon golf, merci!Objects
fait partie de l'java.util.
importation, donc je dois ajouter cela au nombre d'octets, j'ai peur, ce qui en fait 69 octets .. :(-~(a^a)
pour 1?C (gcc) , 56 octets
Essayez-le en ligne!
Renvoie
0
si la paire diffère de 1, non nul sinon. Un peu inhabituel pour C, à moins que vous ne pensiez qu'il revienneEXIT_SUCCESS
si la paire diffère de 1, toute autre valeur sinon.Utilise
sizeof((char)d))
pour produire la constante1
d'une manière vierge tout en forçant également le nom de la fonction à être vierge.Il XORs ensuite que 1 avec le popcount du XOR des arguments. Heureusement, le
^
symbole est facile à garder vierge, tout comme l'identifiant très long__builtin_popcount
.En attendant, voici le script utilisé pour tester la solution:
Qui utilise l'
./flipbit
outil que j'ai écrit dont la source est simplement:Les morceaux difficiles étaient:
=
ne fonctionne pas bien, car elle peut être une comparaison dans tous les cas où elle peut apparaître. De même-
ne fonctionne pas bien. Ainsi^
est utilisé pour affirmer l'égalité avec 1.la source
^
opérateur immaculé? Si les bits ont été modifiés, qu'est-ce qui l'empêche de devenir un opérateur différent? Cela compilerait toujours, mais vous donnerait juste la mauvaise réponse. Suis-je en train de mal comprendre la signification du mot "vierge" ici?^
il ne peut être changé qu'en l'un quelconque_\ZVN~Þ
ou le caractère non imprimable au point de code 30.~
est le seul de ceux qui est un opérateur, mais ce n'est qu'un opérateur unaire.__LINE__
place desizeof(char)
. Je pense que c'est bien de supposer que votre fonction sera sur la ligne 1 de votre fichier .c. Ou mêmeunix
est défini à 1 sur TIO, et probablement la plupart des autres Linux.d
cuire dans la source dans le moins d'octets possible. Sinond
(ou quel que soit le nom de la fonction), vous pouvez simplement le modifier et le code fonctionnera toujours. Même(__LINE__)
avecd();
ne fonctionnera pas card();
peut être changé en n'importe quelle autre lettre et il sera toujours compilé puisque la fonction n'a jamais à être appelée, donc n'est pas liée.R ,
3837 octets-1 octet grâce à Nick Kennedy.
Essayez-le en ligne! (Merci à Giuseppe d'avoir correctement configuré le TIO.)
Preuve qu'il est vierge (en utilisant le vérificateur de Nick Kennedy ).
Sorties 0 pour falsey, et une valeur positive pour véridique, ce que je comprends est acceptable car R interprétera ces derniers comme faux et vrai.
Explication:
bitwXor(a,b)
donne (sous forme d'entier) le XOR au niveau du bit entrea
etb
. Pour vérifier s'il s'agit d'une puissance de 2, vérifiez si sa base de connexion 2 est un entier. La fonctiondpois
donne la fonction de densité de probabilité de la distribution de Poisson: sa valeur est 0 pour les valeurs non entières, et quelque chose de positif pour les entiers non négatifs. LeT
est là cardpois
nécessite un deuxième argument (tout travail réel positif, etT
est interprété comme 1).Si nous insistons pour produire des valeurs distinctes, la version suivante génère FALSE ou TRUE en 42 octets (merci à Giuseppe pour -8 octets):
et est également vierge . Essayez-le en ligne!
la source
pi
parT
pour enregistrer un octet (toujours vierge). Votre TIO ne correspond pas non plus à votre réponse pour le moment.scan()
; Avez-vous une idée? (Le code fonctionne bien sur un ordinateur.)F
au lieu deexp(-Inf)
, dans le même sens que NickT
:-)R , 83 octets
Essayez-le en ligne!
Preuve que c'est vierge
Contourner le fait que
as.integer
,as.double
etc. ne sont que légèrement éloignésis.integer
,is.double
etc. était le plus difficile. En fin de compte, le mieux que je pouvais faire était d' utilisersum(T^el(.[-T])
à la fois la génération d'un et la vérification quias.double
avait renvoyé un vecteur de longueur> 1. L'emballaget
est de gérer le fait que, autrement,identical
peut deveniride~tical
.la source
Julia 0,7 , 20 octets
Essayez-le en ligne!
Voici un validateur vierge qui essaie d'exécuter chaque fonction anonyme modifiée sur une entrée, et aucun ne réussit. Notez que le code a un caractère unicode multi-octets et que certaines sorties possibles du retournement de bits ne sont même pas incluses, car celles-ci produisent des chaînes UTF-8 invalides.
la source
x
ety
sont un peu séparés, donc je pense que c'est un contre-exemple.y
etx
sont également à 1 bit9
et6
respectivement.C # (Visual C # Interactive Compiler) , 37 octets
La
a=>b=>
pièce ne peut pas être modifiée, sinon la fonction n'est pas valide.Dans
a!=b
, le=
ne peut pas être changé carint
ne peut pas être converti enbool
.Essayez-le en ligne!
la source
C # (Visual C # Interactive Compiler) ,
12810177706174 octets-27 octets grâce à Ascii-Only
Essayez-le en ligne!
Vous devez être assez créatif pour obtenir des nombres en C # sans utiliser de littéraux. Utilise uniquement l'opérateur ^. Les variables a, b sont toutes à plus d'un bit l'une de l'autre et tout le reste est un mot-clé / nom.
la source
+/*=
pour des opérations mathématiques ou de validation. ;)+
JavaScript (ES6 en mode strict), 61 octets
Essayez-le en ligne! ou Assurez-vous que tous les programmes modifiés sont incorrects
la source
Groovy ,
4736 octetsEssayez-le en ligne!
Version adaptée de la réponse Java de Kevin Cruijssen .
la source
MATLAB, 37 octets
Désolé, pas de lien TIO, car je ne peux pas faire fonctionner la suite de tests sous Octave. Merci @ExpiredData pour quelques commentaires utiles.
Suite de tests:
la source
numel
place, car ma suite de tests ne semble pas fonctionner dans Octave.eye
!Perl 6 ,
7743 octetsMerci à Jo King pour -33 octets.
Cela équivaut à
1
a été réécrit commeelems([""])
.2
a été réécrit commesum(elems([""]),elems([""]))
;elems(["",""])
peut sembler fonctionner maiselems([""-""])
est également valide et semble bloquer le testeur.Essayez-le en ligne!
la source
JavaScript (Node.js) , 20 octets
Essayez-le en ligne!
validateur par Arnauld, modifié (ne pas utiliser strictement)
la source