Nous avons déjà défini ici un numéro de pliage .
Mais maintenant, nous allons définir un Super Folding Number. Un nombre Super Folding est un nombre qui, s'il est plié suffisamment de fois, finira par atteindre un de moins qu'une puissance de deux. La méthode de pliage est légèrement différente de celle de la question du nombre de pliage.
L'algorithme de pliage se déroule comme suit:
Prenez la représentation binaire
par exemple 5882
1011011111010
Je l'ai renversé en trois partitions. Première moitié, dernière moitié et chiffre du milieu (si elle a un nombre impair de chiffres)
101101 1 111010
Si le chiffre du milieu est zéro, ce nombre ne peut pas être plié
Inverser la seconde moitié et superposé à la première moitié
010111 101101
Ajouter les chiffres en place
111212
- S'il y a des 2 dans le résultat, le nombre ne peut pas être plié, sinon le nouveau nombre est le résultat de l'algorithme de pliage.
Un nombre est un nombre Super Folding s'il peut être plié en une chaîne continue de uns. (Tous les numéros pliants sont également des numéros super pliants)
Votre tâche consiste à écrire du code qui prend un nombre et génère une valeur véridique si le nombre est un nombre Super Folding et faux sinon. Vous serez noté sur la taille de votre programme.
Exemples
5200
Convertir en binaire:
1010001010000
Divisé en deux:
101000 1 010000
Le milieu est un donc nous continuons de superposer les moitiés:
000010
101000
Les a ajoutés:
101010
Pas de deux donc nous continuons de diviser en deux:
101 010
Plier:
010
101
111
Le résultat est 111
(7 en décimal), il s'agit donc d'un Super Folding Number.
Cas de test
Les 100 premiers numéros super pliants sont:
[1, 2, 3, 6, 7, 8, 10, 12, 15, 20, 22, 28, 31, 34, 38, 42, 48, 52, 56, 63, 74, 78, 90, 104, 108, 120, 127, 128, 130, 132, 142, 150, 160, 170, 178, 192, 204, 212, 232, 240, 255, 272, 274, 276, 286, 310, 336, 346, 370, 400, 412, 436, 472, 496, 511, 516, 518, 524, 542, 558, 580, 598, 614, 640, 642, 648, 666, 682, 704, 722, 738, 772, 796, 812, 852, 868, 896, 920, 936, 976, 992, 1023, 1060, 1062, 1068, 1086, 1134, 1188, 1206, 1254, 1312, 1314, 1320, 1338, 1386, 1440, 1458, 1506, 1572, 1596]
3
glissée à nouveau dans les cas de test? Je ne vois pas comment il peut être plié, car il se divise en1 1
donnant immédiatement un2
. Ou dites-vous que le plier zéro fois compte aussi?Réponses:
Voici mon tout premier tir au code golf:
Python 3, 167 octets
167 octets si des tabulations ou des espaces simples sont utilisés pour l'indentation
Edit: Grâce à l'aide de tout le monde ci-dessous, le code ci-dessus a été réduit d'une taille d'origine de 232 octets!
la source
:
s, et en retournant0
et1
au lieu deTrue
etFalse
.Java 7, 202 octets
Il a fallu un peu d'effort pour rendre l'ancienne fonction de pliage récursive, mais la voici. C'est moche comme péché, pour être honnête. Je vais devoir jeter un coup d'œil le matin pour voir si je peux jouer au golf plus loin, car je peux à peine me lever pour le regarder en ce moment.
Avec des sauts de ligne:
la source
CJam ,
4744 octetsEssayez-le en ligne! ou générer une liste de super numéros pliables jusqu'à un nombre donné.
Les tentatives de golf peuvent être vues ici .
Le code se décompose selon les phases suivantes:
EDIT: Cette version reprend plus ou moins une approche de De Morgan's Law par rapport à la version précédente.
* Le problème avec l'exécution sur singletons est que nous sommes coincés avec une chaîne vide après la tranche.
** Si un nombre binaire est super pliant, son image miroir (avec des 0 en tête si nécessaire) l'est. Cela permet d'économiser un octet sur la prise de la moitié droite.
la source
JavaScript, 149 octets
Définit une fonction récursive.
Explication:
la source
m=l>>1
,/2/.test(n)
,n.slice(l-m)
(Ou couper la chaîne inversée). Je pense que si vous changez les cas d'échec et de réussite, vous pouvez les utiliser/0/.test(n)?f(...):1
.JavaScript (ES6),
113109108 octetsFormaté et commenté
Démo
la source
Perl,
7170 octetsComprend +1 pour
-p
Donner un numéro sur STDIN
superfolding.pl
:la source
Python 2, 151 octets
ideone
Une fonction doublement récursive qui prend un entier,,
n
et retourne0
ou1
.Une variable
r
est maintenue pour permettre à la fois le résultat du repliement et savoir si nous avons actuellement: un entier (en premier seulement); avoir une nouvelle chaîne binaire pour essayer de plier (externe); ou se replient (intérieur).Lors de la première passe,
n
est et entier, qui est<''
en Python 2, donc la récursivité commence par le transtypage en chaîne binaire.La prochaine exécution a
r=''
et donc le test{'1'}==set(n)
est exécuté pour vérifier une chaîne continue de1
s (le RHS ne peut pas être{n}
comme nous pouvons avoir besoin de passer ce point plus tard avecr=''
et un viden
quand ce serait un dictionnaire qui ne sera pas égal{'1'}
, un ensemble).Si cela n'est pas satisfait, le critère de queue interne est testé (même si cela n'est pas nécessaire): if
n in'1'
sera évalué à True quandn
est une chaîne vide ou une simple1
, après quoi une nouvelle récursivité externe est commencée en plaçantr
, par la chaîne binaire alors repliée, dansn
et''
enr
. Le littéral2
est ajouté au résultat de cet appel de fonction pour ne permettre aucun passage à la partie suivante (à droite d'une logiqueor
) qui est corrigée plus tard.Si ce n'est pas une valeur véridique (tous les entiers non nuls sont véridiques en Python), les critères de récursivité de la queue externe sont testés:
n!=0
exclut le cas avec un milieu0
et les deux caractères externes sont testés, ils ne sont pas additionnés2
par la concaténation de chaîne'11'!=n[0]+n[-1]
; si ces deux valeurs sont vraies, les bits externes sont supprimés den
withn[1:-1]
, puis a1
est ajoutér
s'il y en a un à l'extérieur, sinon a0
est, en utilisant le fait qu'en'1'>'0'
Python avecmax(n[0],n[-1])
.Enfin l'addition de
2
à chaque récursion intérieure est corrigée avec%2
.la source
PHP, 113 octets
quitte avec erreur (code
1
) si l'argument n'est pas super-pliant, code0
sinon. Courez avec-r
.L'entrée
0
renverra vrai (code0
).panne
la source
PHP, 197 octets
Étendu
Vraies valeurs <10000
la source