Étant donné un numéro, déterminez s'il s'agit d'un numéro pliant.
Un numéro de pliage est un nombre tel que si vous prenez une représentation binaire et que vous le "pliez" en deux, c'est-à-dire que vous prenez le résultat de la multiplication XNOR de la première moitié du nombre et de la seconde moitié avec les chiffres en sens inverse, vous obtiendrez zéro.
Si le nombre a un nombre impair de chiffres en binaire, le chiffre du milieu doit être 1 et est ignoré lors du pliage.
Comme cela peut paraître un peu déroutant, je vais donner quelques exemples:
178
La représentation binaire de 178 est
10110010
Pour plier cela nous l'avons d'abord divisé en deux
1011 0010
Nous inversons la seconde moitié
1011
0100
Et nous XNOR les deux moitiés:
0000
C'est zéro donc c'est un nombre pliant.
1644
La représentation binaire de 1644 est
11001101100
Pour plier cela nous l'avons d'abord divisé en deux
11001 1 01100
Le bit du milieu est 1 alors nous le jetons.
11001 01100
Nous inversons la seconde moitié
11001
00110
Et nous XNOR les deux moitiés:
00000
C'est zéro donc c'est un nombre pliant.
4254
La représentation binaire de 4254 est
1000010011110
Pour plier cela nous l'avons d'abord divisé en deux
100001 0 011110
Le bit du milieu est 0, donc ce n'est pas un numéro de pliage.
Tâche
Votre tâche consiste à accepter un nombre positif et à renvoyer une vérité si le nombre est plié et faux si ce n’est pas le cas. C’est du code golf, alors essayez de garder le décompte des octets.
Cas de test
Voici les 99 premiers numéros pliants:
[1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120, 142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370, 412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738, 796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206, 1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848, 1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470, 2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132, 3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752, 3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558]
0
, alors non. (Cela pourrait valoir la peine d'avoir un troisième exemple travaillé comme celui-ci.) Même chose pour 18.Réponses:
Gelée , 9 octets
Essayez-le en ligne! ou vérifier tous les cas de test .
Comment ça marche
la source
05AB1E ,
1312 octetsCode:
Utilise le codage CP-1252 . Essayez-le en ligne!
Explication:
Premièrement, nous convertissons le nombre en binaire en utilisant
b
. 1644 devient 11001101100 . Nous divisons cela en deux morceaux avec2ä
. Par exemple, 11001101100 deviendrait:S'il y a un nombre impair de bits, la première partie recevra le bit supplémentaire. Nous
R
inversons la dernière chaîne et ajoutons un zéro en utilisant0¸«
. La raison en est de ne donner des résultats de vérité que lorsque le bit du milieu est un 1 ( 1 XOR 0 = 1 et 0 XOR 0 = 0 ). S'il n'y a pas de bit du milieu, 05AB1E ignorera simplement le dernier bit (le zéro ajouté):La dernière chose que nous devons faire est de faire un XOR élément par élément et de prendre le produit du résultat. S'il y a un élément de trop, le programme laissera simplement le dernier élément sur (
[1, 0, 0] XOR [0, 1] = [1, 1]
) Par exemple:Devient:
Et le produit de cela est 1 , qui est la vérité.
la source
s
soit nécessaire.bÐg;ô
était aussi loin que je suis avant de rafraîchir et de vous voir cloué. Excellente réponse pour m'aider à apprendre!Java 7,
152 145 142 138134 octetsDes boucles sur la ficelle comme pour un palindrome, à la recherche de zéros. Garde la trace en se multipliant à plusieurs reprises, il suffit donc de vérifier que ce n'est pas nul à la fin.
Sans barres de défilement:
la source
byte[]b=(a+"").getBytes();
est plus court que lechar[]b=a.toString(a,2).toCharArray();
et semble toujours fonctionner (-12 octets).getBytes
pourrait fonctionner avec le caractère char []. Merci :)z
tant0
qu'int (comme pour la fausseté, tout autre pour la vérité), cela vous fera économiser quelques octets.JavaScript (ES6),
615752 octetsCalcule récursivement:
où
N
est le rang du bit le plus élevé défini dans l'entrée.Si l'entrée a un nombre impair de bits, le bit du milieu est marqué XOR avec indéfini (la valeur renvoyée par
pop()
sur un tableau vide), ce qui la laisse inchangée. Ainsi, un0
bit du milieu efface la sortie et un1
bit du milieu ne modifie pas le résultat des autres opérations - ce qui est cohérent avec la définition de défi d'un numéro de pliage.la source
Python 2, 57 octets
Sorties via le code de sortie : erreur pour Falsey et aucune erreur pour Truthy.
Convertit l'entrée en binaire. Vérifie si le premier et le dernier caractère sont inégaux, le garde et le répète après avoir supprimé ces caractères.
La comparaison
s[-1]==s[0]<_
génère une erreur si les premier et dernier caractères sont inégaux en essayant d'évaluer la variable non affectée nommée_
. S'ils sont égaux, la chaîne d'inégalités est court-circuitée. Lorsque nous arrivons à l’élément central de1
, lawhile
boucle se termine dans les cas particuliers de manière satisfaisante.Je soupçonne qu'une approche purement arithmétique sera plus courte avec une récursion comme
f=lambda n,r=0:...f(n/2,2*r+~n%2)...
pour chomper les chiffres binaires à partir de la fin retournés et inversés, et détecter quandn
etr
sont égaux jusqu'à un centre1
. Il existe cependant des subtilités avec les zéros et le centre.la source
Python 2,
94 79 7267 octets12 octets sauvés grâce à @xnor
Définit une fonction non nommée sur la deuxième ligne.
Explication (avec quelques espaces ajoutés):
Essayez-le ici!
la source
s==''or s=='1'
peut êtres in'1'
and
peut être arithmétique*
. En outre,f
est autorisé à ne pas être nommé.Haskell,
898886 octetsFonctionne en sommant au bit la représentation du bit avec son inverse et en prenant le produit. S'il s'agit de 1 ou 2, le nombre est un numéro de pliage (1 s'il y a des bits pairs qui se plient, 2 s'il y a des bits impairs et un un au milieu).
la source
Python 2,
100999594 octetsCela semble un peu long, mais je vais continuer à y travailler :) Imprime un
1
si le nombre peut être plié,0
sinon.Testez-le ici!
grâce à Wheat Wizard pour la sauvegarde sur 1 octet :)
merci à Rod pour la sauvegarde de 5 octets! :)
la source
b-1
par~b
[1,a[b]>'0'][len(a)%2]
par(a[b]>=`len(a)%2`)
e=len(a)
pour changerb=e/2
`e%2
`, en sauvegardant 1 octet. Et puis les deux réponses python seront liées c:> <> , 37 + 3 = 40 octets
L'entrée devrait être présente sur la pile au début du programme, donc +3 octets pour le
-v
drapeau.Essayez-le en ligne!
la source
Gelée , 13 octets
TryItOnline
Ou termes équivalents jusqu'à 4558
Comment?
la source
Perl, 46 octets
Comprend +1 pour
-p
Exécuter avec le numéro sur STDIN
folding.pl
:Je considère comme un bogue de Perl que cela fonctionne même. Internal
$_
ne devrait pas recevoir de mises à jour de position de correspondance une fois celle-ci modifiée. Dans ce programme, la position du match dépasse réellement la fin du$_
la source
perl -pe '$_=sprintf("%b",$_)=~/^(.*)1?(??{reverse$^N=~y%01%10%r})$/'
/Brachylog , 16 octets
Cela ne fonctionne pas tout à fait en ligne ...
Prend les entrées via la variable d'entrée et les sorties en cas de succès ou d'échec. Cela dépend énormément
z₂
, qui est dans la langue depuis le 30 avril, mais nous avons oublié de demander de la tirer sur TIO afin que cela ne fonctionne pour le moment que sur une installation locale de la langue. De toute façon, c'est probablement une approche trop naïve.Brachylog (sur TIO), 19 octets
Essayez-le en ligne!
lᵛ↖Lz
est fonctionnellement équivalent àz₂
(si vous n'utilisez pas la variable L ailleurs), mais il est également trois octets plus long.la source
Python 2,
76 7169 octets-5 octets grâce à @Dennis (
''
est présent dans'1'
, remplacez-lein('','1')
parin'1'
)-2 octets grâce à @xnor (multiplication d'utilisation
(...)*
à la place deand
)Ideone
Recursive function, upon first call
n
is a number so it evaluates as less than the empty string, withif n<''
, and the function is called again but withn
cast to a binary string; the tail is either an empty string (even bit-length) or the middle bit, which returns true for empty or a'1'
; on it's way down it tests the outer bits for inequality (equivalent to XOR) and recurses on the inner bits,n[1:-1]
.la source
n in'1'
works.''
was present in'blah'
, but yes it is :)and
can be arithmetic*
.Python 2, 63 bytes
Prints
True
orFalse
. Takes the binary representation ofs
and repeatedly removed the first and last characters as long as they are unequal. Checks whether what remains is the empty string or a central1
. This is done by converting''
to'1'
and checking if the result equals'1'
, which also avoid an index error on the empty string.la source
PowerShell v2+, 143 bytes
Two possible approaches, both the same byte count.
Method 1:
Takes input
$n
, if it's-eq
ual to1
(a special case for this algorithm), increment it. Set$o
utput to be1
(i.e., assume truthy), then loop from0
to the midway point of the input number that has been[convert]
ed to binary. Note the-!($b%2)
to account for odd length binary numbers.Each iteration, we compare the current digit
$n[$_]
with the digit the same length from the end$n[$b-$_]
, and multiply the Boolean result into$o
(essentially performing an-and
on all of them). Once the loop is done, we need to potentially account for the middle binary digit, that's the pseudo-ternary at the end (array indexed via$b%2
). That1
or0
is left on the pipeline, and output is implicit.Method 2:
Takes input and does the same process to
[convert]
the number to binary. Then we're in afor
loop so long as the.length
of the binary string is-g
reatert
han2
. When we're in the loop, if the first$n[0]
and last$n[-1]
digits are-n
ote
qual, slice those two digits off of$n
and re-store it into$n
. Otherwise, output0
andexit
. Once we're out of the loop, we either have (an array of1
,1,0
,0,1
,1,1
, or0,0
), or the binary string for two10
, or 311
. So, we need to test those two possibilities. For the first, we-join
$n
together with+
and evaluate the result and test that it's1
(this is true for arrays1
,1,0
, and0,1
, but is$false
for arrays0,0
and1,1
or strings10
or11
). The other half of the-or
is testing whether$n
is-eq
ual to10
(i.e., input of2
). That Boolean is left on the pipeline, and output is implicit.la source
CJam, 13 bytes
Try it online! or generate a list of folding numbers up to a given number.
la source
MATL, 16 bytes
Truthy is an array with all ones. Check truthy/falsy criteria here.
Try it online! Or Verify the first 20 test cases.
Explanation
Let's use input
1644
as an example.la source
PHP, 101 Bytes
or with log
108 Bytes with array
True values <10000
la source
Julia, 66 bytes
My first golf! works the same way as the Python solution of the same length, minor differences due to language (I did come up with it on my own, though...).
Explanation:
la source
C,
223201189194178 BytesBrute force algorithm. Let's see how far it can be golfed.
Better test setup bugfixes...
la source
MATL, 13 bytes
Truthy is an array with all ones. Check truthy/falsy criteria here.
Try it online! Or verify the first 20 test cases.
Explanation
Using input
1644
as an example:la source
JavaScript, 71 bytes
Defines an anonymous function.
This method may not be the shortest, but as far as I know, it is unique. It adds the number in binary to itself reversed, treating them as decimal, then checking if the result is valid using a regex.
la source
Retina, 92 bytes
Byte count assumes ISO 8859-1 encoding.
Try it online
Convert to unary. Convert that to binary. Cut the number in half and remove a middle
1
if there is. Reverse the first half. Switch its ones and zeros. Match if both halves are equal.la source
Retina,
717060 bytesI probably still have a lot to learn about Retina (e.g. recursive regex?). Explanation: Step 1 converts from decimal to unary. Step 2 converts from unary to pseudo-binary. Step 3 removes digits from both ends as long as they mismatch. Step four matches an optional final central 1 if necessary. Edit: Saved 1 byte thanks to @mbomb007. Saved 10 bytes by improving my unary to binary conversion.
la source
.*
or.+
.Python 2,
6159 bytesSaving two bytes for converting shifts to multiplications
Returns
0
for a folding number and anything else for non-folding. Uses the bit-twiddling approach.la source
C,
6563 bytesTwo bytes for converting shifts to multiplications
Whitespace is already excluded from bytecount, returns 0 for a folding number and anything else for non-folding. Uses the bit-twiddling approach.
la source
k, 77 bytes
by way of explanation, a translation to
q
la source