Les Cheela (du livre Dragon's Egg de Robert L. Forward) sont des créatures qui vivent à la surface d'une étoile à neutrons. Leur corps est plat et circulaire avec douze yeux sur le périmètre, ils utilisent donc naturellement un système de numérotation en base 12.
Chez les Cheela, la garde des nouveau-nés et l'éducation des jeunes sont des tâches accomplies par les Anciens. Étant donné que les jeunes Cheela doivent apprendre à se multiplier, les Anciens pourraient utiliser une table de multiplication.
Votre tâche consiste à produire une table de multiplication 12
x 12
en base 12
, comme suit. Les lettres majuscules A
et B
sont utilisées pour les chiffres correspondant respectivement aux décimales 10
et 11
.
1 2 3 4 5 6 7 8 9 A B 10
2 4 6 8 A 10 12 14 16 18 1A 20
3 6 9 10 13 16 19 20 23 26 29 30
4 8 10 14 18 20 24 28 30 34 38 40
5 A 13 18 21 26 2B 34 39 42 47 50
6 10 16 20 26 30 36 40 46 50 56 60
7 12 19 24 2B 36 41 48 53 5A 65 70
8 14 20 28 34 40 48 54 60 68 74 80
9 16 23 30 39 46 53 60 69 76 83 90
A 18 26 34 42 50 5A 68 76 84 92 A0
B 1A 29 38 47 56 65 74 83 92 A1 B0
10 20 30 40 50 60 70 80 90 A0 B0 100
La sortie doit être imprimée à l'écran. Le format doit être le suivant:
- Les nombres doivent être alignés à droite dans chaque colonne.
- Les espaces de début avant la première colonne, les espaces de fin après la dernière colonne ou une nouvelle ligne de fin après la dernière ligne sont autorisés.
La séparation entre les colonnes peut être un espace (comme indiqué ci-dessus) ou plusieurs espaces, mais le nombre d'espaces doit être cohérent entre les colonnes. Pour mesurer la séparation des colonnes, tenez compte du fait que les nombres affichés incluent tous les espaces en tête qui ont pu être nécessaires pour satisfaire à l'exigence 1 (chaque numéro occupe donc trois caractères, le premier pouvant être des espaces). Par exemple, la table avec séparation à deux espaces serait la suivante:
1 2 3 4 5 6 7 8 9 A B 10 2 4 6 8 A 10 12 14 16 18 1A 20 3 6 9 10 13 16 19 20 23 26 29 30 4 8 10 14 18 20 24 28 30 34 38 40 5 A 13 18 21 26 2B 34 39 42 47 50 6 10 16 20 26 30 36 40 46 50 56 60 7 12 19 24 2B 36 41 48 53 5A 65 70 8 14 20 28 34 40 48 54 60 68 74 80 9 16 23 30 39 46 53 60 69 76 83 90 A 18 26 34 42 50 5A 68 76 84 92 A0 B 1A 29 38 47 56 65 74 83 92 A1 B0 10 20 30 40 50 60 70 80 90 A0 B0 100
Le stockage informatique sur une étoile à neutrons est très cher, donc votre code doit utiliser le moins d'octets possible.
Défi étendu et bonus
Idéalement, votre code devrait être réutilisé dans d'autres parties de l'univers, où d'autres systèmes de numérotation peuvent être utilisés. À cette fin, le défi est éventuellement étendu comme suit: Votre code accepte un nombre N
en entrée et génère une table de multiplication N
x N
en base N
, avec le format ci-dessus.
L'entrée peut provenir du clavier ou d'un argument de fonction. Le programme ou la fonction devrait fonctionner pour 2
≤ N
≤ 36
, en utilisant comme chiffres les premiers N
caractères de la séquence 0
, 1
, ..., 9
, A
, B
, ..., Z
(majuscules des lettres)
Ce défi étendu est facultatif. Si vous suivez cette route, prenez 20% sur votre nombre d'octets (pas besoin d'arrondir à un nombre entier).
la source
Because they have twelve eyes, they naturally use a base-12 numbering system.
Eh bien, naturellement. C'est pourquoi nous utilisons le binaire, après tout ... ;-)Réponses:
Pyth, 27 * 0,8 = 21,6
Essayez-le en ligne: Démonstration
Explication:
la source
CJam, 33 * 0,8 = 26,4 octets
Testez-le ici.
Celui-ci utilise la séparation minimale requise.
Explication
Tableau d'entrée
22
(le plus grand qui tient dans la publication sans barre de défilement horizontale):la source
MATL , 42 * .8 = 33,6
Avertissement
Étant donné que le créateur de la langue et l'auteur du défi sont les mêmes, cette réponse n'est pas éligible pour gagner .
Pour une discussion sur la nécessité ou non de cette restriction, voir cette méta-question .
Code
Cela utilise la séparation minimale.
Exemple
Table de multiplication octale
Explication
Edit: Essayez-le en ligne!
Pour exécuter dans le compilateur en ligne (à partir du 19 février 2016), passez
Y)
àX:
et supprimez[]
. Il s'agit de s'adapter aux changements qui ont été apportés à la langue depuis la publication de ce défi.la source
Utilitaires Bash + BSD, 36
Fonctionne prêt à l'emploi sur OS X.
rs
peut devoir être installé sur les systèmes Linux.Co{1..12}d{1..12}*p
pourCo1d1*p Co1d2*p Co1d3*p ... Co1d12*p ... Co12d12*p
.dc
expression qui génère les termes requis.Co
définit la base de sortie sur 12.d
est utilisé comme séparateur entre les nombres au lieu d'un espace, donc aucun échappement n'est requis dans l'expansion de l'accolade.d
duplique en fait le haut de la pile, mais ceci est effectivement ignoré et rejeté.dc
est une seule ligne séparée par des espaces.rs
remodèle cela en un tableau 12x12.-j
justifie à droite chaque terme.la source
Pyth, 36 octets
Essayez-le ici.
la source
Km+1dUJ12
parKSJ12
.S
crée la gamme[1, 2, ..., 12]
. Vous pouvez remplacer à la foisj""
etjk
pars
, depuis vos chaînes de jonction. Et un autre octet: passezrjbm...K1
àjmr...1K
. Avec ces changements, vous obtenez 28 octets:KSJ12jmrsm.[\ 4sm.Hbj*dkJK1K
Python,
153147132 octets * 0,8 = 105,6Jusqu'à 132 octets grâce aux conseils de Tim Pederick! :)
la source
rjust
('%4s'%f(...)
). Vérifiez si l'impression de chaque valeur avecprint ...,
(puis uneprint
pour la nouvelle ligne) est plus courte quejoin
. Si tel est le cas, essayez de réduire les boucles .and
Aor
B) à l'intérieur de la fonctionf
, en utilisantn>=b
. Je l'ai fait jusqu'à ce que je réalise que ce n'était pas plus court que ce que j'avais auparavant,n//b
mais vous utilisez Python 2! Vous pouvez enregistrer un octet avecn/b
.CJam,
38333238 * (.8) = 30,4 octetsEssayez-le ici.
(Il ressemble assez à celui de Martin maintenant.)
la source
Perl 6 , 60 octets -20% = 48 octets
(C'est presque exactement comme ça que je l'écrirais même si je n'essayais pas de le faire aussi court que possible)
Usage:
la source
for(
comme le début de l'appel d'un sous-programme nomméfor
au lieu de lafor
construction de la boucle de modification . Ce qui provoquerait une erreur de compilation.JavaScript (ES6) 84 (105-20%)
La façon évidente, pour commencer.
Remarques
alert
n'est pas le meilleur moyen de sortir le tableau, mais c'est le plus court, car il y a une demande explicite pour "afficher à l'écran"Moins golfé
la source
Python 3, 126 - 20% = 100,8 octets
La fonction externe,,
t
est celle qui imprime réellement la table de multiplication. La fonction interne,,i
fait la conversion d'un nombre en base de 2 à 36.Pointe du chapeau à Boomerang pour leur solution et pour une astuce de golf. J'ai évité de copier quoi que ce soit de la solution de Boomerang, mais je me suis permis d'y jeter un coup d'œil pour voir où je pourrais en couper davantage. Et même avant cela, j'ai trouvé que plus je jouais au golf, plus le mien commençait à ressembler à celui de Boomerang!
la source
print(i(15,12),i(120,12),i(144,12),i(150,12))
votre code retourne13 A0 00 06
au lieu de13 A0 100 106
. Malheureusement, la tâche nécessite d'imprimer un numéro de base n à 3 chiffres (100). Cela ne devrait pas être trop difficile à réparer, mais cela pourrait ajouter quelques octets ...n>=b
, nonn>b
.def t(b): i=lambda n:(n>=b and i(n//b)or'')+chr(n%b+[48,55][n%b>9]) R=range(b) for r in R:print(*('%3s'%i(~r*~c)for c in R))
j'aimerais le faire dans ma solution mais maintenant nos deux solutions sont assez proches, pourraient aussi bien améliorer la meilleure ^^Javascript (ES6)
96,893,6 octets (20% de 117)Explication
- sauvé 4 octets grâce à @ edc65
la source
alert(b)
sanseval
est plus court. Et au moins, évitez les variablesa
, c'est inutileb+=' '.repeat(4-a.length)+(i*j).toString(n).toUpperCase()
a
comment calculez-vous alors...repeat(4-a.length)...
?MATLAB,
111 * 0,8 = 88,8110 * 0,8 = 88 octetsMes débuts ici:
Explication:
[1:N]'*[1:N]
faire une table de multiplication en base 10dec2base([1:N]'*[1:N],N)
convertir en base 12. La sortie est un tableau de caractères avec 0-s en têtestrjoin(cellstr(dec2base(___)))
convertir en cellule et revenir en char joignant des chaînes avec un espace donnant une chaîne 1x575[' ',strjoin(___)]
ajouter de l'espace pour avoir 576 élémentsstrrep(___,' 0',' ')
supprimer un zéro non significatif. Nous le faisons deux fois parce que nous avons des chaînes avec deux zéros en têtereshape(___,4*N,N)'
convertir un tableau de caractères 1x576 en tableau de caractères 48x12disp(___)
afficher le résultat sansans =
Sortie:
Si nous ne comptons pas les instructions
N=12;
, les5*.8=4
octets sont enregistrés. De plus, si laans =
sortie est tolérée, nous pouvons supprimer l'disp()
enregistrement d'un autre6*0.8=4.8
octet. Bien sûr, il peut y avoir d'autres façons d'économiser des octets :)la source
ans
sortie est tolérée si la sortie est un argument de fonction. Mais dans ce cas, le défi dit que "la sortie doit être imprimée à l'écran", ceans
n'est donc pas autorisé. En outre,N
devrait être considéré comme une entrée dans le défi étendu. Vous pouvez résoudre cela en utilisant une fonction anonyme:,@(n)disp(reshape(strrep(strrep([' ',strjoin(cellstr(dec2base([1:N]'*[1:N],N)))],' 0',' '),' 0',' '),4*N,N)')
que vous appelleriez en utilisantans(12)
Python 3:
166161152 - 20% = 121,6 octetsJe sais que c'est inférieur aux réponses Python existantes mais j'ai pensé à lui donner un coup de feu. C'est ma première publication sur ce site…
la source
APL,
3231 × 0,8 = 24,8 octetsEn origine 0. En anglais:
∘.×⍨1+⍳⍵
: table de multiplication⍵⊥⍣¯1¨
: exprimer en base ⍵ chaque élément de la table de multiplication⊃∘(⎕D,⎕A)¨¨
: convertir la table de vecteur de nombres en une table de vecteurs de caractères¯4↑¨
: aligner à droite sur la longueur 4 chaque élément du résultatLa routine d'impression APL par défaut fait ce qu'il faut.
la source
{¯4↑¨⊃∘(⎕D,⎕A)¨¨⍵⊥⍣¯1¨∘.×⍨1+⍳⍵}
Ruby,
6966 caractères - 20% = 52,8Exemple d'exécution:
la source
ksh93, 51 * 0,8 == 40,8 octets
Cela devrait fonctionner jusqu'à la base 64 (le plus grand radix pris en charge par ksh). Exemples:
la source
Pyke, 14 octets * 0,8 = 11,2 octets, non compétitif
Essayez-le ici!
Explication:
Ou 12 octets sans le bonus
la source