Ce défi est simple. Étant donné un nombre, produire une représentation ascii-art du nombre, en utilisant le système numérique Mayan Base-20.
Qu'est-ce que le système maya?
Les Mayas utilisaient la base 20 pour stocker les nombres, donc la première position était la 1
place s, la prochaine 20
place s, puis la 400
s, etc.
Donc le nombre Maya 1
est 1
en base 10, mais 10
est en fait 20
en base 10, 207
est 807
en base 10, etc.
Et ils ont représenté leurs numéros sous forme de pictogrammes, avec un symbole spécial pour 0
.
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
C'était leur zéro. (au moins la moitié picascii la moitié de ma version artistique de l'art ascii)
C'est une vraie image du symbole zéro maya. 1
Ce sont leurs cinq:
--------------------------------
| |
--------------------------------
Et un 4:
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
Enfin, pour le rassembler:
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
Ils ont donc des x//5
barres et des x%5
points au-dessus des barres. Et si x=0
, ils utilisent le shell / pain au lieu d'un espace vide.
Pour plus d'images, essayez la page Wikimedia Commons d'images de nombres mayas .
Mais ce n'est que pour les chiffres jusqu'à 19
. On n'a pas le droit d'avoir plus que des 4
barres et des 4
points dans une seule "histoire" ... Alors on monte!
La sortie pour 20 est:
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
Notez que ce serait normalement invalide, car il a un 1
et un 0
en même temps. Mais le 3
(notez que, votre réponse a besoin d'au moins 3) de nouvelles lignes avant la 0
moyenne d'une nouvelle valeur de position.
L'histoire du bas a des points, une signification 1
et des barres signifiant 5
. Mais il a en fait une signification de points 20^0
et une signification de barres 20^0 * 5
.
Chaque histoire monte en puissance. Les points du deuxième étage signifient 20
( 20^1
) et 100
( 20^1 * 5
).
Ainsi, le nombre 506
peut être représenté comme:
----
| |
| |
----
--------------------------------
| |
--------------------------------
----
| |
| |
----
--------------------------------
| |
--------------------------------
C'est ça (20^0) * 1 + (20^0 * 5) * 1 + (20^1 * 5) * 1 + (20^2) * 1 = 1 + 5 + 100 + 400 = 506
.
Votre mission, si vous choisissez de ne pas le faire ou si vous le souhaitez (peu importe), est de produire une représentation artistique ascii du nombre de base 10.
Autres règles:
- L'espace de tête / arrière est correct, tant que les points, les barres et les coquilles sont intacts.
- Les barres, les points et les coquilles doivent être exactement ce que les cas de test ont. Pas de redimensionnement.
- Les 0 en tête sont corrects. (coques de tête sur la sortie)
- Vous n'avez pas besoin d'avoir exactement 3 sauts de ligne entre chaque valeur de position ou histoire, juste au moins 3.
Cas de test:
15
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
12
---- ----
| | | |
| | | |
---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
4
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
0
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
24
----
| |
| |
----
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
33
----
| |
| |
----
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
20
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
1: Ils ont également utilisé les têtes de dieux pour les symboles, mais pour ce défi, le coffre de coquille / pain / zelda sera utilisé.
but for this challenge the shell/bread will be used.
. Pas de coquille, pas de pain. Lien LOZ vers la poitrine passée.Réponses:
Rubis,
223180177179 octetsFonction anonyme, retourne une chaîne multiligne.
J'ai oublié d'ajouter un espacement supplémentaire qui était nécessaire, ainsi que la récursivité. J'ai également joué un peu plus en déplaçant les choses.
la source
Python 3.5,
404400392312311308290281285281 octets:( Merci à Adnan pour une astuce pour économiser 9 octets (
290->281
) et Neil pour une astuce pour économiser 4 octets (285->281
)! )Essayez-le en ligne! (Ideone)
Une analyse
Aux fins de cette analyse, nous utiliserons le jeu de caractères
0123456789ABCDEFGHIJ
pour représenter chaque chiffre de la base 20.Donc, j'aurais pu convertir la base 10 en base 20 en utilisant l'un des deux algorithmes que j'ai. Le premier algorithme que j'ai pensé utiliser est ce que j'appelle l' algorithme des puissances . Ce n'est pas celui que j'ai utilisé dans le code car il l'aurait rendu beaucoup plus long qu'il n'aurait dû l'être, donc je ne vais pas parler de celui-ci. Cependant, j'ai créé un script python qui convertit tout entier de la base 10 en toute autre base fournie à l'aide de cette méthode, que vous pouvez utiliser ici sur repl.it. Celui que j'ai utilisé à la place pour ce défi est ce que j'appelle l' algorithme de division , qui je pense est expliqué assez bien ici. Mais fondamentalement, ce qui se passe, c'est qu'il prend le nombre de base 10 fourni et le divise par la base dont il a besoin pour convertir le nombre, qui dans ce cas est 20, jusqu'à ce que le reste soit 0 ou 1. Il prend ensuite le quotiant et le reste , dans cet ordre, de la dernière opération de division, puis tous les autres restes des autres opérations de division dans l'ordre du dernier au premier. Tous ces chiffres sont ensuite réunis, et cette séquence jointe inversée est votre numéro de base 10 en base 20! Pour illustrer cela, supposons que vous souhaitiez convertir le nombre
431
de base 10 en base 20. Donc, ce que nous ferions est le suivant:Ensuite, finalement, nous prendrions la liste que nous avons, qui dans ce cas contient
B11
, et l' inverser pour que nous ayons maintenant11B
. Ce faisant, nous avons enfin obtenu notre réponse finale! 431 en base 10 converti en base 20 est11B
, ce qui peut être confirmé en utilisant mon script Python qui utilise l'algorithme de pouvoirs auquel j'ai déjà partagé un lien ci-dessus, mais je le referai ici . En voici un qui utilise également l'algorithme de division décrit dans cette réponse et renvoie la même réponse que celle des puissances.Ce processus est essentiellement ce qui se passe dans mon script dans cette
while
boucle:while not p or z:p+=[z%20];z=z//20
. La seule différence est que les chiffres ne>9
sont pas représentés comme des lettres mais plutôt comme eux-mêmes.Ensuite, après que le nombre de base 10 a été converti en base 20, pour chaque chiffre de l'entier de base 20, que nous appellerons
g
, lesg mod 5
points sont imprimés puis lesg//5
barres sont imprimées. Ensuite, le programme imprime 3 lignes vides et passe au chiffre suivant. Cependant, si le chiffre est0
, alors un seul "pain" est imprimé suivi de 3 nouvelles lignes, puis le programme passe au chiffre suivant. Donc, en prenant le nombre de base 2011B
, nous passons au premier chiffre. Le premier chiffre est1
, et donc il afficherait 0 barre depuis1//5=0
, et 1 point depuis1%5=1
. Donc, nous obtiendrions d'abord ceci:puis 3 nouvelles lignes. En passant au deuxième chiffre, nous voyons également qu'il s'agit de 1, donc il produirait la même chose:
et aussi 3 nouvelles lignes. Enfin, en passant au dernier chiffre, nous voyons que c'est un
B
. Depuis laB=11
base 20, le programme afficherait 1 point depuis11%5=1
et 2 barres depuis11//5=2
. Alors maintenant, nous obtenons ceci:Enfin, en rassemblant tout cela, nous obtenons ceci:
Et, c'est le chiffre maya pour 431! Vous avez enfin votre numéro de base 10 représenté en chiffres mayas de base 20.
Remarque: Vous pouvez ou non avoir remarqué cette
lambda
fonction dans mon code. Quoi qu'il en soit, cette fonction est utilisée pour la création des points car plusieurs points doivent être sortis côte à côte.la source
S,N,M,X=' -|\n'
place deS,N,M,X=' ','-','|','\n'
?401
contient un zéro intérieur.Python 3, 243 octets
Discussion
n//20and m(n//20)
appellem()
récursivement s'il y a des puissances supérieures à 20 à gérer. La récursivité est effectuée avant d'imprimer la valeur de position actuelle, de sorte que les puissances supérieures soient imprimées en premier.Si la valeur de position actuelle est différente de zéro (r! = 0), le
for a,b,f
-loop imprime les unités puis les cinq.a
est la première / quatrième ligne etb
est la deuxième / troisième ligne. L'astuce est dans leprint(*((a,b,b,a)*f),sep=x)
. Pour les unités, f = 1 résultantprint(*(a,b,b,a),sep=x)
, qui imprime les 4 lignes qui composent les symboles des unités (x est un '\ n'). Pour les cinq, f = le nombre de cinq à imprimer (r // 5), donc le tuple (a, b, b, a) est multiplié (c'est-à-dire répété) par le nombre de cinq à imprimer. Si f = 2, nous obtenonsprint(*(a,b,b,a,a,b,b,a),sep=x)
, qui imprime deux symboles pour cinq.Si la valeur de position actuelle est 0, le symbole zéro est imprimé.
la source
Python, 411 octets
J'ai créé cela pour générer des cas de test, vous pouvez l'utiliser comme référence. Sorta joua au golf.
la source
s=math.sqrt
et en appelant à las(s(w))
place demath.sqrt(math.sqrt(w))
w**0.25
est encore mieux ques(s(w))
. Même si c'est devenu plus long?JavaScript (ES6), 254 octets
la source
Missing } in template expression
. Je ne connais pas grand chose js, comment puis-je le réparer?Python 3, 213 octets
Entré avec une version encore plus courte en utilisant une approche différente:
explication
Les 9 premières lignes environ, construisent des chaînes qui sont utilisées pour créer les symboles
Le cœur de la solution est la fonction récursive
m
, qui construit une liste de chaînes, une chaîne pour chaque ligne dans la sortie. Schématiquement,m
ressemble à:m
peut être réécrit comme:L'appel récursif
m(n//20)
vient en premier afin que les chiffres les plus significatifs soient effectués en premier.[n%5*a,n%5*b,n%5*b,n%5*a]
sont la chaîne des symboles.a
est la ligne supérieure d'un seul symbole.n%5
est le nombre d'un symbole pour ce chiffre. Donc,n%5*a
c'est une chaîne pour la rangée supérieure (et inférieure) den%5
uns. De même, «n% 5 * b» est une chaîne pour la 2e (et 3e) ligne.L'expression
[:n%5*4]
agit comme unif
pour éviter les lignes vierges supplémentaires dans la sortie s'il n'y en a pas de «une». Ce n'est pas nécessaire, mais améliore la sortie.n%20//5
est le nombre de symboles nécessaires pour cinq.[c,d,d,c]
sont les chaînes pour faire un symbole pour cinq.[t,w,w,v+h*19+v,y,y,t]
sont les chaînes pour faire le symbole zéro[x,x]
met au moins trois lignes vides entre les groupes de chiffres mayasla source