Écrivez un programme ou une fonction qui, étant donné un entier positif en entrée, sort la représentation de cet entier en chiffres mayas .
Chiffres mayas
Les chiffres mayas sont un système vigésimal (base 20) utilisant seulement 3 symboles:
< >
pour Zero (le symbole correct est une sorte de shell qui ne peut pas être facilement représenté en utilisant ASCII)..
pour un----
pour cinq
Les nombres sont écrits verticalement en puissances de 20, et les nombres entre 0 et 19 sont écrits comme des piles de cinq et de uns . Vous devez vous référer à l'article Wikipedia pour plus de détails.
À titre d'exemple, voici les nombres compris entre 0 et 25, séparés par des virgules:
. .. ... ....
. .. ... .... ---- ---- ---- ---- ---- . . . . . .
. .. ... .... ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
< >, . , .. ,... ,....,----,----,----,----,----,----,----,----,----,----,----,----,----,----,----,< >, . , .. ,... ,....,----
Contributions
- Les entrées sont toujours des entiers positifs compris entre 0 et 2147483647 (2 ^ 31 - 1).
- Vous pouvez prendre l'entrée de STDIN, comme argument de ligne de commande, paramètre de fonction ou quelque chose de similaire.
Les sorties
- Chaque ligne comporte au maximum 4 caractères.
< >
et----
doit toujours être imprimé comme indiqué ici (4 caractères chacun). - Les uns (
.
) doivent être centrés sur la ligne. S'il y en a 1 ou 3.
, car un alignement horizontal parfait est impossible, peu importe qu'il s'agisse d'une colonne à gauche ou d'une colonne à droite ou au centre. Il doit y avoir exactement une ligne vide entre différentes puissances de 20, quelle que soit la hauteur des piles dans la puissance de 20s. Par exemple, la sortie correcte pour 25 et 30 est:
. . ---- ---- ----
Aucune ligne avant ou arrière n'est autorisée.
Les sorties doivent être imprimées exactement comme dans les exemples donnés.
Cas de test
Chaque numéro individuel entre 0 et 25 donné comme exemple ci-dessus.
Contribution:
42
Sortie:
..
..
- Contribution:
8000
Sortie:
.
< >
< >
< >
- Contribution:
8080
Sortie:
.
< >
....
< >
- contribution:
123456789
Sortie:
.
...
----
----
----
.
----
----
..
----
----
.
....
----
----
----
....
----
- Contribution:
31415
Sortie:
...
...
----
----
----
----
----
----
----
----
- Contribution:
2147483647
Sortie:
.
...
----
----
.
----
----
.
----
----
----
....
----
..
..
----
Notation
Il s'agit de code-golf , donc le code le plus court en octets l'emporte.
la source
Réponses:
Pyth, 41 octets
Essayez-le en ligne: Démonstration
Explication:
la source
Perl,
125117 bytesMerci à Dom Hastings de m'avoir aidé à économiser 8 octets.
la source
redo,if(int($i/=20))
vous ne pouvez les utiliser~~($i/=20)&&redo
.~~
convertit en int - vous pouvez également utiliser0|
au début (ou|0
à la fin). Le remplacementsubstr(".... ... .. . ",20-$i%5*5,5)
par(' .', ' ..','...','.'x4)[$i%5-1].$/
semble fonctionner, mais je n'ai pas testé tous les cas de test ... Si ceux-ci fonctionnent, vous êtes à 114 ... Si je pense à autre chose à partager, je vous le ferai savoir!$-
qui sera toujours tronquée en entier ... pourrait en sauver quelques autres!JavaScript ES6, 143 octets
Des charges d'octets ajoutées car nécessaires
console.log
, pourraient économiser 23 octets supplémentaires sans elle.la source
Mathematica
185 182 171153Avec 18 octets enregistrés grâce à la suggestion d'Arcinde d'utiliser des fonctions anonymes,
Exemple
Vérification
Le nombre décimal, 31415, exprimé en base 20. Mathematica utilise pour cela des minuscules.
Les chiffres décimaux correspondant au nombre de base 20 ci-dessus.
Un autre exemple
la source
c=Column;c[If[#>0,{q,r}=#~QuotientRemainder~5;c@{{""," ."," .."," ...","...."}[[r+1]],c@{{""},{d="----"},{d,d},{d,d,d}}[[q+1]]},"< >"]&/@#~IntegerDigits~20]&
en utilisant des fonctions anonymes.JavaScript (ES6), 157 octets
Les sauts de ligne sont significatifs et comptent pour 1 octet chacun. Étant donné que l'impression sur STDOUT est requise, cela
console.log
m'a coûté quelques octets.Démo
À des fins de démonstration, j'écrirai une version ES5 pour qu'elle fonctionne dans tous les navigateurs:
la source
.join
besoin de parenthèses?Python 2.x, 142 octets:
Exemple:
Modifier: ligne de fuite ...
la source
[n%20==0]
à[n%20<1]
. Ensuite, passez[[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]
àh=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1]
witha=n%5
, qui déplace tous lesn%5
s et modifie le conditionnel*(a>0)
auquel renvoie une chaîne vide àa==0
pour le même effet.a
,h
etn
sur une ligne, comme suit:a=n%5;h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1];n/=20
. Tout cela devrait vous laisser 131 octets.CJam,
8276 octetsMon premier programme CJam, essentiellement juste une translittération de ma réponse Perl à CJam.
Essayez en ligne
Multi-ligne avec commentaires:
la source
PHP, 220 octets
Même approche que ma réponse JavaScript. PHP a des fonctions intégrées pour tout.
Prend 1 entrée de la ligne de commande (ie STDIN), comme vu avec
$argv[1]
:la source
C - 149
Utilise la récursivité pour imprimer d'abord les nombres les plus significatifs. Puis imprime zéro ou imprime tous les points avec un astucieux
printf
et tous les cinq en boucle. Je ne sais pas si je peux éviter d'utiliser if-else ici.L'inconvénient de printf intelligent est que 1 et 3 ne sont pas alignés:
Le résultat pour 23 est:
119solution incorrecte - retour à la fin de la nouvelle lignela source
PHP,
202192 octetsIl obtient l'entrée du premier argument de ligne de commande.
Le code source complet, avec commentaires et tests, est disponible sur github .
la source
\n
est deux caractères - mais une nouvelle ligne au milieu d'une chaîne n'en est qu'un.Python 2, 114 octets
Cette réponse est basée sur la réponse Python de Jakube et la réponse Python 2 de Locoluis.
la source
Gelée ,
504947 octetsEssayez-le en ligne!
...
est maintenant aligné à gauche grâce au point de user202729.Lorsque vous vous trompez en pensant
< >
est un palindrome ...la source
...
.
et..
il doit y avoir un espace donc j'en mets un...
aussi. Y a-t-il un moyen plus court?...
ne doivent pas être alignées à droite. Changez simplement<4
en<3
?