Le livre de Randall Munroe "xkcd, volume 0" utilise un système de nombres plutôt impairs pour les numéros de page. Les premiers numéros de page sont
1, 2, 10, 11, 12, 20, 100, 101, 102, 110, 111, 112, 120, 200, 1000, 1001, ...
Cela ressemble un peu à ternaire, mais il faut noter qu'il saute de 20
tout droit à 100
, à partir 120
de 200
et à partir 200
de 1000
. Une façon de définir cette séquence est de dire qu'elle énumère tous les nombres ternaires qui contiennent au plus un 2
et aucun 1
après 2
. Vous pouvez trouver cela sur OEIS dans l'entrée A169683 . Ce système de numération est appelé binaire de biais .
Votre tâche consiste à trouver la représentation d'un entier positif donné N
dans ce système de numération.
Vous pouvez écrire un programme ou une fonction en prenant l’entrée via STDIN (ou l’alternative la plus proche), un argument de ligne de commande ou une argumentation de fonction et en générant le résultat via STDOUT (ou l’alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).
La sortie peut être une chaîne, un nombre avec une représentation décimale égale à la représentation binaire asymétrique ou une liste de chiffres (sous forme d'entiers ou de caractères / chaînes). Vous ne devez pas retourner les zéros non significatifs.
C'est le code de golf, donc la réponse la plus courte (en octets) gagne.
Anecdote: Ce système de numérotation présente certains avantages. Lorsque vous incrémentez un nombre, vous modifiez toujours au maximum deux chiffres adjacents. Vous ne devez jamais effectuer la modification sur l'intégralité du nombre. Avec la bonne représentation qui permet d’incrémenter en O (1).
Cas de test
1 => 1
2 => 2
3 => 10
6 => 20
7 => 100
50 => 11011
100 => 110020
200 => 1100110
1000 => 111110120
10000 => 1001110001012
100000 => 1100001101010020
1000000 => 1111010000100100100
1048576 => 10000000000000000001
1000000000000000000 => 11011110000010110110101100111010011101100100000000000001102
Je donnerai une prime à la réponse la plus courte qui peut résoudre le dernier cas de test (et toute autre entrée de même ampleur, alors ne pensez pas à le coder en dur) en moins d'une seconde.
Classements
Voici un extrait de pile permettant de générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 51517</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
59->60
et 109->110
, avec le 0 supplémentaire.