Форум сайта python.su
Мне кажется, что место имеет скорее неточность Вашей интерпретации Сэр ))
Вы же сами подчеркнули КАЖДЫЙ, а потом говорите что для 123 выполняется только для 3.
Дело в том что в тех. институте (да и в школе бывает) обычно учат что такое пилообразная функция и как она выглядит.
Постройте график - по x - номер элемента по у - значение x-го элемента.
так вот построив 123 или 321 - получим прямую, в отличии от 121 или 213 например.
Офлайн
Frog-kingЕще раз обращаю ваше внимание на неточность.
Вы же сами подчеркнули КАЖДЫЙ, а потом говорите что для 123 выполняется только для 3.
В последовательности 123 для элемента 3 это правило выполняется тоже
Офлайн
Рекурсией не пробовал ( думаю на валидных данных число рекурсии достигнут предела в питоне).
С двоичной системой также, не пробовал.
У меня тупое образование инженера-метролога, нас алгоритмам не обучали. ))
Если у Вас есть мысли конкретней опешите алгоритм. плиз
Другое моё решение которое было чуть побыстрее предыдущего кода было нативным и заключалось лишь в архитектуре кода - каждый элемент представлял собой экземпляр некого класса, который имел как-бы три состояния(на самом деле методы): first - элемент первый в последовательности, second - соответственно 2-й элемент(получал своё значение в зависимости от первого элемента), и change- вычислял значение i-го элемента в зависимости от предыдущих двух. Экземпляры хранили свои значения.
Ну а далее просто - получаем значение первого элемента, второго, третьего .. n-ого -> результат +1 -> получаем ещё возможное значение n -ого элемента -> результат +1 -> повтор последнего действие пока значение не привесит к переходим на n-1 элемент. Вообщем я думаю мысль понятна.
PROFIT
ЗЫ Это не пила уже получается а НОЖ ))
Офлайн
Warning! Быдлокод
Отработал за 200 сек и отожрал 1,5 гб %)
# "Saw" # Import lib import string, time from itertools import product # Calcularize def calc(n, k): count = 0 result = 0 s = set() for saw in product(string.digits[1:k + 1], repeat = n): if saw not in s: for i in range(n): mn = i - 1 mx = i + 1 if mn < 0: if saw[i] > saw[mx] or saw[i] < saw[mx]: result += 1 elif mx > n - 1: if saw[i] > saw[mn] or saw[i] < saw[mn]: result += 1 elif saw[mn] > saw[i] < saw[mx] or saw[mn] < saw[i] > saw[mx]: result += 1 if result < n: result = 0 elif result == n: result = 0 count += 1 s.add(saw) return count # Input var's n = int(input('N ')) k = int(input('K ')) # Output t1 = time.time() print(calc(n, k)) t2 = time.time() print(t2 - t1)
Отредактировано EchoXSpace (Янв. 22, 2013 14:07:56)
Офлайн
У меня оплавился процессор
Что-то твой код не верные результаты дает: n =4 k = 4 -> 0 и т.д.
А вообще за repeat Спасибо (не знал).
Офлайн
Во, поправил
Питон только изучаю, сейчас прохожу функции
Отредактировано EchoXSpace (Янв. 22, 2013 14:13:32)
Офлайн
во теперь верно но ещё медленней
Есть вариант как ускорить??
Офлайн
2 потока, проверка на одинаковые числа (“1, 1, 2, 1, 2, 1, 2, 1” исключать сразу)
1 поток набивает числа, 2 - проверяет условия
Поправил код, теперь память не ест
# "Saw" # Import lib import string, time from itertools import product # Calcularize def calc(n, k): list = [] count = 0 result = 0 for saw in product(string.digits[1:k + 1], repeat = n): for i in range(n): mn = i - 1 mx = i + 1 if mn < 0: if saw[i] > saw[mx] or saw[i] < saw[mx]: result += 1 elif mx > n - 1: if saw[i] > saw[mn] or saw[i] < saw[mn]: result += 1 elif saw[mn] > saw[i] < saw[mx] or saw[mn] < saw[i] > saw[mx]: result += 1 if result < n: result = 0 elif result == n: result = 0 count += 1 return count # Input var's n = int(input('N ')) k = int(input('K ')) # Output t1 = time.time() print(calc(n, k)) t2 = time.time() print(t2 - t1)
Отредактировано EchoXSpace (Янв. 22, 2013 14:52:00)
Офлайн
По поводу такого рода потоков - попробую завтра.
Вообще для новичка неплохо мне кажется.
Единственное я думаю такое извращение типа string.digits не стоит использовать можно просто range(1, k+1)
ещё если заменить на for i in xrange(n): будет выполняться чуть побыстрее.
Офлайн
def f(k,n): d_up = {i : tuple(range(i+1,k)) for i in range(0,k-1)} d_down = {i : tuple(range(i)) for i in range(1,k)} up = [0]*k dn = [0]*k for i in range(k): for j in range(i): dn[j] += 1 for j in range(i+1,k): up[j] += 1 for i in range(n-2): n_up = [0]*k n_dn = [0]*k for key in d_up: for e in d_up[key]: n_up[e] += dn[key] for key in d_down: for e in d_down[key]: n_dn[e] += up[key] up, dn = n_up, n_dn return sum(dn)*2
Офлайн