Estou olhando pela janela do sótão para o quintal do meu vizinho. Eles têm um cachorro acorrentado a um poste no centro do quintal. O cachorro corre pelo quintal, mas está sempre no final de sua cadeia, por isso acaba deixando uma trilha na terra. Normalmente essa pista seria perfeitamente circular, mas meus vizinhos têm outros postes em seu quintal nos quais a corrente do cachorro é presa. Cada vez que a corrente do cão atinge um poste, o cão começa a girar em torno do novo poste, independentemente do comprimento da corrente que resta como raio. Como os pólos, o cachorro e a corrente têm largura zero (meus vizinhos são matemáticos), a corrente pode enrolar indefinidamente em torno de um poste sem que o raio do círculo diminua. O cão também pode passar pela corrente (e não pelo colarinho) se a corrente estiver em seu caminho. Depois de observar essa estranheza por um tempo, decido escrever um código para simular o cão do meu vizinho. O código pegará as localizações de um poste central, ao qual o cão está acorrentado, as localizações dos outros postes no quintal dos meus vizinhos, o comprimento da corrente e a localização inicial do cachorro, e exibirá um diagrama indicando a caminho onde o cachorro se desgastou na grama. Você pode assumir que qualquer combinação do seguinte é constante (e, portanto, não as aceita como entrada):
Localização do poste ao qual o cão está acorrentado
Comprimento da corrente
Localização inicial do cão
O sol está nascendo, então o espaço no chão do meu sótão iluminado pela janela está encolhendo, me dando cada vez menos espaço para escrever meu código. Tente minimizar a contagem de bytes do seu código para que eu tenha espaço para redigitá-lo no meu sótão.
Casos de teste
Aqui, eu suponho que o cão comece 3 unidades ao sul do pólo em que está acorrentado (o ponto vermelho), localizado em 0,0
. Eu indiquei onde os pólos estão com pontos para maior clareza, você não precisa incluí-los em sua saída.
Poles at 1,2 -1,2
Poles at 0,.5
Poles at 0,1 1,1 -2,1 -1,-.5
Poles at 0,1 1,1
fonte
{0,-.5}
?{0,.5}
vertical sem o maior círculo. O cão começa basicamente preso no segundo poste.Respostas:
Python 3 usando matplotlib, 457 bytes
Como seus vizinhos são matemáticos, assumi que o jardim de seu vizinho ocupa o domínio complexo e, portanto, quaisquer coordenadas de objetos no jardim são números complexos. Para usar esta função, você deve, portanto, passar uma lista de números complexos, indicando a localização dos pólos no jardim do seu vizinho. A representação padrão do sistema de coordenadas foi escolhida, onde à direita há números reais positivos e acima são números imaginários positivos. Isso significa que os exemplos se tornam:
Além disso, o programa assume o seguinte: a trela está ligada ao ponto 0, a trela tem 3 unidades e a área de plotagem é 10 por 10, centrada em torno de 0. Para esses parâmetros, os resultados correspondem exatamente aos exemplos, e é assim que o resultado se parece (para o exemplo final):
O algoritmo é bastante simples, exigindo apenas uma condição para diferenciar a pesquisa no sentido horário e no sentido anti-horário. O estado do algoritmo é definido pelo ponto de rotação atual e pela orientação / comprimento restante da trela quando atinge o ponto de rotação atual. Funciona da seguinte maneira:
Esse algoritmo é então executado primeiro no sentido horário, após o qual o estado é redefinido e é executado no sentido anti-horário. A simplicidade do algoritmo significa que cerca da metade do programa pelo valor gasto é gasto nas funções de desenho. Se as rotinas de desenho fossem removidas, removeria 218 bytes do tamanho do programa.
A seguir, é apresentada uma versão não destruída que também contém código de depuração, que também exibe pontos e colisões de trelas:
A saída que ele produz se parece com isso:
fonte
Processamento 3, 815
833835876879bytesSalvou dois bytes graças a @ZacharyT removendo parênteses desnecessários
Execute este programa da seguinte maneira:
(a função
s
recebe afloat[][]
). Este é essencialmente o caso de teste nº 3, mas multiplicado por 100 para caber na janela.Várias coisas a serem observadas:
pushMatrix()
e apopMatrix()
operação podem conter apenas 32 matrizes.Exemplo de saída para o caso de teste acima.
Se você quiser ver a saída prettificada, adicione esta linha logo após a
translate(w,w);
função ins
.E isso nos dá este resultado:
Ungolfed
f()
e explicação(também contém código de depuração)
Em poucas palavras, o programa envia dois "buscadores", um no sentido anti-horário e o outro no sentido horário. Cada um desses buscadores encontra o pólo mais próximo e desenha um arco se a corrente for longa o suficiente, caso contrário, desenha um círculo. Depois de desenhar um arco, envia outro buscador para esse polo e o processo continua.
f()
contém o processo de cada candidato. Uma explicação mais detalhada virá assim que eu jogar mais isso.fonte
L-d
?LOGO,
305298297293 bytesExperimente o código no FMSLogo.
Defina uma função
draw
(golfed asd
) que, dada a entrada como uma lista de coordenadas do pólo (por exemplodraw [[0 100] [100 100] [-200 100] [-100 -50][0 0]]
, irá desenhar na tela o resultado).Requisitos:
[0 0]
deve ser incluído na lista de pólos. Se o código de depuração (polos de desenho) estiver ativado,[0 0]
o último item deverá ser esse.x=0, y=-300
(como na descrição do problema)Otimizações possíveis:
>=
por>
Código de golfe:
Código não-bloqueado (
;
inicia um comentário embutido (usado para explicação) e:
inicia um nome de variável):fonte
Python 2 + PIL, 310 bytes
O script lê a lista de pontos do stdin como uma lista de números complexos.
fonte