Chaque nombre peut être représenté en utilisant une séquence de reste infiniment longue. Par exemple, si nous prenons le nombre 7 et que nous effectuons 7mod2
, alors 7mod3
, alors 7mod4
, et ainsi de suite, nous obtenons 1,1,3,2,1,0,7,7,7,7,....
.
Cependant, nous avons besoin de la sous- séquence de reste la plus courte possible qui peut encore être utilisée pour la distinguer de tous les nombres inférieurs. Utiliser à nouveau 7 [1,1,3]
est la sous-séquence la plus courte, car toutes les sous-séquences précédentes ne commencent pas par [1,1,3]
:
0: 0,0,0,0...
1: 1,1,1,1...
2: 0,2,2,2...
3: 1,0,3,3...
4: 0,1,0,4...
5: 1,2,1,0...
6: 0,0,2,1...
Notez que [1,1]
cela ne fonctionne pas pour représenter 7, car il peut également être utilisé pour représenter 1. Cependant, vous devez sortir [1]
avec une entrée de 1.
Entrée sortie
Votre entrée est un entier non négatif. Vous devez générer une séquence ou une liste de la séquence de reste de longueur minimale définie ci-dessus.
Cas de test:
0: 0
1: 1
2: 0,2
3: 1,0
4: 0,1
5: 1,2
6: 0,0,2
7: 1,1,3
8: 0,2,0
9: 1,0,1
10: 0,1,2
11: 1,2,3
12: 0,0,0,2
30: 0,0,2,0
42: 0,0,2,2
59: 1,2,3,4
60: 0,0,0,0,0,4
257: 1,2,1,2,5,5
566: 0,2,2,1,2,6,6
1000: 0,1,0,0,4,6,0,1
9998: 0,2,2,3,2,2,6,8,8,10
9999: 1,0,3,4,3,3,7,0,9,0
Voici les 10 000 premières séquences , au cas où vous seriez intéressé (les numéros de ligne sont décalés de 1).
Il s'agit d'un code-golf , alors faites-le aussi court que possible dans votre langue préférée. Faux points bonus pour toutes les réponses rapides!
la source
Réponses:
Mathematica,
6053 octetsUn peu rapide (il gère 10000 en ~ 0,1 seconde, mais manquera probablement de mémoire pour 100000).
Le code renvoie une erreur mais calcule correctement le résultat.
Explication
Nous avons constaté plus tôt dans le chat que les diviseurs requis peuvent toujours être déterminés comme la liste la plus courte
{1, 2, ..., n}
dont le multiple le plus commun dépasse l'entrée. Un court argument pour expliquer pourquoi: si le LCM est inférieur à l'entrée, alors la soustraction du LCM de l'entrée laisserait tous les diviseurs inchangés, de sorte que la représentation n'est pas unique. Cependant, pour toutes les entrées inférieures au LCM, les restes seront uniques, sinon la différence entre deux nombres avec des restes égaux serait un plus petit multiple de tous les diviseurs.Quant au code ... comme d'habitude, l'ordre de lecture de Mathematica au golf est un peu drôle.
Cela nous donne une liste
[1, 2, 3, ..., n+2]
d'entréen
. Il+2
s'agit de s'assurer qu'il fonctionne correctement pour0
et1
.Carte
2~Range~#
(sucre syntaxique pourRange[2,#]
) sur cette liste, nous obtenons doncCe sont des listes de diviseurs candidats (bien sûr, en général, c'est beaucoup plus que ce dont nous aurons besoin). Maintenant, nous trouvons le premier d'entre eux dont le LCM dépasse l'entrée avec:
Plus de syntaxe:
x_
est un modèle qui correspond à l'une des listes et l'appellex
. Le/;
attache une condition à ce modèle. Cette condition est l'LCM@@x>#
endroit où@@
s'applique la fonction à la liste, c'est-à-dire lesLCM@@{1,2,3}
moyensLCM[1,2,3]
.Enfin, nous obtenons simplement tous les restes, en utilisant le fait que
Mod
c'est-àListable
-dire qu'il mappe automatiquement sur une liste si l'un des arguments est une liste (ou si les deux sont des listes de la même longueur):la source
Gelée , 14 octets
Ceci utilise le fait que la solution (le cas échéant) d'un système de congruences linéaires est unique modulo le LCM des modules. Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
MATL , 24 octets
Merci à @nimi d'avoir signalé une erreur dans une version précédente de cette réponse (maintenant corrigée)
Cela manque de mémoire dans le compilateur en ligne pour les deux plus grands cas de test (mais cela fonctionne sur un ordinateur avec 4 Go de RAM).
Essayez-le en ligne!
Explication
Cela applique la définition de manière simple. Pour l'entrée,
n
il calcule un tableau 2D contenantmod(p,q)
avecp
de0
àn
etq
de1
àn+1
. Chacunp
est une colonne et chacunq
est une ligne. Par exemple, avec l'entrée,n=7
ce tableau estMaintenant, la dernière colonne, qui contient les restes de
n
, est par élément par rapport à chaque colonne de ce tableau. Cela donneoù
1
indique l'égalité. La dernière colonne est évidemment égale à elle-même et contient donc toutes celles-ci. Nous devons trouver la colonne qui a le plus grand nombre de initiaux , autres que la dernière colonne, et de prendre note de ce nombre de rapports initiaux,m
. (Dans ce cas, c'est la deuxième colonne, qui contient lesm=3
initiales). À cette fin, nous calculons le produit cumulatif de chaque colonne:puis la somme de chaque colonne
puis triez de manière non croissante et prenez la deuxième valeur, qui est
3
. C'est le souhaitm
, qui indique combien de restes nous devons ramasser.la source
Gelée ,
1311 octetsCela ne gagnera pas de points brownie de vitesse ... Essayez-le en ligne! ou vérifiez les cas de test plus petits .
Comment ça marche
la source
Python 3.5,
1179578 octetsNécessite Python 3.5 et sympy (
python3 -m pip install --user sympy
). Nous remercions @Dennis de m'avoir informé que Python 3.5 autorise l'*l
astuce avec des arguments par défaut.la source
M>n and l
enl*(M>n)
.Python 2,
73706965 octetsUn programme complet. @Dennis a économisé 4 octets en améliorant la façon dont le zéro est traité.
la source
Haskell,
66605150 octetsExemple d'utilisation:
f 42
->[0,0,2,2]
. C'est l'algorithme décrit dans la réponse de @Martin Büttner .Je garderai la version précédente pour référence, car elle est assez rapide:
Haskell, 51 octets
Cela prend 0,03s pour
f (10^100)
mon portable de cinq ans.Modifier: @xnor a trouvé un octet à enregistrer. Merci!
la source
h i=mod i<$>[2..2+sum[1|l<-scanl1 lcm[2..i],l<=i]]
Pyth,
51 octets66 octetsEssaye le!
Version 39 octets à vitesse beaucoup plus élevée (ne fonctionne pas pour 0-2):
Cela semble fonctionner pour des nombres absurdement grands comme 10 10 3
Remarque: cette réponse ne fonctionne pas pour 0, 1 et 2.Corrigé!la source
JavaScript (ES6),
8177 octetsCela construit récursivement la réponse jusqu'à ce que le LCM dépasse le nombre d'origine. Le GCD est également calculé récursivement, bien sûr.
Edit: 4 octets enregistrés grâce à @ user81655.
la source
Rubis, 52 octets
Cette solution vérifie tous les possibles à
m
partir de 2, le reste qui rend la séquence unique. Ce qui rend le dernierm
unique n'est pas le reste lui-même, mais le fait qu'ilm
est le dernier membre de la plus petite plage(2..m)
où le multiple le moins commun (LCM) de cette plage est supérieur àn
. Cela est dû au théorème des restes chinois, où pour déterminer de manière unique quel nombren
est avec un certain nombre de restes, le LCM de ces restes doit être supérieur àn
(si vous sélectionnezn
de(1..n)
; si vous sélectionnezn
dea..b
, le LCM doit uniquement être supérieur àb-a
)Remarque: je mets
a<<n%m
à la fin du code car lesuntil n<t=t.lcm(m+=1)
courts-circuits avanta
ont reçu le dernier élément pour le rendre unique.Si quelqu'un a des suggestions de golf, faites-le moi savoir dans les commentaires ou dans le chat PPCG .
Ungolfing:
la source
Julia,
3633 octetsEssayez-le en ligne!
la source
Python 3.5,
194181 181169152149146 octets:( Merci à @ Sherlock9 pour 2 octets! )
Fonctionne parfaitement et est également assez rapide. Le calcul de la séquence restante minimale de
100000
sorties[0, 1, 0, 0, 4, 5, 0, 1, 0, 10, 4, 4]
et n'a pris que 3 secondes environ. Il a même pu calculer la séquence de l'entrée1000000
(1 million), de la sortie[0, 1, 0, 0, 4, 1, 0, 1, 0, 1, 4, 1, 8, 10, 0, 9]
et a pris environ 60 secondes.Explication
Fondamentalement, cette fonction crée d'abord une liste,
y
avec toutj mod i
oùj
est chaque entier de la plage0=>7
(y compris 7) eti
chaque entier de la plage0=>100
. Le programme passe ensuite dans unewhile
boucle infinie et compare le même nombre de contenus de chaque sous-liste dans les sous-listes de l'avant-dernier ày
(y[:-1:]
) avec le même nombre d'éléments dans la dernière sous-liste (y[-1]
) de la listey
. Lorsque la sousy[-1]
- liste est différente de toute autre sous-liste, la boucle est rompue et la séquence de reste minimale correcte est renvoyée.Par exemple, si l'entrée est 3,
y
serait:Puis, lorsqu'il entre dans la boucle while, il compare chaque sous-liste dans la liste
y[:-1:]
avec le même nombre d'éléments dans la sous-listey[-1]
. Par exemple, il comparerait d'abord[[0],[1],[0]]
et[1]
. Étant donné que la dernière sous-liste se trouve dans le reste dey
, elle continuerait, puis comparerait[[0,0],[0,1],[0,2]]
et[1,0]
. Étant donné que[1,0]
n'est maintenant PAS dans le reste dey
cet ordre spécifique , c'est la séquence de rappel minimale et, par conséquent,[1,0]
serait correctement retournée.la source
y[:c:]
c'est la même chose quey[:c]
C89, 105 octets
Compile (avec des avertissements) en utilisant
gcc -std=c89
. Prend un nombre unique sur stdin et génère la séquence de restes séparés par des espaces sur stdout.la source
C, 89 octets
Compilez avec gcc. Essayez-le en ligne: n = 59 , n = 0 .
la source