# 103正式試題
## pA. 判斷二個數字是否為孿生質數
```python=
for _ in range(int(input())):
a, b = map(int, input().split(","))
if abs(a-b) != 2:
print("N")
continue
for i in range(2, int(a**0.5)+1):
if not(a%i):
print("N")
break
else:
for i in range(2, int(b**0.5)+1):
if not(b%i):
print("N")
break
else:
print("Y")
```
## pB. 買郵票
```python=
for _ in range(int(input())):
a, b, c, d = map(int, input().split(","))
for i in range(a, -1, -1):
if b*i + c*(a-i) == d:
print(f"{i},{a-i}")
break
```
## pC. 在兩字串中,共同出現的英文字母
```python=
for _ in range(int(input())):
a = set(input())
b = set(input())
ans = []
for i in a:
if i in b:
ans.append(i)
ans.sort()
print("".join(ans) if ans != [] else "N")
```
## pD. 計算兩個人之間共同朋友的數量
```python=
for _ in range(int(input())):
a = set([int(i) for i in input().split()][1::])
b = set([int(i) for i in input().split()][1::])
ans = 0
for i in a:
if i in b:
ans += 1
print(ans)
```
## pE. 撲克牌遊戲
```python=
from itertools import combinations
def get_card_value(card):
"""取得撲克牌的點數和花色"""
card = int(card)
point = (card - 1) % 13 + 1 # 轉為 1~13 的點數
suit = (card - 1) // 13 # 轉為 0~3 的花色
return point, suit
def is_straight(points):
"""判斷是否為順子"""
points = sorted(set(points))
for i in range(len(points) - 4):
if points[i:i+5] == list(range(points[i], points[i] + 5)):
return True
# 考慮 A 作為 14 的情況
if set([1, 10, 11, 12, 13]).issubset(points):
return True
return False
def get_hand_score(cards):
"""判斷五張牌的牌型分數"""
points, suits = zip(*[get_card_value(card) for card in cards])
point_count = {p: points.count(p) for p in set(points)}
suit_count = {s: suits.count(s) for s in set(suits)}
# 同花順
if max(suit_count.values()) == 5 and is_straight(points):
return 7
# 四條
if 4 in point_count.values():
return 6
# 葫蘆
if 3 in point_count.values() and 2 in point_count.values():
return 5
# 順子
if is_straight(points):
return 4
# 三條
if 3 in point_count.values():
return 3
# 兩對
if list(point_count.values()).count(2) == 2:
return 2
# 一對
if 2 in point_count.values():
return 1
# 雜牌
return 0
def get_max_score(cards):
"""取得玩家的最高得分"""
max_score = 0
for combo in combinations(cards, 5):
max_score = max(max_score, get_hand_score(combo))
return max_score
# 主程式
def main():
Q = int(input().strip()) # 玩家數量
results = []
for _ in range(Q):
cards = input().split()
results.append(get_max_score(cards))
print("\n".join(map(str, results)))
# 測試範例
if __name__ == "__main__":
main()
```
## pF. 費式數列
```python=
arr = [0, 1]
for i in range(20):
arr.append(arr[i]+arr[i+1])
arr.sort(reverse=True)
arr.pop();arr.pop()
for _ in range(int(input())):
ans = ""
N = n = int(input())
for i in arr:
if n-i >= 0:
ans += "1"
n -= i
else:
ans += "0"
print(f"{N}={int(ans)}")
```
## pG. 凱薩密碼
```python=
d = {"00":"0", "01":"1", "100":"2", "101":"3", "1100":"4", "1101":"5", "11100":"6", "11101":"7", "111100":"8", "111101":"9"}
key = [0, "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "A", "B", "C"]
for _ in range(int(input())):
n = input()
if n[0:2] in d and n[2::] in d:
print(key[int(d[n[0:2]]+d[n[2::]])])
else:
print(key[int(d[n[0:3]]+d[n[3::]])])
```
## pH. 列出所有樹的某節點到根節點之路徑長度
```python=
for _ in range(int(input())):
m, k, u = map(int, input().split(","))
tree = []
for _ in range(m):
tree.append([int(i) for i in input().split()][1::])
node = [[0]*(m) for _ in range(k)]
for i in range(k):
for j in range(m):
node[i][j] = tree[j][i]
a = []
for i in node:
root = i.index(999)
now = i[u]
ans = 1
while root != now:
ans += 1
now = i[now]
a.append(ans)
print(",".join(map(str, a)))
```