Este é o segundo de dois desafios sobre "puxar funções esticadas". Aqui está a parte I mais simples .
Vamos colocar m pregos em uma placa nas posições (x 1 , y 1 ) a (x m , y m ) . Amarre um elástico ao primeiro e ao último deles e estique-o em volta das outras unhas, de modo que a banda atravesse todas as unhas em ordem. Observe que o elástico agora descreve uma função parametrizada linear por partes (x (t), y (t)) no espaço 2D.
Agora, introduza mais n pregos no quadro, nas posições (x 1 , y 1 ) a (x n , y n ) . Se agora remover todos os originais m unhas , exceto a primeira e última (que as extremidades da borracha está ligada a), o elástico vai encurtar até que ele está mentindo esticada em torno dos pregos novos, produzindo outra linear por partes função.
Como exemplo, faça m = 12 pregos iniciais nas posições (0, 0), (2, -1), (3/2, 4/3), (7/2, 1/3), (11/2, 16/3), (1, 16/3), (0, 1), (7, -2), (3, 4), (8, 1), (3, -1), (11, 0) , e n = 10 pregos adicionais nas posições (1, 1), (3, 1), (4, 4), (1, 3), (2, 2), (5, -1), (5, 0 ), (6, 2), (7, 1), (6, 0) . Os três gráficos seguintes mostram o processo descrito acima:
Para versão maior: Clique com o botão direito do mouse -> Abrir em uma nova guia
E aqui está uma animação do aperto do elástico se você tiver alguma dificuldade para visualizá-lo:
O desafio
Dadas duas listas de "pregos", trace o elástico esticado em torno da segunda lista, se ele começar com a forma que atravessa todas as unhas da primeira lista.
Você pode escrever um programa ou função e receber entradas via STDIN, ARGV ou argumento de função. Você pode exibir o resultado na tela ou salvar uma imagem em um arquivo.
Se o resultado for rasterizado, ele precisará ter pelo menos 300 pixels de cada lado. O elástico final e as unhas devem cobrir pelo menos 75% da extensão horizontal e vertical da imagem. As escalas de comprimento de x e y devem ser as mesmas. Você precisa mostrar as unhas no segundo conjunto (usando pelo menos 3x3 pixels) e a corda (com pelo menos 1 pixel de largura). Você pode ou não incluir os eixos.
As cores são a sua escolha, mas você precisa de pelo menos duas cores distintas: uma para o fundo e outra para as unhas e a corda (essas podem ter cores diferentes).
Você pode supor que todas as unhas da segunda lista estão a pelo menos 10 a 5 unidades da forma inicial do elástico (para que você não precise se preocupar com a imprecisão do ponto flutuante).
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Mais exemplos
Aqui estão mais dois exemplos:
{{1, 1}, {3, 3}, {2, 4}, {1, 3}, {4, 0}, {3, -1}, {2, 0}, {4, 2}}
{{2, 1}, {3, 2}, {1, 2}, {4, 1}}
{{1, 1}, {3, 1}, {3, 3}, {1, 3}, {1, 5}, {3, 5}, {-1, 3}, {-1, 0}, {3, 4}, {5, 1}, {5, -1}, {7, -1}, {3, 7}, {7, 5}}
{{0, 0}, {0, 2}, {0, 4}, {0, 6}, {2, 0}, {2, 2}, {2, 4}, {2, 6}, {4, 0}, {4, 2}, {4, 4}, {4, 6}, {6, 0}, {6, 2}, {6, 4}, {6, 6}}
E aqui está um exemplo que mostra o significado de duas das unhas iniciais restantes. O resultado deve ser b e não um :
{{0, 0}, {0, 1}, {-1, 1}, {-1, -1}, {1, -1}, {1, 0}}
{{-0.5, 0.5}}
Agradecemos a Ell por fornecer este exemplo.
fonte
Respostas:
Python + matplotlib, 688
Lê duas listas de pontos de STDIN.
Exemplo
Como funciona
A chave da solução é trabalhar em pequenas etapas incrementais. Em vez de tentar descobrir o que acontece quando removemos todas as unhas de uma só vez, concentramo-nos nos efeitos diretos de remover apenas uma unha. Podemos então remover as unhas uma a uma em uma ordem arbitrária.
Trabalhar de forma incremental significa que devemos acompanhar o estado intermediário do elástico. Aqui está a parte complicada: apenas manter o controle de quais unhas a banda percorre não é suficiente. Durante o processo de remoção das unhas, a banda pode ser ferida e depois desenrolada em torno de uma unha. Portanto, quando a banda interage com uma unha, devemos acompanhar quantas vezes e em que direção ela a envolve. Fazemos isso atribuindo um valor a cada unha ao longo da banda da seguinte forma:
Observe que:
Começamos a contar assim que a banda é tangente à unha, mesmo que a unha não afete estritamente sua forma. Lembre-se de que, diferentemente da ilustração, nossas unhas não têm dimensão. Portanto, se a banda se torna tangente a uma unha, não podemos dizer de que lado da banda a unha está, apenas pela sua posição - devemos acompanhar onde ela costumava ser relativa à banda.
Mantemos as unhas com um valor zero, ou seja, unhas que costumavam, mas não seguram mais a banda, em vez de removê-las imediatamente. Se o fizéssemos, isso poderia desencadear uma reação em cadeia indesejada, enquanto tentamos manter os efeitos de cada etapa localizados. Em vez disso, unhas com valor zero são consideradas elegíveis para remoção como parte do processo maior.
Agora podemos descrever o que acontece em cada etapa:
Selecionamos uma unha para remover do caminho atual da banda. Uma unha é elegível para remoção se fizer parte do primeiro conjunto de unhas (exceto os pontos finais) ou se seu valor for zero.
Fingindo que as duas unhas vizinhas estão fixas, descobrimos quais unhas do segundo conjunto ou o par de pontos de extremidade pela qual a banda passará quando a unha selecionada for removida (não nos incomodamos com o restante das unhas da primeiro set, uma vez que vai finalmente ser todos removidos.) Fazemos isso de uma forma semelhante à da solução a Parte I . Todas essas unhas estão do mesmo lado da banda, portanto, atribuímos a todas elas um valor de 1 ou -1 , dependendo do lado.
Atualizamos o valor das duas unhas vizinhas para refletir as mudanças no caminho da banda (facilmente a parte mais complicada!)
Esse processo é repetido até que não haja mais unhas para remover:
E aqui está um exemplo mais complicado que ilustra a banda envolvendo uma unha várias vezes:
fonte
Java - 1262 bytes
Eu sei que isso provavelmente não é jogado tanto quanto poderia ser.
No entanto, ninguém mais parece estar respondendo a essa pergunta, então eu irei.
Primeiro, a classe "T" - que é uma classe de pontos - 57 bytes
E a classe principal - 1205 bytes
Exemplo:
Para executar, chame a função "d" com uma lista de pontos e uma série de pregos (sim, eu sei, estranho). O que faz:
Não tenho certeza se eixos em pixels estão ok. Sempre ocupará mais de 75% do espaço, pode ser muito, muito pequeno.
Aqui está uma bela animação para demonstrar o que estou fazendo aqui:
Eventualmente, torna-se isso, no qual os pontos mal estão se movendo. É quando vejo quais unhas estão tocando:
Aqui está o código de animação não destruído:
fonte