Wykres Cayleya ASCII

26

Podczas badań nad innym wyzwaniem, które formułuję, natknąłem się na wykres Cayleya , szczególnie ten . Ponieważ jestem jednym z czołowych twórców wyzwań , musiałem oczywiście podjąć wyzwanie artystyczne ASCII.

Wyzwanie polega na stworzeniu tego przedstawienia ASCII grafu Cayley grupy wolnej na dwóch generatorach w następujący sposób:

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

Wkład

Bez danych wejściowych, chyba że Twój język wyraźnie wymaga danych wejściowych do uruchomienia.

Wydajność

Przedstawiona powyżej grafika ASCII.

MD5 Hashes

Ponieważ jest to dość duży wynik, tutaj możesz sprawdzić swoją pracę. Oto kilka skrótów MD5 przykładowych form wyników (wszystkie są UTF-8 bez BOM):

  • Dopełnianie spacji kwadratowych, CR/LFpodawanie linii i końcowy znak nowej linii - 954B93871DAAE7A9C05CCDF79B00BF3C- to reprezentacja używana powyżej.
  • Kwadratowe wypełnienie spacji, CR/LFpodawanie linii, brak nowej linii -28405EF91DA305C406BD03F9275A175C
  • Wypełnienie kwadratowe, LFlinie i końcowe znaki nowej linii8CA65FB455DA7EE5A4C10F25CBD49D7E
  • Kwadratowe wypełnienie spacji, LFpodawanie linii, brak nowej linii -FDB1547D68023281BB60DBEC82C8D281
  • Brak spacji końcowych, CR/LFkanałów i nowej linii -77FDE8CE5D7BD1BDD47610BA23264A19
  • Bez spacji CR/LFkońcowych, linii, bez nowej linii -EAD390C3EFD37F0FCACE55A84B793AB5
  • Brak spacji końcowych, LFkanałów i nowej linii -1F6CAB740F87881EB2E65BED65D08C36
  • Bez spacji LFkońcowych, linii, bez nowej linii -7D41CE1E637619FEA9515D090BFA2E9C
  • Jeśli istnieje dodatkowe MD5, które chciałbyś porównać, daj mi znać, a ja je utworzę i zaktualizuję wyzwanie.

Zasady

  • Wiodące lub końcowe znaki nowej linii lub białe znaki są opcjonalne, o ile same znaki są odpowiednio ustawione w linii.
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je wydrukować.
  • Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
AdmBorkBork
źródło
Jestem nieco zaskoczony, że nie zostało to w żaden sposób sparametryzowane - wygląda na to, że powinno być szóste z rzędu.
Neil
To anarchiczne wyzwanie golfowe jest bardzo podobne.
DJMcMayhem
@Neil Zastanawiałem się nad tym, ale postanowiłem tego nie robić ze strachu, że zbytnio zwiększyłoby to trudność przy niewielkim zysku.
AdmBorkBork
Wygląda na to, że przebiegi -/ |s są zgodne z formułą, (2<<n)-n-2a nie taką, jak (1<<n)-1sądzę.
Neil
@Neil W rzeczywistości są to liczby Eulera , ponieważ to zapewniło najlepszą estetykę.
AdmBorkBork

Odpowiedzi:

9

JavaScript (ES6), 204 195 188 180 bajtów

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

Wypełnienie kwadratu, wysuw linii LF i brak nowej linii, chociaż nie sprawdziłem 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>+

Sparametryzowana wersja dla 222 216 207 199 bajtów. Objaśnienie: Rozmiar wyjściowy wynosi 9119 znaków ASCII, w tym 46 nowych wierszy. (W przypadku wersji sparametryzowanej obliczany jest rozmiar wyjściowy, w tym końcowy znak nowej linii.) Każdy znak jest określany indywidualnie, po pierwsze poprzez sprawdzenie, czy należy się nowy znak, w przeciwnym razie poprzez wywołanie funkcji na współrzędnych względem początku w środku końcowego diagram. Funkcja rekurencyjnie sprawdza punkt względem najbliższych krzyży każdego rozmiaru do punktu i zwraca odpowiedni znak w zależności od tego, czy punkt znajduje się na środku czy na osi krzyża.

Neil
źródło
7

Röda , 284 280 238 234 bajtów

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

Wypróbuj online!

