Os cubos podem ser feitos de seis quadrados como lados. Mas você também pode dobrar três retângulos 2x1 ao meio e colá-los para formar um cubo. Agora, neste desafio, você obtém um conjunto de peças feitas de quadrados e precisa determinar se pode escolher peças para formar um cubo unitário. Nem todas as peças precisam ser usadas, pode haver algumas sobras.
Detalhes
As peças são fornecidas como uma sequência de dois caracteres diferentes ou uma imagem em preto e branco ou qualquer formato raster 2D conveniente. A seguir, assumo que os pixels que formam as peças são pretos e o fundo é branco.
Dois pixels que compartilham um lado são considerados pertencentes à mesma peça. As peças só podem ser dobradas ao longo das linhas de grade que separam os pixels e não podem ser cortadas. Cada lado do cubo tem o tamanho de um pixel e cada lado do cubo pode ser feito apenas de uma única camada.
A saída deve ser um truthy ou Falsey valor.
Casos de teste
A seguir, os espaços são em segundo plano e os símbolos de hash
#
representam as peças.
(mais a ser adicionado)
Válido
##
##
##
#
####
#
# # # # # # #
# ##
## #
Inválido
###
###
# #
####
### ## ####
Execute o seguinte snippet para mais casos de teste.
PS: Esta é uma generalização deste desafio
Respostas:
C,
824803 bytesExperimente online!
... e antes de explicar isso em detalhes, vale a pena uma visão geral de alto nível.
Visão geral básica
Esse algoritmo aplica um correspondente de padrão para classificar cada poliomaino encontrado com um determinado padrão como seu subconjunto. Como os poliominoes são correspondidos, eles são "desmarcados", excluindo-os da correspondência de padrões novamente. A classificação inicial dada pelo matcher é simplesmente uma contagem do número de peças no polyomino.
O fósforo é aplicado primeiro para separar todos os polioquinós que não podem ser dobrados em um cubo; a classificação desses poliominos é descartada. A correspondência será bem-sucedida se esses poliomatinos aparecerem nos de nível superior; portanto, nos preocupamos apenas com o menor subconjunto de "desdobrável" para cada classe. Aqui são mostrados, juntamente com as codificações acolchoadas, todos esses poliaminoinos (excluindo seus reflexos verticais). A codificação usa os bits 4-0 de cada caractere para representar quadrados em cada linha:
Depois que esses poliominoes são selecionados, categorizamos os demais poliominoes em categorias relevantes. Vale a pena notar que em quase todos os casos, é possível encontrar poliominos que permanecem (aqueles dobráveis em cubos) e simplesmente procurar somas de seis. Existem duas exceções:
Para poder acomodar essa restrição, formamos 8 categorias, de AH: A para monominos (peças solitárias), B para dominós, C para trominos de canto, D para trominos de linha, D para trominos de linha, E para tetrominos de linha, F para outros tetrominos, G para pentominos e H para hexominos. Qualquer coisa que não se enquadre em uma dessas categorias é apenas ignorada. Contar poliominoes que se enquadram em cada categoria é suficiente.
No final, apenas retornamos a veracidade ou falsidade com base em uma equação gigante e nessas tabulações.
Ungolfed com comentários
fonte