четверг, 6 марта 2008 г.

Просто так

Задачка -
имеется возрастающая последовательность из n разных чисел. Определить минимальное число сравнений для того чтобы убедиться что не существует двух пар чисел из этой последовательности с одинаковой суммой.
Например - в последовательности [1,2,3,4] такие пары [1,4] и [2,3]


Фукнциональное решение на питоне (мне не совсем нравится. но что придумал то придумал)

def functional_approach(length):

    data=filter(lambda x: x[0]<x[1],iselectmany(xrange(1,length+1),curry1(izipwith,xrange(1,length+1))))

    def count(pair,li):

        return len(filter(lambda x:x[0]> pair[0] and x[1]<pair[1],li))

    print reduce(lambda x,y:x+count(data[y],data[y+1:]),xrange(0,len(data)))


Императивное решение:

def iter_approach(length):

    data = []

    for a in xrange(1,length):

        for b in xrange(a+1,length+1):

            data.append((a,b));

    c = 0

    for l in xrange(0,len(data)-1):

        for n in xrange(l+1,len(data)):

            if data[l][0]<data[n][0] and data[l][1]>data[n][1]:

                c = c + 1

    print c



Вот как хотите но по мне императивное решение проще, понятнее, интуитивние и т.д. Вообщем по всем критериям кроме краткости является лучшим решением. Ну может конечно функциональное написано коряво...не знаю.

Впомогательные фукнции-генераторы izipwith и iselectmany

def izipwith(seq,n):

    for s in seq:

        yield (n,s)

def iselect_many(seq,func):

    for s in seq:

        for s1 in func(s):

            yield s1

Комментариев нет: