2017-06-04 1 views
-1

J'ai rapidement mis en place du code Python pour tester mes connaissances. J'essaie de détecter "palindromes multiples" sans utiliser de chaînes. Voici mon code:Est-ce un palindrome dans plus d'une base?

from math import log 
from math import ceil 
from math import floor 

palindrome = 0 

def palindromify(half, base): 
    assert base != 0 
    reversedhalf = 0 
    palindrome = 0 
    iterator = 0 
    size = floor(log(half, base)) + 1 
    """ 
     for base = 10 and half = 100, 
     log10(100) = 2, floored + 1 = 2 + 1 = 3. 

     for base = 10 and half = 999, 
     log10(999) = 2.9... (or something). 
     floored + 1 = 2 + 1 = 3. 

     size = digits. 
    """ 
    palindrome = half * (base ** size) 
    while iterator < size: 
     digit = floor(half/(base ** iterator)) % base 
     reversedhalf = (base ** (size - iterator - 1)) * digit + reversedhalf 
     iterator = iterator + 1 
    palindrome = reversedhalf + palindrome 
    return palindrome 

def depalindromify(whole, base): 
    halfsize = (ceil(log(whole,base))/2) 
    """ 
     if the half is 100 and base = 10, whole = 100001. 
     log10(100001) = just over 5 
     ceil(just above 5) = 6 
     6/2 = 3. And 100 is 3 digits! 

     if the half is 999 and base = 10, whole = 999999. 
     log10(999999) = just under 6. 
     ceil(just under 6) = 6 
     6/2 = 3. 999 is 3 digits. 
    """ 
    halfbottom = whole % (base ** halfsize) 
    halftop = (whole - halfbottom)/(base ** halfsize) 
    """ 
     (whole - (whole % (base ** halfsize)))/(base ** halfsize) 
     if base = 10, whole = 526625, 
     (526625 - (526625 mod 1000))/(1000) 
     = (526625 - 625)/1000 
     = (526000)/1000 
     = 526 
    """ 
    return halftop 

""" 
    Does not work 
""" 
def multipalindrome(): 
    current = 2 
    currentbase = 2 
    palindromed = 0 
    dun = False 
    highest = 2 
    while True: 
     dun = False 
     current = (highest ** 4) if current < (highest ** 4) else current + 1 
     currentbase = 2 
     while not dun: 
      palindromed = palindromify(current, currentbase) 
      currentbase = currentbase + 1 
      depalindromed = depalindromify(palindromed, currentbase) 
      print '(D) depalindromed = ', depalindromed 
      if (current != depalindromed): ## here 
       if currentbase > highest: 
        print 'New highest! In bases from 2 to ', currentbase, ', top half ', current, '!\n' 
       highest = currentbase 
       dun = True 

multipalindrome() 



# x = input("Enter first half: ") 
# y = input("Enter base:  ") 
# 
# print palindromify(x, y) 

