Faça um círculo unitário centrado na origem. Em dois quadrantes vizinhos , espelhe a curva do círculo através das linhas que conectam as intercepções x e y do círculo.
Com a forma resultante, você pode colocar o plano em mosaico:
Eu fiz essa imagem com a incrível sandbox de física 2D Algodoo !
Escreva um programa que produza uma imagem semelhante a esta em algum formato comum de arquivo de imagem sem perdas. Você pode salvar a imagem como um arquivo com o nome de sua escolha ou pode simplesmente exibi-la. Nenhuma entrada deve ser tomada.
Regras:
A imagem inteira deve ser dividida em mosaico com os ladrilhos de círculo modificado usando duas cores RGB visualmente distintas: uma para os ladrilhos apontando verticalmente e outra para os ladrilhos apontando horizontalmente.
O raio dos ladrilhos do círculo deve ser de pelo menos 32 pixels. (O raio da imagem acima é de cerca de 110 pixels.)
A imagem deve ter pelo menos 4 peças de largura e 4 peças de altura. Isso, combinado com a regra acima, significa que as imagens podem ter um tamanho mínimo de 256 × 256 pixels. (A imagem acima é de 4 peças por 4 peças).
O mosaico pode ser traduzido por qualquer valor. Por exemplo, o canto superior esquerdo da imagem não precisa ser o vértice onde os blocos se encontram. (O mosaico não deve ser girado, no entanto.)
Você pode usar bibliotecas gráficas externas que possuem comandos para desenhar círculos e gerar imagens e similares.
As curvas realmente devem aproximar os círculos, como pode ser feito com o algoritmo do círculo do ponto médio , o que a maioria das bibliotecas gráficas fará por você.
A suavização de serrilhado nas bordas dos ladrilhos é permitida, mas não necessária.
O menor envio em bytes vence.
fonte
0.1
e um deslocamento do0.001
disco é inclinado em $ \ phi = \ arctan (0,01) = 0,57 ° $, olhando de cima os discos aparecem pressionados por um fator de $ \ cos (\ phi) = 0,99995 $, isso é muito menos que um pixel.camera{orthographic location -9z}
. Mas como a cena é basicamente 2D, não faz diferença, você pode renderizá-la com uma visualizaçãoangle 170
sem distorção no olho de peixe no resultado.Gnuplot, 182
Percebi que os limites entre as células parecem muito sinusoidais, então procurei uma solução analítica com uma equação central muito simples
Embora pareça semelhante, os círculos são quadrados demais. Com a mesma idéia, substituo
sin
por uma curva feita de arcos quadricíclicos concatenados e giro-a 45 ° substituindox
ey
comx+y
ex-y
fonte
Livre de Contexto, 99 bytes
Você pode ver o resultado na Galeria livre de contexto .
fonte
HTML + JavaScript, 277
Para testar, salve como arquivo html e abra com um navegador. Ou então, execute o trecho
Devido à demanda popular, aqui está a imagem de saída. Afinal, não é tão emocionante ...
fonte
=>
muitas postagens e só funcionava no Firefox. Mas não se preocupe.IDL 8.3,
201193183 bytesA imagem é enviada para uma janela gráfica IDL; Tirei uma captura de tela, abaixo.
EDIT: graças a @AlexA. e @ Sp3000, por me ajudar a raspar alguns bytes
fonte
Mathematica: 86 bytes (ou 82 bytes)
Graças ao infinito @alephalpha por um método inteligente baseado em array:
Dentro da matriz há uma função anônima, que usa um truque inteligente para adicionar seus argumentos (
+##
) e determinar se a soma é ímpar. Esse booleano é usado como condicional a um padrão que substitui todo o bloco 'branco' pelo bloco 'preto' transformado. A partir daí,ArrayFlatten
junta os ladrilhos e osImage
exibe.Observe o uso do menor
Thread
para substituirTranspose
. Ainda podemos salvar 4 bytes usando o símbolo de transposição.Anterior: 97 bytes (ou 90 bytes)
Você pode reduzir o número de bytes substituindo pelo
Transpose@#
símbolo sobrescrito-t (ponto de código U + F3C7, atalho ESCtr
ESC). No UTF-8, o total é de 90 bytes em 88 caracteres .Começamos com
DiskMatrix
, o que gera uma matriz binária:Em seguida, deslocamos circularmente as linhas da matriz para produzir a célula unitária para o lado a lado:
Se o avião é um tabuleiro de xadrez, esses são os quadrados 'brancos'. Para os quadrados "pretos", precisamos inverter as cores e girar 90 graus. Podemos inverter subtraindo de 1 (
1 - 1 -> 0
e1 - 0 -> 1
) e girando assumindo a transposição:Se as dimensões da imagem forem pares (como o tamanho mínimo, 4), um bloco na borda direita será o mesmo que o próximo na borda esquerda. No entanto, adicionar um bloco para obter um tamanho ímpar (5) e concatenar as linhas produz um padrão alternado regular.
Isso sugere que podemos obter a imagem completa envolvendo uma única linha de blocos alternados
Partition
. UsamosTable
para fazer uma lista de13
pares de ladrilhos preto / branco eJoin
achatar a lista de pares para uma lista de 26 ladrilhos. Em seguida,Partition
a lista em um5
por5
matriz de azulejos (Partition
devoluções da fuga 26 th telhas):Finalmente,
ArrayFlatten
transforma a matriz de matrizes de mosaico em uma matriz plana eImage
exibe o resultado.Anterior: 111 bytes
fonte
Image@ArrayFlatten@Array[RotateLeft[DiskMatrix@32,32]/.a_/;OddQ[+##]:>1-Thread@a&,{5,5}]
Java,
550540508504 bytesEste é um applet java.
Expandido com clichê:
Applet: um pequeno programa de aplicativo que pode ser chamado para uso enquanto estiver trabalhando em outro aplicativo.
Imagem de exemplo:
Explicação:
Isso funciona usando um método para imprimir cada bloco. Antes da criação do método, ele recebe um objeto gráfico que usa um sistema de coordenadas centralizado no canto superior esquerdo de cada bloco:
Para criar um bloco, usamos o seguinte método:
No entanto, todos os outros ladrilhos devem ser refletidos horizontalmente para produzir a imagem correta.
Para refletir um bloco, simplesmente modificamos o
graphics
objeto fornecido com este código:Obrigado @CoolGuy por 4 bytes.
fonte
x
ey
como campos da classe:int a = 98, b = 49,x,y;
Mathematica
299256Wordy, mas foi bom descobrir.
O bloco básico é r (mostrado abaixo), que é uma região exibida pelo RegionPlot. Uma reflexão esquerda-direita do bloco é feita e unida a r. A figura montada de dois ladrilhos é então repetida para ladrilhar o espaço.
fonte
C,
237209180 bytes180 bytes. Esta versão inclui as alterações sugeridas por edc65 em um comentário. Emite 9 avisos do compilador ao criar em um Mac com clang e opções padrão:
209 bytes, usando algumas sugestões de comentários de Martin. Compila sem avisos com clang:
Versão original, 237 bytes:
Resultado (256x256):
Código original com espaço em branco para melhor legibilidade:
Isso não usa nenhuma biblioteca de gráficos, a renderização está completamente contida no código.
A idéia básica é simplesmente fazer um loop sobre todos os 256x256 pixels e ver se eles estão dentro / fora do arco circular do sub-quadrado 32x32 em que estão. Os 5 bits inferiores das coordenadas gerais de pixel definem as coordenadas relativas do pixel dentro o sub-quadrado. O teste interno / externo de
(x, y)
estar dentro do arco com raior
é o padrão:A maior parte da lógica é colocar o centro do arco no canto correto do sub-quadrado e determinar qual cor está dentro / fora.
Alguns comentários sobre a solução:
fonte
int a,b,c,d,x,y;
... Acho que você pode até fazermain(a,b,c,d,x,y)
isso. Lembro-me de algo que o tipo padrão é int. Depois de se livrar disso, você pode mover as atribuições para d, x e y para afor
instrução de incremento do interior , comod=c+32&64,...,++c
(provavelmente até mover++
para outro lugar onde você menciona dec
qualquer maneira), e então pode omitir os colchetes de o interiorfor
. Bom trabalho, btw! :)main()
seja compatível com o padrão. Eu certamente deveria agrupar as declarações. E mover os incrementos também economizará alguns bytes. Oputs()
para a nova linha está no loop externo, então não tenho certeza se posso me livrar dos aparelhos.stdio
não é necessário, use a declaração de função padrão.int
é padrão para globais e pode ser omitido (variáveis e principal). Primeiroputs
pode entrar no for. c var não é usado dentro do loop interno; portanto, aumente a condição. 180:a,b,c,d,x,y;main(){for(puts("P1 256 256");b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c++<256;)putchar(48+(x*x+y*y<962^b==d));puts("");}}
(compila com muitos avisos, mas runs)