2020/02/29

[zerojudge] a565: 2.p&q的邂逅

from sys import stdin

T = int(stdin.readline())
for _ in range(T):
    s = stdin.readline().replace('.', '')
    # 先將 . 去掉 
    原長度 = x = len(s)    
    while(x):
        s = s.replace('pq', '')
        # 把 pq 抽走
        y = len(s)
        if(y == x): break
        x = y
    print((原長度-x)//2)

[zerojudge] e446: 排列生成

import sys

a = int(input()) # 只有一行輸入
f = [str(c) for c in range(1, a+1)]
# 輸入 3  -->  ['1', '2', '3']
d = permutations(f)
'''
利用 permutations 求全排列
print(list(d)) 可以觀察 d
[('1', '2', '3'), ('1', '3', '2'), 
 ('2', '1', '3'), ('2', '3', '1'), 
 ('3', '1', '2'), ('3', '2', '1')]
'''
for u in d: 
    sys.stdout.write(' '.join(u) + '\n')

[zerojudge] d518: 文字抄寫 II

import sys
opt = ''
for s in sys.stdin:
    w = int(s)
    c = 1 # counter init
    f = [{} for i in range(26)] 
    # 每個字母獨立一個 dict              
    for i in range(w):
        s = sys.stdin.readline()
        ch = ord(s[0]) - 97
        # 讀入字串的第一個字母的 ascii 值
        # 在 f 的位置  f[0] 就是 a 的字典
        if(f[ch].__contains__(s)):
            opt += 'Old! {}\n'.format(f[ch][s])
            # 字典已有此字
        else:
            opt += 'New! {}\n'.format(c)
            f[ch][s] = c
            # 字典沒有這個字,將 c 紀錄起來。
            c += 1
sys.stdout.write(opt.strip())
# 一次印出

[zerojudge] d057: 11494 - Queen

import sys 

for s in sys.stdin:
    if(s == '0 0 0 0\n'): break
    x1, y1, x2, y2 = [int(z) for z in s.split()]
    m, n = abs(x1-x2), abs(y1-y2)
    r = 2
    if(m + n == 0): r = 0    # 同一點
    elif(m * n == 0): r = 1  # 同一軸
    elif(m == n): r = 1      # 同斜率
    print(r)

[zerojudge] d596: 1. 猜九宮格裡的地雷

import sys

# 把每個九宮格的鄰居先建表
d = ({'1': set(['2','4']),     
      '2': set(['1','3','5']),
      '3': set(['2','6']),
      '4': set(['1','5','7']),
      '5': set(['2','4','6','8']),
      '6': set(['3','5','9']),
      '7': set(['4','8']),
      '8': set(['5','7','9']),
      '9': set(['6','8'])})
      
w = int(sys.stdin.readline())
for i in range(w):
    a, b, c = sys.stdin.readline().strip().split()
    # d[a] 是可能地雷, d[b] 及 d[c] 是排除的
    r = sorted(list(d[a] - d[b] - d[c]))
    # 使用減法可以省去很多判斷
    # r 為空,表示矛盾。
    if r: print(*r)
    else: print('Empty')

2020/02/28

[zerojudge] a010: 因數分解

# a010 因數分解 python
import sys
import math
'''
題目說 n <= 1000000
而  n 的質因數 <= sqrt(n)
所以先來建立一個質數表
'''
limit = 1000000
u = int(math.sqrt(limit))
sieve = [0, 0, 2, 3] + [1] * (u - 4)
prime = [2]
for i in range(3, u, 2):
    if(sieve[i] == 0): 
        # sieve[i] 為 0 表示被篩掉了    
        continue
    prime.append(i)
    for j in range(i * i, u, i): 
        sieve[j] = 0
# 你可以 print(prime) 來核對
# print(prime)  

def fact(n):
    r = []
    k = math.sqrt(n)
    for x in prime:
        if(x > k): break
        # 檢查到 n 的平方根
        c = 0
        while(n % x == 0):
            c += 1
            n //= x
        if(c): r.append([x,c])
        # c 是試除的次數        
    if(n > 1): r.append([n,1])
    # 剩餘的數 > 1 必定是質因數
    return r

def op(z):
    if(z[1] == 1): return str(z[0])
    return '{}^{}'.format(z[0], z[1])
    
# 主程式    
for s in sys.stdin:
    n = int(s)
    f = fact(n) # 先分解
    # print(f) 看結果對不對
    r = list(map(op, f))
    print(' * '.join(r))
    '''
    假設 n = 100
    fact(n) = [[2, 2], [5, 2]]
    r = ['2^2', '5^2']
    '''

[zerojudge] e700: 星座

import sys 
for s in sys.stdin:
    m, d = s.strip().split('/')
    md = m.rjust(2, '0') + d.rjust(2, '0')
    if(md < '0121'): print('摩羯座')
    elif(md >= '0121' and md <= '0219'): print('水瓶座')
    elif(md >= '0220' and md <= '0320'): print('雙魚座')
    elif(md >= '0321' and md <= '0420'): print('牡羊座')
    elif(md >= '0421' and md <= '0521'): print('金牛座')
    elif(md >= '0522' and md <= '0621'): print('雙子座')
    elif(md >= '0622' and md <= '0722'): print('巨蟹座')
    elif(md >= '0723' and md <= '0821'): print('獅子座')
    elif(md >= '0822' and md <= '0923'): print('處女座')
    elif(md >= '0924' and md <= '1023'): print('天秤座')
    elif(md >= '1024' and md <= '1122'): print('天蠍座')
    elif(md >= '1123' and md <= '1222'): print('射手座')
    elif(md >= '1223'): print('摩羯座')