Prenons une liste l
composée de chiffres. Définir une opération de bloc à l' index i
sur la liste l
à l'acte consistant à déplacer 3 éléments consécutifs à partir i
de l
la fin.
Exemple:
l, i (1-indexing) -> l (after applying block operation at index i)
[1,2,3,4,5], 1 -> [4,5,1,2,3]
[1,2,3,4,5,6,7], 3 -> [1,2,6,7,3,4,5]
Étant donné une liste composée uniquement de 0 et 1, votre défi est de la partitionner de sorte que les zéros soient à l'avant et ceux à l'arrière, en utilisant uniquement des opérations de bloc. La sortie doit être les indices dans l'ordre où ils sont appliqués sur la liste.
Parce que cela est impossible pour la liste [1,0,1,0]
, la longueur de la liste est garantie d'être au moins 5.
Cas de test (1-indexation)
(il existe d'autres sorties valides)
[1,1,1,0,0] -> [1]
[0,1,0,1,0] -> [1,2,1,1]
[0,0,0,1,1,1,0,0,0] -> [4]
Utilisez ce script pour générer plus de cas de test. (seule entrée. La rplc ' ';','
partie est utilisée pour r e pl d' un c e espaces par des virgules dans la sortie)
Critères gagnants
le code-challenge est le principal critère gagnant, et le code le plus rapide est le bris d'égalité. En particulier:
- La solution avec la longueur de sortie la plus courte (le moins d'opérations de bloc) avec le cas de test (
n_elem
= 500,random_seed
= {valeur secrète}) l'emporte. Vous devriez pouvoir exécuter votre solution jusqu'à son terme avec le scénario de test (n_elem
= 500,random_seed
= 123456). - En cas d'égalité, la solution qui peut gérer la plus grande valeur de puissance de 2 de
n_elem
avecrandom_seed
= {valeur secrète} dans les 10 secondes (pour moi) l'emporte. - En cas d'égalité, la solution qui prend moins de temps sur ce cas de test l'emporte.
la source
Réponses:
Python 3 , (0,397 n + 3,58) étapes
Régression polynomiale de 1000 points par
numpy.polyfit
.Essayez-le en ligne!
la source
Python 3, ~ 179 pas pour n = 500 (en moyenne)
Une approche heuristique gourmande. Un peu lent mais fonctionne toujours. Utilise un solveur optimal pour les petites tailles.
la source