Dada uma lista de coordenadas inteiras, encontre a área do maior polígono convexo que você pode construir a partir da lista, de modo que:
- todo vértice está na lista
- nenhum elemento da lista está contido no polígono.
Exemplo:
(0, 0) (8, 0) (0, 1) (3, 1) (7, 1) (1, 2) (5, 2) (9, 2) (2, 3) (5, 3) (7, 3) (3, 4) (5, 5) (11, 5)
Visualizado:
o o
o o o
o o o
o o o
o
o o
O maior polígono convexo que você pode fazer disso é o seguinte:
o
o o
o o
o o
o
o
Com uma área de 12.
Você pode pegar a lista de coordenadas em qualquer formato razoável e deve exibir (de maneira apropriada para o seu idioma de escolha) a área do maior polígono convexo, arredondado para não menos de 2 dígitos após o ponto decimal.
Além disso, você deve empregar algum tipo de algoritmo, e não simplesmente força bruta em todos os subconjuntos dos pontos. Para impor isso, seu programa deve resolver uma lista de 50 vértices em menos de um minuto em um PC moderno.
O menor código em bytes vence.
Respostas:
Javascript ES6, 738 bytes
Aqui está uma versão do ES5 ou menos que deve funcionar na maioria dos navegadores e nós sem ajustar: 827 bytes
Código retorna uma função anônima. Como parâmetro, é preciso uma matriz de pontos, como
[[0,1],[2,3],[4,5]]
. Para usá-lo, você pode colocá-var f=
lo antes ou, se quiser usá-lo na linha de comando, adicionar(process.argv[2].replace(/ /g,'').slice(1,-1).split(')(').map((x)=>x.split(',')))
até o final e chamá-lo comonode convpol.js '(1,2)(3,4)(5,6)'
Obrigado pelo desafio! Como não há implementação de referência, não posso provar que isso esteja correto, mas é consistente pelo menos para permutações da lista de pontos. Eu quase não achei que isso iria funcionar, pois as versões com código de depuração, mesmo desabilitadas, eram muito lentas com o aumento exponencial do tempo. Decidi jogar golfe de qualquer maneira e fiquei satisfeito ao ver que ele caiu para menos de 2 segundos por 50 pontos na minha máquina. Pode calcular aproximadamente 130 pontos em 1 minuto.
O algoritmo é semelhante à varredura de Graham , exceto que ele precisa procurar por cascos vazios e convexos em todos os lugares.
Explicação
Aqui está uma visão geral de alto nível de como o algoritmo funciona. A essência desse algoritmo é apenas procurar loops convexos no sentido anti-horário que não incluam um ponto. O procedimento é algo como isto:
Além disso, como uma otimização, registramos o par inicial da cadeia como marcado, para que qualquer pesquisa posterior ao ver esse par em qualquer lugar da cadeia possa parar imediatamente a pesquisa, uma vez que o maior polígono com esse par já foi encontrado.
Esse algoritmo nunca deve encontrar um polígono duas vezes, e eu verifiquei isso experimentalmente.
fonte
===
e!==
com==
e!=
, mas eu não podia ter certeza, sem compreender o seu código ...(x,i)=>p.i==i
(13 caracteres) é um pouco mais longo quex=>p===x
(8 caracteres), mesmo após a otimização.