Círculos e quadrados têm um ponto central único e definido. No entanto, a noção do centro de um triângulo tem sido discutida há muito tempo. Quatro centros diferentes eram conhecidos pelos gregos antigos:
- Incentivo : a interseção dos bissetores de ângulos do triângulo
- Centroid : A interseção das linhas de cada vértice do triângulo até o meio do seu lado oposto
- Circuncentro : A interseção dos bissetores perpendiculares dos lados
- Orthocentro : A interseção das altitudes do triângulo
Euler mais tarde provou que o centróide, o circuncentro e o ortocentro são colineares em qualquer triângulo. A linha em que esses três pontos estão em um triângulo é chamada de Linha de Euler . É definido para cada triângulo, exceto um triângulo equilátero, onde todos os pontos coincidem.
Seu desafio é criar o programa ou função mais curto que, quando recebidas duas entradas, gera um centro específico ou a linha Euler do triângulo. O primeiro especifica as coordenadas de cada vértice de um triângulo. O segundo é um número inteiro de 1 a 5, determinando o que produzir.
1 - Incenter
2 - Centroid
3 - Circumcenter
4 - Orthocenter
5 - Equation of Euler Line
(if the Euler Line is vertical, output the `x` value of the line
(e.g. output `5` if the equation of the line is `x = 5`))
Você pode supor que os vértices fornecidos nunca serão colineares e que sempre serão coordenadas inteiras (isso também exclui a possibilidade de ter um triângulo equilátero como entrada, conforme comentário de @ R.Kap ).
A matriz de entrada deve ser uma matriz aninhada válida no seu idioma e a entrada deve estar em qualquer formato razoável. Quaisquer valores flutuantes devem ser exibidos com pelo menos três casas decimais, mas não menos. Um ponto de saída deve ser uma matriz válida no seu idioma, correspondente ao formato de entrada.
Casos de teste:
Input: [(-2, 0), (1, 0), (0, 1)] 1
Output: (-0.089, 0.451)
Input: [(-2, 0), (1, 0), (0, 1)] 2
Output: (-0.333, 0.333)
Input: [(-2, 0), (1, 0), (0, 1)] 3
Output: (-0.5, -0.5)
Input: [(-2, 0), (1, 0), (0, 1)] 4
Output: (0, 2)
Input: [(-2, 0), (1, 0), (0, 1)] 5
Output: 5x + 2
Esclarecimento: A entrada pode ser de stdin, separada por espaço ou nova linha, ou como argumentos para uma função. A saída, no entanto, deve ser gravada em stdout.
y=f(x)
.(if the triangle is equilateral, output the point at which the centers meet)
uma vez que é não possível criar um triângulo equilátero no plano de coordenadas utilizando apenas inteiro coordenadas.Respostas:
Python -
908870Novas linhas foram adicionadas para reduzir a rolagem. Provavelmente isso poderia ser ainda mais jogado.
Casos de teste (anotados):
Como você pode ver, possivelmente há erros causados pelo uso do ponto flutuante.
Golfe adicional:
Com base nas sugestões dos comentários abaixo, eu consegui fazer isso menor.
fonte
R=r.append
e depois usá-lo para salvar bytes?AutoHotkey - 731
A função pode ser mais minificada (para cerca de 600 caracteres OU menos) encurtando os nomes de variáveis como midx_a, midx_b e assim por diante.
Chamando a função
fonte
Python 3,5,
851772 bytes:Recebe a entrada como uma sequência de coordenadas separadas por vírgula, seguidas por um número inteiro que transmite o que deve ser produzido. Por exemplo, se as coordenadas de entrada são
(1,0),(2,1),(1,4)
e você deseja o ortocentro do triângulo correspondente a essas coordenadas, você simplesmente chamaria a função da seguinte maneira:Saídas no formato de uma tupla, se for necessário um ponto específico, no formato de uma string com a equação no formulário,
y=mx+b
se a linha de Euler for necessária e a linha não for vertical, ou simplesmente ox
valor da linha, se a linha de Euler é necessário, mas a linha é vertical.Portanto, usando o triângulo com vértices
(1,0),(2,1),(1,4)
, as saídas seriam:Vou tentar jogar isso mais ao longo do tempo, onde e quando puder.
Experimente Online! (Ideona)
fonte