Alexander
я могу поспорить, что если я сейчас начну писать на го, то мой код будет очень странный для гофера
Alexander
и если я упоротый то я и буду продолжать писать такой код и генерить сотни либ
andrei
сможешь ли ты прожить без if err != nil
A64m
да можно разве такой язык сделать, (ну, общего назначения) чтоб на нем нельзя было как-то писать, как его авторы не задумывали? Энкодить фичи других языков, паттерны из других парадигм и т.д.
Anonymous
как в js
Anonymous
я читал про это
andrei
а типы куда
Anonymous
какие
andrei
генерики конечно
Alexander
Interface{}
Alexander
и вперёд
Alexander
и кодогенерация
andrei
(
Alexander
(я не умею go)
Alexander
к слову о haskell либах завтра придётся познакомиться и узнать полноту очередных байндингов
Alexander
/me вообще очень хочет really-curated-hackage
Anonymous
分解物質
каким алгоритмом генерации перестановок можно сгенерировать массив или что-то ещё чтоб потом можно было быстро проходиться по перестановкам в которых определённый элемент стоит на определённом месте?
Alexander
а нужно что-то хранить, если элементов много, то это ж огромные данные
分解物質
分解物質
максимум 7-8
分解物質
но проходов будет очень много
Alexander
какбы я была царица, то я бы делал массив перестановок элементов из на 1 меньше
Alexander
т.е. например все перестановки [1..7] если элементов 8
Alexander
и потом отображения [1..7]->твои элементы и твои-элементы->твои-элементы-с-искомым-вставленным-где-надо хватит
Alexander
allWithN :: Int -> Int -> a -> (Int-> a) -> [[a]]
allWithN total n x out =
$ map (\x -> let (p,s) = splitAt n in p++x:s)
$ map (map out)
$ Data.List.permutations [1..total-1]
Alexander
где out функция которая 1..total переводит в твои элементы
Alexander
+- всякие off-by-one в splitAt (я не проверял)
Alexander
@yellow_apple ^
Alexander
сам Data.List.permutations можешь куда-нить сохранить, чтобы не пересчитывать каждый раз
分解物質
я хочу все перестановки зарание сгенерировать а потом быстро находить нужные
Alexander
зачем?
分解物質
потому что искать буду часто
分解物質
у меня C
Alexander
перестанока с элементом на нужной позиции это все перестановки без элемента + элемент вставленный на нужную позицию
Alexander
поскольку элемент может быть разным, то нужно сделать отображение в индексы
分解物質
Alexander
1 раз же достаточно
分解物質
Alexander
вот отдавая пользователю ты будешь новый массив аллоцировать - это да
Alexander
смотри, например у тебя есть {1231,123123,3243242,345345,23423,132123,234534,34564} 8 -штук
Alexander
ты можешь сделать массив с перестановками {0,1,2,3,4,5,6}
分解物質
Alexander
это будет полный список всех перестановок для любого из элементов выше на любой позиции
Alexander
т.е. например ты хочешь 1231 на 5-ой
Alexander
тогда 0->123123, 1->32432... на пятую вставляешь 1231 и т.д.
Alexander
покатит?
分解物質
не, это не то
Alexander
просто иначе это определенный порядок генерации перестановок и как-то хитро по ним прыгать или свою индексацию делать
Alexander
почему?
分解物質
Alexander
почему то что выше не подходит?
分解物質
Alexander
не вижу причин почему это медленно будет, (ну смотря что ты с возращаемым массивом делаешь)
分解物質
Alexander
зачем забывать что-то?
分解物質
будет не нужно
Alexander
не понял, тебе ж много запростов про разные числа на разным местах?
分解物質
да
Alexander
между всеми этими запросами то, что я предложил можно хранить
Alexander
причем даже если числа в запросе (но не их количество) поменяется
Alexander
есть однако отличие, в варианте со стуктурой ты можешь возвращать *int на память типа константную
Alexander
а в моём нужно аллоцировать новый кусок
Alexander
и заполнять
分解物質
мне нужно оптимизировать цикл в примерно таком коде
a = permutations (1,2,3,4,5,6,7,8)
for e in a {
if e[n] == m {
process(e)
}
}
分解物質
分解物質
при этом цикл будет много раз вызыватся с разными m и n
Alexander
понял, ну я говорю, что я бы делал так (упрощенно m==8)
`
a = permutations(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=0;i<8;i++) q[i]=e[i];
process(e);
}
Alexander
неупрощенно там какой-то сдвиг и % надо
Aragaer
ну надо делать permutations не для полного списка, а для списка без m - будет уже 7! перестановок. Затем на строго n-е место вставлять вытащенное
Alexander
ну и не q[i]=e[i] а q[i]=убрать_сдвиг(m,e[i])
Alexander
вот @aragaer тоже самое говорит
Alexander
там в коде n очепяток, но ты си лучше меня знаешь, по смыслу поймёшь
分解物質
Alexander
зачем каждый?!
Alexander
1 раз
Alexander
один
Alexander
столько же раз сколько ты генеришь 8!
Alexander
сдвиг через \i -> i+m % 8