Gere fractais a partir de padrões de bits em ASCII

34

visão global

Escreva um programa que imprima padrões simples de fractal, com um padrão de bits que codifica o fractal, mais o fator de escala por geração do fractal e o número de gerações.

Explicação

Aqui está uma representação ASCII do tapete Sierpinski :

Geração 0:

# 

Geração 1:

# # # 
#   # 
# # # 

Geração 2:

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

A geração n + 1 do tapete ASCII Sierpinski é composta de uma grade 3x3 contendo 8 cópias da geração n, com o elemento central da grade ausente.

Portanto, como é definido usando uma grade 3x3 e fica 3 vezes maior em largura e altura a cada geração, podemos dizer que possui um fator de escala de 3.

Poderíamos definir um padrão de bits para o tapete de Sierpinski numerando os elementos na grade 3x3 de 0 a 8, de cima para baixo, da esquerda para a direita e definindo o bit correspondente de um número inteiro se a geração n + 1 contiver um cópia da geração n nessa posição da grade:

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

Para um fator de escala de 2, o padrão de bits seria organizado assim:

0 1
2 3

e assim por diante.

Sua tarefa é escrever um programa que aceite um padrão de bits dessa forma, um fator de escala (por exemplo, 3 para o tapete Sierpinski) e um número de geração e que produza um fractal ASCII.

Entrada

Seu programa deve aceitar três números inteiros na seguinte ordem: um padrão de bits, um fator de escala (variando de 2 a 5, inclusive) e uma contagem de geração (variando de 0 a 5, inclusive).

Você não precisa executar nenhuma validação de entrada nesses valores e é perfeitamente aceitável se o programa funcionar com valores maiores que os intervalos especificados.

As entradas podem ser passadas de qualquer forma (tuplas, lista separada por vírgula / espaço, etc.)

Saída

O programa deve gerar um fractal composto pelo #caractere seguido por um espaço nas posições em que o fractal é definido, espaços duplos onde não está e um caractere de nova linha no final de cada linha, imprimindo-os ou retornando uma string de uma função.

Exemplos

Entrada:

495,3,3

Saída (geração 3 do tapete Sierpinski):

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

Entrada:

7,2,5

Saída ( triângulo de Sierpinski ):

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

Entrada:

325,3,3

Saída ( Poeira Cantor ):

#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 



#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 









#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 



#   #       #   #                   #   #       #   # 

#   #       #   #                   #   #       #   # 

Entrada

186,3,3

Saída ( fractal Vicsek ):

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

Entrada:

279,3,3

Saída (exemplo de um fractal assimétrico):

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

etc.

Notas:

  • Isso é então a resposta mais curta em bytes vence
  • Seu programa pode ser autônomo ou uma função chamada com os 3 parâmetros de entrada e retorna (ou imprime) uma string
  • A geração 0 é definida como #(a #seguida por um espaço), mesmo para um padrão de bits 0.
  • Uma nova linha à direita na última linha é opcional, mas permitida, assim como qualquer quantidade de espaço em branco à direita em cada linha.
samgak
fonte
3
+1, gostei disso na sandbox e mais aqui, com o símbolo alterado de "##"para "# ". Vejo que um espaço à direita no final da linha está incluído em seus exemplos, é necessário? . Pela última regra, eu diria que é opcional, mas o fato de você precisar de um espaço à direita para a geração 0 me faz pensar. Também acho que você deve indicar o espaço em branco máximo e as novas linhas (você o tem no plural) permitido. Como exemplo extremo, eu sempre poderia começar com uma matriz de 5 ^ 6 = 15625 linhas de 2 * 5 ^ 6 espaços e depois substituir #s. Na maioria dos casos de entrada que é uma enorme quantidade de espaço em branco não utilizado
Nível River St
@steveverrill Não preciso do espaço à direita na saída da geração 0, no entanto, o espaço à direita faz parte de sua definição, da qual as gerações subseqüentes são definidas em termos de. O plural de novas linhas era um erro de digitação, corrigido.
Samgak 11/08/2015
Você poderia postar a saída esperada para algo menos simétrico, como 279,3,3?
Aditsu
@aditsu com certeza, veja a pergunta editada
samgak 11/11

Respostas:

4

APL (Dyalog Unicode) , SBCS de 37 bytes

