جواب سوال 22 ProjectEuler: امتیازات اسامی

پروژه اویلر

امروز هم با شما هستیم تا یکی دیگر از چالش‌های سایت پروژه اویلر رو باهم به جواب برسونیم. رسیدیم به چالش شماره 22 :

با استفاده از فایل Names.txt که حاوی 5000 اسم هست، باید اسامی رو بصورت الفبایی مرتب کنید. سپس برای هر نام امتیاز آن براساس حروف موجود در نام را محاسبه و در جایگاهش ضرب کنید.

برای مثال نام COLIN براساس حروف موجود در آن امتیاز 3 + 15 + 12 + 9 + 14 = 53 را دارا می باشد که با توجه به جایگاهش در لیست که 938 امین نام می باشد امتیاز کلی آن 938 × 53 = 49714 می شود.

مجموع تمامی امتیازات اسامی در فایل چند است؟

همونطور که ملاحظه فرمودید ابتدا باید فایل را دانلود کرده و ذخیره کنیم. درون فایل اسامی بین “” قرار گرفته اند و با , جدا شده اند. کدهای جواب چالش را می گذارم تا روی اونها مرور کنیم:

with open ("ProjectEuler\p022_names.txt",'r') as fileNames:
    sortedNames=sorted(fileNames.read().replace('"','').split(','),key=str)
    charNumDict={"A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10,"K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19,"T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":26}
    sum=0
    for ind,name in enumerate(sortedNames):
        myTemp=0
        for x in name:
            myTemp+=charNumDict[x]
        sum+=myTemp*(ind+1)
    print (sum)

در خط اول فایل متنی رو براساس آدرس آن و بصورت فقط خواندنی باز کرده و نام آن را fileNames قرار دادم. در خط بعد لیستی با نام sortedNames ساخته و کاراکترهای ” را حذف و اسامی را توسط کامایی که در فایل بینشان بود تقسیم بندی کردیم و تا اینجا مرحله اول که مرتب کردن اسامی بصورت الفبایی بود به اتمام رسید.

در مرحله بعد برای محاسبه امتیازات هر نام باید به هر حرف از حروف الفبا امتیاز مخصوص به آن را اختصاص دهیم. برای این کار دیکشنری ساختیم با نام charNumDict و کلیدها را حروف انگلیسی و نمره آنها را بصورت ولیو قرار دادیم. و در ادامه توسط دو حلقه for تودرتو امتیاز هر نام را محاسبه کرده و با ضرب در جایگاهش در لیست آن را به متغیر سام اضافه نمودیم تا جمع امتیازات کل اسامی محاسبه گردد و در انتها این مقدار را چاپ نمودیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.