La plupart des ordinateurs stockent des entiers en binaire, mais les affichent en décimal. Cependant, le nombre décimal n'est qu'une représentation, il se trouve que c'est pratique.
Ce défi consiste à écrire du code pour sortir une valeur entière en décimal shortlex .
Qu'est-ce que c'est?
http://en.wikipedia.org/wiki/Shortlex_order
Shortlex prend la longueur de la séquence de chiffres comme signifiant principal de la valeur. La séquence, à partir d'une chaîne vide représentant zéro, est ...
ε,0,1,...,8,9,00,01,...98,99,000,001,...,998,999,0000,...
(Pensez aux colonnes Excel, mais en utilisant uniquement les chiffres décimaux.)
Écrivez un programme ou une fonction qui accepte un entier et renvoie une chaîne correspondant à la représentation décimal-décimal de cet entier comme décrit ci-dessus.
Valeurs de test:
0 → "" (chaîne vide)
1 → "0"
10 → "9"
11 → "00"
42 → "31"
100 → "89"
800 → "689"
1060 → "949"
10270 → "9159"
100501 → "89390"
19, 20, 21, 22
en décimales correspond à08, 09, 10, 11
en shortlex. C'est pourquoi j'ai utilisé ça confus100 -> 89
!Réponses:
JavaScript (ES6) 42
74Test dans la console FireFox
Production
Comment ai-je pensé à ça?
Étant donné un nombre fixe de chiffres, la séquence de sortie est simplement ascendante, il y a donc un delta fixe entre l'entrée et la sortie. Regarde:
Mais les 0 principaux sont difficiles à gérer, j'ai donc une astuce standard, ajouter un premier chiffre et travailler modulo (c'est-à-dire couper le premier chiffre en sortie). Ensuite -1-> +9, -11 -> +89, -111 -> +889 et ainsi de suite.
Dernière étape: peu m'importe le premier chiffre, il n'est donc pas nécessaire de vérifier si le numéro d'entrée est <ou> supérieur à 111 ... (honnêtement, j'ai trouvé cela par essais et erreurs)
Tester
la source
n-~(n+'')
au lieu de justen-~n
?(n+'').replace(...)
, remplacez les travaux sur les chaînes, pas sur les nombres.Marbelous
177173170Il ne fonctionne que pour les valeurs inférieures à 256 car Marbelous est un langage 8 bits.
Comment ça fonctionne
Marbelous est un langage 2D avec des valeurs représentées par des billes 8 bits qui tombent d'une cellule à chaque tick à moins qu'un appareil ne les empêche de tomber. Ce programme Marbelous se compose de 3 planches; Commençons par le plus simple:
:O
est le nom de la carte (pour être précis, O est le nom et: indique à l'interprété que cette ligne est un nom. En donnant un nom aux cartes, d'autres cartes peuvent les appeler}0
est un périphérique d'entrée, cela peut être vu comme un argument de cette fonction. Cette cellule sera remplacée par une bille d'entrée (valeur) lorsque la fonction sera appelée.+Z
ajoute 35 à toute bille qui la traverse et la laisse passer.+C
fait de même mais n'ajoute que 12.{0
est une cellule de sortie , lorsqu'un marbre atteint cette cellule, la fonction se termine et renvoie la valeur dans ce périphérique de sortie.Donc, tous ensemble, ce tableau prend une valeur, puis en ajoute 47. Pour nous, cela signifie qu'il transforme n'importe quel nombre à un seul chiffre en code ascii du chiffre -1 (cela fonctionnera bien sûr également pour 10).
Cette carte semble un peu plus compliquée. Vous devriez pouvoir identifier
:I
le nom de la carte et avoir repéré certains périphériques d'entrée et de sortie. Vous remarquerez que nous avons deux périphériques d'entrée différents,}0
et}1
. Cela signifie que cette fonction prend 2 entrées. Vous remarquerez également qu'il existe deux instances de l'}1
appareil. Lors de l'appel de la fonction, ces deux cellules contiendront la même valeur. Le}0
périphérique d'entrée est directement au-dessus d'un\/
périphérique, cela agit comme une poubelle et élimine immédiatement toute bille qui tombe dessus.Jetons un œil à ce qui arrive à l'une des billes mises dans le tableau par les
}1
périphériques d'entrée:Il tombera sur le premier tick et frappera l'
=9
appareil. Cela compare la valeur de la bille à 9 et laisse la bille tomber si l'instruction est=9
évaluée à travers. Le marbre est poussé vers la droite sinon.&0
et&1
sont des synchroniseurs. Ils s'accrochent aux billes qui tombent sur eux jusqu'à ce que tous les autres&n
synchroniseurs soient également remplis. Comme vous pouvez vous y attendre, cela déclenchera conditionnellement un comportement différent sur une autre partie de la carte.Si je vous dis qu'il
++
s'agit d'un incrémenteur, vous devriez déjà être en mesure de dire de quoi les différents synchroniseurs seront remplis. La gauche&1
contiendra la valeur d'entrée}1
+ 1, la&0
suivante contiendra 0 (00
est un littéral de langue, représenté en hexadécimal). La deuxième&1
contiendra la valeur 1 et la droite sera&0
remplie d'unF7
, ce qui soustrait 9 d'une valeur puisque l'addition dans Marbelous est le modulo 256.//
est un dispositif déflecteur qui pousse n'importe quelle bille vers la gauche au lieu de la laisser tomber.Mettre tout cela ensemble vous donne ceci: si le marbre
}1
est à 9, les&0
synchroniseurs se remplissent. Cela entraînera la valeur 0 à tomber dans la{0
sortie etF7
(ou -9) dans la{1
sortie. Si ce}1
n'est pas 9,{0
sera rempli de}1
+ 1 et{0
contiendra 1. Il y a aussi un{>
appareil, c'est une sortie spéciale qui sort une bille à côté d'une planche au lieu d'en dessous. Cela sera rempli de}1
s'il est égal à 9.D'accord, maintenant pour le grand. Cette carte n'a pas de nom explicite, car il s'agit de la carte principale du fichier. Son nom implicite est
Mb
. Vous devriez pouvoir reconnaître certaines cellules. Il existe un périphérique d'entrée, certains littéraux de langue (00
etFF
). Il y a des synchroniseurs et un déflecteur. permet de parcourir ce morceau par morceau.Ainsi, la valeur d'entrée (l'entrée de ligne de commande car il s'agit de la carte principale) commence à la deuxième cellule du haut où
}0
se trouve. Il tombera et atteindra l'>0
appareil, qui est un autre appareil de comparaison. tout marbre supérieur à 0 tombe à travers, tout autre marbre est poussé vers la droite. (puisque les variables Marbelous ne sont pas signées, seulement exactement 0 sera poussé vers la droite). Ce marbre de valeur nulle frappera alors le@6
appareil. Il s'agit d'un portail et transporte le marbre vers un autre portail correspondant, dans ce cas juste au-dessus. La bille 0 atteindra alors le&0
synchroniseur et déclenchera certaines choses ailleurs.Si la bille n'est pas 0, elle tombe, est déviée vers la droite par des
\\
coups--
qui la décrémentent d'un, puis tombe sur/\
un cloneur. Cet appareil prend une bille et en sort une copie à droite et une à gauche. Celui de gauche sera amené vers le haut de l'autre@0
où le marbre passera à nouveau par la même séquence. Celui de gauche sera pris ailleurs. Cela nous donne une boucle, qui décrémente l'entrée de ligne de commande une fois par boucle et déclenche un comportement sur chaque boucle jusqu'à ce qu'il atteigne 0. Il déclenche ensuite un autre comportement.Voyons ce qui se passe avec le marbre poussé dans
@4
chaque boucle.Il y a 3 littéraux de langue ici (
FF
), qui tomberont immédiatement dans les portails. Ces portails les amèneront à trois desII
appareils.II
fait référence au tableau que:I
nous avons défini plus loin dans le fichier. Puisqu'il:I
a 2 périphériques d'entrée distincts, sa représentation sur une autre carte doit avoir 2 cellules de large. Puisque nous avons 6 cellules contenantII
, nous pouvons dire que nous avons 3 instances de cette fonction sur la carte.Les
FF
billes (ou 256 ou -1 si vous voulez) resteront dans les cellules d'entrée de la:I
fonction en attendant jusqu'à ce qu'il y ait suffisamment de billes d' entrée pour démarrer la fonction (une de plus). C'est là que le@4
portail entre en jeu. Une copie de l'entrée de ligne de commande décrémentée passe par là sur chaque boucle. Cela déclenchera la:I
carte la plus à gauche . Initialement avec les valeurs 256 (ou -1) et quelle que soit l'entrée de ligne de commande était -1. Le marbre gauche sera placé dans les}0
appareils de la:I
planche et celui de droite dans le}1
. Si vous vous souvenez de ce que cette carte a fait, vous pourrez dire quel résultat cela a. Il produira une version incrémentée de l'entrée droite sur la sortie gauche (et il transforme un 9 en 0, pas 10) et sort soit 1 ou -9 sur la droite.La valeur incrémentée sera reprise directement dans la cellule d'entrée de droite par un portail, et la valeur de droite tombe dans un synchroniseur. Si un synchroniseur contient déjà une bille, les deux billes entreront en collision. Les billes en collision sont ajoutées ensemble modulo 256. Les valeurs dans les synchroniseurs feront donc le suivi: elles commencent vide, puis passent à 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, puis à 1 à nouveau (puisque 247 s'ajoute modulo 256).
Vous vous souvenez peut-être également qu'une bille est sortie vers la droite lorsque la valeur d'entrée revient à 0. Comme les
:I
cartes sont côte à côte, thsi déclenchera la carte vers la droite une fois. Cela remplira les trois synchroniseurs avec des valeurs plus élevées qu'elles ne devraient l'être pour être une représentation en shortlex de l'entrée de ligne de commande, au moment où celle-ci est bouclée à 0.Vous vous souvenez peut-être également que la
:O
fonction transforme une valeur en valeur ascii du chiffre qui représente la valeur -1. La sortie de cesOO
cellules tombera alors de la carte, qui imprime leurs caractères ascii correspondants sur STDOUT.Alors, que se passe-t-il lorsque la bille d'entrée de ligne de commande atteint 0 et remplit les
&0
synchroniseurs? eh bien, quelques billes de valeur 0 tombent et déclenchent les trois synchroniseurs qui contiennent les chiffres (+ 1) du numéro de shortlex au bas de la planche.&3
est déclenché en premier, car il contient le chiffre le plus significatif, puis vient&2
ensuite&1
. Cette bille est ensuite téléportée vers l'autre@5
appareil avant de finalement toucher la!!
cellule, ce qui met fin à la planche.la source
CJam,
1411 octetsEssayez-le en ligne.
Comment ça fonctionne
Cette approche est fortement basée sur la réponse d'edc65 (avec sa permission explicite ):
Exemple d'exécution
la source
Python 2 (38)
(43)Pas de substitution de caractères, juste de l'arithmétique.
Non golfé:
Je n'ai pas de bonne raison pour laquelle la récursivité fonctionne, j'adapte simplement ce modèle à la liste de valeurs. Si vous changez chacun
n-1
enn
, vous obtiendrez la représentation numérique régulière.Pour le golf, j'utilise
~-n
pour calculern-1
avec une priorité plus élevée que/10
ou%10
, en économisant sur les parens. Len*'_'
est juste de produire la chaîne vide quandn=0
et toute autre chaîne sinon. Le'_'
peut être n'importe quelle chaîne à cet effet.la source
Rubis,
7068666457 octetsDéfinit une fonction à appeler comme
f[42]
. Voici la répartition approximative de l'algorithme:0
séparément.Les crédits pour l'idée d'utiliser une chaîne de format vont à Falko!
Alternativement, en utilisant l'approche d'edc65:
C'est 45 octets et je ne fais que l'inclure, car je ne le bat pas avec. ;)
la source
Haskell, 67 octets
cette solution ajoute fondamentalement 1 le nombre de fois donné, en notation shortlex.
usage:
la source
CJam, 16 octets
Essayez-le en ligne. Nécessite au moins O (n) de temps et de mémoire, alors laissez 100501 à l'interprète hors ligne ...
Comment ça fonctionne
L'idée de base derrière cette approche est de calculer au moins N décimales shortlex dans leur ordre naturel et de rejeter tout sauf le Nième. Pas très efficace, mais bref.
Exemple d'exécution
la source
Bash + coreutils, 27 octets
Port de la réponse intelligente de @ edc65 , avec les améliorations de @ Dennis :
Production:
Réponse précédente:
Bash + coreutils,
7154 octetsVoici une façon légèrement différente de le faire:
jot
affiche des nombres hexadécimaux croissantstr
convertit ceci en (0,1, ..., 8,9, b, ... f, 0a, 00,01, ..., 99,9b, ..., ff, 0aa, ..., 000 , ...)grep
filtre simplement toutes les lignes contenant des chiffres à donner (0,1, ..., 8,9,00, ..., 99,000 ....)sed
supprime tout sauf la nième lignesed
compte les numéros de ligne commençant à 1, donc des erreurs si 0 est passé)grep
, nous devons générer plus d'entiers de base 11 avecseq
/dc
que le nombre d'entrée. La répétition des chiffres de n est plus que suffisante.Notez qu'une fois que le nombre de shortlex est imprimé,
seq
continue de générer des nombres jusqu'à$1$1
, ce qui ralentit surtout pour les plus grands nombres d'entrée - O (n²), je pense. Nous pouvons accélérer en ayant laseq
sortie immédiatement après l'impression au prix de 7 octets:Il n'y a aucune exigence de vitesse dans la question, donc je vais utiliser la version courte pour ma réponse principale.
la source
s='jot -w%x $1$1|tr 0-9a a0-9|grep -P ^\\d+$|sed $1!d 2>-'; echo ${#s}
. Je soupçonne que vous utilisez peut-être python pour mesurer la longueur de la chaîne, qui traite le "\\" comme un seul caractère.$a
semble inutile;cut -b2-<<<$[$1-~${1//?/8}]
devrait fonctionner très bien.Python
2-84, 7066Approche alternative (même longueur):
la source
Python 3, 107 caractères
Cela n'a pas fini par gagner mais j'ai pensé que c'était intelligent:
Je définis un générateur pour toute la séquence en 64 caractères. Malheureusement, je dois passer par quelques contorsions pour obtenir le nième élément du générateur ... si seulement je pouvais le faire
S=lambda n:G()[n]
.la source
Pyth , 12
Un autre port de la réponse de @ edc65, qui est le gagnant clair (IMO):
Pack de test (Merci à @DigitalTrauama):
Explication:
la source
[8, 8, 9] -> 889
). Comment tu fais ça?jk
transformera votre liste en chaîne, et lav
transformera en int.vjk[8 8 9]
[2 -1] -> 19
et[1 11] -> 21
.Java 8, 60 octets
Port de la réponse JavaScript (ES6) étonnante de @ edc65 , car je doute que cela puisse être fait plus court de manière arithmétique en Java.
Essayez-le ici.
la source
Haskell , 57 octets
Essayez-le en ligne!
Construit une liste infinie de nombres shortlex et indexe dedans pour la réponse.
g n
construit la nième "génération" de nombres en ajoutant le chiffre suivant devant chacun des nombres de la génération précédente.la source
05AB1E , 7 octets
Utilise le remplacement d' edc65 par 8 astuces
Essayez-le en ligne!
Explication
la source
Excel, 37 octets
En utilisant l'approche de @ edc65:
la source
Gelée , 5 octets
Essayez-le en ligne!
Je suis très nouveau sur Jelly, donc si vous pouvez améliorer cela, veuillez commenter!
Explication:
(Selon le commentaire de res ci-dessus, le problème est équivalent à convertir le nombre en base bijective 10)
la source