'# '{⊃⍪/,/⍺\⍤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

Experimente online!

ngn
fonte
11

Lisp comum, 248 242 bytes

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

Explicação

  • Entrada:
    • N é o padrão codificado
    • R é o tamanho do padrão
    • G é a geração
  • A saída é uma matriz quadrada implícita de comprimento S = R G
  • Nós iteramos sobre cada linha y , coluna x (aninhada dotimes) e calculamos se cada célula deve ser desenhada (abordagem semelhante à transmissão de raios). Isso é feito olhando recursivamente dentro do fractal com a ffunção auxiliar.
  • Se o fractal na posição (x, y) deve ser desenhado, imprima "# "ou imprima " ". É claro que também imprimimos novas linhas no final de cada linha.

Por exemplo, o triângulo de Sierpinsky é representado por S=7e R=2. Na geração 3, o tamanho do quadrado é 2 3 = 8. Para cada célula (x, y) , acontece o seguinte:

  • fé chamado com x , y , g vinculado a 3 e s vinculado a 4 (8/2)
  • Truncamos x por s , para saber se x pertence ao lado esquerdo ou direito da matriz implícita. truncateretorna o quociente e o restante, que são vinculados respectivamente a px e x (reutilizamos o mesmo símbolo x , mas isso não é um problema).
  • O mesmo vale para y, que fornece py e y novo .
  • Neste exemplo, px e py podem ser 0 ou 1 (porque o padrão é um quadrado de comprimento 2). Eles identificam onde está (x, y) no padrão fractal: quando o bit na posição py.R + px de N é 0, x e y representam uma posição na qual nada deve ser desenhado.
  • Caso contrário, devemos "ampliar" a parte correspondente do fractal e chamamos frecursivamente com as novas ligações para x e y . Essas são agora a posição relativa dentro do fractal interno. Passamos G-1 para a geração es / 2 para representar a metade do comprimento do fractal.
  • O caso base da recursão é encontrado quando G é zero, nesse caso a posição atual (x, y) deve ser desenhada.

Exemplo

(fractal 186 3 3)

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

O cálculo da 8ª geração do tapete Sierpinski usando (fractal 495 3 8)leva 24,7 segundos e gera um arquivo de texto de saída de 83 MB. Eu escrevi uma versão ligeiramente modificada que gera uma imagem. Para os mesmos parâmetros, o arquivo GIF pesa 1,5 MB (o mesmo tempo de computação):

Tapete de Sierpinsky, geração 8

Vicsek (clique para ver o tamanho original):

Fractal de Vicsek

coredump
fonte
1
+1 para o que parece ser um programa conciso em uma linguagem horrivelmente detalhada. 8 aninhados )em uma fileira!
Level River St
@steveverrill Eu nunca ganho código de golfe ... mas ainda assim, acho que a sintaxe compensa para programas maiores. E honestamente, quase não vejo parênteses, apenas uma bela árvore.
Coredump
Essa imagem gif realmente falhas no navegador do meu telefone web ... Grande golfe com uma linguagem mais incomum
Glenn Smith
@HiGuy Thanks. O CodeGolf tem um distintivo para travar o navegador de outras pessoas? Deve :-)
coredump
5

Pitão, 38 bytes

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

Experimente on-line: Conjunto regular de entrada / teste

A explicação segue depois.

Jakube
fonte
1+ Ainda estou esperando a saída de 186 3 5(intérprete on-line), mas, além disso, estou realmente impressionado com o quão curto isso é.
Coredump
1
@ Coredump Eu não acho que você obterá uma saída tão grande usando o intérprete online. Se você quiser testá-lo, precisará baixar o compilador Pyth . Demora cerca de 10 segundos no meu laptop.
Jakube 11/08/15
4

Ruby, 154

A pontuação é apenas para a função. Apresentado não-destruído abaixo no programa de teste. O único golfe que estou reivindicando no momento é a remoção de comentários e recuos. Mais tarde vou jogar golfe. No momento, estou me divertindo brincando com o programa.

A função recebe seis argumentos, mas na chamada inicial apenas os três primeiros são fornecidos por especificação. Isso faz com que os três argumentos restantes sejam configurados com os valores padrão e, em particular, a cadeia de caracteres em aque a saída está armazenada é criada e inicializada para linhas de espaços terminadas por novas linhas. Como efeito colateral, a variável global $wtambém é criada, indicando o número de símbolos por linha.

Quando a função se chama recursivamente, ela fornece todos os seis argumentos, incluindo a string ae as coordenadas x e y do canto superior esquerdo da próxima recursão

