O pequeno Chandler está triste. Desenhe uma nuvem para animá-lo.
Nota: Desenhar uma nuvem não vai animá-lo.
Um círculo pode ser definido como uma tupla de 3, (x,y,r)
onde x
é a posição x do círculo em um plano cartesiano, y
é a posição y do círculo em um plano cartesiano e r
é o raio do círculo. x
e y
pode ser negativo. r
é sempre positivo. A entrada é uma lista de círculos na forma de três tuplas separadas por espaço. Por exemplo:
3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8
Os 3,1,1
meios "Um círculo com ponto central 3,1
com 1 raio. 3,2,1.5
Significa" Um círculo com ponto central 3,2
com 1,5 raio.
Se desenharmos todos esses círculos da entrada em um gráfico, será assim (incluí linhas e rótulos de grade apenas para maior clareza; eles não são necessários):
Observe como todos os círculos são coesos . Ou seja, todos eles se sobrepõem, formando um grande grupo sem pequenos grupos de círculos separados do resto. A entrada é garantida para ser coesa.
Suponha que agora desenhemos uma linha que viaja ao redor da "borda" formada por esses círculos, sem nenhuma das outras linhas. Seria como desenhar a borda da silhueta formada por todos os círculos. A nuvem resultante ficaria assim:
Portanto, essa nuvem foi formada desenhando apenas os arcos dos círculos na entrada que formam uma borda, resultando em uma única forma. Em outras palavras, a nuvem é formada apenas desenhando os arcos que não estão dentro de outro círculo. Seu programa terá entrada na forma explicada acima e saída uma imagem que exibe a nuvem resultante. A forma geral da nuvem deve estar correta, mas a escala, a cor, a espessura da linha e a aparência dos vértices dependem de você. Observe que a nuvem deve estar visível; portanto, não é possível extrair algo como "Este programa desenha uma nuvem branca em fundo branco", "Este programa desenha uma nuvem em uma escala infinitesimalmente pequena", "Este programa desenha uma nuvem com 0 espessura da linha ", etc. Observe também que a cor da borda deve ser diferente da cor do preenchimento ou do plano de fundo.
Outro exemplo. Entrada:
1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7
Resultado:
Se houver um "buraco" na nuvem, você deve desenhá-lo também. Entrada:
0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4
Resultado:
Aqui está uma regra importante: seu programa deve desenhar apenas as linhas que formam a borda. Isso significa que você NÃO PODE simplesmente desenhar os círculos completamente e, em seguida, desenhar os círculos um pouco menores com um preenchimento branco - porque esse método ainda desenha linhas que não formam uma borda, apenas as cobre posteriormente. O objetivo da regra era impedir as implementações "desenhe os círculos e desenhe os círculos novamente com um preenchimento branco", ou qualquer coisa semelhante a isso. Espera-se que a resposta realmente calcule onde desenhar as coisas antes de desenhá-las.
Isso é código de golfe, portanto, a menor contagem de caracteres vence.
fonte
Respostas:
Mathematica
177 126 121119Resolução por regiões de disco: a abordagem do matemático
A lógica é
Essa é precisamente a abordagem adotada abaixo. Produziu as 3 figuras acima.
A região implícita nº 1 é a união dos círculos. A região implícita nº 2 é a união dos discos dentro dos círculos. A diferença deles é a fronteira.
Resolução por regiões de disco: a abordagem do engenheiro (119 caracteres)
A seguir, é feita a união das regiões do disco, discretiza essa região e encontra seu limite. Os pontos no diagrama demarcam os intervalos da malha de Delaunay. Exibimos a região discretizada abaixo para destacar o objeto que fornece o limite de interesse (o contorno da nuvem).
"3,1,1 3,2,1,5 1,2,0,7 0,9,1,2,1,2 1,0,0,8"
O limite da região é discretizado.
Resolução por detecção de bordas: a abordagem do fotógrafo - 121 caracteres
Desenha os discos em preto, rasteriza a imagem, detecta as bordas e inverte em preto e branco.
fonte
RegionBoundary@DiscretizeRegion@RegionUnion[{#,#2}~Disk~#3&@@@ToExpression[#~s~","]&@s@InputString[s=StringSplit]]
s=StringSplit
interior do prompt? Tente movê-lo para a frente novamente, ainda deve ser mais curto que a sua versão atual.T-SQL
23523422921217173 bytesIsso faz uso da funcionalidade espacial no SQL Server 2012+. Quando é executado no SSMS (SQL Server Management Studio), produz um painel de resultados espaciais.
A entrada é da variável @i. Eu poderia reduzir ainda mais se a entrada pudesse ser retirada de uma tabela.Como a entrada da tabela agora é permitida.
Deixei a solução anterior abaixo.
Editar : Remover o espaço perdido, o superávit em e subconsulta
171: Criação de tabela substituída por CTE e @s por @.
Divisão do SQL dinâmico
fonte
'A' has fewer columns than were specified in the column list
DECLARE @i VARCHAR(100) = '1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7'
. Infelizmente, não posso testar em que momento e SQLfiddle não está jogando bem para 2012.Mathematica,
175158149 bytesLembro-me da discussão na sandbox que essa abordagem deveria ser válida, mas não tenho certeza de como ela se encaixa na nova redação das regras, então, @Lilac, deixe-me saber se você acha que isso viola as regras.
Basicamente, estou criando uma condição lógica que é verdadeira para todos os pontos dentro da nuvem e falsa para todos os pontos fora dela. Estou alimentando o
RegionPlot
que, então, renderiza a região de todos os pontos em que a expressão estáTrue
e um contorno em torno dela.Ungolfed:
fonte
ImplicitRegion
localiza automaticamente os valores x e y adequados para plotagem. 122 caracteres:s = StringSplit; RegionPlot@ ImplicitRegion[ Or @@ (((x - #)^2 + (y - #2)^2 < #3^2) & @@@ (ToExpression[#~s~","] &@(s@InputString[]))), {x, y}]
RegionPlot
. Até agora),AspectRatio-> 1
traz o código de volta para 149 bytes, exatamente onde está agora.Python 3,3 (
183177164160 bytes)Ele requer um console de 80 caracteres, que eu sei que é o padrão no Windows. Funciona melhor se o seu console tiver uma fonte quadrada. Aqui estão alguns trechos de algumas das entradas de teste.
Original:
Outro:
Orifício:
fonte
Python -
253249215199Este é um anúncio para a impressionante biblioteca bem torneada , cujas operações de geometria tornaram a solução da tarefa simples, desenhando o (s) contorno (s) da união de círculos sobrepostos (= pontos em buffer):
Resultado:
Editar% s):
sys.argv[1:]
porraw_input().split()
, salvando umimport sys
k={'color':'k'}
Luxo removido , substituídosavefig
porshow
map(float,s.split(','))
poreval(s)
fonte
Python - 535
fonte
from math import*
removendo espaços não selecionados, usando apenas nomes de variáveis de uma letra, usando a compreensão da lista (por exemplo,cc=[z for z in a if z!=a2 and (z[0]…)]
). Veja também as dicas para jogar golfe no Python .a2
.Python -
296249231223212O crédito vai para @ richard-green (foi dada permissão) para a solução original, eu a reduzi um pouco.
fonte
pylab
vez dematplotlib.pyplot
.from pylab import *
, ainda seria capaz de ligarshow()
escatter()
sem referências?[eval(i)for i in raw_input().split()]
como aseval
transformações do python1,2,3
em uma tupla. É claro que você também precisará alterar o[x,y,r]
para a(x,y,r)
.JavaScript (E6) + HTML 322
JSFiddle
Cada círculo é subdividido em cerca de 100 pequenos arcos e cada arco é desenhado se o seu ponto médio não estiver dentro de nenhum dos outros círculos.
fonte
Python 274 bytes
Isso recebe a entrada do stdin e verifica todos os pontos da tela, desenhando os pixels um a um conforme o andamento. Não é exatamente eficiente, mas segue todas as regras.
Observe que a exibição do pygame terminará assim que o desenho estiver concluído. Eu não tinha certeza se deveria incluí-lo como parte da minha resposta, mas para visualizá-lo, você pode
raw_input
inserir um no final ou adicionar um pequeno loop, se desejar. deseja impedir que o sistema operacional se queixe de não responder e assim:Imagens de exemplo:
1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7, 1,2,0.7
0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4
fonte
Perl - 430
Grava um arquivo pbm no stdout.
Imagem de teste (convertida em png):
fonte