17ème problème de référence d'écriture en temps réel hors ligne implémenté en Python

Cliquez ici pour plus de détails sur le problème. http://nabetani.sakura.ne.jp/hena/ord17scheherazade/ http://qiita.com/Nabetani/items/dabe8ec57e0313229552

#!/usr/bin/env python
# -*- coding:utf8 -*-

def is_palindrome(data, base):
    digits = []
    while data > 0:
        digits.append(data % base)
        data /= base
    return digits == digits[::-1]

def solve(data):
    bases = [base for base in xrange(2, data) if is_palindrome(data, base)]
    return ','.join(map(str, bases)) if bases else '-'

def test(data, correct):
    answer = solve(int(data))
    print 'xo'[answer == correct], data, correct, answer

0, test( "17301", "5,38,100,218,236,5766,17300" );
1, test( "2", "-" );
2, test( "1", "-" );
3, test( "3", "2" );
4, test( "4", "3" );
5, test( "5", "2,4" );
6, test( "6", "5" );
7, test( "10", "3,4,9" );
8, test( "101", "10,100" );
9, test( "1001", "10,25,76,90,142,1000" );
10, test( "10001", "10,24,30,42,80,100,136,10000" );
11, test( "1212", "22,100,201,302,403,605,1211" );
12, test( "123412", "62,100,205,215,30852,61705,123411" );
13, test( "5179", "5178" );
14, test( "4919", "4918" );
15, test( "5791", "5790" );
16, test( "5498", "2748,5497" );
17, test( "453", "150,452" );
18, test( "134", "66,133" );
19, test( "8489", "27,652,8488" );
20, test( "1234", "22,616,1233" );
21, test( "5497", "41,238,5496" );
22, test( "4763", "19,35,432,4762" );
23, test( "3974", "17,27,1986,3973" );
24, test( "3521", "44,55,502,3520" );
25, test( "5513", "20,38,53,148,5512" );
26, test( "8042", "23,29,60,4020,8041" );
27, test( "7442", "37,60,121,3720,7441" );
28, test( "4857", "25,1618,4856" );
29, test( "22843", "49,69,91,141,430,22842" );
30, test( "194823", "84,121,21646,64940,194822" );
31, test( "435697", "160,169,235,626,1822,435696" );
32, test( "142", "3,7,70,141" );
33, test( "886", "5,14,442,885" );
34, test( "3102", "7,65,93,140,281,516,1033,1550,3101" );
35, test( "17326", "11,28,99,105,8662,17325" );
36, test( "32982", "13,72,238,477,716,1433,5496,10993,16490,32981" );
37, test( "36", "5,8,11,17,35" );
38, test( "37", "6,36" );
39, test( "251", "8,250" );
40, test( "252", "5,10,17,20,27,35,41,62,83,125,251" );
41, test( "253", "12,14,22,252" );
42, test( "6643", "2,3,9,81,90,510,948,6642" );
43, test( "5040", "71,79,83,89,104,111,119,125,139,143,167,179,209,239,251,279,314,335,359,419,503,559,629,719,839,1007,1259,1679,2519,5039" );

J'ai en quelque sorte trouvé une règle à partir du résultat de sortie et j'ai essayé d'accélérer le traitement.

def reverse(number, base):
    r = 0
    while number > 0:
        r = r * base + (number % base)
        number /= base
    return r

def solve(number):
    if number < 3: return '-'
    bases = []
    prev = 0
    for div in xrange(1, number):
        base = (number - 1) / div
        if base == 1 or base == prev: break
        if number == reverse(number, base): bases.append(base)
        prev = base
    for base in xrange(base - 1, 1, -1):
        if number == reverse(number, base): bases.append(base)
    return ','.join(map(str, bases[::-1]))
Temps d'exécution
Avant d'accélérer 2.122s
Après avoir accéléré 0.255s

Grâce à cielavenir, la limite s'est avérée être √ (nombre -1), j'ai donc essayé d'organiser le processus d'accélération. http://qiita.com/cielavenir/items/3d2bea62d301a2309884

