Você recebe uma grade hexagonal dos personagens .
e #
, assim:
. . . . . . . .
. . . . # . . .
. # . . . # . .
. . . # . . . .
. . . . . # . .
. . . . . . . .
Sua tarefa é preencher toda a caixa delimitadora alinhado ao eixo da #
com ainda mais #
:
. . . . . . . .
. . # # # # . .
. # # # # # . .
. . # # # # # .
. . # # # # . .
. . . . . . . .
A caixa delimitadora alinhada ao eixo é a menor forma hexagonal convexa que contém todas as #
. Observe que, no caso da grade hexagonal, existem três eixos a serem considerados (L / E, SW / NE, NW / SE):
Aqui está outro exemplo para mostrar que, em alguns casos, um ou mais lados conterão apenas um #
:
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . . . . . . . . . . . . .
Você pode visualizá-los como hexágonos com lados degenerados ou pode desenhar a caixa delimitadora ao redor deles, como eu fiz acima, caso em que ainda são hexágonos:
Demasiado difícil? Tente a Parte I!
Regras
Você pode usar quaisquer duas distintas não espaciais caracteres imprimíveis ASCII (0x21 a 0x7E, inclusive), no lugar de #
e .
. Continuarei me referindo a eles como #
e .
pelo restante da especificação.
Entrada e saída podem ser uma única sequência separada por avanço de linha ou uma lista de sequências (uma para cada linha), mas o formato precisa ser consistente.
Você pode assumir que a entrada contém pelo menos uma #
e todas as linhas têm o mesmo comprimento. Observe que existem dois "tipos" de linhas diferentes (começando com um espaço ou um não-espaço) - você pode não assumir que a entrada sempre começa com o mesmo tipo. Você pode assumir que a caixa delimitadora sempre se encaixa dentro da grade que você recebe.
Você pode escrever um programa ou função e usar qualquer um dos nossos métodos padrão de recebimento de entrada e saída.
Você pode usar qualquer linguagem de programação , mas observe que essas brechas são proibidas por padrão.
Isso é código-golfe , então a resposta mais curta e válida - medida em bytes - vence.
Casos de teste
Cada caso de teste tem entrada e saída próximos um do outro.
# #
. . . .
# . # # # #
. . . .
. # . #
. . . . # .
# . # .
# . # .
. . . . # .
. # . #
# . # .
# . . # # .
. # # #
. # # #
# . . # # #
. # # #
. . # . # #
. . # #
# . . # # .
# . . # # .
. . # #
. . # . # #
. . . . . . . . . . . . . . . .
. . # . # . . . . . # # # . . .
. . . . . . . . . . . # # . . .
. . . # . . . . . . . # . . . .
. . . . . . . . . . . . . . . .
. . # . . . # . . . # # # # # .
. . . . . . . . . . . # # # # .
. . . # . . . . . . . # # # . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . # . . . . . # # # # . .
. # . . . # . . . # # # # # . .
. . . # . . . . . . # # # # # .
. . . . . # . . . . # # # # . .
fonte
Respostas:
Pyth ,
8271 bytesExperimente online!
Explicação
Seja A o ponto com a coordenada y mais baixa e B o ponto com a coordenada y mais alta.
Seja C o ponto com o mais baixo (valor x menos valor y) e D o ponto com o mais alto.
Seja E o ponto com o mais baixo (valor x mais valor y) e F o ponto com o mais alto.
Então é equivalente a encontrar as coordenadas em que a coordenada y está entre A e B, o valor x menos o valor y está entre C e D, e o valor x mais o valor y está entre E e F.
fonte
Haskell,
256 254243 bytesObrigado @ Damien por jogar golfe
f
!A entrada é tomada como lista de lista de caracteres, a saída é fornecida da mesma maneira.
Então isso era uma fera para escrever. É baseado na idéia de LeakyNun, usando uma filtragem máxima e mínima nas coordenadas dos itens.
Estou realmente surpreso com o fato de
m=map
realmente salvar bytes, pois parece muito caro.Explicação:
Aqui está uma versão um pouco menos massacrada (ênfase em um pouco ):
f
é uma função que atribui a cada caracter um índice(y-index, x-index)
, preservando a estrutura original da lista.b
: Dado um item da lista indexada,b
calcula[y-index, y - x, y + x]
.p
: Dado o campo indexado, retorne 3 funçõesInt -> Bool
, a primeira das quais é a verificação do índice y, a segunda da diferença e a terceira da soma.min(snd e)
cuida dos espaços (um espaço é menor que ambos). Esta função está embutida no código do golfe.q
dado o campo indexado, mudar tudo necessário.
para#
verificando se esse campo específico de retornoTrue
para cada função de teste.A solução final é então a composição de
q
ef
.fonte
f=z(\y->z((,).(,)y)[0..])[0..]
h x=z x[0..]
f=h$h.curry(,)
Python 3,
380378348346 bytesObserve que o recuo é com guias, não espaços.
Versão Golfed:
Teste no Ideone
Explicação (para versão não destruída abaixo):
Todo o processamento é feito sem nenhuma conversão; os caracteres de espaço são simplesmente ignorados.
A função
axes_pos
calcula três tuplas de coordenadas "3D" imaginárias, elas são acumuladas em (três elementos) mínimo e máximo de três tuplas (bmin
,bmax
) para todos os#
caracteres.As coordenadas são calculadas em
def axes_pos(x, y): return y, x + y, lc - y + x
;onde X conta de 0 para a direita e Y conta de 0 para baixo (da primeira linha à última).
A primeira coordenada imaginária é basicamente Y, porque é óbvio o porquê. Seu machado é ortogonal a verde (nas fotos do OP) O
segundo é ortogonal a vermelho e o terceiro é ortogonal a azul.
Na segunda passagem, a substituição é feita por todos os
.
caracteres cujas coordenadas "3D" se enquadram embmin
..bmax
range, element wise - isso é verificado nesta expressãoall(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))
.Versão ungolfed com testes, também em Ideone :
Atualização 1:Removido desnecessário
Atualização 2,3:-1
para a terceira coordenada imaginária, porque não altera nadaMelhorias parcialmente implementadas sugeridas por
Leaky Nun
+ meu próprio também.fonte
def A(x,y):return y,x+y,len(L)-1-y+x
->A=lambda x,y:(y,x+y,len(L)-1-y+x)
len(L)-y+x
emx-y
Geléia ,
4535 134241 bytesEsta é uma lista de links; o último deve ser chamado na entrada para produzir a saída.
A E / S está na forma de matrizes de cadeias, onde
.
indica vazio e@
indica preenchido.Experimente online! ou verifique todos os casos de teste .
fundo
Vamos considerar o seguinte exemplo.
Ao desenhar um par ou linhas paralelas - o par mais próximo que envolve todas as posições preenchidas - em cada uma das três direções, podemos determinar a caixa delimitadora hexagonal.
Na implementação, substituímos todos os caracteres entre essas duas linhas por
@
e tudo fora dessas linhas por.
, com a possível exceção de diagonais que contêm apenas espaços).Para o eixo horizontal, isso fornece
para o eixo diagonal em queda, fornece
e para o eixo diagonal de elevação, fornece
Tomando o mínimo de caráter dos três, já que
.
<@
, obtemosTudo o que resta a fazer é restaurar os espaços.
Como funciona
fonte
Python,
237230 bytes7 bytes graças a Dennis.
Porto da minha resposta em Pyth .
Pega a matriz de linhas como entrada, gera uma matriz de caracteres 2D.
fonte
Perl,
128126 bytesInclui +6 para
-0F\n
Execute com entrada no STDIN. Use
1
para preenchido,0
para vazio. As linhas não precisam ser preenchidas com espaços no final:hexafill.pl
Usa coordenadas do cubo. Determine o máximo e o mínimo durante o
$= == 1
loop e preenche as coordenadas entre esses limites durante o$= == 0
loop. Os primeiros 58 loops são inúteis e existem apenas para serem preenchidos$-
com o número de linhasfonte
TSQL, 768 bytes
Eu escrevi uma consulta para resolver isso - o que achei bastante difícil. Não é capaz de competir com toda a excelente resposta mais curta. Mas queria publicá-lo de qualquer maneira para os interessados. Desculpe o tamanho da resposta - esperando que o codegolf também seja sobre abordagens diferentes.
Golfe:
Ungolfed:
Violino sem Golfe
fonte
Oitava GNU,
212, 196 bytesTalvez não seja realmente o idioma preferido do jogador, mas é isso que faz o desafio, não é? Assumindo que m é tomado como uma matriz de caracteres: 178 bytes independentes e 196 se inseridos em uma função .
golfed:
ungolfed:
Explicação : construímos um sistema de coordenadas, 3 eixos - ortogonais aos lados dos hexágonos, localizamos max e min de cada coordenada e, em seguida, construímos uma máscara lógica começando com 1 em todos os lugares e logicamente e: cada restrição de max e min de coordenadas, finalmente redefinindo cada posição "verdadeira" restante para "#" char.
Se você quiser testá-lo, basta criar uma matriz m assim:
e, em seguida, chame f (m) e compare com m construindo uma matriz com os dois em:
fonte
m
e a saída a ser armazenadak
. As respostas devem sempre ser programas completos ou funções que podem ser chamadas.