Genera frattali da schemi di bit in ASCII


34

Panoramica

Scrivi un programma che stampa semplici schemi di frattali con uno schema di bit che codifica il frattale, oltre al fattore di scala per generazione del frattale e al numero di generazioni.

Spiegazione

Ecco una rappresentazione ASCII del tappeto Sierpinski :

Generazione 0:

# 

Prima generazione:

# # # 
#   # 
# # # 

Seconda generazione:

# # # # # # # # # 
#   # #   # #   # 
# # # # # # # # # 
# # #       # # # 
#   #       #   # 
# # #       # # # 
# # # # # # # # # 
#   # #   # #   # 
# # # # # # # # # 

La generazione n + 1 del tappeto ASCII Sierpinski è costituita da una griglia 3x3 contenente 8 copie della generazione n, con l'elemento centrale della griglia mancante.

Quindi, poiché è definito utilizzando una griglia 3x3 e diventa 3 volte più grande in larghezza e altezza ogni generazione, possiamo dire che ha un fattore di scala di 3.

Potremmo definire un modello di bit per il tappeto Sierpinski numerando gli elementi nella griglia 3x3 da 0 a 8, dall'alto verso il basso, da sinistra a destra e impostando il bit corrispondente di un numero intero se la generazione n + 1 contiene un copia della generazione n in quella posizione della griglia:

bit:       place value:   bit pattern:   bit value:

0 1 2      1    2    4    1 1 1          1    2    4
3 4 5      8   16   32    1 0 1          8    0   32 
6 7 8      64 128  256    1 1 1          64 128  256 

integer value = 1 + 2 + 4 + 8 + 32 + 64 + 128 + 256 = 495

Per un fattore di scala di 2, il modello di bit sarebbe organizzato in questo modo:

0 1
2 3

e così via.

Il tuo compito è scrivere un programma che accetta un modello di bit in questa forma, un fattore di scala (ad es. 3 per il tappeto Sierpinski) e un numero di generazione e genera un frattale ASCII.

Ingresso

Il tuo programma dovrebbe accettare 3 numeri interi nel seguente ordine: un modello di bit, un fattore di scala (compreso tra 2 e 5, inclusi) e un conteggio di generazione (compreso tra 0 e 5, inclusi).

Non è necessario eseguire alcuna convalida dell'input su questi valori ed è perfettamente corretto se il programma funziona per valori superiori agli intervalli specificati.

Gli input possono essere passati in qualsiasi forma (tuple, elenco separato da virgole / spazi, ecc.)

Produzione

Il programma dovrebbe generare un frattale composto dal #personaggio seguito da uno spazio in posizioni in cui è definito il frattale, doppi spazi dove non lo è e un carattere di nuova riga alla fine di ogni riga, stampandoli o restituendo una stringa da una funzione.

Esempi

Ingresso:

495,3,3

Uscita (Sierpinski Carpet generazione 3):

# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # #       # # # # # #       # # # # # #       # # # 
#   #       #   # #   #       #   # #   #       #   # 
# # #       # # # # # #       # # # # # #       # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # # # # # # # #                   # # # # # # # # # 
#   # #   # #   #                   #   # #   # #   # 
# # # # # # # # #                   # # # # # # # # # 
# # #       # # #                   # # #       # # # 
#   #       #   #                   #   #       #   # 
# # #       # # #                   # # #       # # # 
# # # # # # # # #                   # # # # # # # # # 
#   # #   # #   #                   #   # #   # #   # 
# # # # # # # # #                   # # # # # # # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # #       # # # # # #       # # # # # #       # # # 
#   #       #   # #   #       #   # #   #       #   # 
# # #       # # # # # #       # # # # # #       # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 

Ingresso:

7,2,5

