Gosto muito de Tetris, mas não sou muito bom nisso. Apenas uma vez eu gostaria de ver aquela nave espacial decolar na frente dos meus próprios olhos! E como os computadores são ótimos em tudo, a única solução possível é criar um programa para reproduzi-lo para mim ... exceto que você fará isso por mim!
Dado um tetromino (forma feita de quatro quadrados) e um mapa do campo de jogo, você deve colocar o tetromino de forma que ele marque o maior número de linhas (faça o maior número de linhas completamente cheio de blocos) e crie o menor número de novos buracos (um espaço vazio que não pode "ver" o topo do campo de jogo 1 ).
Entrada
A entrada conterá um caractere em uma única linha que representa o tetromino que cai, seguido por uma grade 10 * 18 2 de espaços ( ) e sinais de adição (
+
).
O personagem representa qualquer um dos sete tetrominos básicos encontrados em Tetris. Todas as peças podem ser giradas 90 graus, mas não viradas. Todos os tetrominos e suas rotações são os seguintes:
#
S = ## ##
## #
#
Z = ## ##
## #
# ### ##
L = # # # #
## # ###
# ### ##
J = # # # #
## # ###
# # #
T = ### ## ### ##
# # #
O = ##
##
#
I = # ####
#
#
A grade representa o campo de jogo de Tetris, +
sendo blocos colocados anteriormente. Portanto, um exemplo de entrada pode ser o seguinte:
I
+ ++
+ +++++
++ +++++++
++ +++++++
++ +++++++
++ +++++++
++++++ +++
Resultado
Sua saída será idêntica à entrada, mas com o tetromino na posição ideal. O tetromino deve ser representado com #
para diferenciá-los dos blocos pré-colocados. Além disso, você também deve gerar quantas linhas / furos sua veiculação cria no formulário xL yH
em uma nova linha.
A saída para o exemplo dado acima seria a seguinte 3 :
I
+ ++
+ +++++
++#+++++++
++#+++++++
++#+++++++
++#+++++++
++++++ +++
4L 0H
Você deve produzir apenas os melhores resultados; no caso de dois ou mais casos com a mesma pontuação, você deve produzir todos eles (separados por uma linha em branco). Os melhores resultados devem ser determinados pela classificação pelo número de linhas marcadas (descendente) primeiro e depois pelo número de novos furos criados (ascendente). Então, 1L 1H
é uma pontuação melhor que 0L 0H
.
Vou trabalhar na criação de uma lista de várias entradas e saídas esperadas contra as quais você pode testar seu programa. Assista esse espaço.
Regras e Desambiguação
- Isso é código-golfe , portanto, a implementação correta mais curta vence.
- A entrada / saída pode estar em qualquer meio que seja adequado ao seu idioma de destino (por exemplo, arquivo, stdin / stdout, área de texto).
- Se o seu idioma de destino não suportar entrada de várias linhas (ou for inconveniente), você poderá delimitar cada linha da entrada com vírgulas (
,
). - Você pode omitir a saída de qualquer linha em branco na grade.
- Lembre-se de que o tetromino cai de cima - você não pode colocar a peça "no subsolo". Portanto, você pode assumir que todas as colocações possíveis da peça estarão no "nível da superfície" (ou seja, não há blocos entre a peça e a parte superior do quadro).
- Suponha que nunca haverá uma situação em que você seja forçado a terminar o jogo (o tetromino colocado toca o centro superior do campo).
- Soluções idênticas na saída devem ser omitidas (por exemplo, existem 3 saídas da solução se você girar a
O
peça ingenuamente ).
1 Estou ciente de que isso criará alguns falsos positivos, mas é uma simplificação.
2 Esse é o tamanho da grade usado na versão do Game Boy.
3 Sim, 0H
está correto. Verifique novamente, eu disse novos buracos; ^)
Respostas:
C 1009 bytes
Aqui está a versão não destruída
Vi que a principal fonte de código extenso provavelmente seria a definição dos blocos. Então, decidi representá-los como padrões de bits em uma matriz de 4x4 bits. Isso resulta em 16 bits que se encaixam facilmente em um único
int
. Atiles
matriz contém todos os padrões para as 19 rotações possíveis dos 7 blocos.Ao compilar, ignore o aviso que
gets
foi descontinuado. Eu sei que é, mas é a maneira mais curta de ler uma linha da entrada.fonte
int
que é assumido. Vários de seusprintfs
únicos produzem um único caractere. Você poderá substituí-los por equivalentesputchar
para salvar alguns caracteres. Por exemplo, mudandoprintf("\n")
paraputchar(10)
:)