[PYTHON] Puzzle mathématique pour former le cerveau du programmeur Q05 Vous payez toujours en espèces?

Résumé du problème

Échangez 1000 yens contre une combinaison de 500 boules de yens, 100 boules de yens, 50 boules de yens et 10 boules de yens. Cependant, le nombre total de pièces est de 15 ou moins.

Code Résolvez sans réfléchir

#Q05 Payez-vous toujours en espèces?

combinations = [] #Liste des combinaisons
for c500 in range(3):
    for c100 in range(11):
        for c50 in range(16):
            for c10 in range(16):
                if c500 + c100 + c50 + c10 <= 15:
                    if c500 * 500 + c100 * 100 + c50 * 50 + c10 *10 == 1000:
                        combinations.append((c500, c100, c50, c10))
                
print(combinations)
print(len(combinations))

Code 2

Écrivez avec le moins de répétitions possible d'énoncés for

import itertools
import numpy as np

combinations = []
for c in list(itertools.product(list(range(16)), repeat=4)):
    m = np.array(list(c)) * np.array([500, 100, 50, 10])
    if np.sum(c) <= 15 and np.sum(m) == 1000:
        combinations.append(c)
        
print(combinations)
print(len(combinations))

Le code est devenu plus court, mais je ne pense pas qu'il soit beaucoup plus rapide et moins lisible, donc c'est juste pour référence. .. ..

Ce que je veux dire, c'est que lors du traitement autour du tableau

Si vous cherchez, vous trouverez des outils plus faciles à mettre en œuvre.

Ce qui suit est un complément aux outils utilisés cette fois.

itertools.product Trouvez le produit direct de la séquence. Vous pouvez utiliser l'option de répétition pour trouver le produit direct avec vous-même. Renvoie un objet itertools, mais peut être converti en liste. L'exemple d'utilisation suivant.

import itertools

x = ['a', 'b']
y = ['c', 'd']
z = list(range(3)) #[0, 1, 2]

print(list(itertools.product(x, y))) 
#[('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')]

print(list(itertools.product(x, repeat=2)))
#[('a', 'a'), ('a', 'b'), ('b', 'a'), ('b', 'b')]

print(list(itertools.product(z, repeat=2)))
#[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

Quatre règles de liste dans numpy

Dans une liste normale, le signe + représente une concaténation de la liste. Les autres symboles arithmétiques sont des erreurs. Dans numpy, si vous connectez la liste avec un symbole d'opération, la liste des résultats du calcul des éléments à la même position est renvoyée.

import numpy as np

x = [1, 3, 5]
y = [2, 4, 6]

print(x + y) #[1, 3, 5, 2, 4, 6]
print(x - y) #error
print(x * y) #error
print(x / y) #error

print(np.array(x) + np.array(y)) # [ 3  7 11]
print(np.array(x) - np.array(y)) # [-1 -1 -1]
print(np.array(x) * np.array(y)) # [ 2 12 30]
print(np.array(x) / np.array(y)) # [0.5 0.75 0.83333333]

Recommended Posts

Puzzle mathématique pour former le cerveau du programmeur Q05 Vous payez toujours en espèces?
Puzzle mathématique pour entraîner le cerveau du programmeur Q08 Excellent robot de nettoyage
Puzzle mathématique pour entraîner le cerveau du programmeur Q04 Découper un bâton
Puzzle mathématique pour entraîner le cerveau du programmeur Q01 "Translittération en décimal"
Puzzle mathématique pour entraîner le cerveau du programmeur Q03 Retourner la carte
Puzzle mathématique pour entraîner le cerveau du programmeur Q06 (version modifiée) Prédiction de Koratz