Gráfico ASCII Cayley

26

Mientras investigaba para un desafío diferente que estoy formulando, me encontré con un gráfico de Cayley , específicamente este . Como soy uno de los mejores escritores de desafío de , por supuesto, tuve que hacer un desafío de arte ASCII para esto.

Su desafío es producir esta representación artística ASCII de un gráfico de Cayley del grupo libre en dos generadores de la siguiente manera:

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

Entrada

Sin entrada, a menos que su idioma explícitamente requiera entrada para ejecutarse.

Salida

La representación artística ASCII que se muestra arriba.

MD5 Hashes

Dado que este es un resultado bastante grande, para verificar su trabajo aquí hay algunos hash MD5 de formas de salida de ejemplo (todos son UTF-8 sin BOM):

  • Relleno de espacio cuadrado, CR/LFsaltos de línea y nueva línea final 954B93871DAAE7A9C05CCDF79B00BF3C: esta es la representación utilizada anteriormente.
  • Relleno de espacio cuadrado, CR/LFavances de línea, sin línea nueva -28405EF91DA305C406BD03F9275A175C
  • Relleno de espacio cuadrado LF, saltos de línea y nueva línea final -8CA65FB455DA7EE5A4C10F25CBD49D7E
  • Relleno de espacio cuadrado, LFavances de línea, sin línea nueva -FDB1547D68023281BB60DBEC82C8D281
  • Sin espacios finales, CR/LFavances de línea y nueva línea final -77FDE8CE5D7BD1BDD47610BA23264A19
  • Sin espacios finales, CR/LFavances de línea, sin nueva línea final -EAD390C3EFD37F0FCACE55A84B793AB5
  • Sin espacios finales, LFavances de línea y nueva línea final -1F6CAB740F87881EB2E65BED65D08C36
  • Sin espacios finales, LFavances de línea, sin nueva línea final -7D41CE1E637619FEA9515D090BFA2E9C
  • Si desea comparar un MD5 adicional, hágamelo saber y lo crearé y actualizaré el desafío.

Reglas

  • Las nuevas líneas o espacios en blanco iniciales o finales son opcionales, siempre que los caracteres se alineen correctamente.
  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Si es posible, incluya un enlace a un entorno de prueba en línea para que otras personas puedan probar su código.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
AdmBorkBork
fuente
Estoy un poco sorprendido de que esto no esté parametrizado de ninguna manera, parece que debería ser el sexto de una secuencia.
Neil
Este desafío de golf de anarquía es muy similar.
DJMcMayhem
@Neil Pensé en hacerlo, pero decidí no hacerlo por temor a que aumentaría demasiado la dificultad para obtener poca ganancia.
AdmBorkBork
Parece que las ejecuciones de -/ |s siguen la fórmula en (2<<n)-n-2lugar de (1<<n)-1lo que habría sido mi suposición original.
Neil
@Neil En realidad son números eulerianos , ya que eso proporcionó la mejor estética.
AdmBorkBork

Respuestas:

9

JavaScript (ES6), 204 195 188 180 bytes

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

Relleno de espacio cuadrado, saltos de línea LF y sin línea nueva, aunque no he comprobado el 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>+

Versión parametrizada para 222 216 207 199 bytes. Explicación: El tamaño de salida es de 9119 caracteres ASCII, incluidas 46 líneas nuevas. (Para la versión parametrizada, el tamaño de salida se calcula incluyendo la nueva línea final). Cada carácter se determina individualmente, primero verificando si se debe una nueva línea, de lo contrario, llamando a una función en las coordenadas relativas al origen en el medio de la final diagrama. La función verifica recursivamente el punto contra las cruces más cercanas de cada tamaño al punto, y devuelve el carácter apropiado dependiendo de si se descubre que el punto se encuentra en el centro o eje de una cruz.

Neil
fuente
7

Röda , 284 280 238 234 bytes

{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 _&""}

Pruébalo en línea!

