是否是多于1个碱基的回文?
Is it a palindrome in more than 1 base?
我快速整理了一些 Python 代码来测试我的知识。我试图在不使用字符串的情况下检测 "multiple palindromes" 。这是我的代码:
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)
我添加了 """ comments """
来帮助自己理解 ceil 和 floor 函数。基本上,multipalindrome()
应该 运行 一个无限循环,它选择一个数字,将其回文化,然后查看该回文是否是多于 1 个碱基的回文。它尝试这样做足以在所有碱基中获得回文(这可能不会发生)。就检测多个回文以及在函数中使用什么碱基等而言,我不确定该去哪里。
当我使用 python 解释器 (2.7) 运行 时,我得到:
...
(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
henry@FusionReactor:~/code4fun/palindrome$
编辑:
问题:我不确定 运行 检测多重回文的检查方法。
如果您不明白我要做什么,请随时提问。谢谢!
首先,既然您正在使用 python,您确实应该利用它。请查看 this link 如何有效地将任何碱基转换为任何碱基。
其次,您可以通过执行 str(num) == str(num)[::-1]
来检查数字是否为回文,其中 returns True
或 False
取决于所述数字是否为任何基数是否回文。 [::-1]
部分反转字符串。
我快速整理了一些 Python 代码来测试我的知识。我试图在不使用字符串的情况下检测 "multiple palindromes" 。这是我的代码:
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)
我添加了 """ comments """
来帮助自己理解 ceil 和 floor 函数。基本上,multipalindrome()
应该 运行 一个无限循环,它选择一个数字,将其回文化,然后查看该回文是否是多于 1 个碱基的回文。它尝试这样做足以在所有碱基中获得回文(这可能不会发生)。就检测多个回文以及在函数中使用什么碱基等而言,我不确定该去哪里。
当我使用 python 解释器 (2.7) 运行 时,我得到:
...
(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
henry@FusionReactor:~/code4fun/palindrome$
编辑: 问题:我不确定 运行 检测多重回文的检查方法。 如果您不明白我要做什么,请随时提问。谢谢!
首先,既然您正在使用 python,您确实应该利用它。请查看 this link 如何有效地将任何碱基转换为任何碱基。
其次,您可以通过执行 str(num) == str(num)[::-1]
来检查数字是否为回文,其中 returns True
或 False
取决于所述数字是否为任何基数是否回文。 [::-1]
部分反转字符串。