Introdução
Jogadores experientes em código nos prepararam para o dilúvio do dia do juízo final . As áreas de risco foram evacuadas e a população mudou-se para terrenos altos.
Subestimamos a inundação (ou talvez tenha ocorrido um erro no código do @ user12345). Algumas áreas altas estão se aproximando rapidamente do nível do mar. Muros devem ser erguidos para garantir a sobrevivência dos acampamentos agora densamente povoados. Infelizmente, o governo tem um suprimento limitado de muros.
Problema
Nosso cenário do dia do juízo final é descrito por dois números em uma única linha, n
e m
. Após essa linha, há n
linhas com m
valores por linha, separados apenas por um único espaço. Cada valor será um dos quatro caracteres.
x
Intransitável. A água não pode fluir aqui. Paredes não podem ser erguidas aqui.-
Instável. A água pode fluir através disso aqui. Paredes não podem ser erguidas aqui..
Estável. A água pode fluir por aqui. Paredes podem ser erguidas aqui.o
Acampamento. A água pode fluir por aqui. Se isso acontecer, todo mundo morre. Paredes não podem ser construídas aqui.
A água fluirá de todas as bordas do mapa, a menos que a borda seja intransitável ou uma parede seja construída sobre o ladrilho. Escreva um programa que possa gerar o número mínimo de paredes necessárias para proteger um acampamento.
Exemplo de entrada
6 7
x . . x x x x
x . . x - - x
x . x x - - x
x . o o o - .
x . o o o - .
x x x x x x x
Saída de exemplo
3
Suposições
- A água flui apenas ortogonalmente
- Acampamentos existem apenas como um bloco ortogonalmente contíguo por cenário
- Uma solução sempre existirá (embora possa exigir grandes quantidades de paredes)
- Acampamentos não podem ser localizados em uma borda, pois o cenário não teria solução
- 2
n
<<16 - 2
m
<<16 - A entrada pode ser fornecida pelo stdin, lida em "city.txt" ou aceita como um único argumento
O menor código vence!
Respostas:
Mathematica,
257253caracteresA entrada é lida
"city.txt"
.Explicação:
O Mathematica tem muitas funções para lidar com gráficos.
Primeiro, eu li os dados de
"city.txt"
.Então eu construo um gráfico de grade com 'm' * 'n' vértices (
GridGraph@d[[1,{2,1}]]
) e adiciono a ele um "vértice no infinito" que é conectado a todos os vértices nas "arestas" do gráfico. Este vértice é de onde a água flui.E
o
,x
es
denotam as posições de "o", "x" e "" respectivamente.Então, para qualquer subconjunto
w
des
(os subconjuntos são classificados por comprimento), excluo os vértices inx
ew
fromg
(VertexDelete[g,x⋃w]
) e encontro o comprimento do caminho mais curto do "vértice no infinito" ao acampamentoo
. Se o comprimento for infinito, o acampamento estará seguro. Portanto, o comprimento do primeirow
é o número mínimo de paredes necessárias para proteger um acampamento.fonte
C,
827 799522Golfe:
A entrada é fornecida com a altura e com os argumentos da linha de comando e, em seguida, a grade é lida como uma única string no stdin da seguinte forma:
./a.out 6 7 < input
onde a entrada está neste formato (da esquerda para a direita, de cima para baixo):"Legível":
Nem tão curto quanto a solução da @Claudiu, mas ele é incrivelmente rápido. Em vez de inundar as bordas, encontra o acampamento e trabalha a partir dos tokens 'o'.
Exemplos de canais de parede:
fonte
@
). Eu tentei executar o código de mim, mas ele não parecia trabalhoPython,
553525512449414404387368 caracteres (+4? Para invocação)Eu me diverti muito jogando golfe nisso. É 82 bytes maior se você tentar compactá-lo! Agora isso é uma medida de compacidade e falta de repetição.
Os níveis de recuo são espaço, guia.
Uso :
Lê de
city.txt
:Invoque da seguinte maneira:
O
2>X
é ocultar o stderr desde a saída do programa, gerando uma exceção. Se isso for considerado injusto, adicione 4 caracteres para a invocação.Explicação :
Força bruta simples.
C
faz uma inundação e retorna true se atingir um acampamento. Sem preenchimento extra, pois foi necessário muito espaço para configurá-lo corretamente.D
, dado um conjunto de paredes a serem preenchidas, chamaC
de todos os pontos da borda, de modo que sejamC
responsáveis por essas paredes, e imprime o comprimento e as saídas, se nenhuma delas chegar ao acampamento. A lista de paredes também é usada para acompanhar o preenchimento, para que não seja necessária cópia do painel! Complicado,C
também anexa todos os pontos vazios encontrados a uma listaS
, portanto, a função tambémD
é usada para construir primeiro a lista de pontos vazios. Por esse motivo, eu uso, em vez de , para garantir que todos os s sejam coletados na primeira execução.sum
any
.
Invoco
D
uma vez e, em seguida, copio a lista de lugares vazios,Z
poisS
ele continuará sendo anexado a (ineficiente, mas mais barato na contagem de caracteres). Então eu usoitertools.combinations
para selecionar cada combinação de pontos vazios, de 0 pontos acima. Eu corro cada combinaçãoD
e ela imprime o comprimento da primeira que funciona, gerando uma exceção para sair do programa. Se nenhuma resposta for encontrada, nada será impresso.Observe que, atualmente, o programa não funciona se nenhuma parede for necessária. Seriam +3 caracteres para cuidar deste caso; não tenho certeza se é necessário.
Observe também que este é um
O(2^n)
algoritmo, onden
está o número de pontos vazios. Assim, para uma placa de 15x15 completamente vazio com um acampamento no meio, isso vai levar2^(15*15-1)
=2.6959947e+67
iterações para completar, que vai ser um tempo muito longo, de fato!fonte
Groovy:
841805754Ungolfed:
Muito mais golfe por vir ...
Retorna 2E9 se não houver solução.
fonte
Dyalog APL , 91 bytes
⊃∊{1∊a[⍸×{(×d)∧s 3∨/3∨⌿⍵}⍣≡4=d←0@⍵⊢a]:⍬⋄≢⍵}¨c[⍋≢¨c←(,⍳2⊣¨b)/¨⊂b←⍸2=a←(s←(4,4,⍨⍉)⍣2)'xo.'⍳⎕]
assume
⎕IO=0
, usa os recursos da v16.0 (@
e⍸
), o tempo de execução é exponencial no número de.
-s⎕
é entrada avaliada, deve ser uma matriz de caracteres'xo.'⍳
substituax
por 0,o
por 1,.
por 2 e todos os outros por 3s←(4,4,⍨⍉)⍣2
uma função que envolve uma matriz com 4sa←
atribuir a matriz numérica cercada por 4s a uma variávela
b←⍸2=
b
é a lista de pares de coordenadas em que os 2s (ie.
-s) são(,⍳2⊣¨b)/¨⊂b
gerar todas as combinações de elementos deb
c[⍋≢¨c←...]
ordená-los por tamanho{... :⍬⋄≢⍵}¨
para cada combinação, verifique algo e retorne seu comprimento ou uma lista vazia⊃∊
o primeiro resultado não vaziod←0@⍵⊢a
d
éa
com alguns elementos substituídos por 04=
criar matriz booleana - onde estão os 4s? ou seja, a fronteira que adicionamos{...}⍣≡
continue aplicando a função{}
até o resultado estabilizar3∨/3∨⌿⍵
"booleano" ou "cada elemento com seus vizinhos"s
o resultado será menor, então vamos recriar a borda(×d)∧
aplicar os elementos diferentes de zero ded
(as não paredes) como uma máscara booleanaa[⍸× ...]
o quea
corresponde aos 1s em nossa matriz booleana?1∊
existem 1s, ou sejao
, acampamentos?fonte