Форум сайта python.su
0
Все привет, начал изучать питон. Нашел задачку, сам решить не смог, а найденное решение не до понял.
Написать программу декодирования телефонного номера для АОН.
По запросу АОНа АТС посылает телефонный номер, используя следующие правила:
— Если цифра повторяется менее 2 раз, то это помеха и она должна быть отброшена
— Каждая значащая цифра повторяется минимум 2 раза
— Если в номере идут несколько цифр подряд, то для обозначения «такая же цифра как предыдущая» используется идущий 2 или более подряд раз знак #
def aon(s): # Remove single digits s = ''.join(map(lambda x: x[1] if x[0] == x[1] else '', zip(s[1:], s))) # Remove repetitions s = reduce(lambda x, y: x + y if x[-1] != y else x, s) # Decode '#' s = reduce(lambda x, y: x + x[-1] if y == '#' else x + y, s) # Remove leading '#' s = s.strip('#') return s print aon("######4434###552222311333661")
s = reduce(lambda x, y: x + y if x[-1] != y else x, s) s = reduce(lambda x, y: x + x[-1] if y == '#' else x + y, s)
Отредактировано BIM (Авг. 10, 2014 21:12:23)
Офлайн
857
Этот код не работает, потому что пытается выполнить ''.join() для кортежей.
Давно сделал ради интереса однопроходный вариант. (Задачу нашёл в уроках cutwater'а.)
def get_aon(s): """Decodes a number from AON. Example: 4434###552222311333661 => 4452136 """ out = '' w, p, q = '#', '#', False for x in s: if x == '#': if x != p: p, q = x, True elif q: if x != w: out += w q = False else: if x != p: p, q = x, True elif q: out, w, q = out + p, p, False return out
Отредактировано py.user.next (Авг. 9, 2014 23:52:51)
Офлайн
6
http://python.su/forum/topic/3788/?page=1
# -*- coding: UTF-8 -*- s = raw_input(u"Введите строку:") aon = '' for x in [i for i in range(len(s)) if s[i] == s[i+1:i+2] and s[i] != s[i-1:i]]: if s[x] == '#': aon = aon[len(aon)-1:len(aon)] + aon continue aon = aon +s[x] print aon
Офлайн
103
Мне последнее время так нравится писать однострочные скрипты, что не смог удержаться))
def aon(s): return ''.join([s[i-1] if s[i]=='#' else s[i] for i in xrange(len(s)-1) if s[i]==s[i+1] and (s[i]!=s[i-1] or i==0)])
>>> print aon('4434###552222311333661') 4452136
Отредактировано terabayt (Авг. 10, 2014 10:58:09)
Офлайн
857
Код Kasta_neda неправильно обрабатывает “1122###” (выдаёт “212”).
Код terabayt неправильно обрабатывает “11233###2##” (выдаёт “1332”).
Офлайн
6
py.user.next
Точно, плюс за проверку-отладку
Просто нашел на форуме и не проверил….
Офлайн
857
Это была быстрая проверка :) , так как юнит-тест был написан ещё тогда. Сначала тест, потом код.
Офлайн
0
py.user.next
Этот код не работает, потому что пытается выполнить ‘'.join() для кортежей.Давно сделал ради интереса однопроходный вариант. (Задачу нашёл в уроках cutwater’а.)
Офлайн
103
py.user.next
агааа, я не приавильно понял. я думал что если идут решетки, то нужно брать цифру, что стоит перед решетками
спасибо
тогда вот так:
def aon(s): return reduce(lambda x,y: x+x[-1] if y=='#' else x+y, [s[i] for i in xrange(len(s)-1) if s[i]==s[i+1] and (s[i]!=s[i-1] or i==0)]).strip('#')
Офлайн
857
Код BIM неправильно обрабатывает “11233###2##” (возвращает “133”).
Код terabayt не обрабатывает пустую строку.
BIM
Мне не понятно приведенное мной решение, с лямбда функциями.
>>> import functools >>> >>> functools.reduce(lambda x, y: x + y, [1, 2, 3, 4, 5]) 15 >>> ((((1 + 2) + 3) + 4) + 5) 15 >>> functools.reduce(lambda x, y: x * y, [1, 2, 3, 4, 5]) 120 >>> ((((1 * 2) * 3) * 4) * 5) 120 >>>
Отредактировано py.user.next (Авг. 10, 2014 23:14:32)
Офлайн