###### 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";
}
?>
```
:::