ASCII Cayley Graph

26

Tout en faisant des recherches pour un défi différent que je formule, je suis tombé sur un graphique de Cayley , en particulier celui-ci . Étant donné que je suis l' un des meilleurs auteurs de défis en , j'ai bien sûr dû faire un défi artistique ASCII pour cela.

Votre défi est de produire cette représentation artistique ASCII d'un graphique de Cayley du groupe libre sur deux générateurs comme suit:

                                               +                                               
                                              +++                                              
                                             + | +                                             
                                            ++-+-++                                            
                                             + | +                                             
                                          +    |    +                                          
                                         +++   |   +++                                         
                                        + |    |    | +                                        
                                       ++-+----+----+-++                                       
                                        + |    |    | +                                        
                                         +++   |   +++                                         
                                          +    |    +                                          
                                   +           |           +                                   
                                  +++          |          +++                                  
                                 + | +         |         + | +                                 
                                ++-+-++        |        ++-+-++                                
                                 + | +         |         + | +                                 
                              +    |           |           |    +                              
                             +++   |           |           |   +++                             
                            + |    |           |           |    | +                            
                           ++-+----+-----------+-----------+----+-++                           
                            + |    |           |           |    | +                            
                             +++   |           |           |   +++                             
                              +    |           |           |    +                              
                                 + | +         |         + | +                                 
                                ++-+-++        |        ++-+-++                                
                                 + | +         |         + | +                                 
                    +             +++          |          +++             +                    
                   +++             +           |           +             +++                   
                  + | +                        |                        + | +                  
                 ++-+-++                       |                       ++-+-++                 
                  + | +                        |                        + | +                  
               +    |    +                     |                     +    |    +               
              +++   |   +++                    |                    +++   |   +++              
             + |    |    | +                   |                   + |    |    | +             
            ++-+----+----+-++                  |                  ++-+----+----+-++            
             + |    |    | +                   |                   + |    |    | +             
              +++   |   +++                    |                    +++   |   +++              
               +    |    +                     |                     +    |    +               
        +           |                          |                          |           +        
       +++          |                          |                          |          +++       
      + | +         |                          |                          |         + | +      
     ++-+-++        |                          |                          |        ++-+-++     
      + | +         |                          |                          |         + | +      
   +    |           |                          |                          |           |    +   
  +++   |           |                          |                          |           |   +++  
 + |    |           |                          |                          |           |    | + 
++-+----+-----------+--------------------------+--------------------------+-----------+----+-++
 + |    |           |                          |                          |           |    | + 
  +++   |           |                          |                          |           |   +++  
   +    |           |                          |                          |           |    +   
      + | +         |                          |                          |         + | +      
     ++-+-++        |                          |                          |        ++-+-++     
      + | +         |                          |                          |         + | +      
       +++          |                          |                          |          +++       
        +           |                          |                          |           +        
               +    |    +                     |                     +    |    +               
              +++   |   +++                    |                    +++   |   +++              
             + |    |    | +                   |                   + |    |    | +             
            ++-+----+----+-++                  |                  ++-+----+----+-++            
             + |    |    | +                   |                   + |    |    | +             
              +++   |   +++                    |                    +++   |   +++              
               +    |    +                     |                     +    |    +               
                  + | +                        |                        + | +                  
                 ++-+-++                       |                       ++-+-++                 
                  + | +                        |                        + | +                  
                   +++             +           |           +             +++                   
                    +             +++          |          +++             +                    
                                 + | +         |         + | +                                 
                                ++-+-++        |        ++-+-++                                
                                 + | +         |         + | +                                 
                              +    |           |           |    +                              
                             +++   |           |           |   +++                             
                            + |    |           |           |    | +                            
                           ++-+----+-----------+-----------+----+-++                           
                            + |    |           |           |    | +                            
                             +++   |           |           |   +++                             
                              +    |           |           |    +                              
                                 + | +         |         + | +                                 
                                ++-+-++        |        ++-+-++                                
                                 + | +         |         + | +                                 
                                  +++          |          +++                                  
                                   +           |           +                                   
                                          +    |    +                                          
                                         +++   |   +++                                         
                                        + |    |    | +                                        
                                       ++-+----+----+-++                                       
                                        + |    |    | +                                        
                                         +++   |   +++                                         
                                          +    |    +                                          
                                             + | +                                             
                                            ++-+-++                                            
                                             + | +                                             
                                              +++                                              
                                               +                                               