To anonimowa funkcja. Użyłem znaku nowej linii zamiast średnika, więc jest bardzo ładnie sformatowany!

Funkcja rekurencyjna ftworzy wykres w dwuwymiarowej tablicy t, która jest następnie drukowana w ostatnim wierszu.

Nie znalazłem sposobu na obliczenie 27,12,5,2,1w kilku bajtach, więc są one zakodowane na stałe.

fergusq
źródło
Czy nie ma sposobu na obliczenie potęg 2?
Neil
@Neil Istnieje b_shiftloperator, ale myślę , że jest zbyt długi, aby go używać w tym programie.
fergusq
Jedyne, co mogę wymyślić, to może baza 3? Nie wiem, jak dobry jest Roda w konwersji podstawowej ... 10000110001200020001-> 1168671727wątpię, czy możesz konwertować i dzielić mniej niż 2 bajty chociaż heh ...
Magic Octopus Urn
3

Węgiel , 50 43 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Początkowo próbowałem różnych odbić i rotacji, ale albo nie zrobiły tego, co chciałem, albo w niektórych przypadkach były wadliwe. Następnie wypróbowałem podejście z zagnieżdżoną pętlą, ale teraz przełączyłem się na tę iteracyjną metodę, która działa, rysując pewną liczbę linii między każdym wewnętrznym krzyżem w zależności od tego, przez ile potęg 3, liczba kroków jest podzielna. Można go nawet łatwo zmodyfikować, aby akceptował parametr rozmiaru kosztem tylko 4 bajtów:

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

Edycja: Od tego czasu opracowałem sposób RotateShutterOverlapwykonania tego zadania, ale denerwująco zajmuje mi 44 bajty:

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

Jeśli zostanie RotateShutterOverlapzaakceptowana zmienna liczba całkowita rotacji, zmniejszy to ją do 40 bajtów:

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

W tej chwili użycie parametru listy rotacji zajmuje 45 bajtów:

A⁰ηF⁶«A∨η¹γA⁻⁺X²ιηιηJη⁰P+γ+⟲SO⟦⁶ײ⁺¹⁼⁵ι⟧⁻ײγ¹
Neil
źródło
To wydaje mi się oszustwem. : P
HyperNeutrino
@HyperNeutrino Nieco mniej zakodowana wersja: Wypróbuj online! A może nie to miałeś na myśli?
Neil
: PI oznaczało, że jest to zbyt krótkie i zbyt łatwe dla Węgla: P
HyperNeutrino
@Neil: O To jest niesamowite! Zastanawiam się, czy możesz podać przykład błędnego odbicia / rotacji, abym mógł to naprawić
tylko ASCII
@ Tylko ASCII W przypadku błędnego odbicia myślę, że działało tylko jedno z przekątnych, ale nie pamiętam, które. Myślę, że błąd był nieokreśloną zmienną (prawdopodobnie za dużo copypasta).
Neil
2

05AB1E , 620 bajtów

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

Wypróbuj online!

Wszystko, co zrobiłem, to wycięcie wzoru na czwarte, przekonwertowanie symboli na base-4, skompresowanie 1/4 wzoru na base-214, a następnie przerzucenie go nad liniami symetrii. Pracuję nad czymś mądrzejszym, używając faktycznego algorytmu, ale dopóki nie skończę, to właśnie tu będzie dla mnie.

Urna Magicznej Ośmiornicy
źródło
4
To zdecydowanie największa 05AB1Eodpowiedź, jaką widziałem. xD Zwykle jest to blisko 6,20 zamiast 620 z odpowiedziami w tym języku. ;)
Kevin Cruijssen
@KevinCruijssen, gdyby prosił o iterację 4, byłby znacznie mniejszy haha. Nadal pracuję nad rzeczywistym algorytmem w 05AB1E ... Trochę trudniej niż myślałem.
Magic Octopus Urn
2

Python 3, 264 bajty

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

Wykorzystuje parę wzajemnie rekurencyjnych funkcji. F rysuje linie, a P wstawia „+”. Można grać w golfa więcej, ale na razie nie ma czasu.

RootTwo
źródło
1

C, 236 bajtów

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

Po prostu rekurencyjnie buduj tablicę znaków przed jej wyświetleniem.

Wypróbuj online!

Dzięki @Neil za uświadomienie mi, że długość gałęzi jest zgodna z rzeczywistą zasadą.

ciemny
źródło