Найти - Пользователи
Полная версия: сокращение объёма кода в примере, складывающем два bin числа
Начало » Python для новичков » сокращение объёма кода в примере, складывающем два bin числа
1
Spectral
Добрый день всем ещё раз!
Ищу возможные пути сокращения числа строк кода в программе, которая решает сложение двух 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()
Ed
Я что-то туплю наверное. У вас получается 1 + 110 = 111, что вроде бы правильно, а потом 111 + 1 = 1110, чего я уже не понимаю.
Spectral
Ed
Я что-то туплю наверное. У вас получается 1 + 110 = 111, что вроде бы правильно, а потом 111 + 1 = 1110, чего я уже не понимаю.
Да, это ошибка. Попозже исправлю.
Spectral
Неправильная работа первоначального алгоритма вынудила меня перейти к строковому формату бинарного числа,
что уже упростило скрипт в разы. + в данном случае класс писать нет необходимости.

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)
Вопрос снят.
Ed
Spectral
Вопрос снят.
В смысле сокращать код уже не хотите?
Spectral
Ed
В смысле сокращать код уже не хотите?
Если можно покороче не в ущерб пониманию - то я только это приветствую)
Ed
для начала можно заюзать rjust для дополнения нулями. потом поменять тип shift на int.
Да и вообще прикольнее было бы передавать в эту функцию не строки, а числа. И результат получать как число.
baa
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)
py.user.next
Spectral
Про метод bin(x) знаю
а как он может помочь ?
есть другая функция
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB