Supposons que nous voulions déplacer un tableau comme dans le jeu 2048 : si nous avons deux éléments consécutifs égaux dans un tableau, fusionnez-les en deux fois l'élément value. Shift doit retourner un nouveau tableau, où chaque paire d'éléments égaux consécutifs est remplacée par leur somme, et les paires ne doivent pas se croiser. Le décalage est effectué une seule fois. Il n'est donc pas nécessaire de fusionner à nouveau les valeurs résultantes. Notez que si nous avons 3 éléments égaux consécutifs, nous devons additionner les éléments les plus à droite. Ainsi, par exemple, [2, 2, 2]
devrait devenir [2, 4]
, pas [4, 2]
.
La tâche consiste à écrire la fonction la plus courte qui prend un tableau et retourne un tableau décalé.
Vous pouvez supposer que tous les entiers seront strictement positifs.
Exemples:
[] -> []
[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]
Je suis aussi très intéressé par la solution qui utilise réduire :)
la source
Réponses:
Gelée ,
10 98 octetsTryItOnline ou exécuter tous les cas de test
Comment?
la source
Haskell,
475750 octetsUsages
reduce
(oufold
comme on l'appelle en Haskell, ici un repli à droitefoldr
). Exemple d'utilisation:map abs.foldr(#)[] $ [2,2,2,4,4,8]
->[2,4,8,8]
.Edit: +10 octets pour que cela fonctionne aussi pour les tableaux non triés. Les nombres fusionnés sont insérés en tant que valeurs négatives pour empêcher une deuxième fusion. Ils sont corrigés par une finale
map abs
.la source
Brain-Flak ,
15896Essayez-le en ligne!
Explication:
1 Inverser la liste (tout déplacer vers l'autre pile, mais cela n'a pas d'importance)
2 Effectuez les étapes 3 à 6 jusqu'à ce qu'il ne reste plus rien sur cette pile:
3 Dupliquez les deux éléments supérieurs (2 3 -> 2 3 2 3)
4 Mettez un 1 en haut si les deux premiers sont égaux, un 0 sinon (du wiki)
5 Si les deux premiers étaient égaux (différent de zéro en haut), ajoutez les deux suivants et appuyez sur le résultat.
6 Déplacez l’élément supérieur vers l’autre pile
7 Basculez vers l’autre pile et imprimez implicitement
la source
PHP, 116 octets
ou
-4 octets si la sortie peut être un tableau
print_r
au lieu de 'json_encode`176 octets pour résoudre ceci avec un regex
la source
for($i=count($a=$argv);--$i;)$b[]=($a[$i]==$a[$i-1])?2*$a[$i--]:$a[$i];print_r(array_reverse($b));
même idée mais plus courte[]
j'ai besoin$r=[];
Merci pour votre aideGNU sed,
41 3837Inclut +1 pour -r
-3 grâce à Digital Trauma
-1 grâce à seshoumara
L'entrée et la sortie sont des chaînes unaires séparées par des espaces ( basées sur ce consensus ).
Essayez-le en ligne!
la source
y,!, ,
pour enregistrer 1 octet.Rétine , 32
r
sur la ligne 3 active la correspondance de regex droite à gauche. Et cela signifie que la\1
référence doit venir avant le(1+)
groupe de capture auquel il fait référence.Essayez-le en ligne.
la source
Perl, 41 octets
Inclut +1 pour
-p
Donnez la séquence d'entrée sur STDIN:
shift2048.pl
:la source
Python, 61 octets
Le booléen
b
vérifie si les deux derniers éléments doivent être réduits en vérifiant qu'ils sont égaux de manière sûre pour les listes de longueur 1 ou 0. Le dernier élément est ensuite ajouté avec un multiplicateur de1
égal ou non2
. Il est ajouté au résultat récursif sur la liste avec autant d'éléments coupés à la fin. Merci à Dennis pour 1 octet!la source
[l[-1]<<b]
enregistre un octet.l[-2:-1]
est[l[-2]]
Perl, 43 + 1 (
-p
) = 44 octetsTon Hospel est arrivé avec 41 octets de réponse , allez voir!
-4 grâce à @Ton Hospel!
Edit : ajouté
\b
, sans cela, il échouait en entrée comme24 4
sur le résultat en sortie28
.Courir avec le
-p
drapeau:Je ne vois pas d'autre moyen que d'utiliser
reverse
deux fois le pli à droite (comme les/(\d+) \1/$1*2/ge
ferait un pli gauche, c'est-à-dire2 2 2
qu'il deviendrait4 2
au lieu de2 4
). Donc 14 octets perdus grâce àreverse
... Je pense quand même qu'il doit y avoir une autre (meilleure) façon (c'est du perl après tout!), Faites le moi savoir si vous le trouvez!la source
reverse reverse
semble un peu long. Je ne suis pas un expert en Perl, mais y a-t-il un moyen de créer un raccourcireverse
(si rien d'autre, [ab] utilisanteval
)?($_)
reverse
looks likereverse
ne peut pas être appelée sans argument (les exemples le montrent, mais il n’existe qu’un seul prototype:)reverse LIST
, j’ai donc oublié d’$_
être l’argument par défaut;)LIST
peut être vide ...$_
comme argument par défaut, la doc spécifie un prototype sans paramètre (commeprint
oulenght
...). Ou peut-être que c'est juste une mauvaise impression que j'ai.JavaScript (ES6), 68 octets
la source
[1024, 1024, 512, 512, 256, 256]
résolution est-elle comme[2048, 512, 1024]
et non[2048, 1024, 512]
...?Perl 5.10,
6150 octets (49+ 1 pour drapeau)Merci à Ton Hospel d' avoir sauvé 11 octets!
Solution sans regex, avec
-a
drapeau:Essayez ici!
la source
@a=($F[-1]-$b?$b:2*pop@F,@a)while$b=pop@F;say"@a"
(50 octets)JavaScript (ES6),
686558576564 octetsSauvegardé 1 octet grâce à @ l4m2
Corrigé pour les tableaux non triés maintenant qu'il a été précisé que de telles entrées sont à prévoir.
la source
a=>(a.reverse()+'').replace(/(.),\1/g,(c,i)=>i*2).split`,`.reverse()
?[1024, 1024, 512, 512, 256, 256]
(je pense que ce cas de test a peut-être été ajouté plus tard).f=(a,l=[],m)=>(x=a.pop())*!m-l?f(a,x).concat(l):x?f(a,2*x,1):[l]
?05AB1E , 26 octets
Essayez-le en ligne!
Étapes généralisées
la source
Mathematica, 53 octets
Explication
Fractionner les entrées en sous-listes composées de séquences d'éléments identiques c'est-à-dire
{2, 2, 2, 4, 8, 8}
devient{{2, 2, 2}, {4}, {8, 8}}
.Partitionnez chaque sous-liste en partitions de la longueur maximale 2. c’est-à-dire
{{2, 2, 2}, {4}, {8, 8}}
devient{{{2, 2}, {2}}, {{4}}, {{8, 8}}}
.Totaliser chaque partition. c'est-à-dire
{{{2, 2}, {2}}, {{4}}, {{8, 8}}}
devient{{4, 2}, {4}, {16}}
.Inverser les résultats car la
Partition
commande de Mathematica va de gauche à droite, mais nous voulons que les partitions soient dans une autre direction. c'est-à-dire{{4, 2}, {4}, {16}}
devient{{2, 4}, {4}, {16}}
.Aplatir le résultat. c'est-à-dire
{{2, 4}, {4}, {16}}
devient{2, 4, 4, 16}
.la source
Plus@@@
estTr/@
et je pense que vous pouvez éviter les parenthèses etJoin@@
si vous utilisez##&@@
le résultat deReverse
(je ne l’ai pas testé cependant).Java 7, 133 octets
L'entrée est une ArrayList, et elle effectue une boucle en arrière, supprimant et doublant si nécessaire.
la source
Long
références sur la ligne 3 avec==
. Tenez comptea.get(i)-a.get(i-1)==0
.Perl, 37 octets
Comprend +4 pour
-0n
Exécuter avec l'entrée en tant que lignes séparées sur STDIN:
shift2048.pl:
la source
Haskell, 56 octets
la source
PHP,
86 100 9994 octetsnécessite PHP 7.0; prend des valeurs à partir des arguments de la ligne de commande.
Courez avec
-nr
ou essayez-le en ligne .la source
for($r=[];$v=($p=array_pop)($a=&$_GET[a]);)array_unshift($r,end($a)-$v?$v:2*$p($a));print_r($r);
est 1 Byte plus courtJulia 205 octets
La fonction à appeler est
H
par exemple
H([1,2,2,4,8,2,])
Ce n'est en aucun cas le moyen le plus court de le faire à Julia. Mais c'est tellement cool que je voulais quand même le partager.
t(a)
est un type de valeur, représentant la valeur (a).s(a)
est une instance de ce type de valeurg
est une fonction qui distribue les valeurs de différence (en utilisant les types de valeur) et le nombre de ses paramètres. Et c'est coolK
juste enrouleg
pour quePartie super cool:
Ceci définit l'
^
opérateur à appliquer aux fonctions. Donc ,K^s(2)(X)
c'est la même queK(K(X))
siH
on vient d' appelerK
surK
un tas de fois - suffisamment de fois effondrement certainement tous les cas imbriquéCela peut être fait beaucoup plus court, mais cette façon est tellement amusante.
la source
PowerShell v2 +, 81 octets
Prend l'entrée en tant que tableau explicite
$n
, l'inverse$n[$n.count..0]
,-join
s les éléments avec une virgule, puis regex est-replace
une paire de chiffres correspondante avec le premier élément, a*2
, et entourée de parenthèses. Les tubes qui résultent (qui@(2,2,4,4)
ressemblera à l' entrée(4*2),(2*2)
) àiex
(abrégéInvoke-Expression
et similaire àeval
), qui convertit la multiplication en nombres réels. Stocke le tableau résultant dans$b
, encapsule celui-ci entre parenthèses pour le placer sur le pipeline, puis l'inverse$b
avec[$b.count..0]
. Laisse les éléments résultants sur le pipeline et la sortie est implicite.Cas de test
NB-- Dans PowerShell, le concept de "retourner" un tableau vide n'a pas de sens - il est converti
$null
en dès qu'il quitte la portée - et équivaut donc à ne rien renvoyer, ce qui est fait ici dans le premier exemple. (après quelques erreurs vachement verbeuses). De plus, la sortie ici est séparée par des espaces, car c'est le séparateur par défaut pour les tableaux stringifiés.la source
Javascript - 103 octets
la source
[2,2,4,4]
rendements[2,2,4,4]
.Brain-Flak , 60 octets
Essayez-le en ligne!
Explication:
la source
Python 2, 94 octets
Essayez-le en ligne
la source
Julia,
7382 octetsUtilisez le pli à droite pour construire la liste de l’avant vers l’avant (vous pouvez également utiliser le pli à gauche et l’inverse de la liste au début et à la fin).
Si l'en-tête de la liste actuelle n'est pas égal à l'élément suivant à ajouter au début, ajoutez-le simplement au début.
Sinon, supprimez la tête de liste (sonne assez cruel) et ajoutez l'élément fois 2.
Exemple
la source
Raquette 166 octets
Ungolfed:
Essai:
Sortie:
la source
Japt , 12 octets
Essayez-le en ligne!
Déballé et comment ça marche
J'ai eu une idée de la solution Jelly de Jonathan Allan .
la source
Mathematica, 51 octets
{Longest@a___,x_/;x>0,x_,b___}
correspond à une liste contenant deux nombres positifs identiques consécutifs et transforme ces deux nombres en-2x
.Longest
oblige les matches à se dérouler le plus tard possible.Le processus est illustré étape par étape:
la source
Vim, 28 octets
G@='?\v(\d+)\n\1<C-@>DJ@"<C-A>-@=<C-@>'<CR>
Une macro qui regex recherche en arrière des numéros consécutifs correspondants et les ajoute.
Le tableau d'entrée doit être un nombre par ligne. Ce format me permet d’économiser des traits, ce qui est agréable, mais la vraie raison est de travailler autour des correspondances de regex qui se chevauchent. Étant donné la chaîne
222
, si vous ne/22
faites correspondre que la première paire, pas la seconde paire qui se chevauchent. Les règles de chevauchement sont différentes lorsque les deux paires commencent sur des lignes différentes. Dans ce défi[2, 2, 2]
devient[2, 4]
, donc correspondant à la paire de chevauchement est critique.REMARQUE: le défi demandé ne nécessite qu'un seul laissez-passer. Pour cette raison, vous devez avoir
:set nowrapscan
. Avec:set wrapscan
moi, je pourrais créer une version qui termine le travail en plusieurs passes, bien que cette solution ne l’ait pas toujours.<C-@>
: Normalement, en ligne de commande, taper un littéral<CR>
sans exécuter la commande avec laquelle vous devez l'échapper<C-V>
. Mais vous pouvez taper<C-@>
sans échappée et il sera traité comme un<C-J>
/<NL>
, ce qui ressemblera à<CR>
lorsque vous exécutez la macro, mais pas lorsque vous tapez. Essayez de lire:help NL-used-for-Nul
.@=
: Je ne peux pas utiliser facilement une macro enregistrée cette fois-ci, car il est possible que l’entrée ne comporte aucune paire correspondante. Si cela se produit lors de l'exécution d'une macro, la recherche infructueuse échouera. Mais si cela se produit lors de la passe (implicite en premier), les autres commandes du mode normal seront exécutées, ce qui endommagera le fichier. L'inconvénient de@=
je perd un octet sur l'appel récursif; Parfois, vous pouvez utiliser@@
un appel récursif, mais cela débute à@"
partir de 4 octets plus tôt dans ce cas.DJ@"<C-A>-
:DJ
supprime la ligne et met le numéro (pas de nouvelle ligne) dans un registre afin que je puisse l'exécuter en tant que macro pour un argument de nombre<C-A>
. Je dois par la-
suite pour ne pas avoir un deuxième match dans des cas comme[4, 2, 2]
.la source
Perl6, 92 octets
la source
Prolog (SWI) ,
9787 octetsEssayez-le en ligne!
la source