Aragaer
a = permutations(filter_out(m, (1,2,3,4,5,6,7))) for e in a { for (i = 0; i < n; i++) q[i] = e[i]; q[i++] = m; for (; i < 8; i++) q[i] = e[i-1]; process(q); }
Alexander
@aragaer не надо filter_out(m, тогда и в правду много раз генерить
Aragaer
перестановки можно генерить достаточно шустро, вроде есть какой-то там алгоритм от кнута чтле
Alexander
нужно сделать так чтобы m перешло в 8
Aragaer
когда ты просто берешь входной список и начинаешь его деструктивно переставлять
Alexander
(8-m) % 8
Alexander
блин
Alexander
не надо!!!!
Alexander
:(
Alexander
доктор меня все игнорируют
分解物質
я не совсе понимаю твою идею
Alexander
смотри
Alexander
пусть у тебя есть числа 1..7
Aragaer
ну я ж человек простой, я тут вообще списков не вижу, вижу массив в 8 интов 8)
Alexander
ты можешь сделать преобразование в {1..8} \ {m} ?
分解物質
для каждого m отдельно
Alexander
там должна быть функция какая-то из % и арифметики, для всех подходящая
Alexander
вот тогда теперь, если ты генеришь перестановки для 1..7
Alexander
1 шт.
Alexander
то из них ты можешь создать все перестановки для 1..8 с m на заданной позиции
Alexander
по правилу n_i, i<позиция = f(e[i]), n_позиция =m, ...
Alexander
где f твоя функция
Alexander
в общем-то вот и все
Alexander
ты генеришь перестановки и сохраняешь их
Alexander
потом ты просто проходишься по этому списку, применяя формулу (это плата за алгоритм), для того, чтобы создать свой массив
Alexander
что-то типа f(i) = (i + 8 - m) % 9
Alexander
т.е. m-ный элемент перейдет в 8 которого в списке нету
Alexander
остальные перейдут в 0..7
Alexander
так у нас с единицы было
Alexander
f(i) = 1 + (i+8-m) % 9
Alexander
Prelude Control.Monad Data.List> let f m i = 1 + (i + 8 - m) `mod` 8 Prelude Control.Monad Data.List> map (f 5) [0..7] [4,5,6,7,8,1,2,3]
Alexander
блин не, все не то, но формула есть
分解物質
Alexander
Prelude Control.Monad Data.List> let f m i = 1 + (i + m - 8) `mod` 8 Prelude Control.Monad Data.List> map (f 5) [0..7] [6,7,8,1,2,3,4,5]
Alexander
во
Alexander
т.е. при m=5 пятерке соотвествует 8-ка, которой нету в списке, 1-7 отображаются на {1..8} \\ {5}
Alexander
т.е. q[i] = 1+(e[i]+m-8) % 8
Alexander
для любого m
Alexander
дальше 7!*цена-генерации-элемента + 7! * цену сборки 8 элементного массива vs 8!*цена-генерации-элемента по скорости
Alexander
7!*(размер перестановки)+1 vs 8!*(размер перестановки) по памяти
Alexander
по скорости я не учитывал прыжки по индексам во втором случае и посчитав их бесплатными
Alexander
@yellow_apple норм?
分解物質
дальше 7!*цена-генерации-элемента + 7! * цену сборки 8 элементного массива vs 8!*цена-генерации-элемента по скорости
но ведь 7!*цена-генерации-элемента + 7! * цену сборки 8 элементного массива ещё надо умножить на 8, нет?
Alexander
зачем?
Alexander
не надо
Alexander
ты же понимаешь что из одной перестановки (1..7) ты можешь получить все перестановки чисел (1..8) с m на позиции n
Alexander
т.е. тебе нужно сгенерить 1 перестановку
Alexander
в смысле сгенерить все перестановки {1..7} 1 раз
分解物質
мы же можем искать разные числа на разных позициях а это генерирует только одно число на разных позициях
Alexander
нет!!!
分解物質
ааа
Alexander
сдвиг на что?
Alexander
1+(e[i]+m-8)%8
Alexander
для 1-based
Alexander
ладно я ушел на время, если будут вопросы то пиши
分解物質
мне нужно оптимизировать цикл в примерно таком коде a = permutations (1,2,3,4,5,6,7,8) for e in a { if e[n] == m { process(e) } }
кароче, я хочу a = permutations (1,2,3,4,5,6,7,8) for i from 0 to 7! { process(a[f(i, n, m)]) } при этом функции f прийдётся знать о порядке в котором permutations будет генерировать перестановки или можно ещё лучше?
Alexander
я все ещё не вижу почему мой варинт хуже.. ну да ладно
Влод
забавно
Alexander
а где что?
Alexander
хороший пакет, да
Влод
ну прост искал парсер джавы (не надеясь что такой бывает) и тут хоба инлайн джава. звучит забавно/больно
Anonymous
ого а можно спросить зачем?
Влод
думаю норм было бы знакомить человека с хаскелем показывая инлайн джаву
Влод
ого а можно спросить зачем?
зачем александ делал это пакет?
Alexander
ilia спарк надо использовать было, в java экосистему клиента интегрироваться и т.п.
Alexander
я его почти не делал, что-то на раннем этапе
Anonymous
я про парсинг джавы в хаскеле
Alexander
из этих inline-X я только inline-r много делал
Alexander
а
Alexander
к слову fpconf попросили архитектурную штуку, а не inline-X иначе бы я про это говорил на fpconf
Alexander
но т.к. fby говорит, что ответит через неделю
Alexander
каждую неделю, то вот
Влод
я про парсинг джавы в хаскеле
да неочевидно. да просто генерить идиоматичный котлин из джава либы. хаскел использую как люди используют перл - для мелких парсеров на коленке
Anonymous
а, как scalagen?
Alexander
как rust-чо-то-там?
Alexander
который раст из сишки делает?