Ce défi est simple, étant donné un nombre décimal, convertissez en binaire et calculez la somme des sous-chaînes du nombre binaire, dont la longueur est plus courte que le nombre d'origine. Voici un exemple:
Input:
11
Binary:
11 -> 1011
Substrings:
101 = 5
011 = 3
10 = 2
01 = 1
11 = 3
1 = 1
0 = 0
1 = 1
1 = 1
Sum:
5+3+2+1+3+1+0+1+1=17
Output:
17
Votre programme doit prendre un seul entier décimal en entrée et sortir la somme des sous-chaînes binaires, comme vu ci-dessus. Vous pouvez supposer que l'entrée aura toujours plus de deux chiffres dans sa représentation binaire et que l'entrée ne provoquera aucune erreur lors de l'exécution de votre programme.
C'est le code-golf , le code le plus court en octets gagne!
Cas de test:
2 => 1
3 => 2
4 => 3
5 => 5
6 => 7
7 => 9
8 => 7
9 => 10
10 => 14
11 => 17
code-golf
base-conversion
binary
subsequence
GamrCorps
la source
la source
Réponses:
Gelée,
107 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
Pyth, 10
Essayez-le en ligne ou exécutez la suite de tests
Explication:
la source
CJam,
2721 octetsMerci à Dennis de m'avoir aidé à économiser 6 octets!
Fonctionne uniquement avec la dernière version de CJam (disponible sur TIO). Essayez-le en ligne !
Ancienne version:
Essayez-le en ligne .
la source
Python 3, 111 caractères
ÉDITER : Explication:
Convertissez la chaîne d'entrée en int, puis l'int en chaîne binaire et supprimez ses deux premiers caractères, car la
bin
méthode renvoie une chaîne au format0b...
Prenez toutes les sous-chaînes de la chaîne binaire, convertissez-les en décimal en utilisant
int(n, 2)
et additionnez-les.est une liste de toutes les sous-chaînes. Version non golfée:
J'espère que cela t'aides.
la source
CJam (22 octets)
C'est un octet de plus que la meilleure réponse CJam actuelle, mais l'approche peut probablement être adaptée à d'autres langues de manière très rentable.
Démo en ligne
Une analyse
Supposons que la question soit
sans le bit
Ensuite, il n'est pas trop difficile de montrer que le bit le plus significatif se produit avec un poids total
1*(2^B-1)
oùB
est le nombre de bits; le deuxième bit le plus significatif se produit avec le poids total2*(2^(B-1)-1)
; jusqu'au bit le plus significatif Bth, qui se produit avec le poids totalB*(2^1-1)
.En tenant compte maintenant de la soustraction du nombre original
x
, on se retrouve avec la sommeDissection
La conversion en base 2 donne la première partie de la somme principale plus
x
; à la base 1 donne la deuxième partie plusx
; et à la base 0 donne justex
, donc la soustraction de la base-1 de la base-2 l'x
annule, et la soustraction de la base-0 donne le résultat souhaité.la source
JavaScript (ES6), 78 octets
L'extérieur
map
construit des sous-chaînes de tête den
la représentation binaire de; celui interne extrait les sous-chaînes de fin des sous-chaînes de tête, couvrant ainsi toutes les sous-chaînes possibles, y compris la représentation binaire d'origine.Chaque sous-chaîne est convertie de binaire en décimal et soustraite de l'entrée d'origine car cela est légèrement plus court que de les additionner et de soustraire l'entrée d'origine.
la source
Mathematica,
7370 octetsUne fonction. Entier-> Entier
la source
Rétine , 64
Essayez-le en ligne!
Une description de haut niveau étape par étape: convertir décimal en unaire, unaire en binaire, obtenir des préfixes, obtenir des suffixes de préfixes, vider le nombre d'origine, convertir un binaire en unaire, retourner le nombre. J'écrirai une description plus détaillée une fois que j'aurai fini de jouer au golf, beaucoup de ces étapes semblent suspectes ...
la source
C, 71 octets
Nous maintenons un accumulateur
a
et un masquem
. Le masque commence à 1 et devient un peu plus long à chaque fois autour de la boucle extérieure. Dans la boucle intérieure, une copiei
de l'entrée est successivement décalée vers la droite jusqu'à ce qu'elle soit plus courte que le masque, accumulant à chaque fois la valeur masquée.Programme de test
Sortie test
la source
C #, 148 octets
Ou, si j'ajoute Import "using static System.Math;" puis 138 avec
Les langages OOP comme C # ne gagneront pas une telle course, mais je voulais quand même l'essayer. Voici une version + testeur plus embellie.
Le do-while imbriqué ajoute la valeur décalée vers la droite d'iTemp (après l'avoir affectée) tant que shift + 1 est plus petit que pos. La ligne suivante calcule la prochaine valeur décalée d'iPrev
x1 et x2 calculent le masque, x3 l'applique puis le décale vers la gauche, car le dernier chiffre est toujours supprimé. Pour 11, cela ressemble à ceci:
la source
PowerShell v2 +, 138 octets
Ooof. Cette conversion de / vers binaire coûte cher.
Prend l'entrée
$a
, puis utilise l' appel .NET[convert]::ToString($a,2)
pour le transformer en représentation binaire. De là, nous parcourons deux boucles - la première compte à rebours de la fin de la chaîne vers le bas1
et la seconde compte vers le haut à partir de0
. (Le premier est la longueur d'une sous-chaîne à extraire, et le second est l'index de l'endroit dans la chaîne pour démarrer la sous-chaîne.) Nous avons défini une aide en$l
cours de route pour la transmettre à la boucle intérieure.À l'intérieur de la boucle interne, nous utilisons un autre appel .NET
[convert]::ToInt32()
pour convertir la.substring()
base appropriée2
en un entier. Chacun d'eux est ensuite laissé sur le pipeline. Nous encapsulons tout cela avec des parenthèses()
et-join
les ensemble avec un+
, puis jetons cela àiex
(court pourInvoke-Expression
et similaire àeval
).Je pense que cela nécessite techniquement v2 ou plus récent pour appeler correctement les appels .NET.
la source