Quem não ama um bom fractal? O tapete Sierpinski é um exemplo clássico de um fractal.
Para concluir esta tarefa, você precisará gerar um tapete do tipo e imprimir a imagem resultante no stdout
(veja o exemplo abaixo para formatação) , representando o tapete nivelado. Etapas podem ser encontradas neste artigo da Wikipedia .
Este valor será obtido stdin
ou equivalente.
Por exemplo, uma entrada de 4 produziria um tapete de nível 4:
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
Uma entrada de 3 produziria um tapete de nível 3:
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
Uma entrada de 2 produziria um tapete de nível 2:
■ ■ ■
■ ■
■ ■ ■
E uma entrada de 1 produziria um tapete de nível 1 (apenas um quadrado):
■
Observe os espaços entre as colunas.
A idéia é usar o caractere ■ para blocos e espaço para lacunas
A linha começa com o caractere ■.
Como sempre, a menor solução vence por contagem de caracteres (devido a caracteres não padrão).
Como alternativa, # pode ser usado em vez do caractere ■ em idiomas que não suportam Unicode.
Respostas:
CJam,
3837313028 caracteresBem, estamos contando por caracteres, então vamos descompactar Unicode:
Teste aqui. Basta colocar o nível desejado no campo de entrada.
Explicação
Após a conversão base, isso é
que é igual ao seguinte, apenas com o caractere Unicode escrito como
9632c
:Esse código é baseado na seguinte observação: se observarmos as coordenadas (x, y) de cada célula, obteremos uma célula vazia, sempre que ambos x e y têm um
1
na mesma posição na sua base de representação-3. Se você pensar bem, o padrão de repetição em pequena escala é o dígito base-3 significativo, então o dígito mais significativo governa a próxima repetição em escala maior e assim por diante.O conteúdo da matriz resultante é impresso automaticamente.
Agradecimentos a Dennis por eliminar três bytes.
fonte
#0<'■S
->#~S'■
salva 1 caractere.[1_]a#~
por3Yba&
.&
produz um valor de verdade / falsidade (ou mesmo que ele exista). Pode valer a pena um post nas dicas do CJam para a maneira canônica de testar se uma matriz contém algum elemento.Matlab
(113) (110) (99)(85)Você pode experimentá-lo aqui (será necessário substituir
input('')
pela entrada desejada).Agora 99 graças ao feersum! E agora com 85, graças à RTL!
Golfe:
Ungolfed:
Explicação:
Estou abusando do produto kronecker para esta tarefa. (É um produto especial definido para duas matrizes de tamanho arbitrário. Exemplo:
Então
Então, aqui está um exemplo para n = 5 (no método antigo de contagem é 4);
fonte
d=zeros(size([c,c]))
você deve usard=[c c]*0
.d
pode ser evitado por abusarkron
mais uma vez:disp(char(kron(c,[1,0])*3+32));
,Haskell,
114108fonte
Python - 100
fonte
Perl 5: 68 caracteres
n em stdin.
Uma representação ternária codificada decimal da lista de coordenadas é gerada primeiro
@,
(nome escolhido para que não haja espaço entre@,
efor
) usando os dígitos 0, 1 e 3. Agora, a adição de coordenadas xey no domínio decimal terá 2 no resultado se e somente se houvesse dois em posições correspondentes.//
é usado para propagar a variável padrão$_
do loop externo (for
) para a variável postmatch$'
quando é sombreada pelamap
variável padrão no loop interno.fonte
Java,
330283 CharactersParam é o tamanho que você deseja. A menos que haja uma otimização para o algoritmo, tentei esmagar tudo.
Graças a @StretchManiac, removendo o
i
método e limpando as declarações, conseguimos um pouco mais.Código legível
fonte
String[]a
, e se você estiver usando apenasi
uma vez, será melhor se livrar do método.""+s
no seup
método? São três caracteres extras para absolutamente nenhum propósito. Mesmo se o tipo des
coisa fosse alguma coisa além dissoString
, ainda seria completamente desnecessário.static void p(int s){System.out.print((char)s);}
e, principalmente, faça-oint s=35;
,s=32;
ep(10);
(em vez dep("\n");
) e salve mais alguns caracteres.Integer.valueOf
paranew Byte
Raquete
230229225220Não é a melhor hora para jogar golfe.
Golfe:
Ungolfed:
fonte
C:
123 118 111104 caracteresBaseado em uma idéia semelhante à minha solução perl. Depois de adicionar alguns espaços:
Usa um sistema ternário que codifica cada dígito com 2 bits. Os valores ilegais (com dois na posição ímpar) são filtrados por
x & (x>>1) & 0b01010101
. Ambas as coordenadas são armazenadas em um valor, portanto, a verificação da cor do pixel é reduzidax & (x >> 2 * n) & 0b01010101
.n
é armazenado como uma potência de 2 por conveniência.Editar
Substituído
define
por uma constante simplesm
.Editar 2
0x5555555
máscara pode ser representada com(1LL<<32)/3
, mas precisamos apenasn
desses bits, portanton/3
é suficiente.Editar 3
Pequenos ajustes. Um ganho de 2 caracteres dependendo do scanf ser executado antes do valor de carregamento
n
para a execução de--n
. O eol só pode seguir#
, duh.fonte
HTML / JavaScript, 205 caracteres
Obfuscatweet , 205 Chars
HTML / JS, 298 caracteres
Devido à forma como o HTML é reproduzido com espaço em branco, alguns caracteres tiveram que ser dedicados ao nbsp char. Além disso, a fonte padrão da maioria dos navegadores não é Courier, então eu tive que configurá-la para isso também. Aproximadamente 20 caracteres no estilo. Se isso requer um método de entrada direta, posso adicioná-lo, mas alterar a entrada atualmente está configurando n para um valor diferente.
Demo
HTML / JS legível
fonte
CJam,
38353231 caracteresExperimente online.
Exemplo de execução
Como funciona
converte a sequência Unicode da base 60.000 (
6e4b
) para a base 128 (128b
), lança para Character (:c
) e avalia a sequência resultante (~
).Como resultado, o seguinte código é executado:
fonte
Python 3 -
116113 caracteresEdição: Bem, usei o truque eu não gosto muito de mim e compactou o código por 3 bytes. Não sei se essa é a melhor maneira possível, mas eu vou com ela.
Pode conter alguns caracteres não imprimíveis, então aqui está uma versão imprimível da sequência.
Não é muito bom, mas pelo menos supera alguns idiomas.
O que se expande para:
De certa forma não-destruído, caso alguém não consiga ver como funciona:
fonte
Mathematica, 71 bytes
entrada
saída
fonte
CJam, 76 caracteres
Esta é uma tradução direta da fórmula dada aqui
Experimente aqui
fonte
Bash + coreutils, 105 caracteres unicode
Como contamos caracteres e não bytes:
Na sua forma decodificada:
Pure Bash, 143 bytes
A entrada é obtida dos argumentos da linha de comando:
Saída:
fonte
C #
Programa completo - 237:
LINQPad - 166 +
Math.Ceiling(Math.Log(a + 1) / Math.Log(10))
fonte
using System;class P{static void Main(string[]a){string g,h;for(int b=(int)Math.Pow(3,int.Parse(a[0])-1),c=-1,d,e,f;++c<b;Console.WriteLine(g))for(g="",d=0;d<b;g+=h)for(h="■",e=c,f=d++;e>0|f>0;e/=3,f/=3)h=e%3==1&f%3==1?" ":h;}}
( 229 bytes / 227 caracteres ) (■
= 3 bytes, para que você possa substituí-lo por#
para salvar 2 bytes também). Coloquei principalmente tudo dentro dos for-loops, para que não haja mais necessidade de colchetes.C - 154
Entrada de stdin. Tentei encontrar uma boa maneira de evitar uma função extra, mas não consegui encontrar nenhuma.
A contagem de caracteres inclui apenas os espaços necessários.
fonte
PHP, 194 caracteres
O
n
recebido como primeiro argumento na linha de comando.Legível
fonte
■
vez de#
, poderá salvar 2 caracteres removendo as aspas.Scala 230 caracteres
Código de golfe:
Código não destruído:
Somente espaços necessários estão incluídos.
fonte
V , 21 bytes (não concorrente)
Experimente online!
Hexdump:
V é mais recente que o desafio, portanto deve ser marcado como não concorrente. Ainda assim, é bom ver que essa resposta é muito menor do que todas as outras, mesmo quando contamos em bytes em vez de caracteres.
fonte
OK, 40 bytes
Experimente online.
Começa com
1
e depois desenha em uma grade(1 1 1;1 0 1;1 1 1)
, que desenha em uma grade da mesma maneira, etc. repetiu o número necessário de vezes.fonte
Python 2 , 91 bytes
Experimente online!
fonte
C # (.NET Core) , 162 bytes
Experimente online!
Degolfed
fonte
SOGL V0.12 , 27 bytes
Experimente aqui!
fonte
R , 92 caracteres
94 bytes com o caractere especial.
Experimente online!
fonte
Tela ,
171617 caracteresExperimente aqui!
-1: usado em
[
vez de{
excluir o primeiro;
dentro do loop.+1: Corrigido comportamento errôneo:
■
agora corresponde ao nível 1, conforme especificado na postagem original.fonte
■
ser multibyte. Diz isso na parte inferior da postagem original.Pip
-S
, 30 caracteresExperimente online!
A idéia básica: considere uma grade de coordenadas na base 3. Os furos no tapete ocorrem onde 1) é um trit na coordenada x
1
e 2) o trit na mesma posição na coordenada y também1
.Solução semelhante, mesmo número de caracteres, mas -2 bytes:
{2N({aTB3R2i}MSg)?s'■}MC3**a/3
fonte
K (ngn / k) , 50 bytes
obrigado @DLosc por me lembrar que eu deveria exibir espaços entre as colunas
Experimente online!
fonte