Un arbre diviseur esthétiquement plaisant est une arborescence de diviseurs d’entrée n
qui, pour tout nombre composé m
, a deux nœuds enfants qui sont la paire de diviseurs la plus proche de la racine carrée de m
. Le noeud de gauche doit être le plus petit diviseur de m
et le noeud de droite doit être le plus grand diviseur de m
. Un nombre premier dans l'arborescence ne doit pas avoir de nœud enfant. Votre arbre peut être sous la forme d'un texte ou d'une image. Les règles pour la sortie de texte d'art sont les suivantes.
Règles d'espacement
Pour espacer les nœuds de l’arbre, nous appliquons les règles suivantes:
- Les nœuds situés à une profondeur donnée à partir de la racine doivent tous se trouver sur la même ligne de texte dans la sortie.
/ \ NE PAS / \ / \ / 3 2 3 2
- Pour les nœuds de gauche, la branche entrante doit se trouver en haut à droite si le nœud est un nombre à un chiffre, sinon juste au-dessus du dernier chiffre. Exemple:
/ ET / 3 720
- Pour les nœuds de droite, la branche entrante doit être en haut à gauche si le nœud est un nombre à un chiffre, sinon juste au-dessus du premier chiffre. Exemple:
\ ET \ 7 243
- Pour les branches gauche sortantes, la branche doit commencer par un espace à gauche du nombre. Exemple:
275 / 11
- Pour les branches droites sortantes, la branche doit commencer par un espace à droite du nombre. Exemple:
275 \ 25
- Deux nœuds situés au même niveau de l’arbre doivent être séparés par au moins deux espaces. Dans le même temps, deux sous-arbres situés au même niveau de l’arborescence doivent être espacés le moins possible.
Cet arbre ne fonctionne pas car les ** sous-arbres ** sont trop proches. 504 / \ / \ / \ / \ 21 24 / \. / \ / \. / \ 3 7. 4 6 . / \ / \ .2 2 2 3 Bien que cet arbre ait suffisamment d’espace entre ses branches. 504 / \ / \ / \ / \ / \ 21 ... 24 / \ ... / \ / \ ... / \ 3 7 ... 4 6 ... / \ / \ ... 2 2 2 3
- Si deux sous-arbres sont trop proches l'un de l'autre dans un arbre, vous pouvez les séparer en ajoutant une autre rangée de branches
/\
à l'arbre au-dessus des parents.
441 / \ La dernière ligne n’est pas encore renseignée et nous sommes déjà à court d’espace. 21 21 / \ / \ Ajouter une autre rangée de branches 441 / \ Presque, mais le 7 et le 3 sont trop rapprochés. / \ Une autre ligne devrait le faire. 21 21 / \ / \ 3 7 3 7 Ajouter une autre rangée de branches 441 / \ Et nous avons fini. / \ / \ 21 21 / \ / \ 3 7 3 7
Exemples
Par exemple, l’arbre diviseur de 24 ressemblera à ceci:
24
/ \
/ \
4 6
/ \ / \
2 2 2 3
4 et 6 sont la paire de diviseurs la plus proche de la racine carrée de 24. 4 est à gauche, car elle est plus petite. Sur la ligne suivante, le nombre 2 à gauche de 3, car il est plus petit.
L'arbre diviseur pour 63 devrait ressembler à:
63 and NOT like this 63
/ \ / \
7 9 3 21
/ \ / \
3 3 7 3
Dans l'arborescence incorrecte, 3 et 21 ne sont pas la paire de diviseurs la plus proche de la racine carrée de 63, et 3 et 7 ne sont pas triés correctement. Le placement de la branche sur le 21 est correct, cependant.
Pour 42, vous devriez avoir:
42 and NOT 42
/ \ / \
6 7 21 2
/ \ / \
2 3 3 7
Jetons un coup d'œil à 720. Notez qu'il nous faut cinq niveaux de branches 720
pour que les sous-arbres 24
et 30
soient correctement espacés. En outre, notez que 24
et 30
ont deux niveaux de branches parce que 4
et 6
ont des nœuds enfants qui nécessitent un espacement correct et que les nœuds enfants de 30
doivent être au même niveau que les nœuds enfants de 24
.
720
/ \
/ \
/ \
/ \
/ \
24 30
/ \ / \
/ \ / \
4 6 5 6
/ \ / \ / \
2 2 2 3 2 3
Le défi
- Votre tâche consiste à créer un arbre diviseur esthétiquement plaisant, correctement espacé
n
, dans lequeln
un entier positif est supérieur à 1. - Votre sortie peut contenir des espaces de début et de fin et des nouvelles lignes de début et de fin, mais doit autrement être conforme aux règles d'espacement données ci-dessus.
- Votre sortie est autorisée à être: du texte, une image (autres formats à ajouter, si nécessaire).
- Pour les images, assurez-vous que les nœuds de votre arborescence sont bien espacés et que les nœuds situés à la même hauteur dans l'arborescence ont la même hauteur dans l'image.
- C'est du code golf. Le plus petit nombre d'octets (ou équivalent) gagne.
Nous remercions Stewie Griffin pour avoir pensé à cette idée, ainsi que Peter Taylor, Martin Ender, Mego et Eᴀsᴀ Iʀᴋ pour leur aide dans la réécriture de la spécification. Comme d'habitude, toute suggestion ou correction est très appréciée. Bonne chance et bon golf!
Plus de cas de test:
2
4
/ \
2 2
20
/ \
4 5
/ \
2 2
323
/ \
17 19
362880
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
576 630
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
24 24 21 30
/ \ / \ / \ / \
/ \ / \ / \ / \
4 6 4 6 3 7 5 6
/ \ / \ / \ / \ / \
2 2 2 3 2 2 2 3 2 3
1286250
/ \
/ \
/ \
/ \
/ \
1050 1225
/ \ / \
/ \ / \
/ \ / \
30 35 35 35
/ \ / \ / \ / \
5 6 5 7 5 7 5 7
/ \
2 3
la source
Réponses:
Python 2 ,
711651575559554547539540530522 octetsAprès quatre mois d’essais pour écrire cette réponse, heurtant un mur, le laissant pendant une semaine, rincez, répétez, j’ai enfin terminé une réponse artistique ASCII appropriée pour ce défi. Il ne reste plus que le golf. Les suggestions de golf sont donc les bienvenues. Essayez-le en ligne!
Golfs: -60 octets pour renommer certaines fonctions fréquemment utilisées et modifier le mode de restitution du résultat. -73 octets pour changer la façon dont les hauteurs des sous-arbres sont vérifiées, comment les variables d'espacement sont calculées et comment le résultat est renvoyé. -3 octets du
isdigit()
remplacement de FlipTack . -16 octets jouant encore ceisdigit()
remplacement et remplaçant "" par "E
. -5 octets provenant d'améliorations mineures et passant de Python 3 à Python 2. -7 octets consistant à modifier la façon dont le résultat est renvoyé. -8 octets d'un petit changement dans le mode deA
définition, enmodifiant ainsi, en supprimantT
, et en ajoutantW
, en partant de l'hypothèse que tout sous-arbre ayant au moins une branche plus longue que son homologue est nécessairement plus long que son homologueQ
tout à fait, et éditer comment le résultat est retourné. -10 octets à partir de utiliserA<10
au lieu deL(S(A))<2
pourA
etB
. -8 octets de changer la valeur par défautH
à[0]
car le code évite le problème des arguments par défaut mutables en ne muterH
, changer la façon dontq
est définie en utilisant au(B>9)
lieu de1-(B<10)
, en supprimantp
tout à fait, et la créationF
en remplacementp+q-M
.Correctifs: L' hypothèse était fausse, le contre-exemple dans
11**9 = 2357947691
. +1 octetExplication
Toute la fonction peut être réduite à environ quatre étapes:
n
,A
etB
.A
andB
, en redessinant au besoin.Je vais passer en revue chaque étape dans l'ordre.
Étape 1. C’est franchement l’étape la plus facile. Vérifiez chaque nombre
z
entre 1 et la racine carrée pour connaître la divisibilité enn
et saisissez le plus grandz
etn//z
celui qui correspond. Retour justestr(n)
sin
est premier (ouA==1
ouB==n
)Étape 2. Dessinez les sous-arbres de
A
etB
et obtenez le nombre de/\
branches entre les nœuds des sous-arbres. Pour ce faire, nous obtenons les indices de chaque étape comportant des chiffres, obtenons les premières différences d'indices et soustrayons 1 à nouveau. Une fois que nous avons les hauteurs, nous les comparons pour obtenir les plus grandes, et redessinons les sous-arbres avec les nouvelles hauteurs.Je soupçonne sournoisement que le sous-arbre qui est le plus grand en général a toujours des branches aussi longues ou égales aux branches du sous-arbre le plus court, et je peux l'utiliser pour jouer au code, mais je n'ai pas encore de preuve de cela.Contre-exemple dans11**9 = 2357947691
.Étape 3. Cette étape est ce qui a pris des mois pour écrire. L'étape 2 a pris quelques jours pour écrire et déboguer, mais il a fallu une éternité pour trouver les bonnes formules d'espacement. Je verrai si je peux condenser ce que j'ai calculé en quelques paragraphes. Notez que certains des codes de cette explication ont été depuis sortis du code réel.
Tout d' abord,
p
,q
,h
,P
,Q
,s
etM
.p
est le nombre de caractères de la fin de la branche gauche/
à la droite du sous-arbre gauche.q
est le nombre de caractères de l'extrémité gauche de la sous-arborescence droite à la fin de la branche droite/
.h
est le nombre de branches entre la racine et les sous-arbres.P
et neQ
sont que les inverses dep
etq
et sont utiles pour placer les espaces autour des/\
branches jusqu’à la racinen
.s
est le nombre d'espaces ajoutés entre les deux sous-arbres.M
est le plus simple; c'est la longueur den
. Mettez graphiquement:La formule permettant de déterminer
p
estp = len(x[0]) - x[0].rindex(str(A)[-1]) - (A<10)
la suivante:, la longueur moins l'indice zéro du dernier caractère de A moins la correction pour les chiffres à un chiffreA
.La formule de détermination
q
estq = y[0].index(str(B)[0]) + (B>9)
la suivante:, l’index du premier caractère de B, plus une correction pour index-zéro, moins une correction pour un seul chiffreB
(combinés en une correction pour plusieurs chiffresB
).La formule de calcul
h
est la suivante:h = H[0] or (p+q+M%2+2-M)//2 or 1
. Soit nous prenons un élément prédéfini,H
ce qui signifie que nous redessinons l’arbre, nous utilisons(from_the_left + from_the_right + parity_space + 2 - len(root)) // 2)
, soit nous utilisons le nombre minimum de niveaux de branche, 1.La formule de calcul
s
est la suivante:s = 2*h+M-p-q
. Nous soustrayonsp
etq
du nombre d'espaces entre les branches de la racine au plus large2*h + M
.Étape 4. Et finalement, nous mettons tout cela ensemble. D' abord , nous faisons la racine,
[" "*(P+h)+Z+" "*(Q+h)]
puis nous mettons dans les branches jusqu'aux sous - arbres,[" "*(P+J)+"/"+" "*(2*h+M-2*J-2)+"\\"+" "*(Q+J)for J in G(h)][::-1]
et enfin nous mettons dans notre sous - arbres espacés régulièrement,[(" "*(2*h+M-p-q)).join([(I<L(w)and w[I]or" "*L(w[0]))for w in(x,y)])for I in G(max(L(x),L(y)))]
.Et voilà! Nous avons nous-mêmes un arbre diviseur esthétique!
Ungolfing:
la source
isdigit
chèque pourrait être'/'<x[i].strip()[0]<':'
?Mathematica,
9686817978 octetsMerci @MartinEnder pour 2 octets.
La sortie ressemble à ceci:
Explication
Générez la liste des diviseurs de l'entrée. Trouvez l'élément le plus proche de la racine carrée de l'entrée. (
Max
sert à aplatir la sortie)Recherchez l’autre diviseur en divisant l’entrée par le diviseur trouvé ci-dessus, appliquez l’entrée comme tête du résultat.
Répétez le processus.
Si l'entrée est primordiale, ne faites rien.
Formatez la sortie.
Edit: Une version plus esthétique (258 octets)
La sortie ressemble à ceci:
la source
Sqrt@#
->#^.5
(bien entendu, vous ne pouvez pas utiliser la notation infix pour,Nearest
mais vous pouvez utiliserMax@
).Charbon de bois , 302 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Comme la version détaillée est très détaillée, il utilise une translittération JavaScript du principal algorithme:
la source