Contribution

Aucune entrée, sauf si votre langue nécessite explicitement une entrée pour s'exécuter.

Sortie

La représentation artistique ASCII montrée ci-dessus.

Hash MD5

Comme il s'agit d'une sortie assez importante, pour vérifier votre travail, voici quelques hachages MD5 d'exemples de formes de sortie (tous sont UTF-8 sans BOM):

  • Remplissage d'espace carré, CR/LFsauts de ligne et saut de ligne - 954B93871DAAE7A9C05CCDF79B00BF3C- c'est la représentation utilisée ci-dessus.
  • Remplissage d'espace carré, CR/LFsauts de ligne, pas de nouvelle ligne arrière -28405EF91DA305C406BD03F9275A175C
  • Remplissage d'espace carré, LFsauts de ligne et saut de ligne -8CA65FB455DA7EE5A4C10F25CBD49D7E
  • Remplissage d'espace carré, LFsauts de ligne, pas de nouvelle ligne arrière -FDB1547D68023281BB60DBEC82C8D281
  • Pas d'espaces de fin, de CR/LFsauts de ligne et de retour à la ligne de fin -77FDE8CE5D7BD1BDD47610BA23264A19
  • Pas d'espaces de fin, de CR/LFsauts de ligne, pas de retour à la ligne de fin -EAD390C3EFD37F0FCACE55A84B793AB5
  • Pas d'espaces de fin, de LFsauts de ligne et de retour à la ligne de fin -1F6CAB740F87881EB2E65BED65D08C36
  • Pas d'espaces de fin, de LFsauts de ligne, pas de retour à la ligne de fin -7D41CE1E637619FEA9515D090BFA2E9C
  • S'il y a un MD5 supplémentaire que vous souhaitez comparer, faites-le moi savoir et je le créerai et mettrai à jour le défi.

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.
  • 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 d'autres personnes puissent essayer votre code!
  • Les failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
AdmBorkBork
la source
Je suis légèrement surpris que cela ne soit en aucun cas paramétré - il semble que ce devrait être le sixième d'une séquence.
Neil
Ce défi de golf anarchie est très similaire.
DJMcMayhem
@Neil J'avais envisagé de le faire, mais j'ai décidé contre cela de peur que cela n'augmente trop la difficulté pour peu de gain.
AdmBorkBork
On dirait que les séquences de -/ |s suivent la formule (2<<n)-n-2plutôt que (1<<n)-1ce qui aurait été ma supposition d'origine.
Neil
@Neil Ce sont en fait des nombres eulériens , car cela a fourni la meilleure esthétique.
AdmBorkBork

Réponses:

9

JavaScript (ES6), 204 195 188 180 octets

f=
_=>[...Array(9119)].map((_,i)=>~i%96?g(48+~(i/96),47-i%96,5):`
`,g=(x,y,z,n=(1<<z)-z)=>x|y?(x=x<0?-x:x)+(y=y<0?-y:y)<n?` |-+`[2*!x+!y]:z--?x>y?g(x-n,y,z):g(x,y-n,z):` `:`+`).join``
;document.write(`<pre>`+f())

Remplissage d'espace carré, sauts de ligne LF et aucun retour à la ligne de fin, même si je n'ai pas vérifié le MD5.

f=
m=>[...Array((w=(4<<m)-m*-~m-2)*~-w)].map((_,i)=>~i%w?g(w/2+~(i/w),w/2-i%w-1,m):`
`,g=(x,y,z,n=(1<<z)-z)=>x|y?(x=x<0?-x:x)+(y=y<0?-y:y)<n?` |-+`[2*!x+!y]:z--?x>y?g(x-n,y,z):g(x,y-n,z):` `:`+`).join``
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>+

Version paramétrée pour 222 216 207 199 octets. Explication: La taille de sortie est de 9119 caractères ASCII, dont 46 sauts de ligne. (Pour la version paramétrée, la taille de sortie est calculée en incluant la nouvelle ligne de fin.) Chaque caractère est déterminé individuellement, d'abord en vérifiant si une nouvelle ligne est due, sinon en appelant une fonction sur les coordonnées par rapport à l'origine au milieu de la finale diagramme. La fonction vérifie récursivement le point par rapport aux croix les plus proches de chaque taille vers le point et renvoie le caractère approprié selon que le point se trouve au centre ou sur l'axe d'une croix.

