Re[6]: Пояснение по условию
От: Трурль  
Дата: 08.12.05 08:13
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:


LCR>Что то слишком многословно

LCR>
LCR>m=:1 7 4 5 2 0 6 6       NB. пример списка
LCR>x=:(2:+i.@-&2@#)+/\]     NB. магия
LCR>/:~@-.&0,x m
LCR>2 6 7 7 8 8 9 11 11 11 12 12 12 13 14 16 17 17 18 18 19 19 19 23 24 25 30
LCR>

Зато правильно
  sort[allsum[1 7 4 5 2 0 6 6]]
1 2 3 3 4 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9
 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 
 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 
 13 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 15 
 15 15 16 16 16 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 17 17 17 
 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 
 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 20 20 20 21 21 21 21 
 21 21 21 21 22 22 22 22 22 22 22 22 23 23 23 23 23 23 23 23 24 24 24 24 24 24 
 24 24 24 24 25 25 25 25 25 25 25 25 26 26 26 26 27 27 28 28 29 29 30 30 31 31
Re[7]: Пояснение по условию
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 08.12.05 10:16
Оценка:
Трурль,

Т>Зато правильно

Т>
Т>  sort[allsum[1 7 4 5 2 0 6 6]]
Т> <247 чиселок>
Т>


Да ладно уж, просто ты перебираешь все непустые и неединичные подмножества, а я — те, которые идут подряд, то есть решаю первую задачу Но это, как ты понимаешь, непринципиально:
   d=:[:#:[:i.2:^#
   x=:#~>&1@(+/"1)
   f=:/:~@(+/"1@#~[:x d)
   #f 1 7 4 5 2 0 6 6
247
   f 1 7 4 5 2 0 6 6 
1 2 3 3 4 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 1...

хъ:
1. что такое ; (точка с запятой) в К? (подозреваю что композиция)
2. где ты умудрился скачать К? Ссылкой не поделишься
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[6]: Пояснение по условию
От: mishaa Россия http://kmmbvnr.livejournal.com
Дата: 08.12.05 10:37
Оценка: +1
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Что то слишком многословно

LCR>
LCR>m=:1 7 4 5 2 0 6 6       NB. пример списка
LCR>x=:(2:+i.@-&2@#)+/\]     NB. магия
LCR>/:~@-.&0,x m
LCR>2 6 7 7 8 8 9 11 11 11 12 12 12 13 14 16 17 17 18 18 19 19 19 23 24 25 30
LCR>


А сумма все чисел 31 в ответ входить разве не должна?
-- Главное про деструктор копирования не забыть --
Re[2]: Пояснение по условию
От: Глеб Алексеев  
Дата: 08.12.05 11:01
Оценка: 20 (2)
Здравствуйте, Mamut, Вы писали:

M>Как оказалось, условие я и сам неправильно понял. Оказалось, что надо не просто суммы смежных двоек, троек и т.д., а все гораздо хуже Необходимо суммы всех возможных групп чисел вообще. Т.е. а1 + а2, а1 + а3, а1 + а4, ...., а1 + а2 + а3, а1 + а3 + а4, ..., а2 + а3, ..., а2 + а4 + а5, ...


M>И потом получившиеся суммы поставить в порядке возрастания. На вопрос "а нафига это надо", друг не ответил, сказал, что надо А я уже обещался помочь


Я, видимо, все неправильно понял, и в ФП полный чайник, так что не судите строго. Просто задача очень похожа на упражнение из Харпера. Вот решение на ОКамле (извините, Хаскеля не знаю):

let rec powerset lst = match lst with
      [] -> [ []]
    | h::t ->          
          let pstail = powerset t in
          let diff = List.map (fun x -> h::x) pstail in
              pstail @ diff

let sum_list lst = List.fold_left (+) 0 lst

let all_sums lst =
    let ps = powerset lst in
    let sums = List.map sum_list ps in
        List.sort compare sums


# powerset [1;2;3;5];;
- : int list list =
[[]; [5]; [3]; [3; 5]; [2]; [2; 5]; [2; 3]; [2; 3; 5]; [1]; [1; 5]; [1; 3];
 [1; 3; 5]; [1; 2]; [1; 2; 5]; [1; 2; 3]; [1; 2; 3; 5]
# all_sums [1;2;3;4];;
- : int list = [0; 1; 2; 3; 3; 4; 4; 5; 5; 6; 6; 7; 7; 8; 9; 10]
#
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Пояснение по условию
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 08.12.05 11:14
Оценка:
Миша,

LCR>>
LCR>>2 6 7 7 8 8 9 11 11 11 12 12 12 13 14 16 17 17 18 18 19 19 19 23 24 25 30
LCR>>


M>А сумма все чисел 31 в ответ входить разве не должна?


А фиг его знает. По постановке непонятно. Но если всё же если хочется, то пожалуйста:
   x=:(2:+i.@-&1@#)+/\]
   /:~@-.&0,x 1 7 4 5 2 0 6 6
2 6 7 7 8 8 9 11 11 11 12 12 12 13 14 16 17 17 18 18 19 19 19 23 24 25 30 31


Как грится, нот э биг дил
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[3]: Совсем мелочь
От: Глеб Алексеев  
Дата: 08.12.05 11:52
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>let sum_list lst = List.fold_left (+) 0 lst


Чуть красивше можно:
let sum_list = List.fold_left (+) 0
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Пояснение по условию
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 09.12.05 05:04
Оценка:
Глеб Алексеев,

ГА>Я, видимо, все неправильно понял, и в ФП полный чайник, так что не судите строго. Просто задача очень похожа на упражнение из Харпера. Вот решение на ОКамле (извините, Хаскеля не знаю):


ГА>
ГА>let rec powerset lst = match lst with
ГА>      [] -> [ []]
ГА>    | h::t ->          
ГА>          let pstail = powerset t in
ГА>          let diff = List.map (fun x -> h::x) pstail in
ГА>              pstail @ diff

ГА>let sum_list lst = List.fold_left (+) 0 lst

ГА>let all_sums lst =
ГА>    let ps = powerset lst in
ГА>    let sums = List.map sum_list ps in
ГА>        List.sort compare sums
ГА>



Я бы ввёл ещё парочку функций
let rec size l = match l with
    | [] -> []
    | h::t -> 1 + size t;;

let rec seive l = match l with
    | [] -> []
    | h::t ->
        if (size h) > 1 then
            h::seive t
          else
              seive t;;

и переписал бы all_sums как
let all_sums lst =
    let ps = seive powerset lst in
    let sums = List.map sum_list ps in
        List.sort compare sums;;


quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[8]: Пояснение по условию
От: Трурль  
Дата: 09.12.05 06:22
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>1. что такое ; (точка с запятой) в К? (подозреваю что композиция)

Скорее, разделитель.

LCR>2. где ты умудрился скачать К? Ссылкой не поделишься

На kx.com. Только они его уже убрали.

Ну,и в качестве упражнения в фалометрии.
  f:{b@<b:+/'x@&:'a@&1<+/'a:+2_vs!_2^#x}
  #f 1 7 4 5 2 0 6 6
247
Re[4]: Пояснение по условию
От: Глеб Алексеев  
Дата: 09.12.05 09:12
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

Чувствую, что написал или лишнего, или некрасивого кода, и гуры надо мной издеваются, только в чем я неправ — не пойму.
По порядку.

LCR>Я бы ввёл ещё парочку функций

LCR>
(*  А разве нету готовой функции List.length? *)
LCR>let rec size l = match l with
LCR>    | [] -> [] (*  А здесь [] с ноликом не перепутали? *)
LCR>    | h::t -> 1 + size t;;
(*  А зачем такое решето, если 
        1) пустой список в результатах по определению только один 
        2) сумма пустого списка равна нулю
        3) в условии задачи никто не говорил выбрасывать пустое множество
        4) и если все-таки его писать, то чем не подошел List.filter, зачем вручную?*)
LCR>let rec seive l = match l with
LCR>    | [] -> [] (* а здесь пару лишних [] не забыли? *)
LCR>    | h::t ->
LCR>        if (size h) > 1 then
LCR>            h::seive t
LCR>          else
LCR>              seive t;;
LCR>

LCR>и переписал бы all_sums как
LCR>
LCR>let all_sums lst =
LCR>    let ps = seive powerset lst in
LCR>    let sums = List.map sum_list ps in
LCR>        List.sort compare sums;;
LCR>


LCR>

На всякий случай тоже улыбнусь .

з.ы. После пары месяцев активного пребывания на РСДНе я всегда компилирую и разок запускаю код, который сюда выкладываю
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Пояснение по условию
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 09.12.05 10:17
Оценка: +1
Глеб Алексеев,

ГА>
ГА>(*  А разве нету готовой функции List.length? *)
ГА>


+1 есть, но я не смог вспомнить, как она называется

LCR>>let rec size l = match l with
LCR>>    | [] -> [] (*  А здесь [] с ноликом не перепутали? *)


+1 перепутал; со скобками даже не откомпилируется

ГА>(*  А зачем такое решето, если 
ГА>        1) пустой список в результатах по определению только один 
ГА>        2) сумма пустого списка равна нулю
ГА>        3) в условии задачи никто не говорил выбрасывать пустое множество
ГА>        4) и если все-таки его писать, то чем не подошел List.filter, зачем вручную?*)


