Descrição
Consideramos uma versão ligeiramente simplificada do Tetris, em que cada movimento consiste em:
- girando a peça no sentido horário, 0 a 3 vezes
- posicionando a peça em uma determinada coluna
- queda rápida
O objetivo é determinar o número de linhas concluídas, dada uma lista desses movimentos do Tetris.
As linhas concluídas são removidas quando as peças são descartadas, seguindo as regras padrão do Tetris.
Playfield
O campo de jogo tem 10 colunas de largura. Não há Game Over e presume-se que sempre haja espaço e tempo suficientes para executar as ações acima, independentemente da configuração do campo de jogo. A altura do campo de jogo realmente não importa aqui, mas você pode usar as 22 linhas padrão como limite superior.
Formas de tetrominós
Entrada / Saída
Entrada
Uma lista separada por vírgula de movimentos do Tetris codificados com 3 caracteres. Os dois primeiros caracteres descrevem a forma de Tetromino a ser usada e o último descreve a posição em que caiu.
- Tetromino:
I
,O
,T
,L
,J
,Z
ouS
, na mesma ordem como acima. - Número de rotações no sentido horário:
0
a3
- Coluna:
0
para9
. Esta é a coluna na qual o canto superior esquerdo da peça (marcado com umx
na foto acima) fica após a rotação 1
Supõe-se que todas as movimentações na lista fornecida são válidas. Não há necessidade de verificar entradas inválidas, como I07
( I
forma horizontal colocada muito à direita).
1 Você pode implementar um algoritmo de rotação real ou codificar todas as formas diferentes, contanto que ele x
esteja localizado na coluna fornecida pelo terceiro caractere da movimentação.
Saída
Número de linhas concluídas.
Exemplo
O00,T24
irá gerar a primeira posição e O00,T24,S02,T01,L00,Z03,O07,L06,I05
irá gerar a segunda posição.
Portanto, a seguinte sequência irá gerar um Tetris e deve retornar 4
:
O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19
Casos de teste
1) "O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19" -> 4
2) "S00,J03,L27,Z16,Z18,I10,T22,I01,I05,O01,L27,O05,S13" -> 5
3) "I01,T30,J18,L15,J37,I01,S15,L07,O03,O03,L00,Z00,T38,T01,S06,L18,L14" -> 4
4) "S14,T00,I13,I06,I05,I19,L20,J26,O07,Z14,Z10,Z12,O01,L27,L04,I03,S07,I01,T25,J23,J27,O01,
I10,I10" -> 8
5) "O00,T24,L32,T16,L04,Z11,O06,L03,I18,J30,L23,Z07,I19,T05,T18,L30,I01,I01,I05,T02" -> 8
Página de teste
Você pode usar este JSFiddle para testar uma lista de movimentação.
Respostas:
PHP,
405399378372368360354347331330328319309300 bytes(com o mapeamento de blocos de Dave )
programa, executa movimentos como argumentos separados, imprime o resultado
repartição para funcionar:
faz movimentos como matriz, retorna resultado
para referência: o mapeamento antigo
teste
veja minha outra resposta PHP
quer assistir?
remova o
#
da fonte da função e adicione:algumas etapas de golfe
Rev. 5: Um grande salto (399 - 21 = 378) ocorreu simplesmente movendo o deslocamento da coluna
de um loop separado para os dois loops existentes.
Rev. 8: Mudar da matriz para a base 16 para a peça ($ s) não deu muito,
mas abriu caminho para um pouco mais de golfe.
Rev. 17: triturou os valores com
base64_encode(pack('V*',<values>))
e usou a indexação de bytes em vez de
unpack
salvar 16 bytesRev. 25 a 29: inspirado no código de Dave: novo hash (-2), novo design de loop (-9), goto (-10)
sem pré-turno; isso custaria 17 bytes.
mais potencial
Com
/2%9
, pude salvar 15 bytes (apenas 14 bytes/4%5
)colocando dados binários em um arquivo
b
e depois indexandofile(b)[0]
.Eu quero isso?
Caracteres UTF-8 custariam muito pela transformação.
no hash
Eu usei
ZJLO.ST /2%9 -> 0123.56
; masT.ZJLOS /3%7 -> 0.23456
é tão bom.um byte a mais:
O.STJLZ %13/2 -> 0.23456
e mais três:
OSTZJ.L %17%12%9 -> 01234.6
Não foi possível encontrar um hash curto (máximo de 5 bytes) que não deixa espaço;
mas Dave encontrou
STZJL /4%5 -> 01234
, largando o O da lista. wtg!Entre:
TIJSL.ZO (%12%8) -> 01234.67
sala de folhas para aI
forma(e um imaginário
A
,M
ouY
forma).%28%8
e%84%8
faça o mesmo (mas com emE
vez deA
).fonte
break 2
é muito mais limpa do que o que eu tinha que fazer em C! Você pode salvar alguns bytes usandoarray_diff
(defina as linhas concluídas para um valor fixo em vez de usarunset
e substituaarray_values
porarray_diff
), mas não posso dizer pelos documentos se isso nivelaria os valores repetidos (por exemplo, array_diff ([1,2, 2,3], [1]) -> [2,2,3] ou apenas [2,3])array_diff
não remove valores duplicados; e eu já tenho o valor fixo (1023); mas não reindexa a matriz. Ótima idéia, mas custaria um byte./10
todo o lugar), mas, caso contrário, acho que já terminei. Estou surpreso com o quão diretamente competitivo PHP e C se mostraram. Isso foi divertido - espero que o OP aceite sua resposta!if
.C,
401392383378374351335324320318316305 bytesPega entrada separada por vírgula em stdin, retorna a pontuação no status de saída.
Requer
char
assinatura (que é o padrão para o GCC) e'3Z3Z'
deve ser interpretado como 861549402 (que é o caso do GCC em pequenas máquinas endian, pelo menos).Exemplo de uso:
Explicação de alto nível:
Todas as formas, exceto a linha, podem caber em uma grade 3x3 com um canto ausente:
Isso significa que é fácil armazená-los em um byte cada. Por exemplo:
(alinhamos cada peça à parte inferior esquerda da caixa para facilitar a queda)
Como obtemos pelo menos 4 bytes para um int, isso significa que podemos armazenar todas as 4 rotações de cada peça em um único número inteiro, com um caso especial para a linha. Também podemos ajustar cada linha da grade do jogo em um int (precisa apenas de 10 bits), e a peça atualmente em queda em uma longa (4 linhas = 40 bits).
Demolir:
-4, -1 graças a @Titus e -23, -11 com inspiração na resposta
fonte
s+=(d[A-x]=d[A])
sem usarx
?x
é necessário para manter o controle de quantas linhas ao colapso na etapa atual (cada linhaA
é definido para o valor de linhaA-x
como os avanços de loop)1[a]
ea[1]
faça a mesma coisa (ou mais precisamente,a[b]
traduz para*(a+b)
). É abusado assim como uma maneira de evitar colchetes. Nesse caso,1[*v]
==(*v)[1]
, ou seja, a segunda letra do comando, ou seja, a rotação.I
espaço reservado? Nesse caso, tente/2%9
como hash em vez de%12
.%12%8
se não.Ruby,
474443428379 + 48 = 427 bytes-1 graças a @Titus
Definitivamente, isso pode ser jogado mais.
Lê um dicionário binário de peças (veja abaixo) de STDIN ou um nome de arquivo e faz uma lista de movimentos como argumento, por exemplo
$ cat pieces | ruby script.rb O00,T24,S02,...
.Dados binários da peça (formato xxd)
Veja em repl.it (com argumentos codificados, dicionário): https://repl.it/Cqft/2
Ungolfed & explicação
fonte
m >> 10
poderia serm >> x
\d
s na expressão regular:/(\w)(\d)(\d)/
→/(\w)(.)(.)/
PHP,
454435427420414 bytescampos de bits para peças e mapa; mas nenhum caso especial para a
I
forma como o golfe de Dave.recebe argumentos da linha de comando, imprime resultado
ungolfed como função
recebe argumentos como array, retorna resultado
testes (em função)
fonte
<?
sobrecarga :)