iT邦幫忙

DAY 22
0

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

廿二、用SQL Plus 設計個小遊戲之2((Oracle SQL 2013/10/07)

接著,要準備的工作,既然是猜數字,就要有樣本的資料庫,
我可不希望邊玩還要等程式去產生下一組樣本,所以這裡考慮用空間換取時間。
這裡,我也不想考慮用P(9,4),也就是把1234,1243,1324....9876,共3024筆資料,
都寫到資料庫內,因為我不想產生一份3024筆的insert into的SQL!

我只想做C(9/4)的組合,共126筆,由第一次執行時產生,並存到資料庫內。
至於每一組的24種排列組合,才由程式動態在每次猜測過程計算出結果用。

而這個126筆資料的產生動作,(甚至3024筆的那種),其實可由Excel產生。
接下來,我將透過Excel產出這126筆資料1234,1235,1236,...,6789。

1、在Excel輸入第1筆資料1234,接著用遞增+1方式,產生到1235.....6789,應該會有5556筆資料,
2、產生2~7的欄位

組合	數1	數2	數3	數4	檢測1	檢測2
1234	1	2	3	4	24	12

公式:
數1=MIDB($A2,1,1)
數2=MIDB($A2,2,1)
數3=MIDB($A2,3,1)
數4=MIDB($A2,4,1)
檢測1=B2*C2*D2*E2
檢測2=(B2-C2)*(B2-D2)*(B2-E2)*(C2-D2)*(C2-E2)*(D2-E2)

先刪掉檢測1=0、以及檢測2=0(篩選功能,應該都會用吧?)
這個動作做完,剩下1926筆。

接著再找出這4個數字不按遞增順序者,並刪除,例如: 1243
留下只能是2349這種後面永遠大於前面的。

3、產生檢測3~5
公式:
檢測3=B2-C2
檢測4=C2-D2
檢測5=D2-E2
找出任一個是正數的都砍掉。(自訂篩選條件>0,這應該也會吧!)

這個動作做完,就剩下126筆了。

4、幫這126筆產生序號(K欄位),數字遞增,可以考慮用亂數來產生這序號
公式是 =RAND(),幫每一組都用這個函數,複製==>選擇性貼上==>值,在根據這個值重新排序後,產生1~126即可。
以上資料,保留住B,C,D,E,K,準備用來寫入TABLE用(yafuu_guess_array)。

5、把資料變成可拆解,並insert 的DATA,資料格式重整為可拆解用的長串資料。
序號*3+數字*4+區隔碼1;=8碼1組。也可以只用4碼1組,只是會看起來像是一大串的無意義數字。

0012346;0022367;0031236;0041489;0051679;0061479;0073456;0083789;0091567;0105678;0112359;0121238;
0131689;0143479;0151569;0163469;0173489;0183569;0191378;0201379;0213567;0225679;0231245;0242689;
0251356;0264568;0271579;0283478;0292379;0303468;0311457;0321359;0332569;0342479;0352459;0362467;
0372478;0381258;0391267;0402678;0412347;0421247;0434567;0441589;0451467;0462368;0475789;0483457;
0492458;0504679;0512348;0521289;0532345;0541278;0551678;0561789;0571257;0582468;0593578;0601578;
0613458;0625689;0631369;0642378;0653589;0661389;0672789;0681367;0692679;0702356;0713678;0721568;
0732456;0741246;0754789;0761269;0772457;0781358;0796789;0802579;0811478;0821259;0831249;0841237;
0854678;0861346;0872568;0881248;0894689;0902389;0911469;0922349;0931268;0942358;0952369;0961256;
0971456;0983689;0992589;1001279;1011468;1022567;1033679;1044569;1054589;1061458;1072357;1081347;
1094578;1101459;1111235;1123579;1132489;1142469;1151348;1161357;1171239;1181368;1191349;1201345;
1212578;1223459;1231234;1243467;1253568;1264579;

我不打算開太多表格跟sql檔案,for初始設定環境用,所以必須再處理過這些資料,擺在PACKAGE當成第一次的時候處理用。

6、Create Table yafuu_guess_array
( seq_id number,
gs01 number,
gs02 number,
gs03 number,
gs04 number,
gs_flag number --記錄這組號碼是否還可以參考使用?1=OK, 0=NG, 初值 1
);

create unique index yafuu_guess_array_n1
on yafuu_guess_array (seq_id);

目前完成

  1. 參數基本定義。
  2. 每次猜測的檢測樣本資料庫。
  3. Table yafuu_guess_array。

[開發技術組]哇咧~夠了(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 設計個小遊戲之1((Oracle SQL 2013/10/06)
下一篇
廿三、用SQL Plus 設計個小遊戲之3(Oracle SQL 2013/10/08)
系列文
哇咧~夠了(Oracle SQL)28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
月半車甫
iT邦研究生 3 級 ‧ 2013-10-08 10:12:02

悲劇了....DML問題。再想想怎麼解套....
ORA-14551: 無法在查詢內執行 DML 作業

月半車甫 iT邦研究生 3 級 ‧ 2013-10-08 11:10:27 檢舉

增加個條件自治事务
PRAGMA AUTONOMOUS_TRANSACTION;
即可。

我要留言

立即登入留言