В сторону: это что, общепринятый стиль письма на Хаскелле — минимально информативные имена давать переменным?
Пришлось немного на бумажке пописать, чтобы вникнуть в происходящее. Впрочем, для языковой практики это полезно
А по сути: если zs (неотрицательные и отсортированы по убыванию) или (неположительные и отсортированы по возрастанию), то вся выходная последовательность тоже отсортирована по убыванию или возрастанию, соответственно.
В противном случае последовательность не отсортирована.
А поскольку её размер — экспоненциальный, то сортировка (требующая присутствия всех элементов в памяти) накроется медным тазом.
WinHugs обломился вот на таком: length (sort [1..33340]) ещё выдерживает, а 33341 уже нет. Значит, входной список из 17 элементов — накроет его медным тазом.
К>В сторону: это что, общепринятый стиль письма на Хаскелле — минимально информативные имена давать переменным? К>Пришлось немного на бумажке пописать, чтобы вникнуть в происходящее. Впрочем, для языковой практики это полезно :)
К>А по сути: если zs (неотрицательные и отсортированы по убыванию) или (неположительные и отсортированы по возрастанию), то вся выходная последовательность тоже отсортирована по убыванию или возрастанию, соответственно.
К>В противном случае последовательность не отсортирована. К>А поскольку её размер — экспоненциальный, то сортировка (требующая присутствия всех элементов в памяти) накроется медным тазом. К>WinHugs обломился вот на таком: length (sort [1..33340]) ещё выдерживает, а 33341 уже нет. Значит, входной список из 17 элементов — накроет его медным тазом.
Здравствуйте, Mamut, Вы писали:
M>Как оказалось, условие я и сам неправильно понял. Оказалось, что надо не просто суммы смежных двоек, троек и т.д., а все гораздо хуже Необходимо суммы всех возможных групп чисел вообще. Т.е. а1 + а2, а1 + а3, а1 + а4, ...., а1 + а2 + а3, а1 + а3 + а4, ..., а2 + а3, ..., а2 + а4 + а5, ...
M>И потом получившиеся суммы поставить в порядке возрастания. На вопрос "а нафига это надо", друг не ответил, сказал, что надо А я уже обещался помочь
Здравствуйте, Трурль, Вы писали:
Т>Здравствуйте, Mamut, Вы писали:
M>>Как оказалось, условие я и сам неправильно понял. :shuffle: Оказалось, что надо не просто суммы смежных двоек, троек и т.д., а все гораздо хуже :) Необходимо суммы всех возможных групп чисел вообще. Т.е. а1 + а2, а1 + а3, а1 + а4, ...., а1 + а2 + а3, а1 + а3 + а4, ..., а2 + а3, ..., а2 + а4 + а5, ...
M>>И потом получившиеся суммы поставить в порядке возрастания. На вопрос "а нафига это надо", друг не ответил, сказал, что надо :xz: А я уже обещался помочь :shuffle:
Т>
Те же возражения. Сортировка результирующей гигантской последовательности.
-- это чтобы с консоли можно было играться
answer {-xs-} = (sort.allsums) {-xs-}
протокол работы
A> length$answer [1..14]
(секунду подумал)
16369
A> answer [1..14]
(секунду подумал)
(следует дамп из 16 тысяч чисел)
A> answer [1..15]
ERROR - Garbage collection fails to reclaim sufficient space
Здравствуйте, Кодт, Вы писали:
К>Те же возражения. Сортировка результирующей гигантской последовательности.
Кстати, сама по себе сортировка не так уж страшна.
sort:{x[<x]}
allsum:{:[(#x)<2;();(#x)=2;+/x; t, (*x)+(1_ x),t:_f[1_ x] ]}
#allsum[!22]
4194281
\t sort[allsum[!22]]
250 - время в ms
Здравствуйте, Трурль, Вы писали:
Т>Здравствуйте, Кодт, Вы писали:
К>>Те же возражения. Сортировка результирующей гигантской последовательности. Т>Кстати, сама по себе сортировка не так уж страшна.
Т>
Т>sort:{x[<x]}
Т>allsum:{:[(#x)<2;();(#x)=2;+/x; t, (*x)+(1_ x),t:_f[1_ x] ]}
Т> #allsum[!22]
Т>4194281
Т> \t sort[allsum[!22]]
Т>250 - время в ms
Т>
а вот сортировка и примеры на Q — это запрещенный прием
К><>
К>Кстати говоря. Условие задачи можно трактовать так, чтобы получить упорядоченное множество сумм — то есть дубликаты неплохо бы выбрасывать.
К>Для этого придётся пофиксить merge...
Я уже решил это все дело написать на С++ Потому что сделал вид, что умею думать и начертил вот такое:
Лучше уж я буду сохранять промежуточные результаты
Здравствуйте, Mamut, Вы писали:
К>>Кстати говоря. Условие задачи можно трактовать так, чтобы получить упорядоченное множество сумм — то есть дубликаты неплохо бы выбрасывать.
К>>Для этого придётся пофиксить merge...
M>Я уже решил это все дело написать на С++ Потому что сделал вид, что умею думать и начертил вот такое:
<> M>Лучше уж я буду сохранять промежуточные результаты
Не нужно сохранять промежуточные результаты. Если у тебя есть N генераторов, объединённых в сеть merge — как выше, то делаем
Причём выход сети фильтровать обязательно надо, а входы (генераторы) и промежуточные потоки — на усмотрение.
Фильтрование выходной последовательности в С++ — дело плёвое. Фильтрование генераторов — тоже, в общем, несложно.
Здравствуйте, Кодт, Вы писали:
К>Кстати говоря. Условие задачи можно трактовать так, чтобы получить упорядоченное множество сумм — то есть дубликаты неплохо бы выбрасывать.
К>Для этого придётся пофиксить merge...
Прикольно. Я как раз фиксил merge, чтобы она не выбрасывала дубликаты.
Здравствуйте, Трурль, Вы писали:
К>>Оффтопичный вопрос: а APL на такое способен? Т>Способен. Но писать на APL в форумах
Я, увы, не знаток APL — видел его в книжках и однажды играл под ДОС в совершенно убойной среде (cga 320*200).
Но неужели нет версии APL для нормальных ascii-шных пацанов?
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Трурль,
К>>>Но неужели нет версии APL для нормальных ascii-шных пацанов?
LCR>A+ =?= APL
В некотором смысле APL > A+ > K.
Но A+ не ascii-шный.