Py3 字符串水題

Powered by:AB_IN 局外人

科大訊飛杯 B題

題目描述

勇士菜哭武獲得了一把新的武器,武器有特殊的傷害計算方式。武器的傷害計算方式由若干個部分的和組成,用+號連接。每一部分可以是一個整數a,或者是一個公式ndx。其中a表示固定傷害a點;ndx表示擲n個x面骰子,傷害是所有骰子點數的和。總傷害是每一部分傷害的和。

比如2d6+1d70+3,表示擲兩個6面骰子和一個70面骰子(不一定實際存在70面骰子,可以理解成1到70當中隨機選擇一個整數),再加上固定傷害3點。

他正準備挑選一把好武器,需要計算新武器的傷害期望值,想讓你幫他計算一下。

輸入描述

輸入一個字符串,表示傷害計算公式。字符串長度不超過5000,對於每一個部分,1≤a, n, x≤1000。a,n,x都是整數。

輸出描述

輸出一個數,表示傷害的期望值。如果不是整數,小數點後位數保留最少,即最終結果只有可能是整數或者小數點後是.5的形式,如果不是整數,那麼保留一位小數。

這裏提供兩個寫法

while True:
    try:
        s=input().split("+")
        ans=0
        for i in s:
            if i.find('d')!=-1:#這個就是判斷i這個字符串裏有沒有d,有就返回1,沒有返回-1
                n,x=i.split("d")#n,x根據d分開
                ans+=(int)(n)*(int(x)+1)*0.5#求期望值,應該是從1一直加到x,再除以x,可以化簡
            else:
                ans+=int(i)
        if ans%1==0:#判斷是否爲整數
            print(int(ans))
        else:
            print(int(ans)+0.5)#根據題目要求加0.5
    except:
        break             
while True:
    try:
        s=input().split("+")
        ans=0
        for i in range(len(s)):
            if 'd' in s[i]:#從前往後判斷是否‘d’在字符串裏
                n,x=s[i].split("d")
                ans+=(int)(n)*(int(x)+1)*0.5
            else:
                ans+=int(s[i])
        if ans*10%10==0:
            print(int(ans))
        else:
            print("%.1f"%ans)#print(f'{ans:.1f}')
    except:
        break                

P1312: 剔除相關數

while True:
    try:
        n=int(input())
        if n==0:
            break
        tmp=input().split()
        lst=["".join(sorted(list(i))) for i in tmp]
        for i in lst:
            if lst.count(i)>1:
                while lst.count(i)>0:
                    tmp.remove(tmp[lst.index(i)]);lst.remove(i)
        tmp.sort()
        if len(tmp)==0:
            print("None",end="")
        else:    
            for i in tmp:
                print(i,end=" ")
        print()
    except:
        break

記幾個點:
1.sorted(list(i))這兒,返回排好的i的列表。如果用list(i).sort()沒有返回值。

2. lst=['1','2','1','1'] "".join(lst)將列表的字符連接到一起成字符串'1211'。如果用str(lst)的話,返回的是
"['1','2','1','1']"
(如果lst=[1,2,1,1]時,還得加上一句lst=[str(i) for i in lst]lst=list(map(str,lst)),一個循環,一個映射。)

3.下標問題。
<1>如果一個循環要用到它的下標

for k,i in enumerate(lst):

此時k爲下標,i爲數字。
<2>如果單純就是想要下標

k=lst.index(i)

此時k爲下標,i爲數字。

4.刪相同數時
<1>可以寫個while循環,remove直到它的count=0
<2>大名鼎鼎的filter
比如:要在列表裏把1刪了 lst=[1,2,1,1]

lst=[1,2,1,1]
tmp=list(filter(lambda x: x!=1,lst))
print(tmp)
#[2]

所以!!!
更短的代碼!

while True:
    try:
        n=int(input())
        if n==0:
            break
        tmp=input().split()
        lst=["".join(sorted(list(i))) for i in tmp]
        tmp1=list(filter(lambda x: lst.count("".join(sorted(list(x))))==1 ,tmp))
        tmp1.sort()
        if len(tmp1)==0:
            print("None",end="")
        else:    
            for i in tmp1:
                print(i,end=" ")
        print()
    except:
        break

即從tmp裏出來個原數 ,篩選出 lst裏 (經過sort過的) (在lst裏只有一次出現的)數。

完結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章