O restante do programa é bem direto, conforme indicado nos comentários.

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

Saída

Aqui está um conjunto de fractais vagamente baseado na forma das letras da palavra GOLFE. Cartas mais realistas poderiam ser obtidas com bitmaps maiores. Como mostra o último exemplo, os fractais mais interessantes são descobertos por acidente.

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)

# # # # # # # # # # # # # # # # # # # # # # # # # # #
  #     #     #     #     #     #     #     #     #  
#   # #   # #   # #   # #   # #   # #   # #   # #   #
      # # #             # # #             # # #      
        #                 #                 #        
      #   #             #   #             #   #      
# # #       # # # # # #       # # # # # #       # # #
  #           #     #           #     #           #  
#   #       #   # #   #       #   # #   #       #   #
                  # # # # # # # # #                  
                    #     #     #                    
                  #   # #   # #   #                  
                        # # #                        
                          #                          
                        #   #                        
                  # # #       # # #                  
                    #           #                    
                  #   #       #   #                  
# # # # # # # # #                   # # # # # # # # #
  #     #     #                       #     #     #  
#   # #   # #   #                   #   # #   # #   #
      # # #                               # # #      
        #                                   #        
      #   #                               #   #      
# # #       # # #                   # # #       # # #
  #           #                       #           #  
#   #       #   #                   #   #       #   #
Level River St
fonte
3

CJam, 45

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

Implementação da minha primeira ideia. Experimente online

Basicamente, ele começa com uma matriz 1 * 1 contendo 3 (a diferença entre '#' e ''), depois multiplica repetidamente cada número na matriz com o padrão de bits (matriz 0/1) e combina as matrizes resultantes em uma matriz maior. No final, ele adiciona um espaço a cada número e se junta a espaços e novas linhas.

Segunda ideia, 49

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

Experimente online

Isso gera todas as coordenadas da matriz de saída como matrizes de pares de números <contagem de geração> menores que o fator de escala (todas essas combinações); em seguida, para cada par de números, obtém o bit correspondente do padrão e para cada matriz de coordenadas multiplica os bits e multiplica por 3. O processamento final é o mesmo.

Provavelmente há espaço para mais golfe.

aditsu
fonte
2

C, 316 bytes

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

Sem golfe:

#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;
}
LambdaBeta
fonte
3
De acordo com os pontos no final da especificação, uma função é permitida em vez de um programa. Altere-o para uma função e apenas passe os três parâmetros de entrada para ele - isso eliminaria todas essas coisas de atoi e economizaria cerca de 40 bytes.
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")
}

exemplos:

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

primeiro corte, provavelmente pode ser jogado um pouco mais longe ...

Gilad Hoch
fonte
Está faltando um espaço entre cada um dos seus #. Além de ser exigido pelas especificações, ele realmente aprimora a aparência da sua saída.
Level River St
@steveverrill, você está certo. Eu não percebi isso no começo. Eu editei com uma solução rápida. obrigado :)
gilad hoch
2

Matlab, 115 bytes

O kronproduto Kronecker torna tudo muito mais fácil:

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,''])

# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # #       # # # # # #       # # # # # #       # # # 
#   #       #   # #   #       #   # #   #       #   # 
# # #       # # # # # #       # # # # # #       # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # # # # # # # #                   # # # # # # # # # 
#   # #   # #   #                   #   # #   # #   # 
# # # # # # # # #                   # # # # # # # # # 
# # #       # # #                   # # #       # # # 
#   #       #   #                   #   #       #   # 
# # #       # # #                   # # #       # # # 
# # # # # # # # #                   # # # # # # # # # 
#   # #   # #   #                   #   # #   # #   # 
# # # # # # # # #                   # # # # # # # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
# # #       # # # # # #       # # # # # #       # # # 
#   #       #   # #   #       #   # #   #       #   # 
# # #       # # # # # #       # # # # # #       # # # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
#   # #   # #   # #   # #   # #   # #   # #   # #   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # 
flawr
fonte
Embora de2bisó funcione se você tiver a Caixa de ferramentas do Communications Systems. Não funciona sem ele. Seria necessário dec2bin.
Tom Carpenter #
Parece que esta caixa de ferramentas está incluída na minha versão padrão do aluno, então acho que isso é aceitável. (Note que de2binão faz o mesmo que dec2bin.)
flawr
2

C, 158 bytes

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");}}
Neoheurista
fonte
1

K5, 70 bytes

É um começo:

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

Em ação:

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