Un défi assez simple aujourd'hui:
Écrivez un programme ou une fonction qui accepte un entier positif N et imprime ou retourne une liste triée des nombres uniques qui apparaissent dans la table de multiplication dont les multiplicands de ligne et de colonne vont tous deux de 1 à N inclus.
La liste peut être triée par ordre croissant (du plus petit au plus grand) ou par ordre décroissant (du plus grand au plus petit), et peut être sortie dans n'importe quel format raisonnable.
Le code le plus court en octets gagne!
Exemple
Lorsque N = 4, la table de multiplication ressemble à:
1 2 3 4
-----------
1| 1 2 3 4
|
2| 2 4 6 8
|
3| 3 6 9 12
|
4| 4 8 12 16
Les numéros uniques dans le tableau sont 1, 2, 3, 4, 6, 8, 9, 12, 16
. Ceux-ci sont déjà triés, donc
1, 2, 3, 4, 6, 8, 9, 12, 16
pourrait être votre sortie exacte pour N = 4. Mais puisque le tri peut être inversé et qu'il y a une certaine marge de manœuvre dans le formatage, ces sorties seraient également valides:
[16,12,9,8,6,4,3,2,1]
1
2
3
4
6
8
9
12
16
16 12 9 8 4 3 2 1
Cas de test
N=1 -> [1]
N=2 -> [1, 2, 4]
N=3 -> [1, 2, 3, 4, 6, 9]
N=4 -> [1, 2, 3, 4, 6, 8, 9, 12, 16]
N=5 -> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 20, 25]
N=6 -> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 30, 36]
N=7 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 28, 30, 35, 36, 42, 49]
N=8 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 28, 30, 32, 35, 36, 40, 42, 48, 49, 56, 64]
N=9 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 54, 56, 63, 64, 72, 81]
N=10 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 50, 54, 56, 60, 63, 64, 70, 72, 80, 81, 90, 100]
N=11 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 36, 40, 42, 44, 45, 48, 49, 50, 54, 55, 56, 60, 63, 64, 66, 70, 72, 77, 80, 81, 88, 90, 99, 100, 110, 121]
N=12 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 36, 40, 42, 44, 45, 48, 49, 50, 54, 55, 56, 60, 63, 64, 66, 70, 72, 77, 80, 81, 84, 88, 90, 96, 99, 100, 108, 110, 120, 121, 132, 144]
la source
Réponses:
Pyth, 8 octets
Essayez-le en ligne.
Explication:
SQ
prend l'entrée de liste évaluée (Q
) et crée une liste[1, 2, ..., Q]
.^SQ2
prend le produit cartésien de cette liste avec lui-même - toutes les combinaisons de produits possibles.*M
multiplie toutes ces paires pour former tous les résultats possibles dans la table de multiplication, laS{
rend unique et la trie.la source
M
. +1Python 2,
6151 octetsMerci à xnor d'avoir raccourci une syntaxe.
la source
set(...)
peut simplement être un ensemble comp{...}
. De plus, les fonctions sont autorisées par défaut ici, vous pouvez donc simplement écrirelambda n:...
.f=lambda n:n*[0]and sorted(set(range(n,n*n+n,n)+f(n-1)))
.APL,
1816 octetsIl s'agit d'une fonction monadique sans nom. La sortie est en ordre croissant.
Explication:
Correction d'un problème et sauvegarde de 2 octets grâce à Thomas Kwa!
la source
CJam,
1412 octetsDernière version avec améliorations proposées par @aditsu:
Il s'agit d'une fonction anonyme. Essayez-le en ligne , avec le code d'entrée / sortie nécessaire pour le tester.
@Martin a proposé une autre solution très élégante (
{,:)_ff*:|$}
) de même longueur. J'ai utilisé celui d'Aditsu parce qu'il était beaucoup plus similaire à ma solution d'origine.La principale différence avec ma solution d'origine est qu'elle conserve la
0
valeur dans la séquence d'origine, ce qui économise 2 octets au début. Vous penseriez que cela n'aiderait pas, car vous devez supprimer la0
valeur du résultat. Mais le cœur de l'idée de @ aditsu est0^
la fin, ce qui est une différence fixe avec0
. Cela supprime le0
, et en même temps, puisqu'il s'agit d'une opération d'ensemble, élimine les éléments en double de l'ensemble de solutions. Étant donné que j'avais déjà besoin de 2 octets pour éliminer les doublons auparavant, la suppression du0
est alors essentiellement gratuite.Explication:
la source
{2m*::)::*_&$}
,{)2m*::*_&$0-}
{,:)_ff*:|$}
{)2m*::*0^$}
Octave, 22 octets
la source
Julia, 24 octets
Il s'agit d'une fonction anonyme qui accepte un entier et renvoie un tableau d'entiers.
Non golfé:
la source
MATLAB, 24 octets
la source
zsh,
8656 octetsmerci à @Dennis pour avoir économisé 30 (!) octets
Explication / non golfé:
Cela ne fonctionne pas dans Bash parce que Bash ne se développe pas
{1..$1}
- il l'interprète juste littéralement (donc,a=5; echo {1..$a}
sort{1..5}
au lieu de1 2 3 4 5
).la source
Rubis,
5048 octetsNon golfé:
Utilisation de la boucle imbriquée pour multiplier chaque nombre par un autre nombre jusqu'à n, puis tri du tableau.
50 octets
Usage:
la source
R, 39 octets
Cela lit un entier depuis STDIN et écrit une liste délimitée par des espaces dans STDOUT.
Nous créons la table de multiplication sous forme de matrice à l'aide
outer
, aplatissons implicitement dans un vecteur et trions à l'aidesort
, sélectionnons des éléments uniques à l'aideunique
et imprimons l'espace délimité à l'aidecat
.la source
Mathematica, 25 octets
la source
K, 17 octets
Pas grand chose à dire ici. Trier (
t@<t:
) les éléments uniques (?
) de l',/
autoproduit cartésien multiplié aplati (t*\:t:
) de 1 à N (1+!
) inclus .En action:
la source
Haskell,
5554 octetsExemple d'utilisation:
f 4
->[1,2,3,4,6,8,9,12,16]
.nub
supprime les éléments en double d'une liste.Edit: @Zgarb a trouvé un superflu
$
.la source
J,
2120 octetsMerci à @Zgarb pour -1 octet!
Ma première réponse J! Les conseils de golf sont appréciés s'il y a quelque chose à jouer au golf.
Il s'agit d'une fonction monadique; nous prenons le produit extérieur par multiplication de la liste
1..input
avec lui-même, aplatissons, prenons des éléments uniques et trions.la source
Kotlin, 70 octets
Version non golfée:
Testez-le avec:
la source
Shell + utilitaires communs, 41
Ou bien:
Bash + coreutils, 48
Construit une expansion d'accolade à l'intérieur d'une expansion arithmétique:
\$[{1..n}*{1..n}]
se développe aux extensions arithmétiques$[1*1] $[1*2] ... $[1*n] ... $[n*n]
qui sont évaluées et transmises àprintf
, qui en imprime une par ligne, qui est dirigée verssort
.Utilisez soigneusement les devis, les évasions et
eval
assurez-vous que les extensions se produisent dans l'ordre requis.Ou bien:
Pure Bash, 60
la source
Pyth, 10
Essayez-le en ligne ou exécutez une suite de tests
la source
Minkolang 0,14 ,
252218 octetsJe me suis souvenu que j'avais implémenté très commodément des produits cartésiens avant que cette question ne soit publiée !
Essayez-le ici.(Sorties dans l'ordre inverse.)
Explication
la source
JavaScript (ES6),
9290 octetsExplication
Tester
la source
Perl 6 , 27 octets
Exemple d'utilisation:
la source
Haskell, 51 octets
Plutôt ennuyeux. Filtre simplement la liste
[1..n*n]
des éléments du formulairea*b
aveca
etb
dans[1..n]
. L'utilisationfilter
donne la même longueurJ'ai essayé pendant un certain temps de générer la liste des produits avec quelque chose de plus intelligent comme
concatMap
oumapM
, mais je n'ai obtenu que des résultats plus longs. Une vérification plus sophistiquée de l'adhésion est arrivée à 52 octets, 1 octet de plus, mais peut peut-être être raccourcie.la source
(*)<$>..<*>..
comme ceciJAVA - 86 octets
Non golfé
la source
Pyth, 11 octets
Ceci est similaire à la réponse de Julia. Merci à @Maltysen
la source
PHP,
74,7370 octetsNon golfé:
Précédent:
while(($j=$i++)<$n)for(;$j++<$n;)$a[]=$i*$j;$a=array_unique($a);sort($a);
Pas sûr à 100% de ce qu'il faut faire avec la sortie, mais
$a
contient un tableau avec les numéros correspondants.$n
est le nombre via$_GET['n']
, avecregister_globals=1
la source
TeaScript ,
3735 caractères; 40 octetsSauvegardé 2 octets grâce à @Downgoat
TeaScript est JavaScript pour le golf.
Essayez-le en ligne!
Non golfé et explication
la source
r
au lieu deA.r
pour générer des plagesC, 96 octets
Ceci imprime les nombres dans l'ordre décroissant. Les suggestions sont les bienvenues car cela semble loin d'être optimal.
la source
JavaScript (ES6), 86 octets
Vous cherchez à le raccourcir (essayez peut-être d'essayer des boucles d'imbrication).
la source
Perl 5, 91 octets
à exécuter en passant l'argument sur la ligne de commande. Il y a quelques déclarations à court d'exécution avec des restrictions et des avertissements.
la source
Python,
124102 octetsPlus pythonique!
la source
l.append(i*j)
sur la même ligne que si conditionnel. Je pense que cela finit par être de 102 octets au total.+=
plutôtappend
.list(set(l))
le tri n'est pas garanti.Perl 5, 67 octets
la source