#54708: Python參考


abc1231334 (tl32m)


我只會python QQ,python跑得慢很容易TLE。
所以要想辦法優化計算步驟。

我一開始是用lines = stdin.readlines()。產生一個lines的list,再從list一個一個讀,顯然建立list,依序從list讀取會拖慢速度。
之後改成每一步驟都讀一行,例如:

from sys import stdin
while True:
    # 先讀取一行,為密碼,如果是EOF就break,
    s = stdin.readline().strip()
    if s.strip() == "":
        break
    pwd = s.replace(" ","")
    # 讀取猜測次數
    guess_time = int(stdin.readline())
    for _ in range(guess_time):
        pwd_temp = pwd
        # 讀取猜測的內容
      guess = stdin.readline().strip().replace(" ","")

我的解法是盡量不要用到list,把字串本身當成list來用。
我的算法是從右到左比對,如果說pwd_tempguess的那個字元一樣,就A+=1,然後把那個字元刪掉。

先把A的狀況處理完,再來看B的狀況。

這裡特別注意一下,假設密碼是9 9 1 9,猜測是1 1 0 1,這樣子會變成0A1B。

以下是解題參考,中間那邊的一堆if,其實可以弄成for loop,但是我懶得想,反正也過了。

from sys import stdin



while True:
    s = stdin.readline().strip()
    if s.strip() == "":
        break
    pwd = s.replace(" ","")
    guess_time = int(stdin.readline())
    for _ in range(guess_time):
        pwd_temp = pwd
        guess = stdin.readline().strip().replace(" ","")
        A = 0
        B = 0

        if pwd_temp[3] == guess[3]:
            A += 1
            pwd_temp = pwd_temp[0:3]
            guess = guess[0:3]
        if pwd_temp[2] == guess[2]:
            A += 1
            pwd_temp = pwd_temp[0:2] + pwd_temp[3:]
            guess = guess[0:2] + guess[3:]
        if pwd_temp[1] == guess[1]:
            A += 1
            pwd_temp = pwd_temp[0:1] + pwd_temp[2:]
            guess = guess[0:1] + guess[2:]
        if pwd_temp[0] == guess[0]:
            A += 1
            pwd_temp = pwd_temp[1:]
            guess = guess[1:]
        
        for g in guess:
            if g in pwd_temp:
                pwd_temp = pwd_temp.replace(g,"Z",1)
                B += 1
        print(f"{A}A{B}B")
#54709: Re: Python參考


abc1231334 (tl32m)


我只會python QQ,python跑得慢很容易TLE。
所以要想辦法優化計算步驟。

我一開始是用lines = stdin.readlines()。產生一個lines的list,再從list一個一個讀,顯然建立list,依序從list讀取會拖慢速度。
之後改成每一步驟都讀一行,例如:

from sys import stdin
while True:
    # 先讀取一行,為密碼,如果是EOF就break,
    s = stdin.readline().strip()
    if s.strip() == "":
        break
    pwd = s.replace(" ","")
    # 讀取猜測次數
    guess_time = int(stdin.readline())
    for _ in range(guess_time):
        pwd_temp = pwd
        # 讀取猜測的內容
      guess = stdin.readline().strip().replace(" ","")

我的解法是盡量不要用到list,把字串本身當成list來用。
我的算法是從右到左比對,如果說pwd_tempguess的那個字元一樣,就A+=1,然後把那個字元刪掉。

先把A的狀況處理完,再來看B的狀況。

這裡特別注意一下,假設密碼是9 9 1 9,猜測是1 1 0 1,這樣子會變成0A1B。

以下是解題參考,中間那邊的一堆if,其實可以弄成for loop,但是我懶得想,反正也過了。

from sys import stdin



while True:
    s = stdin.readline().strip()
    if s.strip() == "":
        break
    pwd = s.replace(" ","")
    guess_time = int(stdin.readline())
    for _ in range(guess_time):
        pwd_temp = pwd
        guess = stdin.readline().strip().replace(" ","")
        A = 0
        B = 0

        if pwd_temp[3] == guess[3]:
            A += 1
            pwd_temp = pwd_temp[0:3]
            guess = guess[0:3]
        if pwd_temp[2] == guess[2]:
            A += 1
            pwd_temp = pwd_temp[0:2] + pwd_temp[3:]
            guess = guess[0:2] + guess[3:]
        if pwd_temp[1] == guess[1]:
            A += 1
            pwd_temp = pwd_temp[0:1] + pwd_temp[2:]
            guess = guess[0:1] + guess[2:]
        if pwd_temp[0] == guess[0]:
            A += 1
            pwd_temp = pwd_temp[1:]
            guess = guess[1:]
        
        for g in guess:
            if g in pwd_temp:
                pwd_temp = pwd_temp.replace(g,"Z",1)
                B += 1
        print(f"{A}A{B}B")

 

我講的那些優化速度邏輯,可能有誤。

stdin.readline()真的有比stdin.readlines()或是stdin.read()還快嗎? 可能沒有

另外,我在處理字串時,沒有轉換成list確實省時間,但是我頻繁的切片,也會造成拖慢速度,這也是可以優化的點。