Relacionado a esta pergunta .
Uma sala é definida como um polígono sem interseção (não necessariamente convexo), expresso como uma lista ordenada de coordenadas bidimensionais. Uma lâmpada suficientemente brilhante é colocada em um ponto específico dentro da sala e emite luz em todas as direções. Sua tarefa é encontrar a área total iluminada da sala. Você pode receber informações em qualquer formato razoável. Os pontos no polígono / sala, bem como as coordenadas da fonte de luz, são números racionais. Eles podem ser tirados no sentido horário ou anti-horário, qualquer um dos formatos é bom. O caso de teste no problema é fornecido no sentido anti-horário.
A figura a seguir mostra duas salas de exemplo, onde o ponto arroxeado representa a fonte de luz e a região sombreada representa a área iluminada.
Caso de teste:
(1/2, 18)
(1,3)
(5,1/2)
(7,5)
(12,7)
(16,3)
(15,11)
(8,19)
(3,7)
Light source located at (5,8)
Answer: 815523/6710 ≈ 121.538
Aqui está uma representação gráfica da solução para esse caso de teste. Os dois pontos que definem a solução que não está no polígono original são (55/61, 363/61) e (856/55, 357/55).
Essa fórmula pode ser útil no cálculo da área.
Como esse é o código-golfe , o código mais curto em bytes vence.
[tag:code-golf]
Respostas:
Python 3 , 388
398408409415417493bytesPara torná-lo mais preciso, aumente
n
Abordagem básica de Monte-Carlo. Etapas listadas abaixo.
s
s
pelo número total e multiplique pela área total do intervalo.Versão não destruída:
Experimente online!
Crédito pelo algoritmo de interseção de linha
Além disso, agradeça a todos os comentaristas úteis sobre como jogar isso ainda mais.
fonte
from random import*
(quebra de linha)u=uniform
para -2 bytesg=lambda i:
n
que ser uma potência de 10? Caso contrário, você pode salvar um byte usando uma potência de 9.i:(min
, o espaço em tambémx[i]for
pode ser removido. Além disso,return float(s/n)*(r*t)
pode serreturn(r*t)*float(s/n)
. E eu não estou totalmente certo, mas não pode as variáveisr
ee
ser removido e usado diretamente, já que você só usá-los uma vez? De alguma forma, dá um resultado ligeiramente diferente, emborag
não seja modificado, de modo que essa parte me confunde um pouco (não estou muito familiarizado com o Python para entender por que o resultado é um pouco diferente).Haskell , 559
618632bytesSolução exata (salvo erros). Haskell integrou aritmética racional exata. Experimente online!
Observe que isso fornece
815523/6710
, não814643/6710
, para a sala de exemplo, e a primeira interseção da parede é calculada como(55/61, 363/61)
. Tenho certeza de que isso está correto porque a entrada de Monte Carlo (lentamente) converge para o mesmo resultado.Lenda:
Bônus: GUI brilhante para testes. Clique ao lado dos pontos para movê-los.
fonte
APL + WIN
Esta é uma versão não destruída deste desafio interessante que ofereço para demonstrar minha lógica. Minha versão antiga do APL + WIN não é adequada para estruturas de controle aninhadas de golfe. APLs mais modernos poderiam se sair melhor - desafiar?
Se os leitores validarem a lógica, tentarei jogar esta solução no golfe. Se a lógica estiver errada, simplesmente excluirei.
fonte
R ,
296255 bytesExperimente online!
Esta é outra versão reduzida da resposta Python . O método básico de Monte Carlo é o mesmo, mas reorganizei algumas das funções para reduzi-las. Na minha primeira iteração, eu tinha sido muito agressivo no rearranjo, e então percebi que podia otimizar o comprimento e a velocidade retornando a uma versão do algoritmo de interseção mais próxima do python.
Aqui está uma versão não destruída que também plota os resultados:
fonte