Intro
Quelque chose avec lequel j'ai joué en mathématiques récréatives a été la construction d'une table de diviseurs pour comparer / contraster visuellement les diviseurs premiers d'un ensemble de nombres. L'ensemble des numéros d'entrée se trouve en haut sous forme d'étiquettes de colonne, les diviseurs principaux sont à gauche sous forme d'étiquettes de ligne, et une marque indique où les deux s'alignent.
Par exemple, pour l'entrée, 6, 9, 14, 22
une table similaire à la suivante serait construite:
6 9 14 22
2 * * *
3 * *
7 *
11 *
En effet, 6
a des diviseurs premiers de 2
et 3
, 9
a des diviseurs premiers de 3
, et ainsi de suite.
Construction
- Le tableau est construit de telle sorte que les numéros d'entrée forment des étiquettes de colonne séparées par des espaces et dans l'ordre croissant (vous pouvez supposer qu'ils sont pré-triés), et les diviseurs premiers sont répertoriés sur la gauche dans l'ordre croissant un par ligne formant la ligne Étiquettes.
- Notez que les espaces de tête sur les diviseurs premiers et les nombres d'entrée peuvent être requis si les nombres sont de longueurs différentes, de sorte que toutes les colonnes ont la même largeur et s'alignent de manière appropriée.
- Chaque diviseur est représenté par un seul
*
(ou un autre caractère ASCII approprié de votre choix, tant que le même caractère est utilisé pour toutes les occurrences). - Les diviseurs multiples sont ignorés (par exemple,
3 x 3 = 9
mais il n'y en a qu'un*
pour cette intersection). - Le
*
peut être placé n'importe où horizontalement dans la colonne, tant qu'il n'est pas ambigu (j'ai tous mes exemples avec le*
aligné à droite).
Contribution
- Une liste d'entiers positifs dans n'importe quel format pratique , chacun
>1
. - Vous pouvez supposer que l'entrée est pré-triée.
- L'entrée est garantie d'avoir uniquement des valeurs uniques.
Sortie
Représentation artistique ASCII résultante de la table des diviseurs premiers.
Règles
- Les sauts de ligne ou les espaces de début ou de fin sont tous facultatifs, tant que les caractères eux-mêmes s'alignent correctement.
- S'il est plus court d'avoir une ligne de séparation séparant les en-têtes de colonne / ligne des données tabulaires, cela est également autorisé.
- Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
- Si possible, veuillez inclure un lien vers un environnement de test en ligne afin que les gens puissent essayer votre code!
- Les failles standard sont interdites.
- Il s'agit de code-golf, donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
Exemples
6,9,14,22
6 9 14 22
2 * * *
3 * *
7 *
11 *
2,3,5,7
2 3 5 7
2 *
3 *
5 *
7 *
2,4,8,16,32
2 4 8 16 32
2 * * * * *
75,99,151,153
75 99 151 153
3 * * *
5 *
11 *
17 *
151 *
Réponses:
Mathematica,
10190 octetsMerci à ngenisis pour avoir économisé 11 octets!
Le
∣
caractère environ un tiers du chemin est U + 2223 (3 octets). Fonction sans nom d'un nombre variable d'arguments, dont chacun est un entier différent de zéro, qui renvoie unTableForm
objet (sortie formatée) comme suit:f=#&@@@FactorInteger[1##]
définitf
être l'ensemble de tous les nombres premiers divisant l'une des entrées (de manière équivalente, divisant leur produit1##
), tandis queg
la liste est constituée des entrées.Outer[If[#∣#2,Y,""]&,f,g]
crée un tableau deY
s et de chaînes vides correspondant à la divisibilité (nous utilisons le jeton non définiY
au lieu d'une chaîne"Y"
ou"*"
pour enregistrer deux octets). Ensuite, nous utilisonsTableForm[...,TableHeadings->{f,g}]
pour formater le tableau résultant avec des en-têtes de ligne et de colonne appropriés.Soumission précédente:
la source
""
.TableForm[Outer[If[#∣#2,Y,""]&,f=#&@@@FactorInteger[1##],g={##}],TableHeadings->{f,g}]&
si les séparateurs sont autorisésp[f,]
.TableForm
est cool, j'espère que cela restera dans ma boîte à outils!Gelée , 18 octets
Utilise
1
au lieu de*
, comme le permettent les règles.Essayez-le en ligne!
Comment ça marche
la source
Gelée ,
2523 octetsEssayez-le en ligne!
Comment?
Il peut être plus court à utiliser
ÆE
et à filtrer les lignes vides.la source
JavaScript (ES6),
264260...179173 octetsJe pense que cette approche a dépassé de façon permanente celle récursive (actuellement 178 octets):
Utilise
0
à la place de*
, ce qui est permis par le défi.Extrait de test
Afficher l'extrait de code
la source
|
opérateur dans l'instruction if, puisque vous comparez 2 booléens ...i<2
chèque à l'intérieur de la.map
fonction?...i<2?a:a.map(x=>x%i&&c)
de...a.map(x=>i<2?x:x%i&&c)
, qui est pas plus courte. Si vous voulez le déplacer dans l' autre.map
, peut-être ...Python 2 - 197 octets
Passé à Python 2 pour une gestion plus facile des entrées et permettant `` la conversion de chaînes. Utilise
gmpy2
pour générer le premier prime. Format de sortie toujours basé sur la soumission Python 3 précédente (voir ci-dessous), à savoir remplir une listeg
avec des symboles et la formater.Essayez-le en ligne!
Explication
Pour ceux qui ne veulent pas le décoder eux-mêmes.
précédent
Python 3 - 251 octets
Je suis sûr que quelqu'un peut faire mieux. Basé sur cette réponse pour générer les nombres premiers <
k
.Une version non expliquée et une explication suivront.
la source
i=list(map(int,input().split(',')))
, vous pouvez simplement le fairei=input()
et prendre une entrée dans le formulaire[1, 2, 3, 4]
.p=gmpy2.next_prime(p);t=['*'[m%p:]for m in i]
et supprimer l'espace dansif"*" in
.Mathematica, 165 octets
Plutôt verbeux - peut-être que quelqu'un peut en faire quelque chose:
la source
Bash utilitaires GNU +,
134133132125123 octetsEssayez-le en ligne!
la source
Python 2 ,
181179 octets-2 octets grâce à FlipTack
L'entrée doit être un tuple.
Essayez-le en ligne!
la source
all(i%j for j in p)
au lieu d'utilisermap
?Lot, 451 octets
Explication: Commence par calculer la largeur du champ
w
via le maximum des valeurs d'entréem
. Génère la première ligne de sortie en remplissant une chaîne vide et les nombres d'entrée à la largeurw
à l'aide du sous-programmet
. Parcourt ensuite les entiers à partir de 2, générant la ligne de sortie en remplissant l'entier puis en appelant le sous-programmec
pour remplir une chaîne vide ou un astérisque selon le cas pour chaque valeur, mais la ligne générée est ensuite ignorée si elle ne contient pas d'astérisques. Lorsque la sortie est générée, chaque valeur est divisée par l'entier jusqu'à ce qu'elle laisse un reste, de sorte que la boucle se termine lorsqu'aucune valeur n'est supérieure à 1.Notez que le
set v=
obtient exécuté après que le%v%
est substitué dans lafor
boucle sur la même ligne.la source
Python 2 ,
157148146145 145143 octetsUtilise
0
au lieu de*
, comme le permettent les règles.Essayez-le en ligne!
Contexte
Pour identifier les nombres premiers, nous utilisons un corollaire du théorème de Wilson :
Comment ça marche
La première ligne définit une fonction d'assistance.
p prend un nombre variable d'arguments qu'il stocke dans le tuple t .
Le
'%%%ds '%len(`x[-1]`)
utilise une chaîne de format pour construire une chaîne de format;%%
est un signe de pourcentage littéral,%d
est un espace réservé pour l'entier quilen(`x[-1]`)
renvoie, c'est-à-dire le nombre de chiffres du dernier élément de x (l'entrée, pas encore définie), ets
est littéral.Si, par exemple, le dernier élément de x a trois chiffres, cela donne
%3s
, qui se*len(t)
répète une fois pour chaque élément de x . Enfin,%t
applique cette chaîne de format au tuple t , construisant une chaîne d' éléments de t , séparés par des espaces et tous justifiés à droite jusqu'à une certaine longueur.La deuxième ligne définit la soumission réelle: une fonction f qui prend une liste x en entrée. Après avoir remplacé l'
exec
instruction, qui exécute la chaîne qu'elle précèdex[-1]
fois, par unefor
boucle, nous obtenons le code suivant.Tout d'abord, f initialise k et m à 1 . Notez que (k - 1)! = 0! = 1 = m .
Ensuite,
p(' ',*x)
imprime un espace et les entiers en x , en utilisant la fonction p .Maintenant, nous entrons dans la boucle pour imprimer la sortie restante.
Tout d'abord,
r=[n%k and' 'for n in x]
construit la liste des restes de chaque entier n dans x divisé par k . Les restes positifs, c'est-à-dire les restes qui ne correspondent pas à des multiples de k , sont véridiques et sont remplacés par un espace parand' '
.Ensuite, nous construisons
m%k*r
. Puisque m = (k - 1)! , par le corollaire du théorème de Wilson, ce sera simplement r si k est premier, mais une liste vide sinon. S'il y a au moins un 0 dans le résultat, c'est-à-dire si k est premier et qu'au moins un entier dans x est divisible par k ,0in m%k*r
retournera True et serap(k,*r)
appelé, en imprimant k et les indicateurs de divisibilité:0
si divisible, un espace sinon .Enfin, on multiplie m par k² et on incrémente k , donc la qualité m = (k - 1)! continue de tenir.
la source
MATL , 31 octets
Cela utilise
1
au lieu de*
, comme le permet le défi.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication ( obsolète )
la source
Raquette 176 octets
Non golfé:
Essai:
Sortie:
la source