#44948: pythonTLE求救


hansjiang1017@gmail.com (單純想出題所以在拚30%)

學校 : 不指定學校
編號 : 278037
來源 : [111.242.108.219]
最後登入時間 :
2025-03-11 17:33:56
a291. nAnB problem | From: [36.228.107.46] | 發表日期 : 2024-12-29 09:42

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")
    

 
#44953: Re: pythonTLE求救


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-03-11 12:39:29
a291. nAnB problem | From: [123.192.228.253] | 發表日期 : 2024-12-29 16:29

一些問題和我困惑的點:

 

1.

每筆測資間用空白行隔開,理論上範例測資也過不去,直接吃RE

算是這題的坑,題目沒說,不過範例測資有顯示


2.

字串轉換成 list 的過程感覺有些囉嗦,你的流程是:

origon_str    = 4 3 2 1
non_space_str = origon_str.replace(" ", "").strip() # 先移除空格
list_str = list(non_space_str) # 直接轉換成 list

但其實你只需要一行就可以處理,簡潔又優雅

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中都是不可變的資料類型,除非你用什麼手段把原始資料取代成別的東西或移除,否則原始字串都是不會變化的

 

 
#44954: Re: pythonTLE求救


asnewchien@gmail.com (david)

學校 : 不指定學校
編號 : 68108
來源 : [122.117.95.179]
最後登入時間 :
2025-03-08 19:55:21
a291. nAnB problem | From: [122.117.95.179] | 發表日期 : 2024-12-29 17:14

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" 
  
 
#44955: Re: pythonTLE求救


asnewchien@gmail.com (david)

學校 : 不指定學校
編號 : 68108
來源 : [122.117.95.179]
最後登入時間 :
2025-03-08 19:55:21
a291. nAnB problem | From: [122.117.95.179] | 發表日期 : 2024-12-29 17:23

你寫的 in 和 index 都要花時間的.

所以你處理一列測資花的時間是 

比對 a 時, 用的 range(4)

比對 b 時, 也用了 range(4), range 裡又用了 in 和 index

所以花了 range(4) + range(4) * (in + index)

如果能降一些, 才不會超時. 

 
#45000: Re: pythonTLE求救


hansjiang1017@gmail.com (單純想出題所以在拚30%)

學校 : 不指定學校
編號 : 278037
來源 : [111.242.108.219]
最後登入時間 :
2025-03-11 17:33:56
a291. nAnB problem | From: [111.242.104.94] | 發表日期 : 2025-01-01 15:26

你寫的 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")



 
#45011: Re: pythonTLE求救


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-03-11 12:39:29
a291. nAnB problem | From: [123.192.228.253] | 發表日期 : 2025-01-02 10:35

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 模式,逐行檢視每個變量的狀態,會更容易找到問題。

 

每筆測資會用空白行隔開,記得要處理

可以在讀入資料時,遇到空白行就自動忽略,直接讀取下一行

 

 
ZeroJudge Forum