Desafio retirado do meu concurso de desafio de código da universidade
Na verdade, este é o dia 0, mas o desafio de ontem foi muito fácil e pode ser uma brincadeira de outra pergunta aqui.
Tetris é um videogame que se tornou popular nos anos 80. Consiste em colocar uma série de peças com formas diferentes que caem em um tabuleiro, para que se encaixem da maneira mais compacta possível.
Neste problema, assumiremos uma sequência de peças que caem, cada uma em uma determinada posição e com uma certa orientação que não pode ser alterada. As peças são empilhadas quando caem e as linhas completas não são eliminadas (como no jogo original). O objetivo é determinar a altura final de cada coluna do tabuleiro depois que todas as peças caírem.
Há um total de 7 peças diferentes, mostradas na figura:
Desafio
Dada uma lista de peças, produza a altura de todas as colunas do tabuleiro depois que todas as peças caírem
Uma peça consiste em três números: I, R e P. O primeiro número, I, é o identificador da peça (um número entre 1 e 7, na mesma ordem que na figura). O segundo número, R, é a rotação da peça. Pode assumir os valores 0, 90, 180 ou 270 e representa o ângulo de rotação da peça no sentido anti-horário. O terceiro número, P, indica a posição da peça. Representa a coluna à esquerda ocupada pela peça (pode ser um índice de 1 ou 0. Por favor, especifique).
Exemplo e caso de teste (1 índice)
- Dado
[[1, 0, 1], [4, 0, 1], [5, 90, 4]]
- Resultado
[3, 3, 1, 3, 2]
- Dado
[[6, 270, 4], [1, 180, 5], [1, 90, 6], [7, 0, 4]]
- Resultado
[0, 0, 0, 9, 9, 8, 3, 3]
[[3,0,1],[3,180,3]]
Saída dada[1,1,4,4,4]
[[2,180,1],[2,0,3]]
Saída dada[2,2,4,3,3]
Notas
- Isso é código-golfe
- Linha / coluna pode ser 1 ou 0 índice. Por favor especifique.
- Você pode redefinir os valores de entrada (talvez queira chamar a peça 1 como A, etc.). Nesse caso, especifique
Questões
Podemos usar 4 valores distintos em vez de um ângulo em graus ?: Sim
Devemos lidar com "furos" se uma peça não se encaixar exatamente nas anteriores ?: Sim
A altura ou a largura da placa são limitadas? Não. Nem a largura nem a altura são limitadas
Obrigado @Arnauld pelas imagens e pelos casos de teste *. *
I
,R
eP
ser de entrada em uma ordem diferente?Respostas:
JavaScript (Node.js) ,
286284 270266bytesExperimente online! ou tente uma versão aprimorada que também exiba o quadro final.
Codificação de forma
Todas as peças são armazenadas exatamente como 4 nibbles (4x4 bits), com as linhas classificadas na ordem inversa e o pixel mais à esquerda mapeado para o bit menos significativo. Em outras palavras, a representação binária da forma é espelhada vertical e horizontalmente.
Exemplo:
Função hash e tabela de pesquisa
Somente as primeiras entradas são armazenadas explicitamente. Tudo o resto é definido como .82 0
Essas entradas são compactadas como:
que se expande para os seguintes 82 petiscos:
O uso de hexadecimal no formato final é necessário apenas para as duas representações horizontais da peça , portanto, na string acima.I
"ff"
Os parâmetros da função hash foram forçados de maneira bruta de maneira a otimizar zeros à esquerda e à direita. O fato de a string poder ser compactada um pouco mais usando
1e12
os zeros no meio e uma conversão da base 16 para a base 4 na parte certa é apenas um efeito colateral bem-vindo, mas inesperado. :-)Aqui está uma demonstração do processo de desembalagem para todas as peças e todas as rotações.
Comentado
fonte
C (clang) ,
253239221212 bytesExperimente online!
ps Na verdade, o tamanho do código é 221 bytes (mas 212 caracteres) devido aos caracteres UNICODE codificados em UTF-8. Mas o tio.run o trata como código de 212 bytes ...
O tamanho do código no meu computador é 209 caracteres (218 bytes). Mas não pude substituir
\225
por char visível em tio.run 😞Código ungolfed
Descrição
Vamos encontrar a linha de base superior ( TBL ) de cada figura e descrevê-la como um número de células abaixo da TBL para cada posição horizontal. Também vamos descrever o número de células (altura) acima do TBL ( HAT ).
Por exemplo:
Vamos descrever TBLs e HATs para cada figura e cada ângulo de rotação:
Agora devemos codificar esses números como uma sequência de 2 bits e colocar em uma matriz (substituindo
4 0
por um3 1
ângulo de 90 ° da "linha" para caber em 2 bits - o resultado será o mesmo; e diminua as larguras em 1).Codificaremos em ordem: largura (em 2 LSB), TBLs , HATs (para trás para loop para trás). Por exemplo
2 2 1 1 0
para 270 ° do ângulo de t-figura será codificado como1 0 1 2 1
(passado 1 é largura-1 ):0b0100011001 = 281
.atualizado 12.02:
a) Eu converti uma matriz em uma string e salvei 18 caracteres (você pode ver o código anterior de 239 bytes ) :))
b) Mais otimização, o código é reduzido por 9 caracteres.
Esta é a minha última tentativa (acho que sim, lol!) 😀
fonte
<s> ... </s>
.Lisp comum, 634 bytes
Verbose
Teste-o
As peças são listas circulares de listas de números. Essas sub-listas representam cada lado da forma, os números indicando a que distância estão do lado oposto. Elas são da esquerda para a direita quando esse lado está na parte inferior, da direita para a esquerda quando em cima, de cima para baixo quando à esquerda e de baixo para cima quando à direita. Essas opções de design eliminam a necessidade de escrever código para rotação. Infelizmente, a falta de código de rotação não parece compensar as longas representações de forma ou a lógica um tanto complicada que usei para calcular novas alturas de coluna.
A rotação é um número inteiro não negativo. 0 = 0 graus, 1 = 90 graus, 2 = 180 graus, 4 = 270 graus
fonte
C # (compilador interativo do Visual C #) , 308 bytes
Experimente online!
OK - Isso foi loucura ... Enviei uma resposta que usava técnicas comuns de golfe com código. Mas quando vi o que os outros estavam enviando, percebi que havia uma maneira melhor.
Cada
(shape, rotation)
tupla é codificada em uma literal de string C # com duplicatas removidas. O processo de codificação captura cada uma dessas configurações em 2 bytes.Os 3 bits mais baixos armazenam a altura e os próximos 3 armazenam a largura. Como cada um desses valores nunca é superior a 4, eles podem ser lidos diretamente dos 3 bits sem qualquer conversão. aqui estão alguns exemplos:
Em seguida, cada coluna é armazenada em 3 bits. A coisa mais útil para eu armazenar era o número de quadrados ausentes na parte superior e inferior da coluna.
Nunca há mais de 2 quadrados ausentes na parte superior ou inferior e nunca há mais de 1 quadrado de ambos ao mesmo tempo. Dado esse conjunto de restrições, criei a seguinte codificação:
Como temos que contabilizar no máximo 3 colunas com quadrados ausentes acima ou abaixo, podemos codificar cada
(shape, rotation)
tupla em 15 bits.Por fim, formas duplicadas foram removidas. O exemplo a seguir mostra como várias
(shape,rotation)
tuplas podem produzir saídas duplicadas para a mesma forma em diferentes rotações:Todas as saídas exclusivas são determinadas e salvas em um
byte[]
e convertidas em um literal de string C #. Para pesquisar rapidamente onde uma forma se baseiaI
eR
, os primeiros 7 bytes da matriz consistem em uma chave de pesquisa codificada.Abaixo está um link para o programa que eu usei para comprimir as peças.
Experimente online!
Código menos comentado e comentado:
fonte
Carvão , 98 bytes
Experimente online! Link é a versão detalhada do código. Recebe a entrada como uma matriz de valores [P, R, I], onde I é de 0 a 6, R é de 0 o 3 e P também é indexado em 0. Explicação:
Faça um loop sobre as peças de entrada.
Extraia a descrição da peça atual e a rotação. (Ver abaixo.)
Extraia a posição.
Verifique se há espaço horizontal suficiente para colocar a peça.
Verifique se há espaço vertical suficiente para colocar a peça.
Calcule as novas alturas das colunas afetadas.
Quando todas as peças tiverem sido processadas, imprima a lista final das alturas das colunas em linhas separadas.
A sequência compactada representa a sequência original
00001923001061443168200318613441602332034173203014614341642430137
. Aqui, os2
sãoI
separadores e os1
sãoR
separadores. As peças, portanto, decodificam da seguinte forma:Os
R
valores ausentes são preenchidos ciclicamente automaticamente pelo carvão vegetal. Cada dígito é mapeado para dois valores, saliência e altura total, de acordo com a tabela a seguir:A saliência e a altura total estão relacionadas às alturas da coluna da seguinte maneira: Dada uma peça que queremos colocar em uma determinada posição
e
, pode ser possível colocá-la, mesmo que uma das colunas seja mais alta quee
. A quantidade de espaço livre é fornecida pelo excesso. A nova altura da coluna após a colocação da peça é simplesmente a posição colocada mais a altura total.Exemplo: suponha que começamos colocando uma
5
peça na coluna 1. Como ainda não há mais nada, a peça é colocada na posição 0 e as colunas 1 e 3 agora têm a altura 1, enquanto a coluna 2 tem a altura 2. Então, queremos colocar uma6
peça com1
rotação na coluna 0. Aqui podemos colocar esta peça na posição 0; embora a coluna 1 tenha uma altura de 1, a peça tem uma saliência de 1 e, portanto, há espaço suficiente para colocá-la. A coluna 0 termina com uma altura de 2 e a coluna 1 termina com uma altura de 3.fonte