Défi
Imaginons un N
-tuple d'entiers compris entre 0 et M
inclus, et appelons-le F
.
Il y a (M + 1) ** N
des F
s possibles au total.
Combien de ces F
valeurs satisfont à toutes les inégalités suivantes (l'indice est à base unique)?
F[n] + F[n+1] <= M
pour1 <= n < N
F[N] + F[1] <= M
Ecrire un programme ou une fonction qui prend deux nombres entiers positifs N
et M
et fournit la réponse sous quelque forme que pratique.
Cas de test
(N,M) => Answer
(1,1) => 1
(2,1) => 3
(3,1) => 4
(4,1) => 7
(1,2) => 2
(2,2) => 6
(3,2) => 11
(4,2) => 26
(10,3) => 39175
(10,4) => 286555
(10,5) => 1508401
(25,3) => 303734663372
(25,4) => 43953707972058
(25,5) => 2794276977562073
(100,3) => 8510938110502117856062697655362747468175263710
(100,4) => 3732347514675901732382391725971022481763004479674972370
(100,5) => 60964611448369808046336702581873778457326750953325742021695001
Explication
M (max value of element) = 1
F[1] + F[1] <= 1; F = [0]
(1,1) => 1
F[1] + F[2] <= 1; F = [0,0], [0,1], [1,0]
(2,1) => 3
F = [0,0,0], [0,0,1], [0,1,0], [1,0,0]
(3,1) => 4
F = [0,0,0,0], [0,0,0,1], [0,0,1,0], [0,1,0,0], [0,1,0,1], [1,0,0,0], [1,0,1,0]
(4,1) => 7
---
M = 2
F[1] + F[1] <= 2; F = [0], [1]
(1,2) => 2
F = [0,0], [0,1], [0,2], [1,0], [1,1], [2,0]
(2,2) => 6
F = [0,0,0], [0,0,1], [0,0,2], [0,1,0], [0,1,1], [0,2,0], [1,0,0], [1,0,1],
[1,1,0], [1,1,1], [2,0,0]
(3,2) => 11
(4,2) => 26 (left as exercise for you)
Règles
- Il s'agit d'un défi de complexité limitée . La complexité temporelle de votre code doit être polynomiale
M
etN
(par exemple, vous ne pouvez pas générer tous les(M + 1) ** N
tuples, puis vérifier la condition). Veuillez expliquer votre approche dans votre soumission. - Les règles de code-golf standard s'appliquent. La réponse la plus courte en octets l'emporte.
code-golf
restricted-complexity
Bubbler
la source
la source
mat(...,int)
ne semble pas fonctionner pour lesn=100
cas. La méthode est correcte (utiliser sympy pour additionner les puissances des racines du polynôme caractéristique fonctionne, par exemple), mais numpy va mal quelque part lorsque les nombres augmentent (peut-être que c'est l'**
opérateur de puissance?)Pyth , 27 octets
Manifestation
Attend une entrée au format:
Il s'agit d'une programmation dynamique classique, sur l'extrémité gauche des valeurs définies jusqu'à présent, l'extrémité droite et la taille actuelle de l'écart.
Comment ça marche, en pseudocode / Python:
Q
est utilisé pourM
,z
est utilisé pourN
,:
estfill
,N
estleft
,T
estright
,Y
estgap
.la source
MATL ,
1312 octetsEssayez-le en ligne! Ceci est une traduction directe de la réponse Python de xnor et de ma première réponse MATL, donc ce n'est probablement pas optimal. Par exemple, il existe probablement un moyen plus court pour obtenir une matrice triangulaire supérieure gauche que celles
t&lYRP
. Edit: Et il s'avère qu'il y a, à savoir:&>~P
. Merci à Luis Mendo pour -1 octet!la source
Stax , 17 octets
Exécuter et déboguer
Déballé, non golfé et commenté, il ressemble à ceci.
Exécutez celui-ci
la source
R , 72 octets
Essayez-le en ligne!
Ports xnor approche.
Échoue pour les cas de test plus importants car R ne prend en charge que les entiers 32 bits (ils sont convertis en
double
une fois que la valeur int maximale est atteinte), donc l'utilisation d'gmp
une autre bibliothèque arithmétique de précision arbitraire serait nécessaire.Étrangement, R n'a pas d'opérateur de puissance matriciel, comme cela
^
s'applique toujours par élément.la source
%^%
opérateur correctement implémenté dans le packageexpm
qui autoriserait -5 octets , mais malheureusement, il n'est pas disponible sur TIO (j'ai dû le tester localement).function(M,N)sum(diag(expm::`%^%`(outer(0:M,0:M,"+")<=M,N)))