Gráfico ASCII Cayley


26

Enquanto fazia alguma pesquisa para um desafio diferente que estou formulando, me deparei com um gráfico de Cayley , especificamente este . Como sou um dos principais escritores de desafios da , é claro que tive que fazer um desafio da arte ASCII para isso.

Seu desafio é produzir esta representação artística ASCII de um gráfico Cayley do grupo livre em dois geradores, da seguinte maneira:

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

Entrada

Nenhuma entrada, a menos que seu idioma exija explicitamente que a entrada seja executada.

Saída

A representação artística ASCII mostrada acima.

Hashes MD5

Como essa é uma saída bastante grande, para verificar seu trabalho, aqui estão alguns hashes MD5 de exemplos de formas de saída (todos são UTF-8 sem BOM):

  • Preenchimento de espaço quadrado, CR/LFavanço de linha e nova linha à direita -954B93871DAAE7A9C05CCDF79B00BF3C - esta é a representação usada acima.
  • Preenchimento de espaço quadrado, CR/LF avanço de linha, sem nova linha à direita -28405EF91DA305C406BD03F9275A175C
  • Preenchimento de espaço quadrado, LFavanço de linha e nova linha à direita -8CA65FB455DA7EE5A4C10F25CBD49D7E
  • Preenchimento de espaço quadrado,LF avanço de linha, sem nova linha à direita -FDB1547D68023281BB60DBEC82C8D281
  • Sem espaços à direita, CR/LFfeeds de linha e nova linha à direita -77FDE8CE5D7BD1BDD47610BA23264A19
  • Sem espaços à direita, CR/LFfeeds de linha, sem nova linha à direita -EAD390C3EFD37F0FCACE55A84B793AB5
  • Sem espaços à direita, LFfeeds de linha e nova linha à direita -1F6CAB740F87881EB2E65BED65D08C36
  • Sem espaços à direita, LFfeeds de linha, sem nova linha à direita -7D41CE1E637619FEA9515D090BFA2E9C
  • Se houver um MD5 adicional que você gostaria de comparar, informe-me, eu o crio e atualizo o desafio.

Regras

  • Novas linhas à esquerda ou à direita ou espaços em branco são opcionais, desde que os próprios caracteres estejam alinhados corretamente.
  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.

Estou um pouco surpreso que isso não seja parametrizado de forma alguma - parece que deveria ser o sexto de uma sequência.
Neil

Esse desafio de anarquia no golfe é muito parecido.
DJMcMayhem

@ Neil eu tinha pensado em fazê-lo, mas decidi contra, por medo de que aumentasse demais a dificuldade para obter pouco ganho.
AdmBorkBork

Parece que as execuções de -/ |s seguem a fórmula, (2<<n)-n-2e não (1<<n)-1qual é o meu palpite original.
Neil

@ Neil Na verdade, eles são números eulerianos , já que isso proporcionava a melhor estética.
AdmBorkBork 14/03

Respostas:


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

Preenchimento de espaço quadrado, alimentação de linha LF e nenhuma nova linha à direita, embora eu não tenha verificado o 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>+

Versão parametrizada para 222 216 207 199 bytes. Explicação: O tamanho da saída é de 9119 caracteres ASCII, incluindo 46 novas linhas. (Para a versão parametrizada, o tamanho da saída é calculado incluindo a nova linha à direita.) Cada caractere é determinado individualmente, primeiro verificando se uma nova linha está vencida ou chamando uma função nas coordenadas relativas à origem no meio da final diagrama. A função verifica recursivamente o ponto em relação às cruzes mais próximas de cada tamanho para o ponto e retorna o caractere apropriado, dependendo se o ponto for encontrado no centro ou no eixo de uma cruz.


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

Experimente online!

Esta é uma função anônima. Usei novas linhas em vez de ponto-e-vírgula, por isso é muito bem formatado!

A função recursiva fcria o gráfico em uma matriz bidimensionalt , que é impressa na última linha.

Não encontrei uma maneira de calcular 27,12,5,2,1em alguns bytes, portanto eles são codificados.


Não há como calcular potências de 2?
314 Neil

@ Neil Existe um b_shiftloperador, mas acho que é muito longo para ser usado neste programa.
fergusq

A única coisa que consigo pensar é talvez a base 3? Não sei como é bom Roda é a conversão de bases embora ... 10000110001200020001-> 1168671727duvido que você pode converter e dividir com menos de 2 bytes que heh ...
Magia Octopus Urna

3

Carvão , 50 43 bytes

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

Experimente online! Link é a versão detalhada do código. Inicialmente, tentei várias reflexões e rotações, mas elas não fizeram o que eu queria ou, em alguns casos, eram de buggy. Tentei uma abordagem de loop aninhado, mas agora mudei para esse método iterativo que funciona desenhando um número de linhas entre cada cruz interna, dependendo de quantas potências de 3 o número da etapa é divisível. Ele pode ser facilmente modificado para aceitar um parâmetro de tamanho a um custo de apenas 4 bytes:

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

Edit: Eu já trabalhei como usar RotateShutterOverlappara realizar esta tarefa, mas irritantemente leva 44 bytes:

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

Se RotateShutterOverlapaceito um número inteiro de rotações variáveis, isso o reduziria para 40 bytes:

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

Assim, o uso de um parâmetro da lista de rotações leva 45 bytes:

A⁰ηF⁶«A∨η¹γA⁻⁺X²ιηιηJη⁰P+γ+⟲SO⟦⁶ײ⁺¹⁼⁵ι⟧⁻ײγ¹

Isso parece trapaça para mim. : P
HyperNeutrino

@HyperNeutrino Versão ligeiramente menos codificada: Experimente online! Ou não é isso que você quis dizer?
Neil

: PI significa que isso é muito curto e muito fácil para o carvão vegetal: P
HyperNeutrino

@ Neil: O Isso é incrível! Eu estou querendo saber se você poderia dar um exemplo de uma reflexão de buggy / rotação para que eu possa corrigi-lo
ASCII-only

@ Somente ASCII No caso de uma reflexão de buggy, acho que apenas uma das reflexões diagonais estava funcionando, mas não me lembro qual. Eu acho que o erro foi uma variável indefinida (provavelmente copypasta demais).
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ôû€û»

Experimente online!

Tudo o que fiz foi cortar o padrão em quartos, converter os símbolos em base-4, compactar 1/4 do padrão em base-214 e depois invertê-lo sobre as linhas de simetria. Estou trabalhando em algo mais inteligente usando o algoritmo real, mas até terminar que é isso que estará aqui para mim.


4
Essa é de longe a maior 05AB1Eresposta que eu já vi. xD Normalmente, é quase 6,20, em vez de 620, com respostas neste idioma. ;)
Kevin Cruijssen 15/03

@KevinCruijssen, se estivesse pedindo a iteração 4, teria sido muito, muito menor, haha. Ainda trabalhando no algoritmo atual do 05AB1E ... Um pouco mais difícil do que eu pensava.
Urna Mágica do Polvo

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

Usa um par de funções recursivas mutuamente. F desenha as linhas e P insere os '+'. Pode ser jogado mais, mas sem tempo por enquanto.


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

Apenas construa a tabela de caracteres recursivamente antes de exibi-la.

Experimente online!

Obrigado @ Neil por me fazer perceber que o comprimento dos galhos segue uma regra real.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.