###### tags: `資料庫程式設計` `Javascript` > 有什麼新方法都可以放上來喔 > 我只是放我通過的程式碼而已 # OnlineTest - PHP 單元 2 ## 1. 函數使用 :::info 請實作一個 `function cal($w, $x = 12, $y = -3, $z = 2.8)`, 進行以下運算: `($w + $x) * $y - $z` 輸入為四個數字,程式需要執行四次function,執行順序為: `cal($w, $x, $y, $z)` `cal($w, $x, $y)` `cal($w, $x)` `cal($w)` 每次執行後將結果輸出 **Input:** 22 13 4 2 **Output:** 138 137.2 -107.8 -104.8 ```php= <?php $in = array_map('doubleval', explode(' ', readline())); function cal($w, $x = 12, $y = -3, $z = 2.8) { return ($w + $x) * $y - $z; } echo cal($in[0], $in[1], $in[2], $in[3]) ."\n"; echo cal($in[0], $in[1], $in[2]) ."\n"; echo cal($in[0], $in[1]) ."\n"; echo cal($in[0]) ."\n"; ?> ``` ::: ## 2. 時間戳2 :::success 使用mktime()將輸入的數字轉成預設的格式輸出。 輸入的數字分別代表時、分、秒、月、日、年。 輸出格式範例:"01:01:00 AM, 2019/01/01, Tuesday" **Input:** 14 22 34 4 14 2022 **Output:** 14:22:34, 2022/04/14, Thursday ```php= <?php $in = explode(' ', readline()); // mktime(hour, minute, second, month, day, year, is_dst) // 時、分、秒、月、日、年 echo date("H:i:s, Y/m/d, l", mktime($in[0], $in[1], $in[2], $in[3], $in[4], $in[5])); ?> ``` ::: ## 3. 時間戳3 :-1: :-1: :::info 輸入一個數字代表時間戳,輸出特定格式的時間 輸出格式範例:"2019/01/01 01:01:00" **Input:** 2125983673 **Output:** 2037/05/15 07:01:13 ```php= <?php $timestamp = readline(); $time = date_create(); $time = date_timestamp_set($time, $timestamp); $time = date_timezone_set($time, new DateTimeZone("GMT")); echo date_format($time, "Y/m/d H:i:s"); ?> ``` ```php= <?php echo gmdate("Y/m/d H:i:s", readline()); ?> ``` ::: ## 4. 擷取單字 :::success 輸入一段文字,文字中每個單字用空白間隔開,程式需要將文字中每個單字中的第一個字母轉成大寫輸出,如果是數字則直接輸出。 **Input:** hello world 12345 **Output:** HW1 ```php= <?php $words = explode(' ', readline()); foreach ($words as $word) { $c = $word[0]; if ($c >= '0' && $c <= '9') echo $c; else echo strtoupper($c); } ?> ``` ```php= <?php $input = explode(' ', readline()); $len = count($input); for($x = 0; $x < $len; $x++){ $str = strtoupper(substr($input[$x], 0, 1)); echo $str; } ?> ``` ::: ## 5. 凱薩密碼 :::info 把明碼的每個字元加上某一個整數K而得到密碼的字元(明碼及密碼字元一定都在ASCII碼中可列印的範圍內)。 例如若K=2,那麼apple經過加密後就變成crrng了。 解密則是反過來做。這個問題是給你一個密碼字串,請你依照上述的解密方式輸出明碼。 > 輸入的第一行為K,第二行為要解密的內容 ```php= <?php $k = intval(readline()); $code = readline(); $res = ""; for ($i=0; $i<strlen($code); $i++) { $res .= chr(ord($code[$i]) - $k); } echo $res; ?> ``` ::: ## 6. 身分證檢驗 :::success 身分證字號有底下這樣的規則,因此對於任意輸入的身分證字號可以有一些基本的判斷原則,請您來判斷一個身分證字號是否是正常的號碼。 1. 英文代號以下表轉換成數字 A=10 台北市 J=18 新竹縣 S=26 高雄縣 B=11 台中市 K=19 苗栗縣 T=27 屏東縣 C=12 基隆市 L=20 台中縣 U=28 花蓮縣 D=13 台南市 M=21 南投縣 V=29 台東縣 E=14 高雄市 N=22 彰化縣 W=32 金門縣 F=15 台北縣 O=35 新竹市 X=30 澎湖縣 G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山 H=17 桃園縣 Q=24 嘉義縣 Z=33 連江縣 I=34 嘉義市 R=25 台南縣 2. 英文轉成的數字, 個位數乘9再加上十位數的數字 3. 各數字從右到左依次乘1、2、3、4....8 4. 求出(2),(3) 及最後一碼的和 5. (4)除 10 若整除,則為正確 例: T112663836 2 + 7*9 + 1*8 + 1*7 + 2*6 + 6*5 + 6*4 + 3*3 + 8*2 + 3*1 + 6 = 180 除以 10 整除,因此為正確 正確時輸出Y,錯誤時輸出N ```php= <?php $mp = array( 10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21, 22, 35, 23, 24, 25, 26, 27, 28, 29, 32, 30, 31, 33); $id = readline(); $sum = (($mp[ord($id[0]) - ord('A')]) % 10 * 9) + (($mp[ord($id[0]) - ord('A')]) / 10); for ($i=8, $j=1; $i>=1; $i--, $j++) { $sum += $i * intval($id[$j]); } $sum += $id[9]; if ($sum % 10) echo "N"; else echo "Y"; ?> ``` ::: ## 7. 判斷完美數 :::info 當一個數字的所有的真因子(即除了自身以外的因數)的和剛好為本身時,即為完美數,請判斷輸入的數字是否為完美數。 測試資料第一行會有一個正整數n,接下來有n行文字,每行有一個數字 i, 1 <= i <= 263-1,若i為完美數則輸出Y,否則輸出N。 **Input:** 3 4 28 100 **Output:** N Y N ```php= <?php function isPerfect() { $num = intval(readline()); $factSum = 0; $f = 1; while ($f < $num) { if ($num % $f == 0) $factSum += $f; $f++; } if ($factSum == $num) echo "Y\n"; else echo "N\n"; } $k = intval(readline()); for ($i = 0; $i < $k; $i++) { isPerfect(); } ?> ``` ::: ## 8. 密碼規則檢查 :::success 強密碼可以降低密碼被猜中的機率,假設密碼可以由不同類型的字元組成: ● 數字 0123456789 ● 大寫英文 ABCDEFGHIJKLMNOPQRSTUVWXYZ ● 小寫英文 abcdefghijklmnopqrstuvwxyz ● 特殊符號 ~!@#$%^&*()_+=-\|';":/.,?>< 請依照以下規則判斷密碼強度: ● 四種類型的組合都有: 4 ● 四種組合中只有三個: 3 ● 四種組合中只有兩個: 2 ● 四種組合中只有一個: 1 測試資料第一行會有一個正整數n,接下來有n行文字,每行有一串文字 s,每行請輸出該密碼的強度。 範例輸入: 4 45Af Qwe!@#123 100 QaQ 範例輸出: 3 4 1 2 ```php= <?php $num = (int)readline(); for($x = 0; $x < $num; $x++){ $passwd = readline(); $number = '/^(?=.*[0-9])[a-zA-Z\d[\'.,:;*?~`!@#$%^&+=)(<>{}]|\]|\[|\/|\\\|\"|\|]$/'; $a = '/^(?=.*[a-z])[a-zA-Z\d[\'.,:;*?~`!@#$%^&+=)(<>{}]|\]|\[|\/|\\\|\"|\|]$/'; $A = '/^(?=.*[A-Z])[a-zA-Z\d[\'.,:;*?~`!@#$%^&+=)(<>{}]|\]|\[|\/|\\\|\"|\|]$/'; $other = '/^(?=.*[[\'.,:;*?~`!@#$%^&+=)(<>{}]|\]|\[|\/|\\\|\"|\|])[a-zA-Z\d[\'.,:;*?~`!@#$%^&+=)(<>{}]|\]|\[|\/|\\\|\"|\|]$/'; $count = 0; if(preg_match($number, $passwd)) $count++; if(preg_match($a, $passwd)) $count++; if(preg_match($A, $passwd)) $count++; if(preg_match($other, $passwd)) $count++; echo "$count\n"; } ?> ``` :::