Neil
la source
7

Röda , 284 280 238 234 octets

{a=[1,-1]t=[]seq 1,95|t+=[" "]*95,_
f={|x,y,i,d|{s=[27,12,5,2,1][i]i++
a|{|j|{seq y,y+s*j|t[_][x]="|"f x,y+s*j,i,2-j}if[d!=2+j]}_
a|{|j|{seq x,x+s*j|t[y][_]="-"f x+s*j,y,i,3-j}if[d!=3+j]}_}if[i<5]
t[y][x]="+"}f 47,47,0,0
t|print _&""}

Essayez-le en ligne!

Il s'agit d'une fonction anonyme. J'ai utilisé des sauts de ligne au lieu des points-virgules donc c'est très bien formaté!

La fonction récursive fcrée le graphique dans un tableau à deux dimensions t, qui est ensuite imprimé à la dernière ligne.

Je n'ai pas trouvé de moyen de calculer 27,12,5,2,1en quelques octets, ils sont donc codés en dur.

fergusq
la source
N'y a-t-il aucun moyen de calculer des puissances de 2?
Neil
@Neil Un b_shiftlopérateur existe, mais il est trop long pour être utilisé dans ce programme, je pense.
fergusq
La seule chose à laquelle je peux penser est peut-être la base-3? Je ne sais pas à quel point Roda est bonne à la conversion de base, cependant ... 10000110001200020001-> 1168671727doute que vous pouvez convertir et fractionner avec moins de 2 octets bien que ...
Magic Octopus Urn
3

Fusain , 50 43 octets

F³²⁴«P++↷AE…¹¦⁵∧¬﹪ιX³κ⁻X²⁺κ¹⁺κ²εF⁺ε⮌ε¿κ«+κ↶

Essayez-le en ligne! Le lien est vers la version détaillée du code. À l'origine, j'ai essayé diverses réflexions et rotations, mais elles ne faisaient pas ce que je voulais ou, dans certains cas, étaient buggées. J'ai ensuite essayé une approche en boucle imbriquée, mais je suis maintenant passé à cette méthode itérative qui fonctionne en dessinant un certain nombre de lignes entre chaque croix intérieure en fonction du nombre de puissances de 3 sur lesquelles le numéro de pas est divisible. Il peut même être facilement modifié pour accepter un paramètre de taille au prix de seulement 4 octets:

NβF×⁴X³β«P++↷AE…·¹β∧¬﹪ιX³κ⁻X²⁺κ¹⁺κ²εF⁺ε⮌ε¿κ«+κ↶

Edit: J'ai depuis travaillé sur la façon d'utiliser RotateShutterOverlappour accomplir cette tâche, mais ennuyeusement, cela me prend 44 octets:

A⁰ηF⁶«AηγA⁻⁺X²ιηιηJη⁰P-γ+¿γ⟲SO²⁶⁻×²γ¹»‖⟲SO⁹⁵

Si RotateShutterOverlapaccepté un nombre entier de rotations variables, cela le réduirait à 40 octets:

A⁰ηF⁶«A∨η¹γA⁻⁺X²ιηιηJη⁰P+γ+⟲SO⎇‹ι⁵Lβ²⁴⁶γ

En l'état, l'utilisation d'un paramètre de liste de rotations prend 45 octets:

A⁰ηF⁶«A∨η¹γA⁻⁺X²ιηιηJη⁰P+γ+⟲SO⟦⁶ײ⁺¹⁼⁵ι⟧⁻ײγ¹
Neil
la source
J'ai l'impression de tricher. : P
HyperNeutrino
@HyperNeutrino Version légèrement moins hardcodée: Essayez-la en ligne! Ou n'est-ce pas ce que vous vouliez dire?
Neil
: PI voulait dire que c'était beaucoup trop court et beaucoup trop facile pour Charcoal: P
HyperNeutrino
@Neil: O C'est incroyable! Je me demande si vous pourriez donner un exemple de réflexion / rotation de buggy pour que je puisse le corriger
ASCII uniquement
@ ASCII uniquement Dans le cas d'une réflexion en buggy, je pense qu'une seule des réflexions diagonales fonctionnait, mais je ne me souviens pas laquelle. Je pense que l'erreur était une variable non définie (probablement trop de copypasta).
Neil
2

05AB1E , 620 octets