Uscita ( triangolo di Sierpinski ):

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   #   #   #   #   #   #   #   #   #   #   #   #   #   #   #   
# #     # #     # #     # #     # #     # #     # #     # #     
#       #       #       #       #       #       #       #       
# # # #         # # # #         # # # #         # # # #         
#   #           #   #           #   #           #   #           
# #             # #             # #             # #             
#               #               #               #               
# # # # # # # #                 # # # # # # # #                 
#   #   #   #                   #   #   #   #                   
# #     # #                     # #     # #                     
#       #                       #       #                       
# # # #                         # # # #                         
#   #                           #   #                           
# #                             # #                             
#                               #                               
# # # # # # # # # # # # # # # #                                 
#   #   #   #   #   #   #   #                                   
# #     # #     # #     # #                                     
#       #       #       #                                       
# # # #         # # # #                                         
#   #           #   #                                           
# #             # #                                             
#               #                                               
# # # # # # # #                                                 
#   #   #   #                                                   
# #     # #                                                     
#       #                                                       
# # # #                                                         
#   #                                                           
# #                                                             
#                                                               

Ingresso:

325,3,3

Uscita ( Cantor Dust ):

#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 



#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 









#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 



#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 

Ingresso

186,3,3

Uscita ( frattale Vicsek ):

                          #                           
                        # # #                         
                          #                           
                    #     #     #                     
                  # # # # # # # # #                   
                    #     #     #                     
                          #                           
                        # # #                         
                          #                           
        #                 #                 #         
      # # #             # # #             # # #       
        #                 #                 #         
  #     #     #     #     #     #     #     #     #   
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
  #     #     #     #     #     #     #     #     #   
        #                 #                 #         
      # # #             # # #             # # #       
        #                 #                 #         
                          #                           
                        # # #                         
                          #                           
                    #     #     #                     
                  # # # # # # # # #                   
                    #     #     #                     
                          #                           
                        # # #                         
                          #                           

Ingresso:

279,3,3

Uscita (esempio di un frattale asimmetrico):

# # # # # # # # # # # # # # # # # # # # # # # # # # # 
  #     #     #     #     #     #     #     #     #   
    #     #     #     #     #     #     #     #     # 
      # # #             # # #             # # #       
        #                 #                 #         
          #                 #                 #       
            # # #             # # #             # # # 
              #                 #                 #   
                #                 #                 # 
                  # # # # # # # # #                   
                    #     #     #                     
                      #     #     #                   
                        # # #                         
                          #                           
                            #                         
                              # # #                   
                                #                     
                                  #                   
                                    # # # # # # # # # 
                                      #     #     #   
                                        #     #     # 
                                          # # #       
                                            #         
                                              #       
                                                # # # 
                                                  #   
                                                    # 

eccetera.

Gli appunti:

  • Questo è quindi vince la risposta più breve in byte
  • Il programma può essere autonomo o una funzione chiamata con i 3 parametri di input e restituisce (o stampa) una stringa
  • La generazione 0 è definita come #(a #seguita da uno spazio) anche per un modello di bit di 0.
  • Una nuova riga finale sull'ultima riga è facoltativa ma consentita, così come qualsiasi quantità di spazio vuoto finale su ciascuna riga.

3
+1, mi è piaciuto in sandbox e mi piace di più qui, con il simbolo cambiato da "##"a "# ". Vedo che uno spazio finale alla fine della riga è incluso nei tuoi esempi, è necessario? . Per l'ultima regola, suppongo che sia facoltativo, ma il fatto che tu abbia bisogno di uno spazio finale per la generazione 0 mi fa meravigliare. Inoltre penso che dovresti indicare il massimo spazio bianco e le nuove righe (lo hai plurale) consentito. Come esempio estremo potrei sempre iniziare con una matrice di 5 ^ 6 = 15625 linee di 2 * 5 ^ 6 spazi quindi sostituire la #s. Nella maggior parte dei casi di input è un'enorme quantità di spazi bianchi inutilizzati
Level River St

@steveverrill non richiede lo spazio finale quando l'output generazione 0, tuttavia lo spazio finale è parte della sua definizione, che le generazioni successive sono definiti in termini di. Il plurale di newline era un refuso, fisso.
Samgak,

Potresti pubblicare l'output previsto per qualcosa di meno simmetrico, come 279,3,3?
aditsu,

@aditsu certo, vedi domanda modificata
samgak,

