2016-03-19 16 views
0

Ben Proje Euler Problem 22 çözmeye çalışıyorum:# 22 Proje Euler: Cevabım neden yanlış?

names.txt Kullanılması (sağ tıklayın ve 'Bağlantıyı Farklı Kaydet/Hedefi Farklı ...'), beş bin üzerinde ilk adları içeren bir 46K metin dosyası, başlamak 'u alfabetik sıraya göre sıralayarak. Daha sonra her bir isim için alfabetik değeri üzerinde çalışıyorsanız, bu değeri bir isim puanı elde etmek için listesindeki alfabetik konumuyla çarpın. Liste alfabetik sıralanır Örneğin

, Colin, 3 + 15 + 12 + 9 + 14 = 53 değerinde , listede 938 adıdır. Böylece COLIN, 938 × 53 = 49714 bir puan elde eder.

Dosyadaki tüm ad puanlarının toplamı nedir? names.txt ait

içerikleri ben bu kodu kullandığınızda yanlış bir cevap almak neden anlamıyorum

"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA",....[46k omitted] 

şunlardır:

import os 
chart=open('names.txt') 
doc=chart.read() 
doc=doc.split(',') 
doc.sort() 
z=0 

def nameNum(name): 
    r=0 
    for letter in name: 
     r=r+ord(letter) - 64 
    return r 

for string in doc: 
    z+=(doc.index(string)+1)*nameNum(string) 
print z 

ben z yapmaya çalışıyordu cevabı üretmek ama doğru değil ve nedenini anlayamıyorum.

Bu arada python 3.

+1

Hata ayıklama yardımını arayan sorular (** "neden bu kod çalışmıyor?" **) istenen davranışı içermelidir, * belirli bir sorun veya hata * ve * gereken en kısa kod * bunu oluşturmak için ** kendisini sorgular **. ** açık bir problem ifadesi ** olmayan sorular, diğer okuyucular için yararlı değildir. Bkz. [Minimal, Tam ve Doğrulanabilir Örnek Nasıl Oluşturulur] (http://stackoverflow.com/help/mcve). – MattDMo

+2

da, bu Python 2 –

+1

'da çalışan yazdırma z'yi kullandığınız için Python 3'ü kullanamazsınız. Yanıt veremediğim yanıtta, "allsum" gibi test edilebilir bir işlev yazmanızı ve sonra onu basit girdilere uygulamanızı öneririm , '' '' '' ve '' A ',' 'ile başlayarak, cevabı hesaplayabilirsiniz. Sadece allsum (open ('names.txt'). Read()) '' allsum ('' 'CD', 'A', 'AB' '' ') 'gibi bir şeyden sonra çalışın. –

cevap

3

İsimlerle birlikte alıntıları " puanlıyorsunuz. En kolay, virgülle ayrılmadan önce bunları kaldırmaktır; Önce düzeltme

... 
doc=chart.read() 
doc=doc.replace('"', '') 
doc=doc.split(',') 
... 

, Colin

Name: "COLIN", pos: 938, score: -6566 

için negatif bir puan alıyoruz ... ama düzeltme sonra örneğe göre doğru değil;

Name: COLIN, pos: 938, score: 49714 
1

Orada gerçek algoritması ile yanlış bir şey olduğunu, ancak sorun , dosyayı bölmek ise, her isim etrafında " karakter olması olmasıdır; Yani her bir ismin skoruna 2 * (64 - ord('"')) yanlış ekliyorsunuz, bu yüzden yanlış bir sonuç elde edersiniz. herhangi bir ekstra karakter gelmeyecek

import ast 
with open('names.txt') as f: 
    contents = f.read() 
    names = sorted(ast.literal_eval(contents)) 

Şimdi names isimleri sıralı listesi:

dosya kolayca dizeleri bir demet haline ast.literal_eval() tarafından ayrıştırılır edilebilir bir biçime sahip. doc yerine bu listeyi kullanarak, algoritmanızdan doğru sonucu aldım.Bu öğelerin dizini bulmak için .index kullanarak, algoritmayı kendisini etkilemez iken Ayrıca


çok verimsizdir:

for string in doc: 
    z+=(doc.index(string)+1)*nameNum(string) 

yapmanız gerekir use enumerate yerine:

for number, name in enumerate(names, start=1): 
    z += number * nameNum(name) 

Şimdi names fazladan karakter içermeyen isimlerin sıralanmış listesidir. Bu değişikliklerle doğru sonucu elde ettim.

İlgili konular