Plus tôt, j'ai défini le processus d'écrasement d'un tableau
Dans un écrasement, nous lisons le tableau de gauche à droite. Si, à un moment donné, nous rencontrons deux éléments identiques dans une rangée, nous supprimons le premier et doublons le second.
Par exemple, voici le processus d'écrasement du tableau suivant
[5,2,2,4]
^
[5,2,2,4]
^
[5,2,2,4]
^
[5,4,4]
^
[5,4,4]
^
[5,8]
^
Notez que le même élément peut être réduit plusieurs fois. Dans l'exemple, il 2,2,4
s'est effondré en 8
un seul passage.
Il est maintenant facile de broyer des tableaux, ce qui est difficile, c'est de les écraser. Votre tâche consiste à prendre un tableau d'entiers positifs en entrée et à sortir le plus grand tableau pouvant former l'entrée lorsqu'il est écrasé à plusieurs reprises. Par exemple, le réseau [4]
est formé par écrasement [2,2]
qui est à son tour formé par écrasement[1,1,1,1]
. Puisque nous ne pouvons pas avoir de valeurs non entières, [1,1,1,1]
nous ne pouvons plus les écraser et c'est donc notre réponse.
Vous ne recevrez jamais de 0
dans votre tableau d'entrée car ces tableaux peuvent être étendus indéfiniment. Vous ne recevrez également jamais un cas avec deux du même nombre impair côte à côte, de tels cas ne peuvent pas être le résultat d'un écrasement.
C'est du code-golf donc les réponses seront notées avec la taille de leur source mesurée en octets, moins d'octets étant meilleurs.
Avant de commencer à répondre, je veux juste dire que ce défi est beaucoup plus difficile qu'il n'y paraît. Vérifiez votre intuition au fur et à mesure et assurez-vous que votre réponse passe tous les cas de test.
Cas de test
[] -> []
[5] -> [5]
[6] -> [3,3]
[8] -> [1,1,1,1,1,1,1,1]
[4,8] -> [1,1,1,1,1,1,1,1,1,1,2]
[2,8] -> [1, 1, 1, 1, 2, 1, 1, 1, 1]
[4,4] -> [1,1,1,1,1,1,1,1]
la source
[1,1,1,1,1,1,1,1,1,1,2]
produire[4, 8]
au lieu de[8, 4]
? si cela est[1,>1,1,1,1,1,1,1,1,1,2]
,[2,1,>1,1,1,1,1,1,1,2]
,[2,>2,1,1,1,1,1,1,2]
,[4,1,>1,1,1,1,1,2]
,[4,2,1,>1,1,1,2]
,[4,2,>2,1,1,2]
,[4,>4,1,1,2]
,[8,1,>1,2]
,[8,2,>2]
,[8,4]
?[1,>1,1,1,1,1,1,1,1,1,2]
,[2,>1,1,1,1,1,1,1,1,2]
,[2,1,>1,1,1,1,1,1,1,2]
,[2,2,>1,1,1,1,1,1,2]
,[2,2,1,>1,1,1,1,1,2]
,[2,2,2,>1,1,1,1,2]
,[2,2,2,1,>1,1,1,2]
,[2,2,2,2,>1,1,2]
,[2,2,2,2,1,>1,2]
,[2,2,2,2,2,>2]
,[2,2,2,2,4>]
, deuxième passage:[2,>2,2,2,4]
,[4,>2,2,4]
,[4,2,>2,4]
,[4,4,>4]
,[4,8>]
. Espérons que cela clarifie les choses. Si vous souhaitez que du code pour regarder la question précédente a des réponses qui implémentent une fonction d'écrasement.[4, 4]
doit être supprimé, car nous ne pouvons jamais obtenir ce tableau après une séquence stretch => crush, car cela se terminera par[8]
Réponses:
JavaScript (Node.js) ,
237221213186 octetsEssayez-le en ligne!
Cet algorithme calcule des tableaux étirés optimaux, en étirant chaque nombre au maximum, puis, si nécessaire, il écrase une paire de nombres au bon endroit, créant effectivement un "bloqueur d'écrasement", interrompant la séquence d'écrasement du nombre précédent.
Par exemple:
[1, 1, 1, 1, 1, 1]
donne[4,2]
une fois écrasé, mais se[1, 1, 1, 1, 2]
traduit par[2, 4]
Le défi est de déterminer où exactement un bloqueur d'écrasement doit être placé afin que l'écrasement du tableau résultant donne le bon résultat:
[2, 4]
il faut un bloqueur d'écrasement (le nombre est étiré1
, répété, et[1, 1]
est plus courte que[1,1,1,1]
), mais[4, 2]
et[2, 6]
ne nécessitent pas unn
la séquence étirée précédente, et si la condition ci-dessus est vérifiée, alors la séquence actuelle est une répétition de lan
séquence. Pour interrompre la séquence d'écrasement du numéro précédent, nous devons placer le bloqueur d'écrasement à la fin de la deuxièmen
séquence du numéro actuel à étirer. Exemple:,[2, 8] => [(1, 1)=n, (1, 1) + (2) + (1, 1) + ...]
ou[4, 8] => [(1, 1, 1, 1)=n, (1, 1, 1, 1) + (1, 1, 2) + ...]
la source
Gelée , 42 octets
Essayez-le en ligne!
Programme complet. Extrêmement inefficace, mais fonctionne.
la source
Python 2 ,
230228226 octetsFonctionne en itérant toutes les listes possibles avec la même somme que celle en entrée. Suppression de ceux qui ne sont pas égaux au tableau d'entrée dans un état écrasé, en sélectionnant le plus long.
Modifier: -2 octets en supprimant le
if
dans la fonction principaleModifier: -2 octets en supprimant deux crochets inutiles
Essayez-le en ligne!
Explication
Fonction principale, chargée de trouver toutes les solutions possibles et de sélectionner la plus longue
Fonction d'écrasement, qui vérifie si y est égal à l'un des écrasements.
Générer toutes les permutations possibles avec la somme donnée
la source
05AB1E ,
4137 octetsEssayez-le en ligne!
Port de ma solution Javascript.
Explications:
la source