Форум сайта python.su
Добрый день всем ещё раз!
Ищу возможные пути сокращения числа строк кода в программе, которая решает сложение двух bin-чисел.
На всякий случай напишу, что интерес к этому вопросу чисто образовательный (как можно лучше, мне пока не удается понять из-за малой практики на Python). Про метод bin(x) знаю, поэтому просьба считать, что стоит задача собственной реализации такого метода.
Любая критика приветствуется. Спасибо за внимание заранее.
def chunks(l, n):
# 12345 -> [1,2,3,4,5] with .list() method
l = str(l)
for i in xrange(0, len(l), n):
yield int(l[i:i+n])
def merge(list):
# [1,2,3] -> 123
s = ''
for elem in list:
s+=str(elem)
return int(s)
class Binary:
def __init__(self, value):
self.value = value
def add(self, add_value):
s1 = list(chunks(add_value,1))
s2 = list(chunks(self.value,1))
if len(s1) < len(s2):
for i in xrange(0, len(s2)-len(s1)):
s1.insert(0,0)
elif len(s1) > len(s2):
for i in xrange(0, len(s1)-len(s2)):
s2.insert(0,0)
s3 = []
for i in xrange(len(s1)-1, -1, -1):
if s1[i]+s2[i] == 2:
s3.insert(0,0)
s3.insert(0,1)
else:
s3.insert(0, s1[i]+(s2[i]))
self.value = merge(s3)
return self
def view(self):
print self.value
return self
bin = Binary(1).add(110).view()
bin.add(1).view()
Отредактировано (Ноя. 19, 2011 14:13:15)
Офлайн
Я что-то туплю наверное. У вас получается 1 + 110 = 111, что вроде бы правильно, а потом 111 + 1 = 1110, чего я уже не понимаю.
Офлайн
EdДа, это ошибка. Попозже исправлю.
Я что-то туплю наверное. У вас получается 1 + 110 = 111, что вроде бы правильно, а потом 111 + 1 = 1110, чего я уже не понимаю.
Офлайн
Неправильная работа первоначального алгоритма вынудила меня перейти к строковому формату бинарного числа,
что уже упростило скрипт в разы. + в данном случае класс писать нет необходимости.
def bin_sum(s1,s2):
if len(s1) > len(s2):
while len(s1)>len(s2):
s2 = '0' +s2
else:
while len(s1)<len(s2):
s1= '0' +s1
s= ''
shift = '0'
for i in xrange(len(s1)-1,-1,-1):
d = int(s1[i])+int(s2[i])+int(shift)
shift = d / 2
d = d % 2
s = (str(d) + s)
if shift != 0:
s = '1' + s
return s
s1 = '111'
s2 = '111'
print bin_sum(s1,s2)
Отредактировано (Ноя. 19, 2011 20:23:07)
Офлайн
SpectralВ смысле сокращать код уже не хотите?
Вопрос снят.
Офлайн
EdЕсли можно покороче не в ущерб пониманию - то я только это приветствую)
В смысле сокращать код уже не хотите?
Офлайн
для начала можно заюзать rjust для дополнения нулями. потом поменять тип shift на int.
Да и вообще прикольнее было бы передавать в эту функцию не строки, а числа. И результат получать как число.
Офлайн
s1 = '10101010'
s2 = '1001'
s1, s2 = max(s1, s2), min(s1, s2)
s2 = '0' * (len(s1) - len(s2)) + s2
s = ''
d = 0
for i in range(len(s1) - 1, -1, -1):
d = int(s1[i]) + int(s2[i]) + d
s = str(d % 2) + s
d = d / 2
print(str(d) + s)
Отредактировано (Янв. 12, 2012 08:20:28)
Офлайн
Spectralа как он может помочь ?
Про метод bin(x) знаю
Отредактировано (Ноя. 26, 2011 15:27:10)
Офлайн