import sys
data = sys.stdin.read().splitlines()
index = 0
while index < len(data):
P = data[index].replace(" ", "").strip()
n = int(data[index+1])
index += 2
for _ in range(n):
A = 0
B = 0
a = data[index].replace(" ", "").strip()
password = list(P)
ans = list(a)
index += 1
for i in range(4):
if password[i] == ans[i]:
A+=1
password[i] = "o"
ans[i] = "o"
for i in range(4):
if password[i] != "o" and password[i] in ans:
B+=1
ans[ans.index(password[i])] = "o"
sys.stdout.write(f"{A}A{B}B")
一些問題和我困惑的點:
1.
每筆測資間用空白行隔開,理論上範例測資也過不去,直接吃RE
算是這題的坑,題目沒說,不過範例測資有顯示
2.
字串轉換成 list 的過程感覺有些囉嗦,你的流程是:
origon_str = 4 3 2 1 |
但其實你只需要一行就可以處理,簡潔又優雅
list_str = origon_str.strip().split() |
3.
輸出格式問題,每筆輸出的結尾應有換行符 \n
,但你的 \n
不見了,導致所有測資都印在同一行,就算前面不吃 RE,也不吃 TLE,結果也注定是 WA
使用 print()
可以不用自己加是因為它本身就自帶 \n
,它有一個參數叫 end
,其預設值就是 \n
,效果......就是每執行一次 print()
,就會在結束時輸出 \n
但你用的 sys.stdout.write()
可就沒有這個參數了,格式你得自己處理好
4.
承第2點,由於 str.split()
就可以輕易把帶空格的字串轉換成 list,甚至都不需要多一行 P = data[index].replace(" ", "").strip()
直接 password = data[index].strip().split()
就可以了,str.split()
不會修改原字串,而是回傳一份「新的」list 給你
如果你擔心原始資料被修改,提醒你,字串和tuple一樣,在python中都是不可變的資料類型,除非你用什麼手段把原始資料取代成別的東西或移除,否則原始字串都是不會變化的
for i in range(4): | range |
if password[i] == ans[i]: | |
A+=1 | |
password[i] = "o" | |
ans[i] = "o" | |
for i in range(4): | range * (in + index) |
if password[i] != "o" and password[i] in ans: | |
B+=1 | |
ans[ans.index(password[i])] = "o" | |
你寫的 in 和 index 都要花時間的.
所以你處理一列測資花的時間是
比對 a 時, 用的 range(4)
比對 b 時, 也用了 range(4), range 裡又用了 in 和 index
所以花了 range(4) + range(4) * (in + index)
如果能降一些, 才不會超時.
你寫的 in 和 index 都要花時間的.
所以你處理一列測資花的時間是
比對 a 時, 用的 range(4)
比對 b 時, 也用了 range(4), range 裡又用了 in 和 index
所以花了 range(4) + range(4) * (in + index)
如果能降一些, 才不會超時.
還是不行:
Traceback (most recent call last): File "/15343526_a291/code_15343526.py", line 8, in n = int(data[index + 1]) ValueError: invalid literal for int() with base 10: '7 2 0 5'
import sys
data = sys.stdin.read().splitlines()
index = 0
results = []
while index < len(data):
P = data[index].strip().split()
n = int(data[index + 1])
index += 2
for _ in range(n):
A, B = 0, 0
ans = data[index].strip().split()
index += 1
unmatched_P = []
unmatched_ans = []
for p, a in zip(P, ans):
if p == a:
A += 1
else:
unmatched_P.append(p)
unmatched_ans.append(a)
for p in unmatched_P:
if p in unmatched_ans:
B += 1
unmatched_ans.remove(p)
results.append(f"{A}A{B}B")
index += 1 #這行理論上要使程式跳過空白行,但不知為何未執行
sys.stdout.write("\n".join(results) + "\n")
Traceback (most recent call last): File "/15343526_a291/code_15343526.py", line 8, in n = int(data[index + 1]) ValueError: invalid literal for int() with base 10: '7 2 0 5' |
ValueError 在這裡的意思是你的程式傳入了一個無法被轉換成 int 的東西
他已經告訴你傳入了什麼了,你的程式想將 '7 2 0 5' 這個帶空格的字串轉換成 int
他轉不了,所以吐 ValueError 給你
你可以想一下, '7 2 0 5' 這種格式的東西會出現在測資的什麼位置,而你的 n = int(data[index + 1])
理論上又應該要讀到什麼東西
想像不了的話,若你有使用 vscode 或 pycharm 之類的 ide,可以使用這些 ide 的 debug 模式,逐行檢視每個變量的狀態,會更容易找到問題。
每筆測資會用空白行隔開,記得要處理
可以在讀入資料時,遇到空白行就自動忽略,直接讀取下一行