Une table de multiplication pour la Cheela

26

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 12x 12en base 12, comme suit. Les lettres majuscules Aet Bsont 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:

  1. Les nombres doivent être alignés à droite dans chaque colonne.
  2. 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.
  3. 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 Nen entrée et génère une table de multiplication Nx Nen 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 2N36, en utilisant comme chiffres les premiers Ncaractè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).

Luis Mendo
la source
Bravo Luis! =) J'aurais aimé avoir le temps de trouver une solution MATLAB, mais je suis occupé à mesurer les dimensions des cadeaux de Noël ...
Stewie Griffin
6
Bonne chance avec ces chapeaux sphériques! :-P
Luis Mendo
5
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 ... ;-)
Tim Pederick
2
@TimPederick Bon point :-D Pour clarifier: le corps d'un Cheela est circulaire, ils peuvent remodeler les membres au besoin ... avoir douze yeux est numériquement la caractéristique la plus distincte de leur corps. J'ai mis à jour la question, merci!
Luis Mendo
1
@LuisMendo très beau roman, celui que vous citez. Starquake n'est pas mal non plus.
lstefano

Réponses:

14

Pyth, 27 * 0,8 = 21,6

VSQsm.[\ 4jkXj*dNQrT99rG1SQ

Essayez-le en ligne: Démonstration

Explication:

VSQsm.[\ 4jkXj*dNQrT99rG1SQ   implicit: Q = input number
VSQ                           for N in [1, 2, ..., Q]:
    m                    SQ      map each number d in [1, 2, ..., Q] to:
              *dN                   N * d
             j   Q                  in base Q
            X     rT99rG1           replace the numbers [10, 11, ..., 98] with "A...Z"
          jk                        join to a string
     .[\ 4                          prepend spaces, so that the string has a length of 4
   s                             join all strings and print
Jakube
la source
11

CJam, 33 * 0,8 = 26,4 octets

ri:C,:)_ff{*Cb{_9>{'7+}&}%4Se[}N*

Testez-le ici.

Celui-ci utilise la séparation minimale requise.

Explication

ri:C        e# Read input, convert to integer, store in C.
,:)         e# Get range [1 2 ... C].
_ff{        e# 2D-map over all repeated pairs from that range...
  *Cb       e#   Multiply, convert to base C.
  {         e#   Map over the digits...
    _9>     e#     Check if the digit is greater than 9.
    {'7+}&  e#     If so, add the digit to the character "7", to get "A" to "Z".
  }%
  4Se[      e#   Pad the digits with spaces from the left, to 4 elements.
}
N*          e# Join with linefeeds.

Tableau d'entrée 22(le plus grand qui tient dans la publication sans barre de défilement horizontale):

   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F   G   H   I   J   K   L  10
   2   4   6   8   A   C   E   G   I   K  10  12  14  16  18  1A  1C  1E  1G  1I  1K  20
   3   6   9   C   F   I   L  12  15  18  1B  1E  1H  1K  21  24  27  2A  2D  2G  2J  30
   4   8   C   G   K  12  16  1A  1E  1I  20  24  28  2C  2G  2K  32  36  3A  3E  3I  40
   5   A   F   K  13  18  1D  1I  21  26  2B  2G  2L  34  39  3E  3J  42  47  4C  4H  50
   6   C   I  12  18  1E  1K  24  2A  2G  30  36  3C  3I  42  48  4E  4K  54  5A  5G  60
   7   E   L  16  1D  1K  25  2C  2J  34  3B  3I  43  4A  4H  52  59  5G  61  68  6F  70
   8   G  12  1A  1I  24  2C  2K  36  3E  40  48  4G  52  5A  5I  64  6C  6K  76  7E  80
   9   I  15  1E  21  2A  2J  36  3F  42  4B  4K  57  5G  63  6C  6L  78  7H  84  8D  90
   A   K  18  1I  26  2G  34  3E  42  4C  50  5A  5K  68  6I  76  7G  84  8E  92  9C  A0
   B  10  1B  20  2B  30  3B  40  4B  50  5B  60  6B  70  7B  80  8B  90  9B  A0  AB  B0
   C  12  1E  24  2G  36  3I  48  4K  5A  60  6C  72  7E  84  8G  96  9I  A8  AK  BA  C0
   D  14  1H  28  2L  3C  43  4G  57  5K  6B  72  7F  86  8J  9A  A1  AE  B5  BI  C9  D0
   E  16  1K  2C  34  3I  4A  52  5G  68  70  7E  86  8K  9C  A4  AI  BA  C2  CG  D8  E0
   F  18  21  2G  39  42  4H  5A  63  6I  7B  84  8J  9C  A5  AK  BD  C6  CL  DE  E7  F0
   G  1A  24  2K  3E  48  52  5I  6C  76  80  8G  9A  A4  AK  BE  C8  D2  DI  EC  F6  G0
   H  1C  27  32  3J  4E  59  64  6L  7G  8B  96  A1  AI  BD  C8  D3  DK  EF  FA  G5  H0
   I  1E  2A  36  42  4K  5G  6C  78  84  90  9I  AE  BA  C6  D2  DK  EG  FC  G8  H4  I0
   J  1G  2D  3A  47  54  61  6K  7H  8E  9B  A8  B5  C2  CL  DI  EF  FC  G9  H6  I3  J0
   K  1I  2G  3E  4C  5A  68  76  84  92  A0  AK  BI  CG  DE  EC  FA  G8  H6  I4  J2  K0
   L  1K  2J  3I  4H  5G  6F  7E  8D  9C  AB  BA  C9  D8  E7  F6  G5  H4  I3  J2  K1  L0
  10  20  30  40  50  60  70  80  90  A0  B0  C0  D0  E0  F0  G0  H0  I0  J0  K0  L0 100
Martin Ender
la source
8

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

iXK:t!*Y)KYAZ{'(?<=^0*)0'32cYXZc32hK4*[]e!

Cela utilise la séparation minimale.

Exemple

Table de multiplication octale

>> matl
 > iXK:t!*Y)KYAZ{'(?<=^0*)0'32cYXZc32chK4*[]e!
 > 
> 8
  1   2   3   4   5   6   7  10 
  2   4   6  10  12  14  16  20 
  3   6  11  14  17  22  25  30 
  4  10  14  20  24  30  34  40 
  5  12  17  24  31  36  43  50 
  6  14  22  30  36  44  52  60 
  7  16  25  34  43  52  61  70 
 10  20  30  40  50  60  70 100 

Explication

i              % input number, say n
XK             % copy to clipboard K
:              % vector 1, 2, ... n
t!*            % generate table: duplicate, transpose and multiply with broadcasting
Y)             % linearize into column array
KYA            % paste n from clipboard K. Convert to that base
Z{             % cell array of rows from array
'(?<=^0*)0'    % string literal for regexp replacement: find leading zeros
32c            % space character (for regexp replacement)
YX             % regexp replacement
Zc             % join cell array of strings into single string   
32             % code for space character. Conversion to char happens automatically
h              % concatenate horizontally
K4*[]e!        % paste n and multiply by 4. Reshape into 2D char array with 4*n columns

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.

Luis Mendo
la source
"Puisque 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." Je n'étais pas au courant de cette restriction. Est-ce auto-imposé ou avez-vous trouvé un méta-consensus pertinent?
Alex A.
1
@AlexA. Je l'ai moi-même imposé. Je soupçonnais qu'il y avait probablement une sorte d'accord à ce sujet. De votre commnent je vois qu'il n'y en a pas? Mon point est le suivant: si vous concevez une langue puis publiez un défi, vous êtes probablement dans une position avantageuse. Que fait-on habituellement à ce sujet? Pas de restriction?
Luis Mendo
Je pense que vous n'êtes pas nécessairement avantagé tant que vous ne planifiez pas un défi spécifiquement comme cas d'utilisation pour un intégré dans votre langue. Je ne connais pas un tel consensus au départ, donc je recommande de demander des méta.
Alex A.
@AlexA. Bonne idée! Fait
Luis Mendo,
@AlexA. Si vous avez envie de le faire, ajoutez peut-être votre suggestion comme réponse?
Luis Mendo
5

Utilitaires Bash + BSD, 36

echo Co{1..12}d{1..12}*p|dc|rs -j 12

Fonctionne prêt à l'emploi sur OS X. rspeut devoir être installé sur les systèmes Linux.

  • Bash se développe Co{1..12}d{1..12}*ppour Co1d1*p Co1d2*p Co1d3*p ... Co1d12*p ... Co12d12*p.
  • Il s'agit d'une dcexpression qui génère les termes requis. Codéfinit la base de sortie sur 12. dest utilisé comme séparateur entre les nombres au lieu d'un espace, donc aucun échappement n'est requis dans l'expansion de l'accolade. dduplique en fait le haut de la pile, mais ceci est effectivement ignoré et rejeté.
  • La sortie de dcest une seule ligne séparée par des espaces. rsremodèle cela en un tableau 12x12. -jjustifie à droite chaque terme.
Traumatisme numérique
la source
4

Pyth, 36 octets

Km+1dUJ12rjbmjkm.[\ 4j""m.Hbj*dkJKK1

Essayez-le ici.

Bleu
la source
Vous pouvez remplacer Km+1dUJ12par KSJ12. Scrée la gamme [1, 2, ..., 12]. Vous pouvez remplacer à la fois j""et jkpar s, depuis vos chaînes de jonction. Et un autre octet: passez rjbm...K1à jmr...1K. Avec ces changements, vous obtenez 28 octets:KSJ12jmrsm.[\ 4sm.Hbj*dkJK1K
Jakube
4

Python, 153 147 132 octets * 0,8 = 105,6

def p(b):
 f=lambda n:(n>=b and f(n/b)or'')+chr((48,55)[n%b>9]+n%b)
 for i in range(b*b):print'%4s\n'[:3+(~i%b<1)]%f(~(i%b)*~(i/b)),

Jusqu'à 132 octets grâce aux conseils de Tim Pederick! :)

basile-henry
la source
Voté, car plus je réponds à ma réponse , plus elle commence à ressembler à la vôtre!
Tim Pederick
Quelques améliorations possibles: utilisez le formatage% au lieu de rjust( '%4s'%f(...)). Vérifiez si l'impression de chaque valeur avec print ...,(puis une printpour la nouvelle ligne) est plus courte que join. Si tel est le cas, essayez de réduire les boucles .
Tim Pederick
Merci Tim, j'ai essayé de réduire les boucles (je ne connaissais pas cette astuce). Je ne suis pas sûr que cela me fasse gagner de nombreux octets, le cas échéant, mais c'est plutôt cool :)
basile-henry
Je vois que vous êtes passé à une forme ternaire (condition andA orB) à l'intérieur de la fonction f, en utilisant n>=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//bmais vous utilisez Python 2! Vous pouvez enregistrer un octet avec n/b.
Tim Pederick
Oui, c'est la raison pour laquelle j'ai utilisé cette partie de votre code exploitant python 2 pour enregistrer un octet de plus :)
basile-henry
4

CJam, 38 33 32 38 * (.8) = 30,4 octets

qi:D,:):L{Lf*{Db{_9>{55+c}&}%4Se[}%N}%

Essayez-le ici.

(Il ressemble assez à celui de Martin maintenant.)

qi:D,:):L          e# Generate list of [1...input]
{Lf*               e# Take each number in that list and multiply it by the same list ([[1,2,3,..,input][2,4,6,...,input],...})
{Db{_9>{55+c}&}%   e# Convert each product to base input. If a digit value is >= 10 add 55 and convert to char, to make it a letter.
4Se[}%N}%          e# Pad each number with spaces to length 4. Put a newline after each row.
geokavel
la source
3

Perl 6 , 60 octets -20% = 48 octets

{.put for (1..$_ X*1..$_)».base($_)».fmt('%3s').rotor($_)} # 60-20% = 48
#          ^-----------^ produce a list of two cross multiplied lists
#                        ^--------^ convert each to base N
#          format each to 3 spaces ^----------^
#         split the list into N element chunks ^--------^
#^-------^ print each of those on their own line with spaces between elements

(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:

{...}(2)
  1  10
 10 100
my &code = {...}
code 2;
  1  10
 10 100
{...}(12);
  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
{...}(18);
  1   2   3   4   5   6   7   8   9   A   B   C   D   E   F   G   H  10
  2   4   6   8   A   C   E   G  10  12  14  16  18  1A  1C  1E  1G  20
  3   6   9   C   F  10  13  16  19  1C  1F  20  23  26  29  2C  2F  30
  4   8   C   G  12  16  1A  1E  20  24  28  2C  2G  32  36  3A  3E  40
  5   A   F  12  17  1C  1H  24  29  2E  31  36  3B  3G  43  48  4D  50
  6   C  10  16  1C  20  26  2C  30  36  3C  40  46  4C  50  56  5C  60
  7   E  13  1A  1H  26  2D  32  39  3G  45  4C  51  58  5F  64  6B  70
  8   G  16  1E  24  2C  32  3A  40  48  4G  56  5E  64  6C  72  7A  80
  9  10  19  20  29  30  39  40  49  50  59  60  69  70  79  80  89  90
  A  12  1C  24  2E  36  3G  48  50  5A  62  6C  74  7E  86  8G  98  A0
  B  14  1F  28  31  3C  45  4G  59  62  6D  76  7H  8A  93  9E  A7  B0
  C  16  20  2C  36  40  4C  56  60  6C  76  80  8C  96  A0  AC  B6  C0
  D  18  23  2G  3B  46  51  5E  69  74  7H  8C  97  A2  AF  BA  C5  D0
  E  1A  26  32  3G  4C  58  64  70  7E  8A  96  A2  AG  BC  C8  D4  E0
  F  1C  29  36  43  50  5F  6C  79  86  93  A0  AF  BC  C9  D6  E3  F0
  G  1E  2C  3A  48  56  64  72  80  8G  9E  AC  BA  C8  D6  E4  F2  G0
  H  1G  2F  3E  4D  5C  6B  7A  89  98  A7  B6  C5  D4  E3  F2  G1  H0
 10  20  30  40  50  60  70  80  90  A0  B0  C0  D0  E0  F0  G0  H0 100
Brad Gilbert b2gills
la source
Pas un expert, mais l'espace entre 'pour' et '(' est-il nécessaire? Il faut
couper
@J_F_B_M J'essaie toujours de supprimer les espaces en premier. Donc, s'il y a un espace, il est nécessaire. Si je supprimais l'espace, il ne serait certainement pas compilé car il traiterait for(comme le début de l'appel d'un sous-programme nommé forau lieu de la forconstruction de la boucle de modification . Ce qui provoquerait une erreur de compilation.
Brad Gilbert b2gills
J'ai appris quelque chose. Merci.
J_F_B_M
3

JavaScript (ES6) 84 (105-20%)

La façon évidente, pour commencer.

n=>{for(o=i=``;i++<n;o+=`
`)for(j=0;j++<n;)o+=(`   `+(i*j).toString(n)).slice(-4).toUpperCase();alert(o)}

Remarques

  • Dommage que js toString produise des lettres minuscules
  • 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"
  • Le simple retour de la valeur serait de quelques octets plus court.

Moins golfé

n=>{
  for(o='', i=0; i++<n; o+='\n')
    for(j=0;j++<n;)
       o+=('   '+(i*j).toString(n)).slice(-4).toUpperCase()
  alert(o)
}
edc65
la source
3

Python 3, 126 - 20% = 100,8 octets

La fonction externe,, test celle qui imprime réellement la table de multiplication. La fonction interne,, ifait la conversion d'un nombre en base de 2 à 36.

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))

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!

Tim Pederick
la source
Bonne solution! :) Et vous obtenez un meilleur score que moi! J'aime le> 9 au lieu de mon <10. Je ne suis pas trop familier avec python3 et les expressions étoilées (j'ai dû chercher ça). J'adore ton ~ truc, je dois commencer à l'utiliser!
basile-henry
J'ai testé un peu votre solution et il semble que je ne retourne pas plus de deux chiffres de base n. Par exemple, si vous faites print(i(15,12),i(120,12),i(144,12),i(150,12))votre code retourne 13 A0 00 06au lieu de 13 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 ...
basile-henry
@Boomerang: <rayures head> Je pense que je dois avez cassé quelque chose, alors ... parce qu'il a travaillé avant! Le problème semble être qu'il ne donnera pas un 1 de premier plan ... oh, attendez, je sais quel est le problème. Ça devrait l'être n>=b, non n>b.
Tim Pederick
J'ai trouvé une autre astuce pour rendre le code plus petit: définissez i dans t (b) afin que vous puissiez supprimer le deuxième argument dans i! Comme ceci: 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 ^^
basile-henry
@Boomerang: Hé, le vôtre était le premier, et je pense que Python 2 offre suffisamment de raccourcis pour que vous puissiez toujours me dépasser. Mais merci pour l'aide!
Tim Pederick
3

Javascript (ES6) 96,8 93,6 octets (20% de 117)

n=>{b='';for(i=0;i++<n;b+=`\n`)for(j=0;j++<n;)a=(i*j).toString(n).toUpperCase(),b+=' '.repeat(4-a.length)+a;alert(b)}

Explication

n=>
    {                                     
      b='';                                    //clear table var at each run
      for(i=0;i++<n;b+=`\n`)                   //iterate through rows
        for(j=0;j++<n;)                        //iterate through cols
          a=(i*j).toString(n).toUpperCase(),   //get desired number
          b+=' '.repeat(4-a.length)+a";        //pad to right
    alert(b)                                   //display result
}

- sauvé 4 octets grâce à @ edc65

Aᴄʜᴇʀᴏɴғᴀɪʟ
la source
1
Il suffit d'utiliser {} et alert(b)sans evalest plus court. Et au moins, évitez les variables a, c'est inutileb+=' '.repeat(4-a.length)+(i*j).toString(n).toUpperCase()
edc65
Merci, je n'ai pas vu la nécessité de l'afficher, donc pour moi, eval () était à l'origine plus court que de renvoyer la valeur. @ edc65 cependant, si j'évite acomment calculez-vous alors ...repeat(4-a.length)...?
2015
Ugh désolé que vous ayez raison. +1 tel
quel
2

MATLAB, 111 * 0,8 = 88,8 110 * 0,8 = 88 octets

Mes débuts ici:

@(N)disp(reshape(strrep(strrep([' ',strjoin(cellstr(dec2base([1:N]'*[1:N],N)))],' 0','  '),' 0','  '),4*N,N)')

Explication:

[1:N]'*[1:N] faire une table de multiplication en base 10

dec2base([1:N]'*[1:N],N) convertir en base 12. La sortie est un tableau de caractères avec 0-s en tête

strjoin(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éments

strrep(___,' 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ête

reshape(___,4*N,N)' convertir un tableau de caractères 1x576 en tableau de caractères 48x12

disp(___) afficher le résultat sans ans =

Sortie:

 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 

Si nous ne comptons pas les instructions N=12;, les 5*.8=4octets sont enregistrés. De plus, si la ans =sortie est tolérée, nous pouvons supprimer l' disp()enregistrement d'un autre 6*0.8=4.8octet. Bien sûr, il peut y avoir d'autres façons d'économiser des octets :)

brainkz
la source
En général, la anssortie 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", ce ansn'est donc pas autorisé. En outre, Ndevrait ê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)
Luis Mendo
1
Oh et bienvenue sur le site! :-)
Luis Mendo
@LuisMendo merci! Je vais modifier ma réponse avec la notation @ (N)
brainkz
2

Python 3: 166 161 152 - 20% = 121,6 octets

Je 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…

def t(b):
 r=range(1,b+1);f=lambda x:x and f(x//b)+chr((55,48)[x%b>9]+x%b)or''
 print('\n'.join(''.join(B)for B in(('%4s'%f(i*j)for j in r)for i in r)))
Teemu Piippo
la source
Il y a 3 parenthèses fermantes et 2 littéraux numériques suivis d'espaces. Ces espaces sont inutiles. Sinon, bon premier essai. BTW, Tips for golfing in Python est une bonne lecture.
manatwork
Bienvenue sur PPCG.SE, même s'il ne bat pas les autres réponses Python, tant qu'il est différent (pas le même algorithme / idée), vous pouvez le poster :).
Katenkyo
@manatwork Merci! J'ai encore 9 octets avec ça.
Teemu Piippo
2

APL, 32 31 × 0,8 = 24,8 octets

{¯4↑¨⊃∘(⎕D,⎕A)¨¨⍵⊥⍣¯1¨∘.×⍨1+⍳⍵}

En 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ésultat

La routine d'impression APL par défaut fait ce qu'il faut.

      {¯4↑¨(⍵⊥⍣¯1¨∘.×⍨1+⍳⍵)⊃¨¨⊂⊂⎕D,⎕A}13
    1     2     3     4     5     6     7     8     9     A     B     C    10 
    2     4     6     8     A     C    11    13    15    17    19    1B    20 
    3     6     9     C    12    15    18    1B    21    24    27    2A    30 
    4     8     C    13    17    1B    22    26    2A    31    35    39    40 
    5     A    12    17    1C    24    29    31    36    3B    43    48    50 
    6     C    15    1B    24    2A    33    39    42    48    51    57    60 
    7    11    18    22    29    33    3A    44    4B    55    5C    66    70 
    8    13    1B    26    31    39    44    4C    57    62    6A    75    80 
    9    15    21    2A    36    42    4B    57    63    6C    78    84    90 
    A    17    24    31    3B    48    55    62    6C    79    86    93    A0 
    B    19    27    35    43    51    5C    6A    78    86    94    A2    B0 
    C    1B    2A    39    48    57    66    75    84    93    A2    B1    C0 
   10    20    30    40    50    60    70    80    90    A0    B0    C0   100 
lstefano
la source
–1:{¯4↑¨⊃∘(⎕D,⎕A)¨¨⍵⊥⍣¯1¨∘.×⍨1+⍳⍵}
Adám
Au lieu de "caractères", vous devez utiliser des "octets" avec un lien vers meta.codegolf.stackexchange.com/a/9429/43319 .
Adám
1

Ruby, 69 66 caractères - 20% = 52,8

->n{(r=1..n).map{|a|puts r.map{|b|"%4s"%(a*b).to_s(n).upcase}*''}}

Exemple d'exécution:

2.1.5 :001 > ->n{(r=1..n).map{|a|puts r.map{|b|"%4s"%(a*b).to_s(n).upcase}*''}}[4]
   1   2   3  10
   2  10  12  20
   3  12  21  30
  10  20  30 100
homme au travail
la source
1

ksh93, 51 * 0,8 == 40,8 octets

eval echo "'
' {"{1..$1}'..$((++n*$1))..$n%3..$1d}'

Cela devrait fonctionner jusqu'à la base 64 (le plus grand radix pris en charge par ksh). Exemples:

 $ n= ksh -s 12 <<\EOF
eval echo "'
' {"{1..$1}'..$((++n*$1))..$n%3..$1d}'
EOF


   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

 $ n= ksh -s 22 <<\EOF
eval echo "'
' {"{1..$1}'..$((++n*$1))..$n%3..$1d}'
EOF


   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f   g   h   i   j   k   l  10
   2   4   6   8   a   c   e   g   i   k  10  12  14  16  18  1a  1c  1e  1g  1i  1k  20
   3   6   9   c   f   i   l  12  15  18  1b  1e  1h  1k  21  24  27  2a  2d  2g  2j  30
   4   8   c   g   k  12  16  1a  1e  1i  20  24  28  2c  2g  2k  32  36  3a  3e  3i  40
   5   a   f   k  13  18  1d  1i  21  26  2b  2g  2l  34  39  3e  3j  42  47  4c  4h  50
   6   c   i  12  18  1e  1k  24  2a  2g  30  36  3c  3i  42  48  4e  4k  54  5a  5g  60
   7   e   l  16  1d  1k  25  2c  2j  34  3b  3i  43  4a  4h  52  59  5g  61  68  6f  70
   8   g  12  1a  1i  24  2c  2k  36  3e  40  48  4g  52  5a  5i  64  6c  6k  76  7e  80
   9   i  15  1e  21  2a  2j  36  3f  42  4b  4k  57  5g  63  6c  6l  78  7h  84  8d  90
   a   k  18  1i  26  2g  34  3e  42  4c  50  5a  5k  68  6i  76  7g  84  8e  92  9c  a0
   b  10  1b  20  2b  30  3b  40  4b  50  5b  60  6b  70  7b  80  8b  90  9b  a0  ab  b0
   c  12  1e  24  2g  36  3i  48  4k  5a  60  6c  72  7e  84  8g  96  9i  a8  ak  ba  c0
   d  14  1h  28  2l  3c  43  4g  57  5k  6b  72  7f  86  8j  9a  a1  ae  b5  bi  c9  d0
   e  16  1k  2c  34  3i  4a  52  5g  68  70  7e  86  8k  9c  a4  ai  ba  c2  cg  d8  e0
   f  18  21  2g  39  42  4h  5a  63  6i  7b  84  8j  9c  a5  ak  bd  c6  cl  de  e7  f0
   g  1a  24  2k  3e  48  52  5i  6c  76  80  8g  9a  a4  ak  be  c8  d2  di  ec  f6  g0
   h  1c  27  32  3j  4e  59  64  6l  7g  8b  96  a1  ai  bd  c8  d3  dk  ef  fa  g5  h0
   i  1e  2a  36  42  4k  5g  6c  78  84  90  9i  ae  ba  c6  d2  dk  eg  fc  g8  h4  i0
   j  1g  2d  3a  47  54  61  6k  7h  8e  9b  a8  b5  c2  cl  di  ef  fc  g9  h6  i3  j0
   k  1i  2g  3e  4c  5a  68  76  84  92  a0  ak  bi  cg  de  ec  fa  g8  h6  i4  j2  k0
   l  1k  2j  3i  4h  5g  6f  7e  8d  9c  ab  ba  c9  d8  e7  f6  g5  h4  i3  j2  k1  l0
  10  20  30  40  50  60  70  80  90  a0  b0  c0  d0  e0  f0  g0  h0  i0  j0  k0  l0 100
ormaaj
la source
0

Pyke, 14 octets * 0,8 = 11,2 octets, non compétitif

QhD]UA*MbQMl2P

Essayez-le ici!

Explication:

            - autoassign Q = eval_or_not_input()
QhD]        - [Q+1, Q+1]
    U       - nd_range(^)
     A*     - apply(*, ^)
       MbQ  - map(base(Q), ^)
          Ml2 - map(lower, ^)
          P - print_grid(^)

Ou 12 octets sans le bonus

13D]UA*Mb12P
Bleu
la source
Le défi spécifie des lettres majuscules
Luis Mendo