Este desafio é inspirado por este aplicativo . Os casos de teste são emprestados desse aplicativo.
Esse é um desafio de código mais rápido , em que o objetivo é resolver os maiores casos de teste no menor espaço de tempo. Existem alguns casos de teste menores, para que as pessoas possam testar seus algoritmos mais rapidamente.
Você receberá uma grade de entrada quadrada, de dimensões n por n, em que 9 <= n <= 12 . Essa grade será dividida em n áreas, onde as células de cada área têm identificadores exclusivos (usarei letras minúsculas de al no texto aqui, mas você pode escolher o que quiser, por exemplo, números inteiros 1 a 12 ) .
A entrada pode ser assim (formato de entrada opcional):
aabbbbbcc
adddbbbcc
adeeecccc
adddefgcc
hhhdifggg
hdddifffg
hhhiifffg
hihiifffg
iiiiiiggg
Ou, mais fácil de visualizar:
Desafio:
Você deve colocar 2 * n árvores neste parque, de acordo com as seguintes regras:
- Deve haver exatamente 2 árvores por coluna e 2 árvores por linha
- Todas as áreas devem ter exatamente 2 árvores.
- Nenhuma árvore pode ser adjacente a outra árvore, vertical, horizontal ou diagonal
A solução para o layout acima é:
Nota: Existe apenas uma solução para cada quebra-cabeça
Regras adicionais:
- Os formatos de entrada e saída são opcionais
- A saída pode, por exemplo, ser uma lista de índices, uma grade com 1/0 indicando se há uma árvore nessa posição ou uma versão modificada da entrada em que as árvores são indicadas
- O tempo de execução deve ser determinístico
- O programa deve terminar dentro de 1 minuto no computador de @ isaacg
- Especificações: 4 CPUs, CPU i5-4300U a 1,9 GHz, 7,5G de RAM.
- Caso seu programa não consiga resolver os dois maiores casos de teste em um minuto cada, o tempo para o segundo maior ( n = 11 ) será sua pontuação. Você perderá com uma solução que resolve o maior caso.
Casos de teste:
Eu posso editar esta lista se os envios parecerem personalizados para se ajustarem a esses casos de teste.
12 por 12 :
--- Input ---
aaaaabccccdd
aaaaabccccdd
aaaaabbbbddd
eeeafffgbghh
eeaafffgbghh
eefffffggghh
eeefijffghhh
iieiijjjjkhh
iiiiijjjjkhk
lljjjjjjjkkk
llllllkkkkkk
llllllkkkkkk
--- Solution ---
aaaaabcccCdD
aaaaaBcCccdd
aAaaabbbbdDd
eeeaffFgBghh
eeAaFffgbghh
eefffffGgGhh
EeefijffghhH
iiEiIjjjjkhh
IiiiijjjjkHk
lljJjJjjjkkk
lLllllkkKkkk
lllLllKkkkkk
11 por 11 :
--- Input ---
aaaaaaabbcc
adddabbbbcc
edddbbbbbbc
eddddbbbbbb
effffggghhh
effffgghhii
eefffjjhhii
eeeejjjhhii
eeejjjjkiii
jjjjjjkkiii
jjjjjkkkiii
--- Solution ---
aaAaaaabbCc
adddAbBbbcc
eDddbbbbbbC
eddDdBbbbbb
effffggGhHh
eFfffGghhii
eefFfjjhHii
EeeejjjhhiI
eeEjjjjKiii
JjjjJjkkiii
jjjjjkKkIii
10 por 10
--- Input ---
aaaaabccdd
aeaabbbccd
aeaabfbgcd
eeeaafggcd
eeeaafghcd
eeeiifghcd
ieiiigghcd
iiijighhcd
jjjjighhcd
jjjggghhdd
--- Solution ---
aaAaabccdD
aeaaBbBccd
aEaabfbgcD
eeeaaFgGcd
eEeAafghcd
eeeiiFghCd
IeiIigghcd
iiijigHhCd
JjJjighhcd
jjjgGghHdd
9 por 9
--- Input ---
aabbbbbcc
adddbbbcc
adeeecccc
adddefgcc
hhhdifggg
hdddifffg
hhhiifffg
hihiifffg
iiiiiiggg
--- Solution ---
aAbBbbbcc
adddbbBcC
adEeEcccc
AdddefgCc
hhhDiFggg
hDddifffG
hhhiIfFfg
HiHiifffg
iiiiiIgGg
--- Input ---
aaabbbccc
aaaabbccc
aaaddbcce
ffddddcce
ffffddeee
fgffdheee
fggfhhhee
iggggheee
iiigggggg
--- Solution ---
aaAbBbccc
AaaabbcCc
aaaDdBcce
fFddddcCe
fffFdDeee
fGffdheeE
fggfHhHee
IggggheeE
iiIgggGgg
fonte
There shall be exactly 2 trees per column, and 2 trees per row
portanto, uma força bruta é provavelmente impossível.Respostas:
JavaScript (ES6), 271 bytes
Recebe a entrada como uma matriz de matrizes de caracteres. Retorna uma matriz de máscaras de bits (números inteiros) descrevendo a posição das árvores em cada linha, onde o bit menos significativo é a posição mais à esquerda.
Formatado e comentado
Casos de teste
Esse trecho inclui uma função adicional para exibir os resultados em um formato mais legível. É muito lento para resolver o último caso de teste.
Tempo de execução esperado: ~ 5 segundos.
Mostrar snippet de código
fonte
C, hora oficial: 5ms para 12x12
Compilado com o GCC 7 usando os sinalizadores
-O3
e-fopenmp
. Deverá ter resultados semelhantes em qualquer versão do GCC com o OpenMP instalado.Os formatos de entrada e saída são os indicados na pergunta.
Na minha máquina, são necessários
0,009s0,008s0,005s para o exemplo 12x12 e0,022s0,020s0,019s para executar todos os exemplos. Na máquina de benchmark, o isaacg relata 5ms para o exemplo 12x12 usando a versão original (não encadeada) do código.Uso:
Apenas um solucionador de força bruta simples, trabalhando em uma linha de cada vez. Funciona a uma boa velocidade reconhecendo situações impossíveis mais cedo (por exemplo, não restando células da região, mas menos de 2 árvores na região).
A primeira atualização aprimora os acertos do cache colocando os dados relacionados próximos na memória e torna os cálculos possíveis de árvores restantes no segmento um pouco mais inteligentes (agora é responsável pelo fato de que as árvores não podem ser adjacentes). Ele também extrai o loop mais externo, para que menos casos especiais sejam necessários na parte mais quente do algoritmo.
A segunda atualização faz com que o loop mais externo seja executado em paralelo entre os processadores disponíveis (usando o OpenMP), dando um aumento de velocidade linear. Isso é ativado apenas para n> = 11, uma vez que a sobrecarga de threads de criação supera os benefícios para grades menores.
fonte
Java (OpenJDK 8) , Horário oficial: 1.2s em 12x12
editar: não mais código de golfe
Experimente online!
O link TIO é para o caso de teste 12x12. O TIO relata 2.429s para o tempo de execução.
Pega uma matriz de números inteiros como entrada e modifica a matriz para conter 1s para árvores e 0s para não-árvores.
Isso é executado para todos os casos de teste. O maior case de teste é executado em minha máquina em menos de um segundo, embora eu tenha uma máquina bastante poderosa
Código de teste para o 12x12, pode ser modificado para outros
Produz isso na minha máquina:
fonte
Clingo , ± 7 ms para 12 × 12, 116 bytes
(As novas linhas são opcionais e não são contadas.)
Execute com
clingo plant.lp - -c n=<n>
onde<n>
está o tamanho da grade. O formato de entrada é uma lista dec(X,Y,Z).
instruções para cada célula (X
,Y
) coloridoZ
, com uma ≤X
,Y
,Z
≤n
, separados por espaços em branco opcional. A saída incluit(X,Y)
para cada árvore em (X
,Y
).O tempo é bastante sem sentido, pois é basicamente apenas o tempo de inicialização; portanto, considere isso um voto para casos de teste maiores.
Demo
Para facilitar o tratamento do formato de entrada / saída, aqui estão os programas Python para converter de e para o formato indicado no desafio.
Entrada
Saída
fonte