Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 9, 2014 22:30:09

BIM
Зарегистрирован: 2014-08-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка о АОН

Все привет, начал изучать питон. Нашел задачку, сам решить не смог, а найденное решение не до понял.

Написать программу декодирования телефонного номера для АОН.
По запросу АОНа АТС посылает телефонный номер, используя следующие правила:
— Если цифра повторяется менее 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)

Офлайн

#2 Авг. 9, 2014 23:46:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Задачка о АОН

Этот код не работает, потому что пытается выполнить ''.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)

Офлайн

#3 Авг. 10, 2014 09:13:53

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Задачка о АОН

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

Офлайн

#4 Авг. 10, 2014 10:49:41

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Задачка о АОН

Мне последнее время так нравится писать однострочные скрипты, что не смог удержаться))

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



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Авг. 10, 2014 10:58:09)

Офлайн

#5 Авг. 10, 2014 11:42:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Задачка о АОН

Код Kasta_neda неправильно обрабатывает “1122###” (выдаёт “212”).
Код terabayt неправильно обрабатывает “11233###2##” (выдаёт “1332”).



Офлайн

#6 Авг. 10, 2014 12:12:16

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Задачка о АОН

py.user.next
Точно, плюс за проверку-отладку
Просто нашел на форуме и не проверил….

Офлайн

#7 Авг. 10, 2014 12:44:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Задачка о АОН

Это была быстрая проверка :) , так как юнит-тест был написан ещё тогда. Сначала тест, потом код.



Офлайн

#8 Авг. 10, 2014 21:17:06

BIM
Зарегистрирован: 2014-08-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка о АОН

py.user.next
Этот код не работает, потому что пытается выполнить ‘'.join() для кортежей.Давно сделал ради интереса однопроходный вариант. (Задачу нашёл в уроках cutwater’а.)


Извиняюсь, квадратные скобки в коде в посте куда то делись, а так то код рабочий. Спасибо за Ваш вариант, но у меня был вопрос в другом. Мне не понятно приведенное мной решение, с лямбда функциями.Точнее только две строчки этого кода.

А решение с использование циклов и условий довольно просто.

Офлайн

#9 Авг. 10, 2014 22:43:49

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Задачка о АОН

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('#')
специально для BIM
BIM
https://docs.python.org/2/library/functions.html#reduce
ну а что такое lambda вы, надеюсь, знаете?!



————————————————
-*- Simple is better than complex -*-

Офлайн

#10 Авг. 10, 2014 23:13:54

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Задачка о АОН

Код 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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version