Найти - Пользователи
Полная версия: Задачка о АОН
Начало » Python для новичков » Задачка о АОН
1 2
BIM
Все привет, начал изучать питон. Нашел задачку, сам решить не смог, а найденное решение не до понял.

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

апдейт: до этого код был записан просто в пост и почему то квадратные скобки с содержимым опускались. А так код рабочий.
py.user.next
Этот код не работает, потому что пытается выполнить ''.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
Kasta_neda
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
terabayt
Мне последнее время так нравится писать однострочные скрипты, что не смог удержаться))
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
py.user.next
Код Kasta_neda неправильно обрабатывает “1122###” (выдаёт “212”).
Код terabayt неправильно обрабатывает “11233###2##” (выдаёт “1332”).

Kasta_neda
py.user.next
Точно, плюс за проверку-отладку
Просто нашел на форуме и не проверил….
py.user.next
Это была быстрая проверка :) , так как юнит-тест был написан ещё тогда. Сначала тест, потом код.
BIM
py.user.next
Этот код не работает, потому что пытается выполнить ‘'.join() для кортежей.Давно сделал ради интереса однопроходный вариант. (Задачу нашёл в уроках cutwater’а.)


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

А решение с использование циклов и условий довольно просто.
terabayt
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 вы, надеюсь, знаете?!

py.user.next
Код 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
>>>
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