iT邦幫忙

DAY 27
3

哇咧~夠了(Oracle SQL)系列 第 24

廿七、用SQL Plus 設計個小遊戲之7-我猜的演算概念((Oracle SQL 2013/10/12)

接下來是有點複雜的演算(取得下一組號碼)說明,看不懂沒關係...
但這部分是核心,很重要的部分,尤其是玩之前,總要先研究一下玩法....

員工旅遊Day1
目標是讓我們自己去演算出你的謎底(1~9不重複的4個數)。
以下用案例演練說明我比較笨的人工方法:

假設你出題 7153

  1. 猜1234,結果是0A2B。
    ==>推演: 這階段你如果能1次就推演出答案,那要我退出IT界,我大概就認了。

  2. 猜5678,結果是0A2B。
    ==>推演: 這階段有個明確線索,9是不存在的,因為12345678裡面已經有4個B。
    由於是1234, 5678各2,這是比較討厭的結果,繼續模擬吧!
    記得一個要訣,後面猜的一定要吻合前面的紀錄。前兩次我通常固定1234+5678,不適用這一原則。
    如果你想問,這個1234,5678看起來很笨?那麼妄想1次就猜中1/3024=0.0003306的機率,
    那你可以去簽大樂透了,記得中獎要分我1/3024就可以了。
    12.5億元/3024=41.3萬也不錯啦,但要我退出IT界,虧大了。
    所以,前兩次各取2個數字重新排列,假設是2187。

  3. 猜2187,結果是1A1B。
    ==>推演: 這是非常討厭的結果,因為根本就不知道21裡面中幾個,78裡面中幾個?還是21對,78錯!不知!
    繼續猜吧!假設28對,71錯,那麼34,56各1,
    假設28對,那麼有1個A,2不換位置當成A對,8要換位置。扣掉1st,2nd紀錄顯示8只能在第2位置。
    記得一個要訣,後面猜的一定要吻合前面的紀錄。
    我猜,28+4(3會A,不選)+5(56任選1)=2845,拿來比前2次,都吻合前面結果,就選它了。
    看到這裡,似乎跟謎題漸行漸遠,但有些過程是必要的,可幫忙找到最終答案。

  4. 猜2845,結果是0A1B。
    ==>推演: 好玩了,只剩下1個放錯位置的數字,但請注意,原本A不見了,所以原本假設2是對的A,有意外。
    不做肯定,一切都是假設,繼續假設28錯,45有1,則(3)71有2,還有1個誰呢?3 or 6嗎?重新看一次過程
    (1)猜1234,結果是0A2B
    (2)猜5678,結果是0A2B
    (3)猜2187,結果是1A1B
    (4)猜2845,結果是0A1B
    邁入第5次了,在猜不出就有點"落漆"了...加油!
    那就4716的組合找看看,假設1是對的,在第2位(3),X1XX。
    4只能在第一位(1+4),看起來是好消息,41XX。7出現矛盾了(2+3),所以推翻。
    回頭假設1是錯位了。那變成7是對的(3),則XXX7,1只能在3位(1+3),XX17,6417(2)。
    記得一個要訣,後面猜的一定要吻合前面的紀錄。Check OK

  5. 猜6417,結果是0A2B。(ans=7153)
    ==>推演: (3+4)可以假設1是存在的,5是不在,因為Total少1位,但假設就是假設。
    好了,還是很模糊,倒底誰是誰非?似乎沒一個是肯定的。
    裡面確認的是4在(1+4+5)3個位置都出現過,唯一對的話那就是4XXX,繼續假設...
    (1)猜1234,結果是0A2B
    (2)猜5678,結果是0A2B
    (3)猜2187,結果是1A1B
    (4)猜2845,結果是0A1B
    (5)猜6417,結果是0A2B。(ans=7153)
    41XX不成立,4XX1,有4無258(4),剩下17(3)與(5)牴觸,所以有4就無1,則17(3)說明4是不存在的囉?
    無4,則123取2個,13 or 23 or 12組合(1+3),有1的可能大增(1+3+5),67有1,58有1,23有1,
    X1X1
    2X22
    33X3
    XX66
    77XX
    X55X
    8X8X
    ==>2156(3X),3186(3X),3751(3X),.....7153[OK]

  6. 猜7153,結果是4A0B。

結論,用人工腦袋,果然是推得極為辛苦.....大部分人在第4回合,就已經跟我一樣變豬頭了。
改用程式推吧!
這一堆演算過程,如何電腦化?簡單,暴力法囉!3024個組合,逐一剔除,剩下的就是答案!
以前我也是這麼想,但似乎有Smart一點的作法吧!
前面講,1~9,共126組4位數,不含組合變化。
依前面原則,第一次檢核過,其實只剩下60種而已。
可以先跑組合數檢查,把不合格的去掉,
第2次5678取2,把9剔除掉,只剩36種,每種24個變化(1234,1243,1324,1342,1423,...4321)
第3次2187,結果是1A1B,再剔除其他不吻合2個數字的,只剩18組*24變化,
第4次猜2845,結果是0A1B,只剩4種,2367,1467,1357,1368,每種24個變化=96筆。1/96
第5次猜6417,結果是0A2B。2367,1357,1368,每種24個變化=72筆。1/72
暴力法操的是電腦,人腦禁不起這種折騰,更何況我這D腦。

接著把上面提到的原則改成SQL吧!
最高原則,記得一個要訣,後面猜的一定要吻合前面的紀錄。
完成後,就用這個當測試題,看系統腦袋,是否會演算到打結。根據經驗,這種演算,一般5~7幾乎都會找到,4次以下都是運氣,用亂數排種子,是增加運氣成分,但可能弄巧成拙也不一定。
用人玩,7次內找到答案的,大概邏輯觀念都很讚,下次用這個來面試新人好了!

這篇只能擺在10/12-13的員工旅遊日POST上去,不然會引起家庭革命,
我在六福村可能會直接被送去猴園的人猿區待到退休!

[開發技術組]哇咧~夠了(Oracle SQL)
各章節貼文
http://ithelp.ithome.com.tw/ironman6/player/yafuu168/dev/1

[IT人生組] 鐵人不簡單, 挨踢人生刊, 卅天不間斷, 苦辣加甜酸。
各章節貼文
http://ithelp.ithome.com.tw/ironman6/player/yafuu168/life/1


上一篇
廿六、用SQL Plus 設計個小遊戲之6-主流程(Oracle SQL 2013/10/11)
下一篇
廿八、用SQL Plus 設計個小遊戲之8-保存Player回覆(Oracle SQL 2013/10/13)
系列文
哇咧~夠了(Oracle SQL)28

1 則留言

我要留言

立即登入留言