Esta es una función anónima. Utilicé líneas nuevas en lugar de punto y coma, por lo que está muy bien formateado.

La función recursiva fcrea el gráfico en una matriz bidimensional t, que luego se imprime en la última línea.

No encontré una manera de calcular 27,12,5,2,1en pocos bytes, por lo que están codificados.

fergusq
fuente
¿No hay forma de calcular potencias de 2?
Neil
@Neil Existe un b_shiftloperador, pero creo que es demasiado largo para ser utilizado en este programa.
fergusq
¿Lo único que se me ocurre es quizás base-3? No sé qué tan buena es Roda en la conversión base ... 10000110001200020001-> 1168671727dudo que pueda convertir y dividir con menos de 2 bytes aunque je ...
Urna de pulpo mágico
3

Carbón , 50 43 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Originalmente probé varias reflexiones y rotaciones, pero no hicieron lo que quería o, en algunos casos, tenían errores. Luego probé un enfoque de bucle anidado, pero ahora he cambiado a este método iterativo que funciona dibujando una serie de líneas entre cada cruz interna dependiendo de cuántas potencias de 3 es divisible el número de paso. Incluso se puede modificar fácilmente para aceptar un parámetro de tamaño a un costo de solo 4 bytes:

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

Editar: desde entonces he resuelto cómo usar RotateShutterOverlappara lograr esta tarea, pero molestamente me lleva 44 bytes:

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

Si se RotateShutterOverlapacepta un número entero de rotaciones variables, eso lo reduciría a 40 bytes:

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

Tal como está, usar un parámetro de lista de rotaciones toma 45 bytes:

A⁰ηF⁶«A∨η¹γA⁻⁺X²ιηιηJη⁰P+γ+⟲SO⟦⁶ײ⁺¹⁼⁵ι⟧⁻ײγ¹
Neil
fuente
Esto se siente como una trampa para mí. : P
HyperNeutrino
@HyperNeutrino Versión ligeramente menos codificada: ¡ Pruébelo en línea! ¿O no es eso lo que querías decir?
Neil
: PI significa que esto es demasiado corto y demasiado fácil para el carbón: P
HyperNeutrino
@Neil: ¡Esto es increíble! Me pregunto si podría dar un ejemplo de una reflexión / rotación con errores para que pueda solucionarlo
solo ASCII
@ Solo ASCII En el caso de una reflexión defectuosa, creo que solo una de las reflexiones diagonales estaba funcionando, pero no recuerdo cuál. Creo que el error fue una variable indefinida (probablemente demasiado copypasta).
Neil
2

05AB1E , 620 bytes

•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ôû€û»

Pruébalo en línea!

Todo lo que hice fue cortar el patrón en cuartos, convertir los símbolos en base-4, comprimir 1/4 del patrón en base-214 y luego voltearlo sobre las líneas de simetría. Estoy trabajando en algo más inteligente usando el algoritmo real, pero hasta que termine, esto es lo que estará aquí para mí.

Urna de pulpo mágico
fuente
44
Esa es, con mucho, la 05AB1Erespuesta más grande que he visto. xD Por lo general, está cerca de 6.20 en lugar de 620 con respuestas en este idioma. ;)
Kevin Cruijssen
@KevinCruijssen si pidiera la iteración 4, hubiera sido mucho, mucho más pequeño, jaja. Todavía estoy trabajando en el algoritmo real en 05AB1E ... Un poco más difícil de lo que pensaba.
Magic Octopus Urn
2

Python 3, 264 bytes

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

Utiliza un par de funciones recursivas mutuamente. F dibuja las líneas y P inserta los '+'. Se puede jugar más al golf, pero fuera de tiempo por ahora.

RootTwo
fuente
1

C, 236 bytes

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]);}

Simplemente construyendo la tabla de caracteres de forma recursiva antes de mostrarla.

Pruébalo en línea!

Gracias @Neil por hacerme darme cuenta de que la longitud de las ramas sigue una regla real.

oscuro
fuente