fundo
Eu quero construir uma cerca. Para isso, coletei vários postes e os colei no chão. Também colecionei muitas pranchas que pregarei nos bastões para fazer a cerca. Costumo me empolgar ao construir coisas, e provavelmente continuarei pregando as tábuas nos postes até que não haja mais lugar para colocá-las. Eu quero que você enumere as possíveis cercas que eu possa acabar.
Entrada
Sua entrada é uma lista de coordenadas inteiras bidimensionais que representam as posições dos polos, em qualquer formato conveniente. Você pode assumir que ele não contém duplicatas, mas não pode assumir nada sobre sua ordem.
As placas são representadas por linhas retas entre os pólos e, por simplicidade, consideramos apenas placas horizontais e verticais. Dois pólos podem ser unidos por uma placa se não houver outros pólos ou placas entre eles, o que significa que as placas não podem se cruzar. Um arranjo de postes e placas é máximo se nenhuma nova placa puder ser adicionada a ela (equivalentemente, existe um poste ou uma placa entre dois postes alinhados horizontal ou verticalmente).
Resultado
Sua saída é o número de arranjos máximos que podem ser construídos usando os pólos.
Exemplo
Considere a lista de entrada
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)]
Visto de cima, o arranjo correspondente dos pólos é mais ou menos assim:
o
o o
o o
o o
o
Existem exatamente três disposições máximas que podem ser construídas usando esses polos:
o o o
o-o o|o o-o
o----o o||| o o| | o
o-o o|o o-o
o o o
Assim, a saída correta é 3
.
Regras
Você pode escrever uma função ou um programa completo. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
[] -> 1
[(0,0),(1,1),(2,2)] -> 1
[(0,0),(1,0),(2,0)] -> 1
[(0,0),(0,1),(1,0),(1,1)] -> 1
[(1,0),(0,1),(-1,0),(0,-1)] -> 2
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1)] -> 4
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(0,-1),(2,2)] -> 5
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1),(2,2)] -> 8
(0,-2)
, boa captura. Mudando agora.Respostas:
Mathematica, 301 bytes
Esta é uma função sem nome que pega as coordenadas como aninhadas
List
e retorna um número inteiro. Ou seja, você pode dar um nome e chamá-lo ou simplesmente anexá-loCom recuo:
Eu não posso nem começar a expressar o quão ingênua essa implementação é ... definitivamente não poderia ser mais força bruta ...
o--o--o
produz apenas duas cercas em vez de três).Surpreendentemente, ele resolve todos os casos de teste praticamente imediatamente.
Um truque realmente interessante que eu descobri para isso é o uso de
Orderless
reduzir o número de padrões que eu tenho que combinar. Essencialmente, quando quero abandonar conjuntos de cercas com cercas cruzadas, preciso encontrar um par de cercas verticais e horizontais e verificar a condição delas. Mas não sei em que ordem eles aparecerão. Como os padrões de lista normalmente dependem da ordem, isso resultaria em dois padrões realmente longos. Então, em vez disso, substituo pela lista circundante por uma funçãot
comt @@@
- que não está definida, portanto é mantida como está. Mas essa função éOrderless
, então eu posso verificar uma única ordem no padrão, e o Mathematica verificará todas as permutações. Depois, coloquei as listas de volta no lugarList @@@
.Eu gostaria que houvesse um interno que fosse a)
Orderless
, b) nãoListable
e c) não definido para 0 argumentos ou argumentos de lista. Então eu poderia substituirt
por isso. Mas não parece haver um operador assim.fonte
Haskell, 318 bytes
Uso:
p [(1,0),(0,1),(-1,0),(0,-1)]
. Resultado:2
Como funciona:
fonte