def palindrome(number, base):
    forward, reverse = number, 0
    while number > 0:
        reverse = (reverse * base) + (number % base)
        number /= base
    return forward == reverse

def solve(number):
    if number < 3: return '-'
    pre = number - 1
    root = int(pre ** 0.5)
    bases = [base for base in xrange(2, pre / root) if palindrome(number, base)]
    bases += [pre / div for div in xrange(root, 0, -1) if palindrome(number, pre / div)]
    return ','.join(map(str, bases))

Recommended Posts

17ème problème de référence d'écriture en temps réel hors ligne implémenté en Python
Le 15e comment écrire un problème de référence en temps réel hors ligne en Python
Le 14ème problème de référence d'écriture en temps réel hors ligne en python
Le 18ème comment écrire un problème de référence en temps réel hors ligne en Python
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Le 19ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
20e Comment écrire des problèmes en temps réel hors ligne en Python
Le 16ème problème d'écriture en temps réel hors ligne a été résolu avec Python
Le 15e problème d'écriture en temps réel hors ligne a été résolu avec python
Le 18ème problème d'écriture en temps réel hors ligne en Python
Le 19ème problème d'écriture en temps réel hors ligne en Python
17e comment résoudre les problèmes d'écriture en temps réel hors ligne avec Python
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
Le 14ème problème de référence d'écriture en temps réel hors ligne avec Python
Partie 1 J'ai écrit la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
13th Offline en temps réel Comment résoudre les problèmes d'écriture avec Python
Le 10ème problème de référence d'écriture en temps réel hors ligne. Exemple d'implémentation par Python.
Comment écrire un exemple d'implémentation Python du problème E15 en temps réel hors ligne
Le 11ème problème de référence d'écriture en temps réel hors ligne. Exemple d'implémentation par python.
Réponse à "Comment écrire le problème F02 en temps réel hors ligne"
Partie 1 J'ai écrit un exemple de la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
Réponse à "Comment écrire un problème F01 en temps réel hors ligne"
Réponse au "Problème d'écriture en temps réel hors ligne E13"
Comment écrire un exemple d'implémentation E14 Python en temps réel hors ligne
Comment écrire hors ligne en temps réel Résolution des problèmes E05 avec Python
Le douzième problème de référence d'écriture en temps réel hors ligne. Implémenté par python
Comment écrire Ruby to_s en Python
Comment écrire un exemple d'implémentation E11 Ruby et Python en temps réel hors ligne
Comment écrire en temps réel hors ligne Résolution des problèmes E04 avec Python
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
Comment utiliser la bibliothèque C en Python
Comment écrire le bon shebang dans les scripts Perl, Python et Ruby
Conseils pour rédiger un aplatissement concis en python
Comment obtenir les fichiers dans le dossier [Python]
Comment récupérer la nième plus grande valeur en Python
Comment obtenir le nom de la variable lui-même en python
Informations de base Écrire le problème d'algorithme de l'automne 2018 en Python
Comment obtenir le nombre de chiffres en Python
Comment écrire une concaténation de chaînes sur plusieurs lignes en Python
Comment connaître le répertoire actuel en Python dans Blender
Je veux écrire en Python! (3) Utiliser des simulacres
Comment utiliser le modèle appris dans Lobe en Python
[Python] Comment afficher les valeurs de liste dans l'ordre
Comment développer en Python
Comment écrire une validation personnalisée dans Django REST Framework
[python] Comment vérifier si la clé existe dans le dictionnaire
Comment déboguer une bibliothèque Python standard dans Visual Studio
Comment utiliser la méthode __call__ dans la classe Python
[Python] Comment écrire une instruction if en une phrase.
Comment obtenir la dernière (dernière) valeur d'une liste en Python
[Python] Comment faire PCA avec Python
Comment écrire sobrement avec des pandas
Comment collecter des images en Python
Comment utiliser SQLite en Python
Dans la commande python, python pointe vers python3.8
Comment obtenir la version Python
Comment utiliser Mysql avec python
Comment envelopper C en Python