2017-06-04 3 views
-1

Ich habe schnell einen Python-Code zusammengestellt, um mein Wissen zu testen. Ich versuche "mehrere Palindrome" zu erkennen, ohne Strings zu verwenden. Hier ist mein Code:Ist es ein Palindrom in mehr als 1 Basis?

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) 

ich die """ comments """ hinzugefügt habe mich zu helfen, die Decke und Boden-Funktionen zu verstehen. Im Grunde sollte multipalindrome() eine Endlosschleife laufen, die eine Zahl wählt, palindromiert und sieht, ob das Palindrom ein Palindrom in mehr als 1 Basis ist. Es versucht, dies genug zu tun, um ein Palindrom in allen Basen zu bekommen (das wird wahrscheinlich nicht passieren). Ich bin mir nicht sicher, wo so weit gehen, wie mehrere Palindrome Erkennung und welche Basen in der Funktion zu nutzen, etc ..

Wenn ich dies mit dem Python-Interpreter (2.7), erhalte ich:

... 
(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$ 

Edit: Frage: Ich bin mir nicht sicher, welche Überprüfung, um eine multiple Palindrom zu erkennen. Wenn Sie nicht verstehen, was ich versuche zu tun, zögern Sie nicht zu fragen. Vielen Dank!

+0

Welche Frage stellen Sie? –

+0

@Scott Hunter, ich bin mir nicht sicher, welche Überprüfung ausgeführt werden soll, um ein multiples Palindrom zu erkennen. Realisierte ich nicht genug, danke, lol – Alphanumeric

+0

@Alphanumeric: Ist nicht * jede * positive ganze Zahl ein Palindrom zu unendlich vielen Basen? Zum Beispiel ist 1729 trivial ein Palindrom in irgendeiner Basis> = 1730, da es eine einzelne Ziffer ist. Haben Sie Einschränkungen auf den Grundlagen, die Ihnen wichtig sind? –

Antwort

1

Zuerst, da Sie Python verwenden, sollten Sie es wirklich nutzen. Sehen Sie sich bitte this link an, um effizient jede Basis in eine beliebige Basis zu konvertieren.

Zweitens können Sie überprüfen, ob eine Nummer, indem Sie str(num) == str(num)[::-1] ein Palindrom, das True oder False je zurückkehrt, ob die Zahl in welcher Basis Palindrom ist oder nicht. Der [::-1] Teil kehrt die Zeichenfolge um.

+0

Ich habe zwei Kommentare/Fragen: Edit: (Eingabe funktioniert hier nicht lol) 1: alle Basen (wie 2 bis unendlich)? 2: Versuche, keine Zeichenfolgen zu verwenden. Vielen Dank! – Alphanumeric

+0

Zwischen 2 und 36. Entschuldigung, sollte das erwähnt haben. –

+0

Keine Sorge! Ist es auch möglich, dies ohne Strings zu tun, d. H. Int's? Vielen Dank! Ich mag diese Antwort wirklich – Alphanumeric

Verwandte Themen