•1dOœ˜‘Av–Qs†ƒFã&äuÌʹÝ2býádÙI’´Ëœ¼)Y»+™ß›[Vg“Ò¢Jù1no<V<*Ét*-¢&â-ßBÆ×090`11-øsµ–¶1VÛ==ü:¼÷ØûÍZ„æ¹=#ùÞV«¡fä&Έ'ëˆÝ=ä^‰¤?Êçù!ØèØr-3îÛ+êò‚û¢½°BéG¦U”Ü1žˆr6S‹“ŽKRK°A¹ª¿â9]}×u¬]ž„Îï›V¦Â¶4Ãï¢v£×é´Ü2Äžiqô>§17F*ÎañníÆ4]s8mÏ›HSÏ771í´‰d3´Þ|À]Uà{þñýqø’e„XÿF4–:Yl&uqžÍÒÿ¾u9¤jóHP‰çêoÒNŠX-°xpÒÿ*ejÏD0Ë+GnÊ-/§3ÜJÙˆƒÌ=ŒÒOX‰|O%wæ[n‹ã4)ôF+~´Ö{aÄ$(Þí¼”÷u–qÿBòfÂíÜìTó–xÝwû¾])<§O«\‚e°‡¾‹K…ZDPô;µ!ò&Ô¼¨1gŠ—Ÿ¦©zW¢¾×4K±ÔÄ_ìûÄ‚3¶Ñ>‚bùn±œ×)ÙCâRö裶”ˆ1ßÑֱͮ[ZéRïyÓxÓE¨cW˜{Ã’ùoE›¥ÚvA¨‹êÆýÑY½RÎ5´‘Ê™uåÄr"ãYð÷I!0¤)å‡ëž”>úèWò}é€@.ØñÈQ€ñ{Á„‘Ü’‰~Çñ=…|“ڃĬcóÇkþÛÇ–š;{¡¦½ÕrÎé–àTz€Kì2à^|¢èˆÎxž“å$œ2ô»EidœþFrSS¥ÝÜ—X¡á~îþQ˜NÜGñ¥Q)aè•4B"1230"" +-|"‡48ôû€û»

Essayez-le en ligne!

Tout ce que j'ai fait, c'est couper le motif en quart, convertir les symboles en base-4, compresser 1/4 du motif en base-214, puis le retourner sur les lignes de symétrie. Je travaille sur quelque chose de plus intelligent en utilisant l'algorithme réel, mais jusqu'à ce que je termine, c'est ce qui sera là pour moi.

Urne de poulpe magique
la source
4
C'est de loin la plus grande 05AB1Eréponse que j'ai vue. xD Habituellement, il est proche de 6,20 au lieu de 620 avec des réponses dans cette langue. ;)
Kevin Cruijssen
@KevinCruijssen s'il avait demandé l'itération 4, il aurait été beaucoup plus petit haha. Je travaille toujours sur l'algorithme actuel dans 05AB1E ... Un peu plus difficile que je ne le pensais.
Magic Octopus Urn
2

Python 3, 264 octets

def F(g,p,d,k):
 for c in'-|'[d.real!=0]*(2**k-k-1):g[p]=c;p+=d
 P(g,p,k-1)
def P(g,p,k):
 if'+'==g.setdefault(p,'+')and k:
  for d in[1,1j,-1,-1j]:F(g,p+d,d,k)
g={}
P(g,0j,5)
print('\n'.join(''.join(g.get(r+c*1j,' ')for c in range(-47,48))for r in range(-47,48)))

Utilise une paire de fonctions mutuellement récursives. F trace les lignes et P insère les «+». Peut être joué plus, mais hors du temps pour l'instant.

RootTwo
la source
1

C, 236 octets

char t[95][95],i=95;f(x,y,s,n,m){if(t[y][x]<33){m=~s+(1<<s);for(n=~m;n++<m;)t[y][x+n]='-',t[y+n][x]=n==0?'+':'|';if(s--)f(x+n,y,s),f(x-n,y,s),f(x,y+n,s),f(x,y-n,s);}}main(){memset(t,32,9025);f(47,47,5);while(i--)printf("%.95s\n",t[i]);}

Il suffit de construire la table des caractères de manière récursive avant de l'afficher.

Essayez-le en ligne!

Merci @Neil de m'avoir fait réaliser que la longueur des branches suit une vraie règle.

faible
la source