As espécies de gansos conhecidas como Alex A são conhecidas por residirem em grades triangulares compostas por 64 células:
(Foto tirada deste problema não relacionado do Project Euler .)
Rotularemos cada célula com os números 0
para 63
começar na linha superior e, em seguida, mover da esquerda para a direita em cada linha abaixo dela. Portanto, a célula superior é 0
e a célula inferior direita é 63
.
Cada célula tem três bordas. Podemos rotular cada borda no formato a,b
onde a
e b
são os números das células que compartilham essa borda. Por exemplo, a borda entre a célula 0
e 2
seria chamada 0,2
ou 2,0
(não importa em que ordem você as coloca).
O sistema de rotulagem de bordas na extremidade da grade é diferente, pois as células na borda da grade têm uma borda que não compartilham com outras células. Se uma borda é apenas parte de uma célula, vamos usar a letra X
. Por exemplo, as três fronteiras da célula 0
são 0,2
, 0,X
e 0,X
.
Algumas das células contêm gansos . No entanto, esses gansos serão mortos por raposas do mal (que vêm de fora das fronteiras da grade) se você não as proteger. E se todos os gansos morrerem, o BrainSteel ficará triste. Portanto, escreveremos um programa que constrói cercas em torno dos gansos para protegê-los das raposas. Os gansos devem existir em um único polígono totalmente fechado de cercas. Como o orçamento da cerca é bastante baixo, use o menor número possível de cercas.
Descrição da entrada
Uma lista de números, separados por vírgula, de 0
para 63
, representando as células que contêm gansos. Exemplo:
6,12
Descrição da saída
Uma lista de fronteiras que precisam ter cercas construídas sobre elas para proteger os gansos com sucesso. Esse deve ser o menor número possível de cercas. Exemplo:
5,6 6,7 11,12 12,13
fonte
Respostas:
C #, 530 bytes
Programa C # completo, recebe a entrada como uma única linha de STDIN e gera uma única linha para STDOUT, com um "" à direita.
Isso é bastante longo ... e tem repetição demais de x / y / z, mas não consegui reduzi-lo a nada sensato até agora e fazer um exame em duas horas pode voltar a isso amanhã.
Este diagrama explica a maior parte do que está acontecendo.
Reconheça que, como não podemos ter seções com largura de 0, um "hexágono" sempre será a forma mais barata (e tem o benefício de fornecer aos gansos o máximo de espaço para se deslocar).
O programa trabalha primeiro convertendo todos os índices da célula de entrada em cordas x / y / z e encontrando o mínimo / máximo de cada um de x / y / z.
Em seguida, ele percorre cada índice de célula e verifica se ele se encaixa no limite do 'hexágono' que descrevemos. Se estiver, ele verifica se está em alguma das arestas extremas dos limites (ou seja, x = xmin ou y = ymax) e adiciona as arestas correspondentes, se estiver. Ele precisa calcular o índice da borda ao lado. Para x e z, apenas os incrementamos / diminuímos da maneira que queremos e, em seguida, usamos a seguinte fórmula:
Observe que a "paridade" sempre muda e que y não está envolvido. Para y, não precisamos alterar nada, mas o código é um pouco confuso, pois precisa executar uma verificação de limites "triangulares" para detectar se a célula ao lado deve ser um "X" ou não.
Solução de exemplo (células com gansos apenas nos três cantos):
Código mais ordenado com comentários:
fonte
using System;
.using Q=System.Console;Q.Write();Q.ReadLine()
(45 bytes) versus sua sugestãousing System;Console.Write();Console.ReadLine()
(47 bytes).i
,x
,y
,z
, ep
para 0.