ihit's diary

ちょっとしたメモに

Project Euler 22, 23

今回もProject Euler

22番
テキストファイルの名前を並び替えてスコア計算

pythonでテキスト分解するのは結構簡単
sort()もかなり便利

#!/usr/bin/env python
# -*- coding: utf-8 -*-

line = open('names.txt').read()
itemList = line[:-1].split(',')
newitemList = map(lambda x: x.strip(" \" "),itemList)
newitemList.sort()

score = 0
iterate = 0
for item in newitemList:
	iterate += 1
	subscore = 0
	for j in item:
		subscore += (ord(j) - 64)
	subscore *= iterate
	score += subscore

print score

23番
2つの過剰数の和で表せない整数の和

過剰数かどうかは前回の関数を使いまわした
時間は22秒とちょっとかかってしまった...なんかうまい方法ないかなあ

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def yakusu(num):
	row_num = num
	yakusu_list = []
	sosu = 2
	while num != 1:
		sosu_count = 0
		while num % sosu == 0:
			sosu_count += 1
			num /= sosu
		if sosu_count > 0:
			yakusu_list.append((sosu,sosu_count))
		sosu += 1
	insu_wa = 1
	for i in map(lambda x: (x[0]**(x[1]+1)-1)/(x[0]-1),yakusu_list):
		insu_wa *= i
	return insu_wa - row_num

kajyo = []
for i in range(1,28124):
	if i < yakusu(i):
		kajyo.append(i)

kajyo_wa_list = []
for i in kajyo:
	for j in kajyo:
		if i + j < 28124:
			kajyo_wa_list.append(i+j)

print sum(range(1,28124)) - sum(set(kajyo_wa_list))