Veuillez excuser le titre punny.
Cette question est inspirée d' une propriété curieuse de 82000 . L'auteur y indique que le nombre 82000 est binaire en base 2, 3, 4 et 5. Le post pose alors la question "y a-t-il un nombre binaire en base 2, 3, 4, 5 et 6? "? (Pour les curieux, j'ai vérifié des valeurs allant jusqu'à 10 ^ 1 000 000 et jusqu'à présent, la réponse est non.)
Cela m'a fait penser: étant donné un nombre, dans quelles bases est- il binaire?
Notre nombre curieux, 82000, est en fait binaire en six bases:
Base 2 = 10100000001010000
Base 3 = 11011111001
Base 4 = 110001100
Base 5 = 10111000
Base 81999 = 11
Base 82000 = 10
Tous les nombres n'auront pas de bases binaires séquentielles. Considérez le nombre 83521. Il est binaire dans les bases 2, 17, 289, 83520 et 83521.
Votre défi consiste à déterminer et à afficher dans quelles bases un nombre est binaire.
Règles
- Un nombre est considéré comme "binaire" dans une base donnée si sa représentation dans cette base se compose uniquement de zéros et de uns.
110110
est une valeur binaire, alors qu'elle12345
ne l'est pas, ne l'A380F
est certainement pas. - Votre numéro sera fourni sur une entrée standard. Ce sera une valeur entière comprise entre 2 et 2 ^ 32-1 inclus et sera fournie au format base 10.
- Dans l'ordre croissant, affichez chaque base supérieure à une dans laquelle le nombre est binaire. Chaque base doit être sur sa propre ligne. Si vous incluez la valeur binaire dans cette base (voir le score bonus ci-dessous), séparez la base et la valeur binaire avec un espace. Seule la sortie vers la sortie standard sera jugée, l'erreur standard et les autres sources seront ignorées.
Notation
Votre score est la taille de votre programme en octets. Plus le score est bas, mieux c'est.
Bonus :
si votre programme génère également les valeurs binaires dans les bases trouvées, multipliez votre score par 0,75
.
Exemples
Contribution:
82000
Sortie (reçoit un bonus):
2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10
Contribution:
1234321
Sortie (pas de bonus):
2
1111
1234320
1234321
la source
n
est toujours au moins binaire dans des bases1
(non comptés),2
,n-1
etn
.[1, 0, 1, 1, 0]
bien, ou faut-il joindre les chiffres comme10110
?Réponses:
Pyth,
1413Merci à Jakube d'avoir souligné la nouvelle
S
fonction.Essayez-le ici.
La version en ligne est trop lente à faire
1234321
. Cela convertit simplement l'entrée de chaque base de 2 en elle-même et supprime les résultats qui contiennent des valeurs autres que 0 et 1.Explication:
De plus, c'est une version bonus (
pas bien jouéemaintenant bien jouée, encore grâce à Jakube) (20 * .75 = 15):Essayez-le ici
la source
VQI!-JjQK+2NU2pdKjkJ
Parfois, la programmation fonctionnelle n'est pas la meilleure approche.Julia,
7270 octetsC'est en fait plus long avec le bonus, donc pas de bonus ici.
Cela lit une ligne de STDIN, la convertit en un entier et imprime le résultat. En dépit d'être une méthode de force brute, l'entrée 1234321 m'a pris moins d'une seconde.
Non golfé + explication:
Exemples:
REMARQUE : Si l'entrée peut être considérée comme un argument de fonction plutôt que depuis STDIN (en attente de confirmation de l'OP), la solution est de 55 octets.
la source
CJam, 20 octets (ou 27 octets * 0,75 = 20,25)
Voici la version sans bonus, 20 octets:
Essayez ceci ici.
Juste pour le plaisir, voici la version bonus, 27 octets:
Essayez-le en ligne ici
la source
ri_,f{2+S@2$bN}4/{2=2,-!},
(19,5 octets)Mathematica, 59 octets
Ugh ...
IntegerDigits
D:Il n'y a pas grand-chose à expliquer sur le code ... 12 octets sont gaspillés par la nécessité d'utiliser STDIN et STDOUT.
Je ne pense pas pouvoir réclamer le bonus. Le meilleur que j'ai est de 84 octets (ce qui donne un score supérieur à 60):
la source
Python 2,
88 8680Assez simple, pas de bonus. Python est agréable et indulgent avec les variables globales.
Le meilleur que j'ai réussi à obtenir pour le bonus est de 118 * 0,75 = 87,75 :
la source
g(N)
place den=N
.g(N,b)
, la virgule faisait les deux égales), mais que voulez-vous dire que je n'aurais pas besoin d'une variable pour N?g(n/b)
à(g(n/b)+'n%b')
où 'représente un backtick?Python 2, 90 * 0,75 = 67,5
Approche itérative assez simple.
Sans le bonus, cela fait 73 octets:
la source
SQL (PostgreSQL),
247,5255230,25 (307 * 0,75)Étant donné que SQL est connu pour être merveilleux dans ce genre de défis, j'ai pensé que je ferais mieux d'en mettre un ensemble :) Le bonus valait vraiment la peine pour celui-ci.
Il doit être conforme aux spécifications, mais je n'ai aucun moyen facile de tester la COPIE I DE STDIN .
Modifier l' ordre fixe. Modification de la façon dont la colonne R est gérée pour utiliser un tableau.
Comme test, je viens d'utiliser des inserts droits dans la
I
table. Le test a été étendu et commenté.la source
order by
. Maintenant pour voir si je peux récupérer ces personnagesHaskell 109 * 0,75 = 81,75 octets
Exemple d'utilisation (remarque: les valeurs binaires sont d'abord lsb):
Sans restrictions d'entrée / sortie, c'est-à-dire entrée via l'argument de fonction, sortie au format natif via REPL):
Haskell, 67 * 0,75 = 50,25 octets
Renvoie une liste de paires (base, valeur). Les valeurs sont d'abord lsb, par ex. (Sauts de ligne / espaces ajoutés pour un meilleur affichage):
la source
R, 111
Probablement beaucoup de place pour améliorer cela en ce moment
Fonctionne avec des avertissements
la source
I%/%b
logique dans laany()
clause. `Java,
181155,25 (207 * .75)151,5 (202 * .75) octetsDéveloppé avec explication:
Original (sans bonus):
3,75 octets grâce à Ypnypn :)
la source
R,
948379Usage:
Le noyau de la fonction est
!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})
qui, pour chaque base x de 2 à n, conserve le quotient n / x tant que le reste est soit 0 et 1. Il produit ensuite le résultat (qui est 0 si tous les restes étaient soit 1 ou 0) et le nie (0 nie à VRAI, tout le reste nie à FAUX). Grâce à la portée de la fonction, il n'est pas nécessaire de créer une variable fictive pour n. Le vecteur de booléens résultant est ensuite utilisé pour indexer2:n
et ne sort donc que les bases pour lesquelles il a fonctionné.la source
TI-Basic, 45 octets
Explication
La partie compliquée
La deuxième ligne fonctionne comme suit:
Remarque
Le programme s'exécute beaucoup plus rapidement si une parenthèse fermante
)
est placée à la fin de la deuxième ligne. Voir ici pour en savoir plus.la source
TI-BASIC,
3129C'est probablement optimal pour TI-BASIC.
Explication:
randIntNoRep(1,32)
renvoie une permutation aléatoire des nombres de 1 à 32 (Tout ce dont nous avons besoin est ces nombres dans un certain ordre; TI-BASIC n'a rien de semblable à la commande iota d'APL). 32 éléments suffisent car la plus petite base possible est 2 et le plus grand nombre est 2 ^ 32-1.B^randIntNoRep(1,31)
élève cette liste à la puissance Bth, ce qui entraîne la liste contenant toutB^1,B^2,...,B^32
(dans un certain ordre).Ensuite, l'entrée (dans la
Ans
variable wer, qui est entrée dans le formulaire[number]:[program name]
) est divisée par ce nombre. Si votre entrée est 42 et la base est 2, le résultat sera la liste21,10.5,5.25,...,42/32,42/64,[lots of numbers less than 1/2]
, encore une fois dans un certain ordre.Prendre la partie fractionnaire et multiplier le nombre par votre base donne le chiffre à cette position dans la représentation base-b. Si tous les chiffres sont inférieurs à 2, le plus grand chiffre sera inférieur à 2.
Comme l'a indiqué Ypnypn, une parenthèse fermante sur l'
For
instruction accélère cela en raison d'un bug de l'analyseur.31-> 31: enregistrement d'un octet mais correction des erreurs d'arrondi qui ajoutaient à nouveau l'octet.
31-> 29: enregistré deux octets en utilisant
RandIntNoRep()
au lieu decumSum(binomcdf())
.la source
seq(expression, variable, start, end[, step])
. Si aucune étape n'est donnée, elle vaut par défaut 1. Cependant, ellecumSum(binomcdf(31,0
est de 8 octets alors qu'elleseq(X,X,1,32
est de 9 octets.Gelée , 9 octets
Essayez-le en ligne!
Fait aux côtés de caird coinheringaahing dans le chat .
Comment ça marche
la source
Javascript, ES6,
118 * 0,75 = 88,5110 * 0,75 = 82,5La version précédente:
Vérifier:
la source
JavaScript ( ES6 ) 65
68 octets pour une fonction avec un paramètre et une sortie console.
65 octets avec E / S via popup
Réclamation du bonus: 88 * 0,75 => 66
la source
Mathematica, 76 * 0,75 = 57
Initialement oublié les exigences d'entrée ... Heureusement, celles-ci n'ont pas ajouté trop de choses.
la source
Rubis , 44 octets
Essayez-le en ligne!
la source
Perl 5 , 63 octets
Essayez-le en ligne!
Aucun bonus à ce sujet car il marque très légèrement mieux que ma version avec le bonus:
Perl 5 , 85 octets * 0,75 = 63,75
Essayez-le en ligne!
la source