J'ai ajouté le """ comments """ pour aider à comprendre moi-même les fonctions de plafond et le plancher. Fondamentalement, multipalindrome() devrait exécuter une boucle infinie qui choisit un nombre, le palindromifie, et voit si ce palindrome est un palindrome dans plus d'une base. Il essaie de le faire assez pour obtenir un palindrome dans toutes les bases (cela n'arrivera probablement pas). Je ne sais pas où aller aussi loin que la détection palindromes multiples et quelles bases à utiliser dans la fonction, etc ..

Quand je lance ce avec l'interpréteur Python (2.7), je reçois:

... 
(D) depalindromed = 30657.0 
(D) depalindromed = 30657.0 
(D) depalindromed = 30658.0 
(D) depalindromed = 30659.0 
(D) depalindromed = 30661.0 
(D) depalindromed = 30661.0 
(D) depalindromed = 30662.0 
(D) depalindromed = 30663.0 
(D) depalindromed = 30664.0 
(D) depalindromed = 30665.0 
(D) depalindromed = 30666.0 
(D) depalindromed = 30667.0 
(D) depalindromed = 30668.0 
(D) depalindromed = 30668.0 
(D) depalindromed = 30670.0 
(D) depalindromed = 30671.0 
(D) depalindromed = 30672.0 
(D) depalindromed = 30672.0 
(D) depalindromed = 30674.0 
(D) depalindromed = 30674.0 
(D) depalindromed = 30676.0 
(D) depalindromed = 30676.0 
(D) depalindromed = 30678.0 
(D) depalindromed = 30678.0 
(D) depalindromed = 30680.0 
(D) depalindromed = 30680.0 
(D) depalindromed = 30681.0 
(D) depalindromed = 30682.0 
(D) depalindromed = 30684.0 
(D) depalindromed = 30684.0 
(D) depalindromed = 30685.0 
(D) depalindromed = 30686.0 
(D) depalindromed = 30688.0 
(D) depalindromed = 30688.0 
(D) depalindromed = 30689.0 
(D) depalindromed = 30690.0 
(D) depalindromed = 30691.0 
(D) depalindromed = 30692.0 
(D) depalindromed = 30693.0 
(D) depalindromed = 30694.0 
(D) depalindromed = 30695.0 
(D) depalindromed = 30695.0 
(D) depalindromed = 30697.0 
(D) depalindromed = 30697.0 
(D) depalindromed = 30699.0 
(D) depalindromed = 30699.0 
(D) depalindromed = 30701.0 
(D) depalindromed = 30701.0 
(D) depalindromed = 30703.0 
(D) depalindromed = 30703.0 
(D) depalindromed = 30704.0 
(D) depalindromed = 30705.0 
(D) depalindromed = 30707.0 
(D) depalindromed = 30707.0 
(D) depalindromed = 30708.0 
(D) depalindromed = 30709.0 
(D) depalindromed = 30711.0 
(D) depalindromed = 30711.0 
(D) depalindromed = 30712.0 
(D) depalindromed = 30713.0 
(D) depalindromed = 30714.0 
(D) depalindromed = 30715.0 
(D) depalindromed = 30716.0 
(D) depalindromed = 30717.0 
(D) depalindromed = 30718.0 
(D) depalindromed = 30718.0 
(D) depalindromed = 30720.0 
(D) depalindromed = 30721.0 
(D) depalindromed = 30722.0 
(D) depalindromed = 30722.0 
(D) depalindromed = 30724.0 
(D) depalindromed = 30725.0 
(D) depalindromed = 30726.0 
(D) depalindromed = 30726.0 
(D) depalindromed = 30727.0 
(D) depalindromed = 30728.0 
(D) depalindromed = 30730.0 
^CTraceback (most recent call last): 
    File "palindrome.py", line 77, in <module> 
    multipalindrome() 
    File "palindrome.py", line 67, in multipalindrome 
    palindromed = palindromify(current, currentbase) 
    File "palindrome.py", line 26, in palindromify 
    reversedhalf = (base ** (size - iterator - 1)) * digit + reversedhalf 
KeyboardInterrupt 
[email protected]:~/code4fun/palindrome$ 

Editer: Question: Je ne suis pas sûr de la vérification à effectuer pour détecter un palindrome multiple. Si vous ne comprenez pas ce que j'essaie de faire, n'hésitez pas à demander. Merci!

+0

Quelle question posez-vous? –

+0

@ Scott Hunter, je ne suis pas sûr de ce que la vérification à exécuter pour détecter un palindrome multiple. Je viens de réaliser que je n'ai pas mis assez, merci, lol – Alphanumeric

+0

@Alphanumeric: N'est-ce pas * tous * entiers positifs un palindrome à l'infiniment de bases? Par exemple, 1729 est trivialement un palindrome dans toute base> = 1730, puisqu'il s'agit d'un seul chiffre. Avez-vous des restrictions sur les bases qui vous intéressent? –

Répondre

1

Tout d'abord, puisque vous utilisez python, vous devriez vraiment en profiter. S'il vous plaît jeter un oeil à this link sur la façon de convertir efficacement n'importe quelle base à n'importe quelle base.

Deuxièmement, vous pouvez vérifier si un nombre est un palindrome en faisant str(num) == str(num)[::-1], qui retourne True ou False selon que ce nombre peu importe la base est palindrome ou non. La partie [::-1] inverse la chaîne.

+0

J'ai deux commentaires/questions: Modifier: (entrée ne fonctionne pas ici lol) 1: toutes les bases (comme 2 à l'infini)? 2: essayer de ne pas utiliser de chaînes. Merci! – Alphanumeric

+0

Entre 2 et 36. Désolé, aurait dû le mentionner. –

+0

Pas de soucis! Aussi, est-il possible de le faire sans chaînes, c'est-à-dire int? Merci! J'aime vraiment cette réponse – Alphanumeric