Inspirado por xkcd .
Seu desafio é determinar se um número faria uma boa combinação no jogo 2048 . Sua entrada será um número, como:
8224
E a saída será se esse número seria uma boa 2048 de combinação, que para esta entrada seria true
ou yes
ou 1
ou qualquer outra forma de indicar um resultado positivo.
Para aqueles não familiarizados com o jogo, aqui está uma explicação simples: potências de dois são organizados em uma grade, como este: [2] [2]
. As peças podem ser movidas em qualquer direção e, se duas peças idênticas se encontrarem, elas se tornarão a próxima potência de duas (assim, [2] [2]
quando movidas para a esquerda ou direita [4]
). Ou você pode apenas tentar o jogo aqui .
O que significa "uma boa combinação 2048"? Significa qualquer número que, se estivesse no jogo "2048", poderia ser combinado em um único número. (Um zero significa um espaço vazio e pode ser ignorado, se necessário.) Observe que os números podem ter vários dígitos! No entanto, os números não devem mudar entre os movimentos. Aqui estão alguns exemplos / casos de teste (com "Bom" indicando uma boa combinação e "Ruim" significando não bom):
- Bom: 8224 (8224 -> 844 -> 88 -> 16)
- Bom: 2222 (2222 -> 44 -> 8)
- Bom: 22048 (22048 -> 448 -> 88 -> 16)
- Ruim: 20482 (não é possível combinar os 2 externos, nem os 2048 e os 2)
- Bom: 20482048 (20482048 -> 4096)
- Ruim: 210241024 (210241024 -> 22048, mas agora é [2] [2048] e não pode ser combinado, pois os números não podem mudar entre os movimentos)
- Bom: 2048 (já é um número)
- Ruim: 2047 (não é um poder de 2)
- Ruim: 11 (não há 1's no jogo)
- Bom: 000040000000 (zeros são espaços vazios)
Regras diversas:
- A entrada pode ser de qualquer lugar razoável, como STDIN, argumento da função, arquivo, etc.
- A saída também pode ser razoável em qualquer lugar, ou seja, STDOUT, valor de retorno da função, arquivo etc.
- Ignore o tamanho da grade -
22222222
ainda deve ser verdadeiro. - O número não é máximo para o número s, desde que seja uma potência de dois. Portanto, os números possíveis são qualquer potência de dois maior que 0.
- Para aqueles preocupados com zeros causando ambiguidade, esse não é o caso. Por exemplo,
22048
pode ser analisado como[2] [2048]
ou[2] [2] [0] [4] [8]
. O primeiro não funciona, mas o segundo, por isso deve ser verdadeiro. - Isso é código-golfe , então o código mais curto em bytes vencerá!
1
22048
saída,good
mas isso não é verdade. Você não pode combinar2
com2048
e a grade é:4x4
se todos os números forem separados, você receberá 5 células. então talvez você deva remover o0
? Também o seu quinto exemplo parece ser inválido desde que o jogo pára em2048
:)Respostas:
GolfScript, 137 caracteres
A entrada deve ser fornecida no STDIN. A saída é
0
/1
para números ruins / bons. A maior parte do código é necessária para analisar as possíveis entradas.Esta versão mais curta (113 caracteres) executa um teste de mudança simples que não funcionaria corretamente para entradas como
224422
.Todos os casos de teste podem ser verificados online .
fonte
Python:
457422 caracteresA função f (s) obtém uma sequência de dígitos e gera 'bom' ou 'ruim' de acordo. Optei por não usar 0 como espaços, porque os espaços não têm sentido no jogo e eles criam ambiguidade ao analisar as strings (22048 é bom ou ruim?). Isso usa apenas números até 2048, mas isso pode ser alterado sem adicionar caracteres. Com o custo de 10 caracteres ou mais, também posso imprimir todas as etapas da combinação dos números. E eu percebo que esse código ainda não é suficiente para o golfe; não se preocupe, as edições estão chegando.
fonte
Haskell:
285 254 253 237 230227uso - basta carregá-lo no ghci e passar a string para h.
Código:
Comentário:
i
é a verificação se um número é uma potência de 2; isso será superado por idiomas com pequenos ajustes.%
gera recursivamente todas as análises que são listas de potências de 2 ou 0.c
reduz as peças.l
testa recursivamente se as peças são dobráveis à esquerda ou boas.g
testa se as peças são dobráveis à esquerda ou à direita Não há limite para os números nas peças - por exemplo,h ((show (2^200))++(show (2^200)))
retorna verdadeiro para 2 peças marcadas "1606938044258990275541962092341162602522202993782792835301376".Editado para corrigir um erro que não ocultava corretamente "88222288888" à direita, mas também encontrou mais oportunidades de golfe.
fonte
Perl, 175-336 bytes
Mantendo intactos apenas os elementos essenciais:
[ 64 e 256 levam a algumas ambiguidades pouco resolvíveis com as quais a correspondência gananciosa não consegue lidar ... mas essas são boas contagens de bytes. ]
fonte
Delphi
572582 caracteresCódigo editado, o limite é definido como 2 ^ 30, portanto não excederá o valor MaxInt no Delphi.
Golfe
Ungolfed
EDITAR
Então fiquei curioso e me perguntei quantas dessas combinações se encaixariam no quebra-cabeça e fiz um teste nele.
Para outros que também são curiosos, faça um teste também;)
Mas ok, aqui estão os resultados:
20736 combinations were tested and 1166 were great combinations
Devo dizer combinações com 3 ou mais zeros foram ignorados (faz sentido certo?)
Combinações são quase única, ou seja, as combinações
2248
,8224
,8422
e4228
todos foram contados como uma grande combinação.fonte
Mathematica - 218 bytes
Versão não destruída:
A
Internal\
mágica PartitionRagged` é retirada dessa pergunta .Esta solução lida com tamanhos de grade arbitrários e números arbitrariamente grandes.
Aqui está uma versão de 195 bytes que funciona como o jogo real, com até 4 blocos apenas (o que
f[22222222]
éFalse
):onde eu substituí
com
fonte
DeleteCases
parece que ele remove os pares mais à esquerda, entãof[88222288888]
falharia?DeleteCases
basta remover zeros e números que não são potências de dois. O recolhimento real dos pares é feito pela regra//. {a___, x_, x_, b___} :> {a, 2 x, b}
, que funciona para esse número e o inverso dele. Na verdade, não tenho muita certeza sobre a ordem em que o Mathematica aplica essas substituições, mas funciona.Haskell - 260
263f
é a função Exemplos:Uma pequena explicação:
p
retorna todas as maneiras de dividir uma lista.q
filtra aqueles que consistem apenas de potências de 2 (excluindo 1, mas incluindo 0).c
tenta recolher uma sequência.r
itera o colapso direito e esquerdo até restar apenas 1 elemento ou a cadeia é incobrável.fonte
c
entanto, há um erro , tente "222244442222" - ele retorna verdadeiro, mas isso não é recolhível no jogo. Precisa recuar com(2*x):c s
.