Programming 板


LINE

※ 引述《imorgan (i。摩根)》之銘言: : 需求: : 1. 1~50任意選出25各數字成為一組(代號a$),剩餘25各數字為該組剩餘數(代號b$) : 2. 共需20組a1~a20(與相對應之b1~b20) : 3. 以a來講,總共會產生500各數字(25*20=500) : 4. 以a來講,1~50每各數字出現次數為10次(50*10=500) : 5. 以a來講,碰撞次數限制為4~6 : 碰撞定義:任意兩組號碼,同時出現在一組a中稱為一次。 : 根據此一定義,任意兩各數字 in 20組a中,碰撞次數n範圍:0<=n<=10 : 碰撞舉例: : 有一組a1產出為(1,2,3,4,5,...,25) : (1,2)的碰撞次數為1次,(1,3)(1,4)(1,5)...(24,25)亦同 : 6. 呈現上述20組a與其對應之20組b,共20*25=500各數字(與其對應各組剩餘b),統計並 : 呈現所有碰撞組合之次數 你這個難題,我用Prolog寫了一點點如下: (SWI-Prolog) univ(U) :- numlist(1, 50, U). % universe 就是 1~50 而已 count(_N, 1). % 一句廢話,對任何東西計算一次, 得數目為 1 % 從 List 中挑走 N 個, 得子串列為 Part, 剩餘串列為 Rest. select(0, List, [], List) :- !. select(N, [H|T], [H|Part], Rest) :- N1 is N-1, select(N1, T, Part, Rest), length([H|Part], N). select(N, [H|T], Part, [H|Rest]) :- select(N, T, Part, Rest), length(Part, N). % 將 List 平分, 分配的每份子串列之長度必為 Length. divide(List, Length, [List]) :- length(List, Length), !. divide(List, Length, [Part|Result]) :- select(Length, List, Part, Rest), divide(Rest, Length, Result). 然後使用以下查詢就可以得到左半A組資料: (在測試時寫錯了,只弄出10組,速度快; 改為產生A20則費比較多時間.) univ(U), % 令 U = {1, 2, ..., 50}, repeat_list(U, 10, U10), % 收集10份U的內容, length(U, Lu), Lhf is Lu / 2, divide(U10, Lhf, A20), %將U10分為20組A, bagof(XYs, (member(An, A20), % 確認每個An組包含的項目皆獨一, forall((member(A, An), select(A, An, Am)), not(member(A, Am))), bagof((X,Y), (member(X, An), member(Y, An), X < Y), XYs)), XYss), % 並收集所有的成對號碼, flatten(XYss, XYs1), % 合併為A組全部的成對號碼. map_list_to_pairs(count, XYs1, Ps), % 將每個成對號碼都數一次, transpose_pairs(Ps, Tps), keysort(Tps, Sps), group_pairs_by_key(Sps, Gsps), % 數算的結果整理成 "配對 - 數算次數" 的集合. forall((member(_-Cs, Gsps), length(Cs, Lcs)), (Lcs = 4; Lcs = 5; Lcs = 6)), % 確認每個成對數字的數算次數為 {4, 5, 6} 之一, bagof(Assoc-Lcs, (member(Assoc-Cs, Gsps), length(Cs, Lcs)), Assocs), % 並將每個成對數字的出現次數彙總, ("配對 - 出現次數") transpose_pairs(Assocs, Scossa), keysort(Scossa, SScossa), group_pairs_by_key(SScossa, Gscossa), % 彙總結果還可以翻轉再彙總為 "出現次數 - 各種配對情況" 的對應表. % 印出A組內容, nl, write('Left set:'), nl, write(A20), % 印出每個配對的出現次數, nl, write('Number of associating items:'), nl, write(Assocs), nl, % 最後印出每個出現次數的配對案例數目, 完成. nl, write('Statistics of associtation:'), nl, write(Gscossa), foreach(member(Times-Instances, Gscossa), (length(Instances, Li), nl, write(Times), write(': '), write(Li), write(' occurrence'), nl)). -- /yau --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.231.67.186
1F:推 aceldama:15k! 15k! 24.176.222.26 12/09 04:26
2F:推 MOONRAKER:PROLOG讚 218.160.182.20 12/09 08:12
3F:→ yauhh:可是大資料量的產生,很慢,怎?辦 101.8.90.125 12/09 08:51
4F:→ MOONRAKER:PROLOG那麼高階 慢也沒辦法 |D 59.120.49.163 12/09 19:50
5F:→ yauhh:應該可以找得到跑比較快的寫法... 61.231.67.186 12/09 20:03







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP