[問題] 特殊賓果的問題

看板Python作者 (羅莉飼養中...)時間9年前 (2016/04/15 01:38), 9年前編輯推噓3(3018)
留言21則, 6人參與, 最新討論串1/1
請教各位先進, 給你一個 list, 裡面有六個 sub-list, 每個 sub-list 裡面有六個數字(範圍從1-9) list 每次隨機生成 舉例: [ [ 3, 4, 9, 2, 4, 6], [ 4, 4, 4, 9, 3, 2], [ 1, 4, 9, 8, 3, 7], [ 6, 4, 2, 1, 3, 8], [ 5, 6, 1, 9, 2, 4], [ 8, 8, 8, 8, 8, 8] ] 目標是計算出連線數, 橫排有3個或以上相同數字的話連線數+1 直排有3個或以上相同數字的話連線數+1 以例子來算的話,連線數是4條 (直的、橫的分開算) 我的想法是先 loop 過 sub-list, 再 loop 過每個數字 可是這樣橫排好解,直排要怎麼計算呢? ps.我在工作了,這真的不是學校作業~謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 116.87.43.238 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1460655494.A.F87.html ※ 編輯: content71 (116.87.43.238), 04/15/2016 01:38:55

04/15 02:25, , 1F
loop過index 這我看跟大一作業有九成像 拜託不要跟我說
04/15 02:25, 1F
tiefblau: 你是以寫程式為職業...... 04/15 02:25 我是轉行的網頁工程師,其實平常沒用到什麼邏輯運算, 如果問題蠢了些不好意思~ 這題是一個線上的練習題

04/15 06:52, , 2F
04/15 06:52, 2F

04/15 10:06, , 3F
最簡單就是enumerate抓index吧 直排跟橫排就內外顛倒
04/15 10:06, 3F
所以解題的重點是transpose matrix?

04/15 15:25, , 4F
這樣就可以了吧 http://imgur.com/G3JbTgx
04/15 15:25, 4F
目的是3個或以上相同數字的話連線數+1 這樣算的話如果有一排6個相同數字,連線數會+4

04/16 09:46, , 5F
x=np.array(L)
04/16 09:46, 5F

04/16 09:47, , 6F
print (sum(sum(v>=3 for v in Counter(p).values())
04/16 09:47, 6F

04/16 09:48, , 7F
for p in chain(x,x.T)))
04/16 09:48, 7F
這個厲害...不過試跑了一下 這code是計算一排同樣數字有三個以上 而不是"連續"的三個以上 也就是一排如果是 4, 4, 2, 3, 4, 4 也會被算成賓果 回報一下結果,利用transpose matrix解出來的答案 http://imgur.com/Kk9PedF
但程式有點亢長

04/17 21:10, , 8F
你可以用 itertools 模組的 groupby() :)
04/17 21:10, 8F
groupby()的功能我了解,但要怎麼應用在這呢?

04/17 23:04, , 9F
if any(len(list(g)) >= 3 for k,g in groupby(
04/17 23:04, 9F

04/17 23:04, , 10F
bingo_line ))
04/17 23:04, 10F

04/17 23:28, , 11F
sum(any(len(list(g))>=3 for k, g in groupby(v))
04/17 23:28, 11F

04/17 23:28, , 12F
for p in (x,x.T) for v in p)
04/17 23:28, 12F
感謝回覆 試跑了一下 無法處理一排裡有兩個賓果的狀況 例如 [8,8,8,3,7,7,7,2,1] 跑出來只會有一個賓果 補充一下,題目還滿機的,隨機給的矩陣大小不是固定6x6

04/18 17:40, , 13F
把 any 改成 sum
04/18 17:40, 13F
改成sum之後就沒有問題了:) 太威了請受我一拜

04/20 00:59, , 14F
return cal_cnt(arrs) + cal_cnt( zip(*arrs) )
04/20 00:59, 14F

04/20 01:07, , 15F
from collections import Counter
04/20 01:07, 15F

04/20 01:07, , 16F
def cal_cnt(arrs):
04/20 01:07, 16F

04/20 01:15, , 17F
t=0
04/20 01:15, 17F

04/20 01:15, , 18F
for arr in arrs:
04/20 01:15, 18F

04/20 01:15, , 19F
t+=sum(map( lambda x:x>=3, Counter(arr).values() ))
04/20 01:15, 19F

04/20 01:16, , 20F
原諒我推文推不出indent XD
04/20 01:16, 20F

04/20 01:18, , 21F
喔喔 現在才看到上面有人用Counter了~原來要連續啊
04/20 01:18, 21F
感謝回覆 其實想像他是寶石方塊的遊戲,三個或以上相連就可以消掉 我猜是題目的本意 ※ 編輯: content71 (116.87.43.238), 04/21/2016 04:15:29
文章代碼(AID): #1N3zM6-7 (Python)
文章代碼(AID): #1N3zM6-7 (Python)