Suponha que queremos mudar uma matriz como é feita no jogo de 2048 : se tivermos dois elementos consecutivos iguais na matriz, mescle-os com o dobro do elemento de valor. Shift deve retornar uma nova matriz, onde cada par de elementos iguais consecutivos é substituído por sua soma e os pares não devem se cruzar. A troca é realizada apenas uma vez, portanto, não precisamos mesclar os valores resultantes novamente. Observe que, se tivermos 3 elementos iguais consecutivos, temos que somar os elementos mais à direita, portanto, por exemplo, [2, 2, 2]
deve se tornar [2, 4]
, não [4, 2]
.
A tarefa é escrever a função mais curta que pega uma matriz e retorna uma matriz deslocada.
Você pode assumir que todos os números inteiros serão estritamente positivos.
Exemplos:
[] -> []
[2, 2, 4, 4] -> [4, 8]
[2, 2, 2, 4, 4, 8] -> [2, 4, 8, 8]
[2, 2, 2, 2] -> [4, 4]
[4, 4, 2, 8, 8, 2] -> [8, 2, 16, 2]
[1024, 1024, 512, 512, 256, 256] -> [2048, 1024, 512]
[3, 3, 3, 1, 1, 7, 5, 5, 5, 5] -> [3, 6, 2, 7, 10, 10]
Também estou muito interessado em solução usando o reduzir :)
fonte
Respostas:
Geléia ,
10 98 bytesTryItOnline ou execute todos os casos de teste
Quão?
fonte
Haskell,
475750 bytesUsos
reduce
(oufold
como é chamado em Haskell, aqui à direitafoldr
). Exemplo de uso:map abs.foldr(#)[] $ [2,2,2,4,4,8]
->[2,4,8,8]
.Editar: +10 bytes para fazê-lo funcionar também com matrizes não classificadas. Os números mesclados são inseridos como valores negativos para impedir uma segunda mesclagem. Eles são corrigidos por uma final
map abs
.fonte
Flacidez Cerebral ,
15896Experimente online!
Explicação:
1 Inverta a lista (movendo tudo para a outra pilha, mas isso não importa)
2 Execute as etapas 3 a 6 até não sobrar mais nada nesta pilha:
3 Duplique os dois principais elementos (2 3 -> 2 3 2 3)
4 Coloque um 1 em cima, se os dois primeiros forem iguais, e 0 em caso contrário (do wiki)
5 Se os dois primeiros forem iguais (diferente de zero no topo), adicione os próximos dois e pressione o resultado
6 Mova o elemento superior para a outra pilha
7 Alterne para a outra pilha e imprima implicitamente
fonte
PHP, 116 bytes
ou
-4 bytes se a saída puder ser uma matriz em
print_r
vez de 'json_encode`176 bytes para resolver isso com um Regex
fonte
for($i=count($a=$argv);--$i;)$b[]=($a[$i]==$a[$i-1])?2*$a[$i--]:$a[$i];print_r(array_reverse($b));
mesma idéia, mas mais curta[]
eu preciso$r=[];
Obrigado por sua ajudaGNU sed,
41 3837Inclui +1 por -r
-3 Agradecimentos ao trauma digital
-1 Agradecimentos a seshoumara
Entrada e saída são cadeias separadas por espaço em unárias (com base nesse consenso ).
Experimente online!
fonte
y,!, ,
para salvar 1 byte.Retina , 32
r
na linha 3 ativa a correspondência de regex da direita para a esquerda. E isso significa que a\1
referência precisa vir antes do(1+)
grupo de captura ao qual faz referência.Experimente online.
fonte
Perl, 41 bytes
Inclui +1 para
-p
Dê a sequência de entrada no STDIN:
shift2048.pl
:fonte
Python, 61 bytes
O booleano
b
verifica se os dois últimos elementos devem entrar em colapso, verificando se são iguais de uma maneira que seja segura para listas de comprimento 1 ou 0. O último elemento se anexado a um multiplicador de1
para igual ou2
para desigual. É anexado ao resultado recursivo da lista com tantos elementos cortados no final. Agradecimentos a Dennis por 1 byte!fonte
[l[-1]<<b]
salva um byte.l[-2:-1]
é[l[-2]]
Perl, 43 + 1 (
-p
) = 44 bytesTon Hospel surgiu com 41 bytes de resposta , confira!
-4 graças a @Ton Hospel!
Edit : adicionado
\b
, pois sem ele estava falhando na entrada como24 4
na qual a saída teria sido28
.Corra com a
-p
bandeira:Não vejo outra maneira do que usar
reverse
duas vezes para dobrar à direita (comos/(\d+) \1/$1*2/ge
faria com a esquerda, ou seja2 2 2
, ao4 2
invés de2 4
). Então, 14 bytes perdidos graças areverse
... Ainda acho que deve haver outra maneira (melhor) (afinal, é perl!), Deixe-me saber se você a encontra!fonte
reverse reverse
parece um pouco demorado. Eu não sou especialista em Perl, mas existe uma maneira de criar um atalho parareverse
(se nada mais, [ab] usareval
)?($_)
reverse
olhares comoreverse
não pode ser chamado sem argumento (assim os exemplos mostram que pode ser, mas não é apenas um protótipo:reverse LIST
), então eu esqueci$_
de ser o argumento padrão;)LIST
pode estar vazio ...$_
como argumento padrão, o documento especifica um protótipo sem parâmetros (comoprint
oulenght
...). Ou talvez seja apenas uma impressão errada que tenho.JavaScript (ES6), 68 bytes
fonte
[1024, 1024, 512, 512, 256, 256]
está resolvendo como[2048, 512, 1024]
e não[2048, 1024, 512]
...?Perl 5.10,
6150 bytes (49+ 1 para sinalizador)Obrigado a Ton Hospel por salvar 11 bytes!
Solução sem regex, com
-a
bandeira:Tente aqui!
fonte
@a=($F[-1]-$b?$b:2*pop@F,@a)while$b=pop@F;say"@a"
(50 bytes)JavaScript (ES6),
686558576564 bytesGuardado 1 byte graças a @ l4m2
Corrigido para matrizes não classificadas agora que foi esclarecido que tais entradas são esperadas.
fonte
a=>(a.reverse()+'').replace(/(.),\1/g,(c,i)=>i*2).split`,`.reverse()
?[1024, 1024, 512, 512, 256, 256]
(acho que esse caso de teste pode ter sido adicionado posteriormente).f=(a,l=[],m)=>(x=a.pop())*!m-l?f(a,x).concat(l):x?f(a,2*x,1):[l]
?05AB1E , 26 bytes
Experimente online!
Etapas generalizadas
fonte
Mathematica, 53 bytes
Explicação
Divida a entrada em sublistas que consistem em execuções de elementos idênticos. ou seja,
{2, 2, 2, 4, 8, 8}
se torna{{2, 2, 2}, {4}, {8, 8}}
.Particione cada uma das sub-listas em partições no máximo 2. ou seja,
{{2, 2, 2}, {4}, {8, 8}}
torna-se{{{2, 2}, {2}}, {{4}}, {{8, 8}}}
.Total de cada partição. ou seja,
{{{2, 2}, {2}}, {{4}}, {{8, 8}}}
se torna{{4, 2}, {4}, {16}}
.Inverta os resultados porque o
Partition
comando do Mathematica vai da esquerda para a direita, mas queremos que as partições estejam em outra direção. ou seja,{{4, 2}, {4}, {16}}
se torna{{2, 4}, {4}, {16}}
.Achate o resultado. ou seja,
{{2, 4}, {4}, {16}}
se torna{2, 4, 4, 16}
.fonte
Plus@@@
éTr/@
e acho que você pode evitar os parênteses eJoin@@
se usar##&@@
o resultado deReverse
(ainda não o testou).Java 7, 133 bytes
A entrada é um ArrayList e apenas faz um loop para trás, removendo e dobrando quando necessário.
fonte
Long
referências na linha 3 com==
. Considerea.get(i)-a.get(i-1)==0
.Perl, 37 bytes
Inclui +4 para
-0n
Execute com a entrada como linhas separadas no STDIN:
shift2048.pl:
fonte
Haskell, 56 bytes
fonte
PHP,
86 100 9994 bytesrequer PHP 7.0; recebe valores dos argumentos da linha de comando.
Corra com
-nr
ou experimente online .fonte
for($r=[];$v=($p=array_pop)($a=&$_GET[a]);)array_unshift($r,end($a)-$v?$v:2*$p($a));print_r($r);
é 1 Byte mais curtoJulia 205 bytes
A função a ser chamada é
H
por exemplo
H([1,2,2,4,8,2,])
Isso não é o caminho mais curto para fazer isso em julia. Mas é tão legal que eu queria compartilhar de qualquer maneira.
t(a)
é um tipo de valor, representando o valor (a).s(a)
é uma instância desse tipo de valorg
é uma função que despacha os valores de diferença (usando os tipos de valor) e os números de seus parâmetros. E isso é legalK
apenas envolveg
para queParte extra legal:
Isso define o
^
operador a ser aplicado às funções. Assim queK^s(2)(X)
é o mesmo queK(K(X))
assimH
é apenas chamarK
emK
um monte de vezes - vezes o suficiente para certamente desmoronar qualquer caso aninhadaIsso pode ser feito muito mais curto, mas dessa maneira é tão divertido.
fonte
PowerShell v2 +, 81 bytes
Pega a entrada como uma matriz explícita
$n
, inverte-a$n[$n.count..0]
,-join
s os elementos juntamente com uma vírgula e regex-replace
um par de dígitos correspondente ao primeiro elemento, a*2
, e entre parênteses. Canais que resultam (com@(2,2,4,4)
aparência de entrada(4*2),(2*2)
) paraiex
(abreviadoInvoke-Expression
e semelhante aeval
), que converte a multiplicação em números reais. Armazena a matriz resultante em$b
, encapsula isso em parênteses para colocá-lo no pipeline e depois reverte$b
com[$b.count..0]
. Deixa os elementos resultantes no pipeline e a saída é implícita.Casos de teste
NB - No PowerShell, o conceito de "retornar" uma matriz vazia não faz sentido - é convertido
$null
assim que sai do escopo - e, portanto, é o equivalente a não retornar nada, o que é feito aqui no primeiro exemplo. (após alguns erros perversamente detalhados). Além disso, a saída aqui é separada por espaço, pois é o separador padrão para matrizes com strings.fonte
Javascript - 103 bytes
fonte
[2,2,4,4]
rendimentos[2,2,4,4]
.Flacidez cerebral , 60 bytes
Experimente online!
Explicação:
fonte
Python 2, 94 bytes
Experimente online
fonte
Julia,
7382 bytesUse a dobra à direita para criar a lista de trás para a frente (também é possível usar a dobra para a esquerda e inverter a lista no início e no final).
Se o cabeçalho da lista atual não for igual ao próximo elemento a ser anexado, basta anexá-lo.
Caso contrário, remova o cabeçalho da lista (soa meio cruel) e acrescente o elemento 2 vezes.
Exemplo
fonte
Raquete 166 bytes
Ungolfed:
Testando:
Resultado:
fonte
Japonês , 12 bytes
Experimente online!
Descompactado e como funciona
Tenho alguma idéia da solução de Jonathan Allan's Jelly .
fonte
Mathematica, 51 bytes
{Longest@a___,x_/;x>0,x_,b___}
corresponde a uma lista contendo dois números positivos idênticos consecutivos e transforma esses dois números em-2x
.Longest
força as partidas a acontecer o mais tarde possível.O processo é ilustrado passo a passo:
fonte
Vim, 28 bytes
G@='?\v(\d+)\n\1<C-@>DJ@"<C-A>-@=<C-@>'<CR>
Uma macro que regex pesquisa para trás em busca de números consecutivos correspondentes e os adiciona.
A matriz de entrada precisa ser um número por linha. Esse formato me economiza traços, o que é bom, mas o verdadeiro motivo é trabalhar com as correspondências de regex sobrepostas. Dada a sequência
222
, se você/22
corresponder apenas ao primeiro par, não ao segundo par sobreposto. As regras de sobreposição são diferentes quando os dois pares começam em linhas diferentes. Nesse desafio ,[2, 2, 2]
torna-[2, 4]
se essencial a combinação do par sobreposto.NOTA: O desafio pediu apenas um único passe. Por esse motivo, você precisa ter
:set nowrapscan
. Com:set wrapscan
eu pude fazer uma versão que finalize o trabalho em várias passagens, embora essa solução como escrita nem sempre faça isso.<C-@>
: Normalmente, em uma linha de comando, para digitar um literal<CR>
sem executar o comando com o qual você teria que escapar<C-V>
. Mas você pode digitar sem<C-@>
escape e ele será tratado como um<C-J>
/<NL>
, que será como<CR>
quando você executar a macro, mas não quando estiver digitando. Tente ler:help NL-used-for-Nul
.@=
: Desta vez não posso usar uma macro gravada facilmente, porque existe a possibilidade de a entrada não ter pares correspondentes. Se isso acontecer durante a execução de uma macro, a pesquisa malsucedida falhará na macro. Mas se isso ocorrer durante a passagem de gravação (implícita primeiro), o restante dos comandos no modo normal será executado, danificando o arquivo. A desvantagem@=
é que perco um byte na chamada recursiva; às vezes você pode usar@@
como uma chamada recursiva, mas que seria executada a@"
partir de 4 bytes anteriormente neste caso.DJ@"<C-A>-
:DJ
Exclui a linha e coloca o número (sem nova linha) num registo, para que eu possa executá-lo como uma macro para um argumento número para<C-A>
. Eu tenho que-
depois para não ter uma segunda partida em casos como esse[4, 2, 2]
.fonte
Perl6, 92 bytes
fonte
Prolog (SWI) ,
9787 bytesExperimente online!
fonte