Да тут задача ведь складывать двойки, тройки и т.д., а у тебя пустое множество и все одноэлементные вошли. Вот и потребовалось "решето". Насчёт List.filter — , вместо того чтобы глянуть в доку и освежить память, я делаю велосипедик.

LCR>>let rec seive l = match l with
LCR>>    | [] -> [] (* а здесь пару лишних [] не забыли? *)


а здесь всё правильно, ибо функция seive должна выкидывать все элементы кроме не очень маленьких по длине. (элементы — списки, val seive : 'a list list -> 'a list list = <fun>), а из пустого списка выкинуть нечего. Если сделать []], то в результирующий список войдёт элемент [], что неправильно.

ГА>з.ы. После пары месяцев активного пребывания на РСДНе я всегда компилирую и разок запускаю код, который сюда выкладываю


Ты чертовски прав.

хъ: можно на ты, мы же братья по языку
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[9]: Пояснение по условию
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 09.12.05 10:28
Оценка:
Трурль,


LCR>>2. где ты умудрился скачать К? Ссылкой не поделишься

Т>На kx.com. Только они его уже убрали.

вот вот.

Т>
Т>  f:{b@<b:+/'x@&:'a@&1<+/'a:+2_vs!_2^#x}
Т>  #f 1 7 4 5 2 0 6 6
Т>247
Т>


Ничего личного, мне твоя программа тоже нравится Правда понятно только #x и :{...}, но вроде язык нормальный.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[6]: Пояснение по условию
От: Глеб Алексеев  
Дата: 09.12.05 11:07
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Да тут задача ведь складывать двойки, тройки и т.д., а у тебя пустое множество и все одноэлементные вошли.

Кстати, не факт:
Mamut>Необходимо суммы всех возможных групп чисел вообще
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Пояснение по условию
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 09.12.05 11:59
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, Lazy Cjow Rhrr, Вы писали:


LCR>>Да тут задача ведь складывать двойки, тройки и т.д., а у тебя пустое множество и все одноэлементные вошли.

ГА>Кстати, не факт:
Mamut>>Необходимо суммы всех возможных групп чисел вообще

Я ориентировался на
  #allsum[!22]
4194281

Как раз получается (2^22) — 23 == 4194281
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[2]: Пояснение по условию
От: Аноним  
Дата: 15.12.05 13:45
Оценка: 9 (1)
Здравствуйте, Mamut, Вы писали:

M>Как оказалось, условие я и сам неправильно понял.


f = nub. sort . init . foldl1 (liftM2 (+)) . map (:[0])
Re[10]: Пояснение по условию
От: Трурль  
Дата: 19.12.05 07:30
Оценка: 17 (2)
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>>>2. где ты умудрился скачать К? Ссылкой не поделишься

Т>>На kx.com. Только они его уже убрали.
LCR>вот вот.

Мир не без добрых людей
Re[11]: Пояснение по условию
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 19.12.05 08:29
Оценка:
Трурль, добрый человек.

Спасибо за ссылку.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.