Une séquence magique est une séquence d'entiers non négatifs x[0..n-1]
telle qu'il existe exactement des x[i]
instances dei
Par exemple, 6,2,1,0,0,0,1,1,0,0,0 est une séquence magique car il y a 6 0, 2 1, etc.
Écrire une fonction qui, lorsqu'elle est donnée n, génère toutes les séquences magiques de longueur n
Le programme qui peut produire la sortie correcte pour la valeur la plus élevée de n en 10 secondes gagne. (Cependant, tous les programmes sont les bienvenus)
Par exemple, le programme d'Alice peut gérer jusqu'à n = 15 en 10 secondes tandis que Bob peut gérer jusqu'à n = 20 dans le même temps. Bob gagne.
Plateforme: Linux 2,7 GHz @ 4 processeurs
number
fastest-code
sequence
Agnishom Chattopadhyay
la source
la source
n>5
avec une solution pas de la forme[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
? J'ai regardén=20
et je n'en ai pas trouvé, et je me demande si je fais une erreur.Réponses:
Python, n≈10 8
Cela utilise le fait, que je vais prouver, que les seules séquences Magic de longueur
n
sont:[1, 2, 1, 0]
et[2, 0, 2, 0]
pourn=4
[2, 1, 2, 0, 0]
pourn=5
[n-4, 2, 1, 0, 0, ..., 0, 0, 1, 0, 0, 0]
pourn>=7
Donc, pour
n>=7
, il suffit de retourner un énorme tuple. Je peux le faire jusqu'à environn=10^8
sur mon ordinateur portable, ce qui est probablement limité par la mémoire; plus et il gèle. (Merci à trichoplax pour l'idée d'utiliser des tuples plutôt que des listes.) Ou, si l'on peut imprimer un dictionnaire d'entrées non nulles{0:n-4, 1:2, 2:1, (n-4):1}
, on peut le faire pour ginormousn
.Je prouve l'unicité de
n>=7
; les autres peuvent être vérifiés par la force brute ou le traitement des dossiers.La somme des entrées de
l
est le nombre total de tous les numéros de la liste, qui est sa longueurn
. La liste contient desl[0]
zéros et donc desn-l[0]
entrées non nulles. Mais par définitionl[0]
doit être différent de zéro ou nous obtenons une contradiction, et chacune des autres entrées non nulles est au moins 1. Cela représente déjà une somme del[0] + (n-l[0]-1)*1 = n-1
sur la somme globale den
. Donc, sans compterl[0]
, il peut y avoir au plus un 2 et aucune entrée plus grande que 2.Mais cela signifie que les seules entrées non nulles sont
l[0], l[1], l[2], and l[l[0]]
, dont les valeurs sont au maximuml[0]
et une permutation de1,1,2
, ce qui donne une somme maximale del[0]+4
. Puisque cette somme estn
, qui est au moins 7, nous l'avonsl[0]>=3
, et ainsil[l[0]]=1
. Maintenant, il y en a au moins un1
, ce qui signifiel[1]>=1
, mais sil[1]==1
c'est un autre1
, alorsl[1]>=2
, ce qui impliquel[1]
est le seul2
. Cela donnel[2]=1
, et toutes les entrées restantes le sont0
, doncl[0]=n-4
, ce qui complète la solution.la source
Python 3, n≈40
Effectue une recherche en premier des listes possibles, remplit les entrées de droite à gauche, arrête la recherche à un suffixe si elle n'est pas plausible, ce qui peut se produire si:
n
(la somme de la liste entière doit êtren
)i*l[i]
dans le suffixe dépassen
(la somme pour la liste entière doit êtren
)J'avais des préfixes testés d'origine de gauche à droite, mais cela s'est fait plus lentement.
Les sorties jusqu'à
n=30
sont les suivantes:À l'exception des trois premières listes
[1, 2, 1, 0], [2, 0, 2, 0], [2, 1, 2, 0, 0]
, il y a exactement une liste de chaque longueurn>6
et elle a la forme[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
. Ce schéma persiste jusqu'à au moinsn=50
. Je soupçonne que cela tient pour toujours, auquel cas il est trivial d'en afficher un grand nombre. Même si ce n'est pas le cas, une compréhension mathématique des solutions possibles accélérerait considérablement la recherche.la source
n=0
. J'avais manqué que nous retournions le résultat pour un seuln
, sans comptern
. Cela me met au courantn=40
.Pyth - 15 octets
Utilise la force brute par toutes les séquences possibles de len
n
puis de filtres.Une explication complète à venir.
Essayez-le ici en ligne .
la source
K, 26 octets
Comme l'approche de Maltysen, la force brute. Le cœur du programme est un prédicat qui teste si un vecteur donné est "magique":
Construisez un vecteur iota tant que le vecteur d'entrée (
!#x
), comptez les occurrences de chaque chiffre ((+/x=)'
) et comparez le résultat avec le vecteur d'entrée (x~
). S'il y a une correspondance, vous avez une séquence magique.Malheureusement, ce premier coup de couteau semble être assez lent. En utilisant Kona sur mon ordinateur portable, il faut environ 12 secondes pour gérer n = 7. Je dois y réfléchir un peu plus.
la source