[PYTHON] Programmation débutant (lycéen) Optimiser l'algorithme créé

Puzzle mathématique

M. K étudie Python [puzzle mathématique](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3% 83% 9E% E8% 84% B3% E3% 82% 92% E9% 8D% 9B% E3% 81% 88% E3% 82% 8B% E6% 95% B0% E5% AD% A6% E3% 83% 91% E3% 82% BA% E3% 83% AB-% E3% 82% B7% E3% 83% B3% E3% 83% 97% E3% 83% AB% E3% 81% A7% E9% AB% 98 % E9% 80% 9F% E3% 81% AA% E3% 82% B3% E3% 83% BC% E3% 83% 89% E3% 81% 8C% E6% 9B% B8% E3% 81% 91% E3 % 82% 8B% E3% 82% 88% E3% 81% 86% E3% 81% AB% E3% 81% AA% E3% 82% 8B70% E5% 95% 8F-% E5% A2% 97% E4% BA% 95-% E6% 95% 8F% E5% 85% 8B / dp / 479814245X / ref = asc_df_479814245X /? Tag = jpo-22 & linkCode = df0 & hvadid = 295723231663 & hvpos = 1o1 & hvnetw = g & hvrando = 6299120 & hvlocint = & hvlocphy = 100009242 & hvtargid = pla-526233948639 & psc = 1 & th = 1 & psc = 1) Apportez-le et essayez ceci. J'ai dit.

Le problème est de trouver la valeur minimale de 10 ou plus dans le nombre de cycles (un nombre tel que 12321) dans l'un des nombres décimaux, binaires et octaux.

Veuillez découvrir où vous pouvez aller.


D = list()
E = list()
F = list()
def checker(num):
    a = str(num)
    b = list(reversed(a))
    c = len(b)
    for j in range(c//2):
        if b[j] != b[-j-1]:
            return None
    return num

for i in range(10,1000):
    d = checker(i)
    if d != None:
        D.append(d)

for i in D:
    e = checker(str(oct(i))[2:])
    if e != None:
        E.append(int(e,8))

for i in E:
    f = checker(str(bin(i))[2:])
    if f != None:
        F.append(int(f,2))
print(F)

Je cherche la bonne réponse, donc c'est un bon travail.

Au lieu d'un passage, vérifiez d'abord le nombre de phrases décimales jusqu'à 1000, puis vérifiez si le nombre de fois trouvé est octal ou binaire. Je suppose que je l'ai fait en le mettant en faisant diverses pensées et erreurs.

Version de refactoring de K-kun

Mais K-kun, qui s'est rendu compte qu'il pouvait le faire en une seule passe, l'a corrigé.

number = 10
result_list = []
def checker(num):
    a = list(reversed(str(num)))
    for j in range(len(a)//2):
        if a[j] != a[-j-1]:
            return None
    return num  
                     
while True:
    if checker(number) != None and checker(str(oct(number))[2:]) != None and checker(str(bin(number))[2:]) != None:
        result_list.append(number)
        print(number)
        break
    else:
        number += 1

C'est un flux assez simple

Commencez à cuisiner

Il y a différentes manières de convertir en chaînes de caractères binaires ou octales, et je pense que la méthode de K est bonne, mais je l'ai changée en " {: o} ".format (nombre). Je ne pense pas que ce soit le niveau de quelle méthode est la meilleure.

La chose la plus mystérieuse est la valeur de retour de la fonction checker. Si c'est une fonction qui vérifie simplement si c'est le nombre de fois, je pense qu'il vaut mieux retourner True / False.

Le reste inversé (str (num)) qui a essayé de trouver les caractères dans l'ordre inverse même s'il s'agissait d'une récitation. En conséquence, vous n'en avez pas besoin, non?

J'ai essayé de réparer ce coup.

def checker(num_str):
    for j in range(len(num_str)//2):
        if num_str[j] != num_str[-j-1]:
            return False
    return True
                     
number = 10
while True:
    if (checker(str(number)) and 
        checker( "{:o}".format(number)) and
        checker( "{:b}".format(number))) :
        print(number)
        break
    number += 1

Le programme que vous avez commenté était plus simple et plus facile à comprendre, je vais donc l'ajouter.

from itertools import count

def is_palindrome(text):
    return text == text[::-1]

for number in count(10):
    if (is_palindrome(f"{number}")
    and is_palindrome(f"{number:o}")
    and is_palindrome(f"{number:b}")):
        print(number)
        break

Recommended Posts

Programmation débutant (lycéen) Optimiser l'algorithme créé
J'ai essayé de refactoriser le code de Python débutant (lycéen)
J'ai essayé de remodeler le code de Python débutant (lycéen) en crunchy orienté objet
Comité du premier cycle du secondaire
La génération combinée des débutants Python (lycéens) était en diagonale au-dessus (génération combinée par traitement récursif)
Comité du premier cycle du secondaire (version Réseau X)
Script du "Livre de programmation à partir d'élèves du primaire et du premier cycle du secondaire"
[Python] Un lycéen a implémenté Perceptron et a essayé de classer les iris.