---
# System prepended metadata

title: OnlineTest - PHP 單元 2
tags: [資料庫程式設計, Javascript]

---

######  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. 英文轉成的數字, 個位數乘９再加上十位數的數字
3. 各數字從右到左依次乘１、２、３、４．．．．８
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";
}
?>
```
:::