Tâche:
À partir d’une entrée entière, déterminez s’il s’agit ou non d’un nombre Cyclops.
Qu'est-ce qu'un numéro de cyclope, vous pouvez demander? Eh bien, c'est un nombre dont la représentation binaire n'en a qu'un 0
au centre!
Cas de test:
Input | Output | Binary | Explanation
--------------------------------------
0 | truthy | 0 | only one zero at "center"
1 | falsy | 1 | contains no zeroes
5 | truthy | 101 | only one zero at center
9 | falsy | 1001 | contains two zeroes (even though both are at the center)
10 | falsy | 1010 | contains two zeroes
27 | truthy | 11011 | only one zero at center
85 | falsy | 1010101 | contains three zeroes
101 | falsy | 1100101 | contains three zeroes
111 | falsy | 1101111 | only one zero, not at center
119 | truthy | 1110111 | only one zero at center
Contribution:
Un nombre entier ou équivalent. (
int
,long
,decimal
, Etc.)Supposons que si l’évaluation de l’entrée entraîne un dépassement d’entier ou d’autres problèmes indésirables, cette entrée n’a pas à être évaluée.
Sortie:
Vérité ou fausseté.
La sortie Vérité / Falsie doit respecter les spécifications de la langue utilisée pour la vérité / la fausseté. (par exemple, C a
0
la valeur false, non nul la valeur true)
Règles du challenge:
Une entrée inférieure à 0 est supposée être une fausseté et ne doit donc pas être évaluée.
Si la longueur de la représentation binaire du nombre est paire, le nombre ne peut pas être un nombre cyclope.
Règles générales:
C'est du code-golf , donc les réponses les plus courtes en octets sont gagnantes !.
Les failles par défaut sont interdites.
Les règles standard s'appliquent à votre réponse avec les règles d'E / S par défaut .
Il s’agit de mon premier défi de programmation de puzzles et de code de programmation , alors tout commentaire sur la façon dont je devrais m'améliorer serait très apprécié!
Réponses:
Japt, 8 octets
Courez en ligne
Explication:
L'idée est de scinder la chaîne binaire en
0
, ce qui donnerait deux éléments s'il n'y en a qu'un0
. Ensuite, nous voyons si le premier élément correspond au second pour s’assurer qu’il est palindromique. Si la chaîne binaire contient plusieurs0
s, alors la réduction renverrait un tableau à plusieurs éléments et la==1
condition échouerait . Si la chaîne binaire en contient un0
, mais n'est pas palindromique,äè
elle reviendra0
carb
contient des0
correspondances dea
.la source
r¶
devrait également fonctionner.¤
= convertir en binaire;q0
= divisé en 0;äè
Je ne suis pas tout à fait sûr .. et le drapeau-N
convertit les listes enNaN
, mais laisse0
et1
le même. Pour laäè
partie , je peux voir que119
est[111,111]
après la scission, ce quiäè
change à1
; et85
est[1,1,1,1]
après la scission, quiäè
devient[1,1,1]
. Pourriez-vous expliquer comment ça.ä("è")
marche?NaN
Falsey est dans Japt? (si vous effectuez une if-else avec ce que la condition ne le se faire exécuter? « Truthy / sortie falsy doit répondre aux spécifications de la langue utilisée pour truthy / falsy ») Aussi les2
rendements2
que je doute est Falsey (mais peut - être si Japt est comme 05AB1E).0
est considéré truthy ... Toutefois, si2
est de retour2
comme truthy, cette soumission peut devoir être retravaillé.Python 2 , 30 octets
Essayez-le en ligne!
Notez que
2*n^2*n+3
c’est le xor au niveau du bit2*n
et2*n+3
, car c’est la priorité de l’opérateur Python.la source
lambda n:(2*n^2*n+3)**2-8*n-9
, avec une valeur de retour de0
pour les nombres de cyclopes?TRUE
pourn = -1
>1
.Code machine x86, 17 octets
Les octets ci-dessus définissent une fonction qui accepte une valeur d’entrée entière de 32 bits (dans le
EDI
registre pour cet exemple, suivant une convention d’appel System V commune, mais vous pouvez en fait choisir à peu près tout le registre d’entrée de votre choix sans affecter la taille du résultat. code) et renvoie un résultat (dans leEAX
registre) indiquant si la valeur entrée est un nombre Cyclops.L'entrée est supposée être un entier non signé, car les règles de challenge stipulent que nous pouvons ignorer les valeurs négatives.
La logique de décision est empruntée à la réponse de Neil : puisqu'un nombre Cyclops a la formen = ( 2k+ 1 ) ( 2k - 1- 1 ) , nous pouvons utiliser une série d'opérations de bricolage pour vérifier l'entrée.
Remarque: La valeur de retour est vérité / fausseté, mais la sémantique est inversée, de telle sorte que la fonction retourne faussement pour un nombre Cyclops. Je prétends que c'est légal parce que le code machine n'a pas de "spécifications pour la vérité / la fausseté", qui est l'exigence dans la question (Voir ci-dessous pour une version alternative si vous pensez que c'est de la triche.)
En mnémonique du langage d'assemblage, il s'agit de:
Essayez-le en ligne!
Comme promis, si vous pensez qu'il est trompeur d'inverser la sémantique de la vérité / falsification même dans un code machine où il n'y a pas de normes ou de conventions réelles, ajoutez trois octets supplémentaires, pour un total de 21 octets :
La première moitié de ce code est identique à l'original (en suivant les
imul
instructions). Lelea
est presque identique, mais au lieu d’ajouter une constante 2, il n’ajoute qu’une constante 1. C’est parce que l’inc
instruction suivante incrémente la valeur dans leEAX
registre de 1 afin de définir les drapeaux. Si le drapeau "zéro" est défini, l'setz
instruction sera définieAL
sur 1; sinon,AL
sera mis à 0. Il s'agit de la manière standard pour un compilateur C de générer du code machine pour renvoyer unbool
.Changer la constante ajoutée dans l'
lea
instruction ne change évidemment pas la taille du code, et l'inc
instruction est très petite (1 octet seulement), mais l'setz
instruction est plutôt imposante avec 3 octets. Malheureusement, je ne peux pas penser à une manière plus courte de l'écrire.la source
Regex (ECMAScript),
6058576058 octetsL'entréen est unaire, comme la longueur d'une chaîne de
x
s.AVERTISSEMENT SPOILER : Pour la racine carrée, cette expression rationnelle utilise une variante de l’algorithme de multiplication généralisée, qui n’est pas évidente et qui pourrait constituer un casse-tête enrichissant à résoudre par vous-même. Pour plus d'informations, voir l'explication de cette forme d'algorithme dans Rechercher un numéro Rocco .
-2 octets en permettant de revenir en arrière dans la recherche dez z du plus petit au plus grand au lieu de l'inverse
-1 octet grâce à Grimy , en recherchant
+3 octets pour gérer zéro
-2 octets en déplaçant la capture de la racine carrée en dehors du regard
^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$
Essayez-le en ligne!
la source
^(1*)0\1$
assez simple ?JavaScript (Node.js) , 20 octets
Essayez-le en ligne!
Peut-être que c'est correct, peut-être.
Merci Grimy, 1 octet enregistré.
JavaScript (Node.js) , 32 octets
Essayez-le en ligne!
JavaScript (Node.js) , 34 octets
Essayez-le en ligne!
la source
.test
not.match
Perl 6 , 23 octets
Essayez-le en ligne!
Solution basée sur regex
la source
Japt ,
2519109 octetsMerci à @Shaggy pour -1 octet
Essayez-le en ligne!
la source
Mathematica (langage Wolfram),
3231 octets1 octet économisé grâce à J42161217!
Essayez-le en ligne!
Fonction pure prenant un entier en entrée et renvoyant
True
ouFalse
. Basé sur le fait (amusant de prouver!) Qu'un nombren
est Cyclope si et seulement sin
plus la racine carrée den/2
plus2
arrondit à une puissance impaire de 2. (On peut remplacerFloor
par soitCeiling
ouRound
tant que l'on remplace également+2
par+1
.) RetourneTrue
en entrée0
.la source
Log2[#+Floor@Sqrt...
√()
au lieu deSqrt[]
Ruby , 24 octets
Essayez-le en ligne!
la source
Japt, 8 octets
Merci à Luis Felipe de Jesus Munoz pour avoir corrigé ma soumission!
Essayez-le en ligne!
Ancienne solution à base de regex, 15 octets
Retourne 1 pour vrai, 0 pour faux.
Essayez-le en ligne!
la source
==
opérateur!Gelée ,
87 octets-1 grâce à Erik the Outgolfer (utilisez isPalindrome intégré à la
ŒḂ
place de⁼Ṛ$
)Un lien monadique acceptant un entier qui donne
1
(vérité) ou0
(falsey).Essayez-le en ligne!
Comment?
la source
Bċ0⁼1ȧŒḂ
est aussi de 8 octets),⁼Ṛ$
c'est la même chose queŒḂ
pour -1. En outre, vous n'avez pas besoin de gérer les nombres négatifs.ṚƑ
à sa place de nos jours, alors vous voudrez peut-être vous en souvenir comme ça (les plus importantsƑ
).Haskell , 32 octets
Essayez-le en ligne!
la source
Regex (ECMAScript),
5347 octets-6 octets grâce à Deadcode et Grimy
Essayez-le en ligne!
la source
^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$
( Essayez-le en ligne! )Brachylog , 8 octets
C'est un prédicat qui réussit si son entrée est un nombre Cyclops et échoue si son entrée n'est pas un nombre Cyclops. Succès / échec est le concept le plus fondamental de vérité / falsey dans Brachylog.
Essayez-le en ligne! Ou trouvez toutes les sorties de vérité jusqu’à 10000 .
Explication
Cela ne réussit que lorsqu'un numéro Cyclops est attribué, car:
D↔D
échouera. dans ce qui suit, on peut supposer que c'est un palindrome.×ᵐ≠
échoueront.×ᵐ≠
échoueront.×ᵐ≠
réussit et le prédicat entier réussit.la source
Ruby ,
27 à24 octetsConvertir en binaire et vérifier avec une expression régulière. Retourne
0
si vrai,nil
si faux.-3 octets grâce à GB .
Essayez-le en ligne!
Pour deux octets de plus, il existe un portage direct de la solution Python:
la source
05AB1E , 8 (ou 9) octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Retourne
1
si vérité;0
ou tout autre nombre positif autre que1
falsey. Dans 05AB1E seulement, la1
vérité et tout le reste sont falsey, mais je ne suis pas sûr s'il s'agit d'une sortie autorisée ou si la sortie doit comporter deux valeurs cohérentes et uniques. Si le second, un finΘ
peut être ajouté pour que toutes les sorties autres que1
deviennent0
:Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Une approche arithmétique serait de 10 octets:
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
1
la vérité et tous les autres nombres comme fausseté est acceptable pour ce défi, car d'autres langues (par exemple, C et TI-BASIC) ont des définitions similaires vérité / fausseté (0 / différent de zéro pour les deux). Tant que ce qui est considéré comme de la vérité ou de la fausseté correspond aux spécificités de la langue, alors c'est un jeu juste.Excel,
9763 octetsCalcule 2 nombres:
Puis soustrayez le deuxième nombre du premier:
Et comparez ce résultat avec le nombre d'origine
Ancienne méthode
Commencez par le log-base-2 de A1 et arrondissez-le au nombre pair le plus proche, puis ajoutez 1.
Créez ensuite une chaîne de autant de
"1"
s et remplacez le caractère du milieu par un"0"
pour créer un nombre Cyclops avec une longueur binaire toujours impaire, égale à ou inférieure à la longueur binaire de A1.Ensuite, comparez-le avec la représentation binaire de A1
la source
R ,
3733 octetsEssayez-le en ligne!
R n’ayant pas de fonction intégrée pour la conversion en binaire, j’ai simplement utilisé l’une des formules d’OEIS pour calculer une liste de termes à partir de la séquence.
n<-0:x
génère une liste généreuse de valeurs de départ.2*4^(n<-0:x^2)-2^n-1)
est la formule d'OEIS, puis il vérifie si l'entrée apparaît dans cette séquence à l'aide de%in%
.-2 octets pour ne pas avoir à gérer des entrées négatives. -2 octets en rappelant que je peux changer
<-
pour=
.la source
C (gcc), 26 octets
Essayez-le en ligne!
La réponse du port de Neil . Repose sur le classement des opérations défini par l'implémentation.
C ++ (clang), 38 octets
Essayez-le en ligne!
Ne peut pas omettre les types en C ++, ne peut pas omettre le retour dans Clang, sinon identique.
la source
return
au lieu de l'exploit de la valeur de retour de l'accumulateur implicite, fragile et dépendant de la plate-forme.C (gcc) ,
29 2827 octets1 octet enregistré grâce à @ceilingcat
Un port de la réponse JS de 21 octets par @tsh .
Essayez-le en ligne!
la source
J ,
2219171514 octets-3 octets grâce à BolceBussiere!
-4 octets grâce à ngn!
-1 octet grâce à Traws!
J , 14 octets
Essayez-le en ligne!
la source
#=1++/
(#=1++/)@(*|.)@#:
1=1#.1-(*|.)@#:
1=1#.(*:|.)@#:
Gelée , 9 octets
Essayez-le en ligne!
la source
Attaché , 22 octets
Essayez-le en ligne!
Des alternatives
27 octets:
{BitXor[2*_,2*_+3]^2=8*_+9}
27 octets:
{BitXor@@(2*_+0'3)^2=8*_+9}
27 octets:
{Palindromic@_∧1=0~_}@Bin
28 octets:
{BitXor[...2*_+0'3]^2=8*_+9}
28 octets:
{BitXor[…2*_+0'3]^2=8*_+9}
28 octets:
{Same@@Bisect@_∧1=0~_}@Bin
29 octets:
{_[#_/2|Floor]=0∧1=0~_}@Bin
30 octets:
Same@Bin@{_+2^Floor[Log2@_/2]}
30 octets:
{_[#_/2|Floor]=0and 1=0~_}@Bin
la source
Retina 0.8.2 ,
3837 octetsEssayez-le en ligne! Le lien inclut des cas de test. Edit: Après clarification, la solution précédente ne gérait pas le zéro correctement. Explication:
Convertir de décimal à unaire.
Convertissez des unaires en binaires, en utilisant la méthode du wiki Retina.
Recherchez le même nombre de
1
s avant et après le0
, ou une chaîne vide (comment la conversion ci-dessus traite-t-elle zéro).la source
Lot,
3937 octetsla source
Excel, 101
107octets-6 octets grâce à @Chronocidal.
Effectue 3 contrôles:
0
0
la source
ISODD(LEN(DEC2BIN(A1)))
pourISEVEN(LOG(A1,2))
Regex (ECMAScript),
65595758 octets+1 octet pour gérer 0 correctement
Essayez-le en ligne!
la source
VBA,
4136 octetsExécuter dans la fenêtre Immediate, avec la déclaration explicite désactivée. L'entrée est la cellule
A1
de la feuille active. Sorties True / False dans la fenêtre immédiate.Utilise la même logique que ma réponse Excel pour trouver le nombre de Cyclops du même nombre de bits (ou un bit plus court s'il existe un nombre pair!), Puis le compare à l'entrée.
Enregistre quelques octets lors du calcul des nombres Cyclops en les réduisant à la forme
y = 2x^2 - x - 1
(oùx = n-1
pour le nième nombre Cyclops, oux = 2^Int(Log([A1])/Log(4))
pour trouver le plus grand nombre Cyclops avec un nombre de bits inférieur ou égal) et en stockant x dans une variable(-5 octets grâce à Taylor Scott !)
la source
[...]
notation[(Log(A1,4)]
PHP , 74 octets
Essayez-le en ligne!
Approche totalement naïve et non mathématique, juste des chaînes.
Ou 60 octets basés sur l'algorithme de @ Chronocidal ci-dessus .
Essayez-le en ligne!
la source
Haskell, 82 octets
Et un port de la solution Python de xnor:
Haskell, 47 octets
la source