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>
la source
59->60
et109->110
, avec le 0 supplémentaire.Réponses:
Pyth, 17 octets
C'est un peu ridiculement lent -
O(output^log_2(3))
. C'est exponentiel dans la longueur de l'entrée, mais pas doublement exponentiel, comme certaines des réponses sur la page. Quelques idées tirées de la réponse de @ Dennis, ici .Manifestation.
Il utilise
.f
la fonction "boucle jusqu'à ce que n correspondances" de Pyth.la source
CJam,
2423222119 octetsIl s'agit d'une approche O (log n) , où n est l'entrée, qui complète le dernier cas de test instantanément. Il convertit n directement en biais binaire, en utilisant une division modulaire par les valeurs du chiffre 1 .
Ce code se termine par une erreur renvoyée à STDERR avec l'interpréteur Java, qui est autorisée conformément au consensus sur Meta .
Si vous essayez ce code dans l' interpréteur CJam , ignorez tout, sauf la dernière ligne de sortie.
L’erreur peut être éliminée, au prix de 2 octets, en ajoutant
2>
au début àW%
.Merci à @ MartinBüttner pour le golf d'un octet.
Contexte
La représentation binaire de biais a k ... a 0 correspond à l'entier n = (2 k + 1 -1) a k + ... + (2 1 -1) a 0 .
Puisque les deux (2 k -1) + ... + (2 1 -1) = 2 k + 1 - (k + 2) et (2 k -1) + ... + 2 (2 j -1) = 2 k + 1 - (2 j + 1 - 2 j + k + 1) sont inférieurs à 2 k + 1 -1 , les valeurs de a k à a 0 peuvent être récupérées par division modulaire successive de 2 k + 1 -1 , 2 k -1 , etc.
Pour commencer, nous devons d’abord trouver la valeur de 2 k + 1 -1 . Puisque n est au plus 2 (2 k + 1 -1) , l'entier n + 1 doit être strictement inférieur à 2 k + 2 .
Ainsi, en prenant la partie entière du logarithme binaire de n + 1, on obtient k + 1 .
Enfin, nous observons que l'entier n + 1 a ⌊log 2 (n + 1) ⌋ chiffres en base 2.
Comment ça fonctionne
Dans les deux dernières itérations, nous effectuons une division modulaire par 1 et 0 . Le premier pousse un 0 non désiré sur la pile. Les dernières tentatives d’exécution
0 0 md
, qui suppriment les 0 non désirés de la pile, se terminent immédiatement au lieu d’appuyer sur quoi que ce soit et dumpent la pile dans STDOUT.la source
Python 2, 67 octets
Semble fonctionner pour les cas de test donnés. Si j'ai bien compris, cela devrait être le cas
O(place values set in output)
, alors le dernier cas est traité avec facilité.Appelle comme
f(100)
. Retourne une représentation décimale égale au binaire de biais.Python 3, 65 octets
Un peu moins efficace mais toujours logarithmique, le dernier cas est donc quasi instantané.
Appelle comme
g(100)
. Retourne une liste de chiffres.la source
2and
compile en 3? Je suis dans 2 et2and2
jette une erreur de syntaxe2and2
ne fonctionnerait pas car il serait analysé comme2 and2
- try2and 2
, qui devrait fonctionner si votre version de Python est suffisamment nouvelle (testé dans Python 2.7.10)CJam,
222120 octetsCeci est un O (e n n) approche, où n est l'entrée. Il répertorie les premiers ⌊e n ⌋ entiers non négatifs en base 3, élimine ceux qui ont 2 s ou 1 s après les 2 premiers (le cas échéant) et sélectionne le n + 1 e .
Essayez-le en ligne dans l' interprète CJam .
Comment ça fonctionne
la source
Pyth, 20 octets
S'exécute en O (journal (entrée ())), bien en dessous d'une seconde pour le cas de test final. Basé autour d'une course jusqu'à la boucle d'erreur. Pas de retour à la ligne.
Manifestation.
Explication:
J est initialisé à la valeur de la plus petite position de chiffre binaire asymétrique supérieure à l'entrée. Ensuite, chaque fois dans la boucle, nous procédons comme suit:
J
deQ
avec=%QJ
. Par exemple, siQ=10
etJ=7
,Q
devient3
, ce qui correspond au changement binaire d' inclinaison de110
la10
. Cela n'a aucun effet lors de la première itération.J
à la valeur de base binaire asymétrique suivante plus petite avec=/J2
. Il s’agit d’une division par 2, passantJ=7
àJ=3
, par exemple. Comme cela se produit avant la sortie du premier chiffre, laJ
position initiale d’un chiffre est plus élevée que nécessaire./QJ
(efficacement).p
, au lieu de l’impression par défaut de Pyth, pour éviter la fin de ligne.Cette boucle se répète jusqu'à ce que
J
zéro soit atteint, point auquel une erreur de division par zéro est générée et la boucle se termine.la source
ES6, 105 octets
L'utilisation est:
f(1048576)
=> `" 10000000000000000001 "Testez le dernier argument à vos risques et périls. J'ai abandonné après 5 secondes.
Et jolie impression avec des commentaires!
la source
f=
.f=n=>{for(o=0;~n--;o+=c?Math.pow(3,s.length+c):1)s=o.toString(3),c=~s.search(2);return s}
Math.pow(3,s.length+c)
par3**(s.length+c)
.Retina, 55 octets
Prend une entrée unaire.
Chaque ligne doit aller dans son propre fichier, mais vous pouvez exécuter le code sous la forme d'un fichier avec l'
-s
indicateur. Par exemple:Méthode: Exécute l'incrémentation d'un nombre d'entrée de chaîne à partir de la chaîne
0
.Nous utilisons les règles d'incrémentation suivantes:
2
:^2 -> ^12
;02 -> 12
;12 -> 20
2
:0$ -> 1$
;1$ -> 2$
(Il peut y avoir au plus un
2
dans la chaîne;^
et$
marque le début et la fin de la chaîne dans les règles.)Plus d'informations sur Retina.
la source
Java,
154148Cette réponse se présente sous la forme d'une fonction anonyme unique prenant un argument entier et renvoyant la réponse sous forme de chaîne. Vous trouverez ci-dessous une classe complète pour tester cette solution.
la source
Bash + coreutils, 52
Ceci est un brutal, donc c'est plutôt lent pour les grands nombres.
Sortie:
la source
Java,
337335253246244 octetsUne méthode qui prend l'index en tant que
long
et renvoie le résultat sous forme de chaîneUtilise a
long
pour l'index, donc peut théoriquement gérer le dernier cas de test, mais je ne le suggérerais vraiment pas.la source
if(j == 0)
déclaration (quatre octets). Vous n'avez pas besoin de déclarerk
; vous pouvez simplement utiliser àj
nouveau (quatre autres). Vous pouvez utiliser l'inférence de type générique (en Java 7) dans votre déclaration de liste (new ArrayList<>();
) (4 autres)Haskell,
7372Merci à @nimi pour 1 octet!
Cette solution ne rapportera aucune prime, les deux derniers tests ont pris un temps démesuré, mais je pense que j'ai assez bien réussi.
Cette solution est une approche plutôt naïve qui calcule le nombre binaire asymétrique
n
en incrémentant 0n
fois.la source
CJam, 24 octets
C'est une approche O (n log n) , où n est l'entrée. Il commence par la représentation binaire asymétrique de 0 et incrémente le nombre entier correspondant n fois.
Essayez-le en ligne dans l' interprète CJam .
Contexte
L'incrémentation d'un nombre en binaire oblique peut être effectuée en suivant deux étapes simples:
Remplace un éventuel 2 par un 0 .
Si un 2 a été remplacé, incrémentez le chiffre à sa gauche.
Sinon, incrémentez le dernier chiffre.
Comment ça fonctionne
la source
VBA,
209147142 octetsMon calcul est inefficace et mon golf pourrait utiliser le travail. Mais c’est ma première tentative de PoG et je me suis dit que j’essaierais celui-ci. Une sorte de moyen de force brute cependant.
Il ne fait que compter par 1 sauf si le dernier chiffre est un 2 puis recule de 2 et avance de 10. Plus les 0 finaux.
Cela cesse de fonctionner à 65534 car VBA insiste pour donner une sortie en notation scientifique, mais la logique devrait fonctionner correctement pour des nombres encore plus élevés.
Dans l’attente des suggestions de golf, VBA n’est pas très adapté au golf, mais il n’est pas souvent représenté et je pense qu’il peut battre Java pour la longueur.
Edit1: Merci Manu d' avoir aidé à réduire de 62 octets
Edit2: Swapped
debug.print
pourmsgbox
en sortie. 5 octets enregistrésla source
Debug.Print (q)
. En outre, vous pouvez supprimer la plupart des espaces (l'éditeur les redéfinira, mais ils ne sont pas nécessaires). Vous n'avez pas besoin de déclarerk as Long
, écrivez simplementk
. Ce sera une variable du type Variant et le code fonctionnera toujours. Avec ces conseils, vous devriez descendre à ~ 165 octets.InStr
, ils sont facultatifs.Trim()
n'est pas nécessaire, car vous n'avez pas d'espace. Appliqué correctement, j'arrive à 147 octets .debug.print q
serait la sortie standard?msgbox q
est plus court mais semble encore une fois que ce n'est pas tout à fait la sortie standard.Sheet1.cells(1,1)
semble être la sortie typique, mais suppose son exécution dans Excel. Je ne suis tout simplement pas tout à fait sûr de la sévérité du code-golf dans ce genre de choses.MsgBox
, si quelqu'un se plaint, vous pouvez toujours le modifier.Javascript ES6,
9986787672 caractèresTester:
Merci pour le fait - c'est la base de ma solution :)
la source
Octave,
107101 octetsDevrait être O (log n) si je pense que ce droit ...
Joli-imprimé:
J'étais un peu bloqué face au dernier défi, étant donné qu'Octave considère par défaut tout comme des nombres à virgule flottante et que je n'avais pas la précision nécessaire pour calculer le dernier. J'ai contourné cela en dépensant de précieux octets pour que tout soit forcément un entier non signé. Le résultat du dernier résultat était trop grand pour être traité comme un nombre. Le résultat est donc une chaîne.
Sortie (j'inclus
1e18 - 1
pour montrer que je peux le faire avec précision, et le dernier ensemble de sorties indique le temps nécessaire pour calculer cette valeur):la source
T-SQL,
221189177 octetsEDIT: Les versions originales de ce code produiraient une sortie incorrecte pour certains nombres, cela a été corrigé.
Avec chaque requête ici, ajoutez simplement le nombre à calculer avant la première virgule.
Tout le monde sait que T-SQL est la meilleure langue de golf. Voici une version qui va calculer même le dernier cas de test. Sur la machine sur laquelle j'ai testé, elle a fonctionné en moins d'une seconde, je serais intéressé de voir comment elle fonctionnera pour tous les autres.
Et le voici à nouveau, mais lisible:
Si je n'utilise que ints, cela peut être un peu plus court, avec 157 octets:
Et encore une fois, plus lisible:
la source
@
est un identifiant valide en SQL et vous permettra probablement de vous en tirer,Char(8000)
ce qui est encore meilleur marché que nvarchar (max). Vous pouvez également convertir auchar
lieu devarchar
, ou utiliser lastr
fonction.@
, bête moi. LeCHAR(8000)
conseil est plutôt bon, je vais essayer. Je semble toujours oublier l'existence deSTR()
remerciements pour le heads up.select @t=concat(@t,@/i)
cela devrait être plus petit. Nécessite sql2012 cependant.CONCAT
Je suis en 2008. Je ne peux donc pas le tester sans utiliser un violon SQL pour le moment. Bon appel cependant.Code de la machine de Turing,
333293 octetsJ'utilise un encodage tel qu'utilisé ici .
Cette machine utilise 9 états et 11 couleurs.
Si une entrée binaire est autorisée, elle peut être réduite à 4 couleurs seulement, en économisant quelques dizaines d'octets.
Si le lien ci-dessus ne fonctionne pas (parfois cela fonctionne pour moi, parfois la page refuse de charger), vous pouvez également le tester en utilisant cette implémentation Java.
la source
Perl, 66 octets
Le numéro doit être entré via STDIN.
la source
(.?)
en$2
car(.*)
en$1
devrait être gourmand et obtenir ce premier caractère. Mais s'il est supprimé, le code ne produit plus les bons résultats! Au fait, vous n'avez pas besoin de la finale;
.$c=<>;s/(.*)2(.*)/$1+1 .$2.0/e||$_++while($c--);print
. J'avais raison,(.?)
rien jamais capturé.$_=1;$c=<>;s/(.?)2/1+$1.0/e||$_++while(--$c);print
, ce qui est 50 octets..*
au début ou à la fin peuvent être optimisés, si vous le remplacez par le texte original. De plus, il n'y a aucune raison d'ajouter le 0 à la fin, car il n'y a toujours que des zéros dans l'original$3
.Pyth, 19 octets
Complexité logarithmique. Finit facilement dans le temps nécessaire. Sortie sous la forme d'une liste de chiffres.
Démonstration .
la source
Perl,
847067 octetsPas très gaie,ça va mieux mais ça marche très vite!La suggestion de Dennis le réduit à 51 (commutateur de 50 octets + -p)
Il doit être appelé comme
perl -p skew_binary.pl num_list.txt
oùnum_list.txt
contient une seule ligne avec le numéro à encoder.la source
Mathematica, 65
Devrait être assez rapide, bien que je dois admettre que j’ai jeté un coup d’œil aux autres soumissions avant de le présenter.
Usage:
Sortie:
Commence à envoyer des messages d'erreur MaxExtraPrecision quelque part après 10 ^ 228 (pour lequel le résultat est calculé en 0,03 seconde sur ma machine)
Une fois la limite MaxExtraPrecision supprimée, il gérera les nombres jusqu’à environ 10 ^ 8000 en une seconde.
Contribution:
Sortie:
la source
C, 95 octets
Ceci accepte un entier et un tampon dans lequel renvoyer les chiffres. Les résultats sont stockés dans
b
, terminés par une valeur3
(qui ne peut pas apparaître dans la sortie). Nous n'avons pas à gérer l'entrée de0
(comme la question ne spécifie que les entiers positifs), il n'y a donc pas de casse spéciale pour éviter une sortie vide.Code étendu
Nous opérons par soustraction successive, en commençant par le chiffre le plus significatif. La seule complication est que nous utilisons la variable
m
pour éviter d’imprimer des zéros en tête. Une extension naturelleunsigned long long
peut être faite si vous le souhaitez, au prix de 10 octets.Programme de test
Transmettez les numéros à convertir en arguments de commande. Il convertit le
int
tampon de tableau en une chaîne de chiffres imprimable. Le temps d’exécution est inférieur à une milliseconde1000000000000000000
.Résultats de test
la source
auto a=~0ull
pour un léger avantage ...JavaScript (Node.js) , 40 octets
Essayez-le en ligne!
Cette solution ne fonctionne pas sur le dernier test. Cela provoque juste un débordement de pile dessus.
la source
CoffeeScript,
9269 octetsBasé sur la réponse et les mises à jour de Qwertiy :
la source
Japt , 31 octets
Essayez-le en ligne!
Port presque direct de cette solution JS . Aucune idée s'il y a un meilleur moyen.
Déballé et comment ça marche
la source
Stax , 16 octets
Exécuter et déboguer
Je ne sais pas exactement quelle est la classe de complexité formelle, mais c'est assez rapide pour effectuer tous les tests en un dixième de seconde sur cette machine.
Déballé, non golfé et commenté, cela ressemble à ceci. Dans ce programme, le registre x contient à l'origine l'entrée.
Exécuter celui-ci
la source