Défi
Étant donné un nombre binaire entré par n'importe quel moyen, "simplifiez" le nombre en utilisant un programme complet ou une fonction.
Contribution
[binary]
binary
est un nombre en binaire supérieur à 0.
Production
Prenez l'entrée, convertissez-la en base 10 sans utiliser de code intégré, puis si ce nombre ne contient que 1 et 0, convertissez-le en nombre en base 10 comme s'il s'agissait d'un autre nombre binaire. Répétez le processus jusqu'à ce que le nombre ne puisse pas être lu en binaire et sortez ce nombre.
Les autres informations
Si l'entrée est 1, sortez simplement
1
. Votre programme ne devrait pas continuer à simplifier à l'infini 1.C'est le golf de code, donc la réponse la plus courte en octets d'ici mardi 17 novembre l'emporte.
Si quelque chose prête à confusion, laissez un commentaire précisant ce que je dois clarifier et je le modifierai en conséquence.
Les commandes intégrées pour la conversion de base ne sont pas autorisées.
Exemples
Input | Output
1 | 1
1010 | 2
1011 | 3
1100100 | 4
1100101 | 5
1111110011 | 3
la source
Réponses:
Pyth,
2016 octets4 octets grâce à Jakube
La moitié du code (
u+yNsTG0
) est simplement le code de conversion de base.Suite de tests
L'entrée
1
est gérée par le fait queu
la valeur a cessé de changer.la source
CJam,
2423 octetsEssayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
la source
"10"
chaînelength-1
, ou pourriez-vous ignorer la décrémentation?"10"
en""
si le nombre entier a un seul chiffre. Cela garantit que le code n'entre pas dans une boucle infinie.Pip,
2827 octetsPrend l'entrée comme argument de ligne de commande. Nous voulons boucler jusqu'à ce que
a=1
oua
contient des caractères en plus des 0 et des 1. Cette dernière condition est testée enRM
utilisant tous les caractères danst
=10
froma
. S'il reste quelque chose, la condition est vraie.À l'intérieur de la boucle, la conversion fonctionne comme suit:
Mettre
a
à la fin l'imprime automatiquement.Une solution récursive en 28 octets:
la source
Python 2, 52
Il est plus facile de voir cela comme deux fonctions récursives:
La fonction
g
convertit une valeur décimale en binaire, et la fonctionf
s'applique àg
plusieurs reprises est longue tant que son argument est composé des chiffres 0 et 1 ('2'>max(`n`)
) et ne l'est pas1
. Le code golfed les réduit en une seule fonction en insérant la définition deg(n)
forf(n)
, en remplaçant l'appel récursif deg
withf
. Le cas de base den=0
ofg
est automatiquement traité par le chèquen>1
.la source
L
derepr
...Prolog,
220212 octetsL'explication
p est la fonction principale et effectue les étapes suivantes (avec l'aide de b, x, y):
Edit: 8 octets enregistrés en unifiant les clauses p avec OR.
la source
Mathematica
107106Avec un octet enregistré par DLosc.
Divisez l'entrée en ses chiffres. Si l'entrée est 1, la sortie 1.
Si l'entrée est un nombre composé de 0 et de 1, convertissez-le en décimal et relancez-le.
Sinon, retournez l'entrée.
La première étape donne 1011 qui à son tour donne 3.
Ici, nous testons en commençant par 1011.
la source
Javascript,
132, 123 octetsEh bien, ce n'est pas la meilleure réponse, mais ..
Pour info, si une entrée non valide est donnée, elle affiche la même chose à l'utilisateur.
la source
for
au lieu dewhile
et en définissant des valeurs directement dans l'instruction (cela réduit également certains{}
);
, en en supprimant certains , en utilisant la description de la fonction ES6, incrémentez eni
ligne. Ça va ressembler à ceci:c=x=>{for(r=0;x&&!/[2-9]/.test(x);x=r)for(i=0;x>0;r+=x%10*Math.pow(2,i++),x=parseInt(x/10));alert(x)};c(prompt())
.function c(x){while(x^0&&!/[2-9]/.test(x)){for(i=r=0;x;i++)r+=x%10*Math.pow(2,i),x=0|x/10;x=r}alert(x)}c(prompt())
c=x=>
au début, ne fonctionnait pas sur la console Chrome ou Firefox. :( @ ן nɟuɐɯɹɐ ן oɯ, n'a pas pu envelopper ma tête autour de la condition XOR et aux=0|x/10
lieu deparseInt
, j'ai incorporé le reste des changements. Merci ..c=x=>{for(r=0;x!=0&&!/[2-9]/.test(x);x=r)for(i=r=0;x;)r+=x%10*Math.pow(2,i++),x=parseInt(x/10);alert(x)};c(prompt())
. Il fonctionne définitivement dans Firefox 42, essayez ce violon . Notez que cette version plus golfée ainsi que votre code d'origine ne fonctionnent pas1
et s'exécuteront dans une boucle sans fin.c=x=>
c'est commefunction c(x){}
voir " Fonctions flèches ".JavaScript ES6, 52
En tant que fonction. L'argument de la fonction doit être soit une chaîne de chiffres binaires, soit un nombre dont la représentation décimale ne contient que 1 et 0.
Testez l'exécution de l'extrait ci-dessous dans un navigateur compatible EcmaScript 6 - implémentation des fonctions fléchées, des chaînes de modèle et de l'opérateur de propagation (j'utilise Firefox)
la source
n+=+c+n
la conversion binaire. Si élégant ...Mathematica,
62595548 octetsSauvegardé 7 octets grâce à Martin Büttner.
la source
Javascript (ES7)
8780787774 octetsDémonstration d'extraits pour prendre en charge les navigateurs (actuellement, seul Firefox prend en charge la nuit l'opérateur exponentiel)
Javascript (ES6) 81 octets
Démo d'extraits pour la prise en charge des navigateurs
la source
𝔼𝕊𝕄𝕚𝕟, 37 caractères / 54 octets
Try it here (Firefox only).
Je ne sais pas si l'
+
opérateur compte comme une fonction intégrée pour la conversion binaire ...la source
Perl 6 , 67 octets
la source
PHP,
210204 octetsC'est ma première publication ici, alors j'espère que vous l'aimerez! Même si ce n'est évidemment pas la meilleure façon de l'écrire, je suis quand même content de le montrer ici!
Le code
J'ai créé une fonction récursive "j" qui vérifiera d'abord si l'entrée est égale à 1. Si c'est le cas, la fonction renvoie 1 comme prévu, sinon elle divisera le nombre dans un tableau pour calculer la valeur décimale, mais seulement si le nombre est binaire. Si ce n'est pas le cas, le numéro sera renvoyé tel quel.
Code non golfé
J'ai utilisé une instruction "foreach" au lieu de ma déclaration initiale "for", ce qui me permet un gain de 6 octets mais je suis sûr qu'il y a beaucoup plus à faire.
la source
PHP,
114112 octetsfonctionne également pour
0
. Courez avec-r
.count_chars($s,3)
renvoie une chaîne contenant tous les caractères de la chaîne (commearray_unique
pour les tableaux). Pour les nombres binaires, ce sera0
,1
ou01
. Pour les autres nombres, cela contiendra un chiffre supérieur à1
, donc<2
ne retournera vrai que pour les nombres binaires.&$s>1
est nécessaire pour le cas spécial1
.Le reste est simple: parcourez les bits en décalant la valeur et en ajoutant le bit actuel, enfin copiez le nombre (converti en chaîne) dans $ s pour le test de la boucle externe.
la source
CoffeeScript,
9289 octetsJavaScript (ES6),
10510190 octetsDémo
Fonctionne uniquement dans les navigateurs compatibles ES6 tels que Firefox et Microsoft Edge
la source
1
. parce qu'il n'entre pas dans la boucle, je supposeScala, 128 octets
la source
Matlab (115)
bin2dec
)la source