Risposte:


4

APL (Dyalog Unicode) , 37 byte SBCS

'# '{⊃⍪/,/⍺\⍤1⊂⍉⍪⍉⍵}⍣⎕⍨(2⍴⎕)⍴⌽⎕⊤⍨992
                                      input the bit pattern
                               ⊤⍨992  decode 99 binary digits from it
                                        (53 is the limit for floating point)
                                      reverse, least significant bit goes first
                                      input the scale factor
                       (2 )           twice, to use as dimensions of a matrix
                                      reshape bit pattern into such a matrix
                                      input the number of generations
'# '{              }⍣                 apply that many times, starting from '# '
               ⍉⍪⍉⍵                    make sure the argument is a matrix
                                      enclose
          \⍤1                         expand using rows of bit-pattern matrix
                                        (1 for identical copy, 0 for zeroed out)
     ⊃⍪/,/                             concat all horizontally and vertically

Provalo online!


11

Lisp comune, 248 242 byte

(lambda(n r g &aux(s(expt r g)))(labels((f(g x y s)(or(= g 0)(#2=multiple-value-bind(q x)(floor x s)(#2#(p y)(floor y s)(if(logbitp(+ q(* p r))n)(f(1- g)x y(/ s r))))))))(#3=dotimes(y s)(#3#(x s)(princ(if(f g x y(/ s r))"# ""  ")))(terpri))))

Ungolfed

(defun fractal (n r g &aux (s (expt r g)))
  (labels((f(g x y s)
            (or(= g 0)
               (multiple-value-bind (px x) (truncate x s)
                 (multiple-value-bind (py y) (truncate y s)
                   (and
                    (logbitp (+ px (* py r)) n)
                    (f (1- g) x y (/ s r))))))))
    (fresh-line)
    (dotimes(y s)
      (dotimes(x s)
        (princ
         (if (f g x y(/ s r))
             "# "
             "  ")))
      (terpri))))

Spiegazione

  • Ingresso:
    • N è il modello codificato
    • R è la dimensione del motivo
    • G è la generazione
  • L'output è una matrice quadrata implicita di lunghezza S = R G
  • Esaminiamo ogni riga y , colonna x (nidificata dotimes) e calcoliamo se ogni cella debba essere disegnata (approccio simile al raycasting). Questo viene fatto guardando ricorsivamente all'interno del frattale con la ffunzione ausiliaria.
  • Se il frattale in posizione (x, y) deve essere disegnato, stampa "# ", oppure stampa " ". Naturalmente stampiamo anche le nuove righe alla fine di ogni riga.

Ad esempio, il triangolo di Sierpinsky è rappresentato da S=7e R=2. Alla generazione 3 la dimensione quadrata è 2 3 = 8. Per ogni cella (x, y) , accade quanto segue:

  • fviene chiamato con x , y , g associato a 3 e s associato a 4 (8/2)
  • Tronciamo x per s , per sapere se x appartiene al lato sinistro o destro della matrice implicita. truncaterestituisce sia il quoziente che il resto, che sono associati rispettivamente a px e x (riutilizziamo lo stesso simbolo x , ma questo non è un problema).
  • Lo stesso vale per y che dà py e nuovo y .
  • In questo esempio, px e py possono essere 0 o 1 (perché il motivo è un quadrato di lunghezza 2). Essi identificano dove è (x, y) nel modello del frattale: quando il bit in posizione py.R + px di N è 0, x ed y rappresentano una posizione in cui non dovrebbe essere elaborato.
  • In caso contrario, dobbiamo "zoom" nella parte corrispondente del frattale e chiamare fin modo ricorsivo con le nuove associazioni per x e y . Quelli sono ora la posizione relativa all'interno del frattale interno. Passiamo G-1 per la generazione e s / 2 per rappresentare la mezza lunghezza del frattale.
  • Il caso base della ricorsione si incontra quando G è zero, nel qual caso la posizione corrente (x, y) dovrebbe essere disegnata.

Esempio

(fractal 186 3 3)

                          #                           
                        # # #                         
                          #                           
                    #     #     #                     
                  # # # # # # # # #                   
                    #     #     #                     
                          #                           
                        # # #                         
                          #                           
        #                 #                 #         
      # # #             # # #             # # #       
        #                 #                 #         
  #     #     #     #     #     #     #     #     #   
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
  #     #     #     #     #     #     #     #     #   
        #                 #                 #         
      # # #             # # #             # # #       
        #                 #                 #         
                          #                           
                        # # #                         
                          #                           
                    #     #     #                     
                  # # # # # # # # #                   
                    #     #     #                     
                          #                           
                        # # #                         
                          #                           

Il calcolo dell'ottava generazione del tappeto Sierpinski (fractal 495 3 8)richiede 24,7 secondi e genera un file di testo di output di 83 MB. Ho scritto una versione leggermente modificata che produce un'immagine. Per gli stessi parametri, il file GIF pesa 1,5 MB (stesso tempo di calcolo):

Tappeto di Sierpinsky, generazione 8

Vicsek (clicca per vedere le dimensioni originali):

Frattale di Vicsek


1
+1 per quello che sembra un programma conciso in un linguaggio orribilmente prolisso. 8 nidificati )di fila!
Level River St

@steveverrill Non vinco mai golf a codice ... ma comunque, penso che la sintassi ripaga per programmi più grandi. E onestamente, quasi non vedo più la parentesi, solo un bell'albero.
coredump,

Quell'immagine gif in realtà si blocca sul browser del mio telefono ... Grande golf con un linguaggio più insolito
Glenn Smith

@HiGuy Grazie. CodeGolf ha un badge per bloccare il browser di altre persone? Dovrebbe :-)
coredump

5

Pyth, 38 byte

VJ^UQvwjdm@" #".A@L_.[0^Q2jvz2+V*RQNdJ

Provalo online: suite di input / test regolari

La spiegazione segue in seguito.


1+ Sto ancora aspettando l'output di 186 3 5(interprete online), ma a parte questo sono davvero colpito da quanto sia breve.
coredump,

1
@coredump Non credo che otterrai un risultato così grande usando l'interprete online. Se vuoi provarlo, dovresti scaricare il compilatore Pyth . Ci vogliono circa 10 secondi sul mio laptop.
Jakube,

4

Ruby, 154

Il punteggio è solo per la funzione. Presentato sotto non ufficiale nel programma di test. L'unico golf che sto sostenendo al momento è la rimozione di commenti e rientri. Giocherò a golf più tardi. Al momento, mi sto divertendo a giocare con il programma.

La funzione accetta sei argomenti, ma sulla chiamata iniziale vengono forniti solo i primi 3 per specifica. Ciò fa sì che i tre argomenti rimanenti vengano impostati sui valori predefiniti, in particolare la stringa in acui è memorizzato l'output viene creata e inizializzata su linee di spazi terminate da newline. Come effetto collaterale $wviene anche creata la variabile globale , che indica il numero di simboli per riga.

Quando la funzione si chiama ricorsivamente, fornisce tutti e sei gli argomenti, tra cui la stringa ae le coordinate xey dell'angolo in alto a sinistra della ricorsione successiva

Il resto del programma è piuttosto semplice, come indicato nei commenti.

#function
f=->b,s,g,x=0,y=0,a=(' '*(-1+2*$w=s**g)+'
')*$w{                                         #accept arguments, if x,y,a are not provided create them. $w = number of symbols per row 
  v=s**g/s                                     #v=width of blocks for this recursion depth
  if g==0
    a[2*y*$w+2*x]=?#                           #if g==0 plot a #
  else                                         #else iterate s*s times through the bits of b, and recurse as necessary
    (s*s).times{|i|b>>i&1>0&&f.call(b,s,g-1,x+i%s*v,y+i/s*v,a)} 
  end
  a
}

#test program (requires 3 input numbers separated by newlines)
b=gets.to_i
s=gets.to_i
g=gets.to_i
#get return value and output to stdout
puts f.call(b,s,g)

Produzione

Ecco una serie di frattali vagamente basati sulla forma delle lettere della parola GOLF. È possibile ottenere lettere più realistiche con bitmap più grandi. Come mostra l'ultimo esempio, i frattali più interessanti vengono scoperti per caso.

63775,4,2 (G)

# # # # # # # # # # # # # # # #
#       #       #       #      
#     # #     # #     # #     #
# # # # # # # # # # # # # # # #
# # # #                        
#                              
#     #                        
# # # #                        
# # # #                 # # # #
#                       #      
#     #                 #     #
# # # #                 # # # #
# # # # # # # # # # # # # # # #
#       #       #       #      
#     # #     # #     # #     #
# # # # # # # # # # # # # # # #

495,3,3 (O, sierpinski carpet)

# # # # # # # # # # # # # # # # # # # # # # # # # # #
#   # #   # #   # #   # #   # #   # #   # #   # #   #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # #       # # # # # #       # # # # # #       # # #
#   #       #   # #   #       #   # #   #       #   #
# # #       # # # # # #       # # # # # #       # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
#   # #   # #   # #   # #   # #   # #   # #   # #   #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #                   # # # # # # # # #
#   # #   # #   #                   #   # #   # #   #
# # # # # # # # #                   # # # # # # # # #
# # #       # # #                   # # #       # # #
#   #       #   #                   #   #       #   #
# # #       # # #                   # # #       # # #
# # # # # # # # #                   # # # # # # # # #
#   # #   # #   #                   #   # #   # #   #
# # # # # # # # #                   # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
#   # #   # #   # #   # #   # #   # #   # #   # #   #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # #       # # # # # #       # # # # # #       # # #
#   #       #   # #   #       #   # #   #       #   #
# # #       # # # # # #       # # # # # #       # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
#   # #   # #   # #   # #   # #   # #   # #   # #   #
# # # # # # # # # # # # # # # # # # # # # # # # # # #

457,3,3 (L)

#                                                    
#                                                    
# # #                                                
#                                                    
#                                                    
# # #                                                
#     #     #                                        
#     #     #                                        
# # # # # # # # #                                    
#                                                    
#                                                    
# # #                                                
#                                                    
#                                                    
# # #                                                
#     #     #                                        
#     #     #                                        
# # # # # # # # #                                    
#                 #                 #                
#                 #                 #                
# # #             # # #             # # #            
#                 #                 #                
#                 #                 #                
# # #             # # #             # # #            
#     #     #     #     #     #     #     #     #    
#     #     #     #     #     #     #     #     #    
# # # # # # # # # # # # # # # # # # # # # # # # # # #

7967,4,2 (F)

# # # # # # # # # # # # # # # #
#       #       #       #      
# # # # # # # # # # # # # # # #
#       #       #       #      
# # # #                        
#                              
# # # #                        
#                              
# # # # # # # # # # # # # # # #
#       #       #       #      
# # # # # # # # # # # # # # # #
#       #       #       #      
# # # #                        
#                              
# # # #                        
#      

1879,3,3 (skull and crossbones discovered by accident)

# # # # # # # # # # # # # # # # # # # # # # # # # # #
  #     #     #     #     #     #     #     #     #  
#   # #   # #   # #   # #   # #   # #   # #   # #   #
      # # #             # # #             # # #      
        #                 #                 #        
      #   #             #   #             #   #      
# # #       # # # # # #       # # # # # #       # # #
  #           #     #           #     #           #  
#   #       #   # #   #       #   # #   #       #   #
                  # # # # # # # # #                  
                    #     #     #                    
                  #   # #   # #   #                  
                        # # #                        
                          #                          
                        #   #                        
                  # # #       # # #                  
                    #           #                    
                  #   #       #   #                  
# # # # # # # # #                   # # # # # # # # #
  #     #     #                       #     #     #  
#   # #   # #   #                   #   # #   # #   #
      # # #                               # # #      
        #                                   #        
      #   #                               #   #      
# # #       # # #                   # # #       # # #
  #           #                       #           #  
#   #       #   #                   #   #       #   #

3

CJam, 45

3aaq~@2b2$_*0e[W%@/a*{ffff*:.+:.+}/' ff+Sf*N*

Implementazione della mia prima idea. Provalo online

Fondamentalmente, inizia con una matrice 1 * 1 contenente 3 (la differenza tra '#' e ''), quindi moltiplica ripetutamente ogni numero nella matrice con il modello di bit (matrice 0/1) e combina le matrici risultanti in una matrice più grande. Alla fine, aggiunge uno spazio a ciascun numero e si unisce a spazi e newline.

2a idea, 49

q~@2bW%2$/z@@m*_,\_m*:z@f{3@@f{\~@==*}~' +}/Sf*N*

Provalo online

Questo genera tutte le coordinate della matrice di output come matrici di <conteggio di generazione> coppie di numeri più piccole del fattore di scala (tutte tali combinazioni), quindi per ogni coppia di numeri ottiene il bit corrispondente dal modello e per ciascun array di coordinate moltiplica i bit e si moltiplica per 3. L'elaborazione finale è la stessa.

Probabilmente c'è spazio per più golf.


2

C, 316 byte

main(a,_,b,s,g,i,w,o,z,x,y)char**_,*o;{b=atoi(_[1]);s=atoi(_[2]);g=atoi(_[3]);w=1;for(i=0;i<g;++i){w*=s;}o=malloc(w*w);for(i=0;i<w*w;++i)o[i]=35;z=w/s;while(z){for(y=0;y<w;++y)for(x=0;x<w;++x)if(!((b>>((y/z)%s*s+(x/z)%s))&1))o[y*w+x]=32;z/=s;}for(y=0;y<w;++y){for(x=0;x<w;++x)printf("%c ",o[y*w+x]);printf("\n");}}

Un-giocato a golf:

#include <stdio.h>

int main(int argc, char *argv[]) 
{
    int bitpattern;
    int scale;
    int generation;

    bitpattern = atoi(argv[1]);
    scale = atoi(argv[2]);
    generation = atoi(argv[3]);

    int i;
    int width = 1;
    for (i=0; i<generation; ++i) {width*=scale;}

    char *out=malloc(width*width);

    for (i=0; i<width*width; ++i) out[i]='#';


    int blocksize = width/scale;
    for (i=0; i<generation; ++i) {
        int x,y;
        for (y=0; y<width; ++y) {
            for (x=0; x<width; ++x) {
                int localX = x/blocksize;
                localX %= scale;
                int localY = y/blocksize;
                localY %= scale;
                int localPos = localY*scale+localX;
                if (!((bitpattern>>localPos)&1))out[y*width+x]=' ';
            }
        }
        blocksize/=scale;
    }

    int x,y;
    for (y=0; y<width; ++y) {
        for (x=0; x<width; ++x)
            printf("%c ",out[y*width+x]);
        printf("\n");
    }
    return 0;
}

3
Secondo i punti elenco alla fine delle specifiche, è consentita una funzione anziché un programma. Cambiarlo in una funzione e passare semplicemente i tre parametri di input ad esso - questo eliminerebbe tutto ciò che atoi e risparmierebbe circa 40 byte.
Level River St

2

Scala 293 299

(e:Int,s:Int,g:Int)=>{def b(x:Int,y:Int)=(1<<x*s+y&e)>0;def f(n:Int):Seq[Seq[Char]]=if(n<1)Seq(Seq('#'))else if(n<2)Seq.tabulate(s,s)((i,j)=>if(b(i,j))'#'else' ')else{val k=f(n-1);val t=k.size;Seq.tabulate(t*s,t*s)((i,j)=>if(b(i/t,j/t))k(i%t)(j%t)else' ')};f(g).map(_.mkString(" ")).mkString(" \n")}

ungolfed:

//create an anonymous function
(encoded: Int, size: Int, generation: Int) => {

  // method will return true if coords (x,y) should be drawn as '#'
  def isBlackInPattern(x: Int, y: Int): Boolean = (1 << x * size + y & encoded) > 0

  // recurse until generation is 1
  def fillRecursively(gen: Int): Seq[Seq[Char]] = {

    // this is just to satisfy OP requirements.
    // if the stopping condition were generation = 1,
    // I could have spared this line...
    if(gen < 1) Seq(Seq('#'))

    //actual stopping condition (generation 1). 
    // fill a matrix of characters with spaces
    // and hashes acording to the pattern.
    else if(gen < 2) Seq.tabulate(size, size)((i, j) => 
      if (isBlackInPattern(i,j)) '#' 
      else ' '
    )

    // recurse, and use previously created fractals to fill
    // the current generation according to the `isBlackInPattern` condition
    else {
      val previousGeneration = fillRecursively(gen-1)
      val previousSize = previousGeneration.size
      // create the current matrix and fill it
      Seq.tabulate(previousSize*size,previousSize*size)((i,j)=>
        if(isBlackInPattern(i/previousSize,j/previousSize))
          previousGeneration(i%t)(j%t)
        else ' '
      )
    }
  }
  // call to recursive function and format matrix of characters to string
  fillRecursively(generation).map(_.mkString(" ")).mkString(" \n")
}

esempi:

val f = (e:Int,s:Int,g:Int)=>{def b(x:Int,y:Int)=(1<<x*s+y&e)>0;def f(n:Int):Seq[Seq[Char]]=if(n<1)Seq(Seq('#'))else if(n<2)Seq.tabulate(s,s)((i,j)=>if(b(i,j))'#'else' ')else{val k=f(n-1);val t=k.size;Seq.tabulate(t*s,t*s)((i,j)=>if(b(i/t,j/t))k(i%t)(j%t)else' ')};f(g).map(_.mkString(" ")).mkString(" \n")}
f: (Int, Int, Int) => String = <function3>

scala> println(f(495,3,3))
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # #       # # # # # #       # # # # # #       # # # 
#   #       #   # #   #       #   # #   #       #   # 
# # #       # # # # # #       # # # # # #       # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # # # # # # # #                   # # # # # # # # # 
#   # #   # #   #                   #   # #   # #   # 
# # # # # # # # #                   # # # # # # # # # 
# # #       # # #                   # # #       # # # 
#   #       #   #                   #   #       #   # 
# # #       # # #                   # # #       # # # 
# # # # # # # # #                   # # # # # # # # # 
#   # #   # #   #                   #   # #   # #   # 
# # # # # # # # #                   # # # # # # # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # #       # # # # # #       # # # # # #       # # # 
#   #       #   # #   #       #   # #   #       #   # 
# # #       # # # # # #       # # # # # #       # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # #

scala> println(f(7,2,5))
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   #   #   #   #   #   #   #   #   #   #   #   #   #   #   #   
# #     # #     # #     # #     # #     # #     # #     # #     
#       #       #       #       #       #       #       #       
# # # #         # # # #         # # # #         # # # #         
#   #           #   #           #   #           #   #           
# #             # #             # #             # #             
#               #               #               #               
# # # # # # # #                 # # # # # # # #                 
#   #   #   #                   #   #   #   #                   
# #     # #                     # #     # #                     
#       #                       #       #                       
# # # #                         # # # #                         
#   #                           #   #                           
# #                             # #                             
#                               #                               
# # # # # # # # # # # # # # # #                                 
#   #   #   #   #   #   #   #                                   
# #     # #     # #     # #                                     
#       #       #       #                                       
# # # #         # # # #                                         
#   #           #   #                                           
# #             # #                                             
#               #                                               
# # # # # # # #                                                 
#   #   #   #                                                   
# #     # #                                                     
#       #                                                       
# # # #                                                         
#   #                                                           
# #                                                             
# 

scala> println(f(18157905,5,2))
#       #                               #       # 
  #   #                                   #   #   
    #                                       #     
  #   #                                   #   #   
#       #                               #       # 
          #       #           #       #           
            #   #               #   #             
              #                   #               
            #   #               #   #             
          #       #           #       #           
                    #       #                     
                      #   #                       
                        #                         
                      #   #                       
                    #       #                     
          #       #           #       #           
            #   #               #   #             
              #                   #               
            #   #               #   #             
          #       #           #       #           
#       #                               #       # 
  #   #                                   #   #   
    #                                       #     
  #   #                                   #   #   
#       #                               #       # 

primo taglio, probabilmente si può giocare a golf un po 'più lontano ...


Ti manca uno spazio tra i tuoi #. Oltre a essere richiesto dalle specifiche, migliora davvero l'aspetto del tuo output.
Level River St

@steveverrill hai ragione. All'inizio non me ne accorsi. Ho modificato con una soluzione rapida. grazie :)
Gilad Hoch,

2

Matlab, 115 byte

Il kronprodotto Kronecker rende tutto molto più semplice:

function f(p,f,g);z=nan(f);z(:)=de2bi(p,f*f);x=3;for k=1:g;x=kron(x,z);end;disp([reshape([x;0*x],f^g,2*f^g)+32,''])

# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # #       # # # # # #       # # # # # #       # # # 
#   #       #   # #   #       #   # #   #       #   # 
# # #       # # # # # #       # # # # # #       # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # # # # # # # #                   # # # # # # # # # 
#   # #   # #   #                   #   # #   # #   # 
# # # # # # # # #                   # # # # # # # # # 
# # #       # # #                   # # #       # # # 
#   #       #   #                   #   #       #   # 
# # #       # # #                   # # #       # # # 
# # # # # # # # #                   # # # # # # # # # 
#   # #   # #   #                   #   # #   # #   # 
# # # # # # # # #                   # # # # # # # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # #       # # # # # #       # # # # # #       # # # 
#   #       #   # #   #       #   # #   #       #   # 
# # #       # # # # # #       # # # # # #       # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 

Tuttavia de2bifunziona solo se si dispone della Casella degli strumenti dei sistemi di comunicazione. Non funziona senza di essa. Avrebbe bisogno dec2bin.
Tom Carpenter,

Sembra che questa cassetta degli attrezzi sia inclusa nella mia versione standard per studenti, quindi penso che sia accettabile. (Nota che de2binon è lo stesso di dec2bin.)
flawr,

2

C, 158 byte

f(p,s,g,h,i,j,c){for(j=1;g--;j*=s);for(h=j;h;){h--;for(i=j;i;){i--;for(c=35,g=j/s;g;g/=s)c=!((p>>((h/g)%s*s+(i/g)%s))&1)?32:c;printf("%c ",c);}printf("\n");}}

1

K5, 70 byte

È un inizio:

{,/'("  ";"# ")$[z;(z-1){,/'+,/'+x@y}[(0*t;t)]/t:(2#y)#|(25#2)\x;,,1]}

In azione:

{,/'("  ";"# ")$[z;(z-1){,/'+,/'+x@y}[(0*t;t)]/t:(2#y)#|(25#2)\x;,,1]}[186;3]'!4
(,"# "
 ("  #   "
  "# # # "
  "  #   ")
 ("        #         "
  "      # # #       "
  "        #         "
  "  #     #     #   "
  "# # # # # # # # # "
  "  #     #     #   "
  "        #         "
  "      # # #       "
  "        #         ")
 ("                          #                           "
  "                        # # #                         "
  "                          #                           "
  "                    #     #     #                     "
  "                  # # # # # # # # #                   "
  "                    #     #     #                     "
  "                          #                           "
  "                        # # #                         "
  "                          #                           "
  "        #                 #                 #         "
  "      # # #             # # #             # # #       "
  "        #                 #                 #         "
  "  #     #     #     #     #     #     #     #     #   "
  "# # # # # # # # # # # # # # # # # # # # # # # # # # # "
  "  #     #     #     #     #     #     #     #     #   "
  "        #                 #                 #         "
  "      # # #             # # #             # # #       "
  "        #                 #                 #         "
  "                          #                           "
  "                        # # #                         "
  "                          #                           "
  "                    #     #     #                     "
  "                  # # # # # # # # #                   "
  "                    #     #     #                     "
  "                          #                           "
  "                        # # #                         "
  "                          #                           "))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.