ラベル ProjectEuler の投稿を表示しています。 すべての投稿を表示
ラベル ProjectEuler の投稿を表示しています。 すべての投稿を表示

2014年3月7日金曜日

#16(0.024 sec): http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2016
n = 1
for i in range(1,1001):
    n*=2

print(sum(map(int, list(str(n)))))
#15: http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2015
print(4*39*37*35*11*31*29*3*23)
${}_{40}\mathrm{C}_{20}$=4*39*37*35*11*31*29*3*23 ってとこまで手で計算。私の感覚だと、最後の掛け算を計算機にさせても全体としては「手で解いた」と言って良いと思うのだがどうか。
#14(2.1 sec): http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2014
#Python 3.3

dic = {1:1}
def collatzSeqNum(n):
    if n in dic: return dic[n]
    if n%2==0: dic[n] = 1 + collatzSeqNum(int(n/2))
    else: dic[n] = 1 + collatzSeqNum(3*n+1)
    return dic[n]

res, maxSeq = 1, 1
for i in range(2, 1000000):
    t = collatzSeqNum(i)
    if t > maxSeq: res = i; maxSeq = t

print(res, maxSeq)

2014年3月6日木曜日

#13(0.024 sec): http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2013

int だの long だのと気にする必要のある人たちがかわいそうになるレベル。
# python3.3
f = open('input.dat')
ls = f.readlines()
f.close()
sum = 0 
for l in ls:
    sum += int(l)
print(str(sum)[0:10])
#12(1.3 sec): http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2012
primes=[2]
def genPrime(n=3):
    while(True):
        for p in primes:
            if n%p==0: break
        else: primes.append(n); yield n 
        n+=2

def genTriNum(t=0, i=1):
    while(True):
         t+=i; i+=1; yield t 

def getFactDic(t):
    d = {}
    for p in primes:
        if t%p==0:
            d[p]=0
            while t%p==0:
                d[p]+=1; t/=p
        if t==1: return d 
        elif p == primes[-1]: pg.__next__()

def getDivNum(d):
    prod = 1 
    for v in d.values():
           prod *= (v+1)
    return prod

pg = genPrime()
tg = genTriNum()
while(True):
    t = tg.__next__()
    d = getFactDic(t)
    n = getDivNum(d)
    if n >= 500:
        print(t, d, getDivNum(d))
        break

2014年3月5日水曜日

#11(0.15 sec): http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2011

こういう問題は嫌いだな。

import numpy 
N=20

def l2r(ls):
    cl = []
    for l in ls:
        for i in range(0, N-3):
            if "00" in l[i:i+4]: break
            else: cl.append(l[i]*l[i+1]*l[i+2]*l[i+3])
    return max(cl)

def tl2br(ls):
    cl = []
    for l in range(0, N-3):
        for c in range(0, N-3):
            t = [ls[l+i, c+i] for i in range(0, 4)]
            if "00" in t: break
            else: cl.append(t[0]*t[1]*t[2]*t[3])
    return max(cl)

def tr2bl(ls):
    cl = []
    for l in range(0, N-3):
        for c in range(3, N):
            t = [ls[l+i, c-i] for i in range(0, 4)]
            if "00" in t: break
            else: cl.append(t[0]*t[1]*t[2]*t[3])
    return max(cl)

ls = numpy.loadtxt('input.dat', dtype='int')
candidates = [l2r(ls), l2r(ls.T), tl2br(ls), tr2bl(ls)]
print(max(candidates))

2014年3月4日火曜日

#10(6.5 sec): http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2010

def calc(N):
    sum = 2
    primes = [2]
    for i in range(3, N):
        isPrime = True
        for p in primes:
            if i%p==0: isPrime = False; break
            elif p * p > i: break
        if isPrime: primes.append(i); sum+=i
    return sum

print(calc(2000000))
#9(0.10 sec). http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%209

def calc(c):
    aPlusB = 1000 - c
    c2 = c*c
    for b in range(1, aPlusB):
        a = aPlusB - b
        if a < b: break
        elif a + b + c != 1000: break
        elif 2*a*b >= c2: break
        elif a*a + b*b == c2: print(a, b, c)

for i in range(1,999):
    calc(i)
#8(0.043 sec): http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%208

s = "731671765313306249192251196744265747423553491949349698352031277450632623957
83180169848018694788518438586156078911294949545950173795833195285320880551112540
69874715852386305071569329096329522744304355766896648950445244523161731856403098
71112172238311362229893423380308135336276614282806444486645238749303589072962904
91560440772390713810515859307960866701724271218839987979087922749219016997208880
93776657273330010533678812202354218097512545405947522435258490771167055601360483
95864467063244157221553975369781797784617406495514929086256932197846862248283972
24137565705605749026140797296865241453510047482166370484403199890008895243450658
54122758866688116427171479924442928230863465674813919123162824586178664583591245
66529476545682848912883142607690042242190226710556263211111093705442175069416589
60408071984038509624554443629812309878799272442849091888458015616609791913387549
92005240636899125607176060588611646710940507754100225698315520005593572972571636
269561882670428252483600823257530420752963450"

def splt():
    return [e for e in s.split('0') if len(e) > 4]

def searchLocal(l):
    ll = []
    n = len(l)-4
    for i in range(0, n):
        ll.append("".join(sorted(list(l[i:i+5]), reverse=True)))
    return max(ll)

if __name__ == '__main__':
    l0 = splt()
    candidates = []
    for l in l0:
        candidates.append(searchLocal(l))
    max = max(candidates)
    res = 1
    for s in max:
        res *= int(s)
    print(res)
7問目(4.6 sec): http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%207


def calc(N):
    primeList = [2] 
    n = 1
    i = 3
    while(True):
        for p in primeList:
            if p * p > i: pass
            elif i % p == 0: break
        else:
            primeList.append(i)
            n += 1
            print(n, i)
        if n > N: break
        i += 1

calc(10001)

2014年3月3日月曜日

ゆーくんの薫陶宜しきを得て Project Euler になど手を出す。取り敢えず Registration は済ませた。面倒臭えな。