Logicky Blog

Logickyの開発ブログです

codeIQをやってみた

The Essence of Programming 結城 浩さんからのアルゴリズムの問題をやってみました。簡単だと思ったのですが、アルゴリズムとかまだ勉強できてないので合ってるのか分かりません。ミスしてる可能性もあります。一応確認したら出来てる感じでしたが。ただ、やっぱりアルゴリズムの問題はクイズ的だし面白いので、もっと勉強しようと思いました。codeIQにはこういうのが色々あるようなので色々見てみたいと思いました。


合ってなかったら残念です。

# -*- coding: utf-8 -*-

f = open('blendlist.txt', 'r')

blends = [] #[[a,[b,c,d]],[b,[d,e,f]]]
curryA = []
curryB = []

#blendsの作成
for blend in f:
    spices = blend.split() #[a,b]
    flag = False

    for spice in spices:
        if len(blends) > 0:
            for b in blends:
                if spice == b[0]:
                    flag = True
                    break
        if not flag: blends.append([spice,[]])
        flag = False

    for idxS in range(len(spices)):
        for idxB in range(len(blends)):
            if spices[idxS] == blends[idxB][0]:
                if idxS == 0: idxAdd = 1
                else: idxAdd = 0
                if not spices[idxAdd] in blends[idxB][1]:
                    blends[idxB][1].append(spices[idxAdd])

f.close()

#curryA,Bの作成
cntA = 0
cntB = 0

for blend in blends:
    if not curryA and not curryB:
        curryA += [blend[0]] + blend[1]
        for b in blends:
            if not b[0] in curryA: curryB += [b[0]]
    else:
        for idx in range(len(blend[1])):
            if blend[1][idx] in curryA: cntA += 1
            else: cntB += 1
        if cntA > cntB:
            if not blend[0] in curryA:
                curryB.remove(blend[0])
                curryA.append(blend[0])
        elif cntA < cntB:
            if not blend[0] in curryB:
                curryA.remove(blend[0])
                curryB.append(blend[0])
        cntA = 0
        cntB = 0

#得点の計算
pntA = 0
pntB = 0

for blend in blends:
    if blend[0] in curryA:
        for spice in blend[1]:
            if spice in curryA: pntA += 1
            for idxBlends in range(len(blends)):
                if blends[idxBlends][0] == spice:
                    blends[idxBlends][1].remove(blend[0])
    else:
        for spice in blend[1]:
            if spice in curryB: pntB += 1
            for idxBlends in range(len(blends)):
                if blends[idxBlends][0] == spice:
                    blends[idxBlends][1].remove(blend[0])

#Answerの作成
answer = ''

if pntA > pntB:
    curryA.sort()
    for spice in curryA: answer += spice + ' '
else:
    curryB.sort()
    for spice in curryB: answer += spice + ' '
answer = answer.rstrip()
answer += 'nn■得点n'
answer += 'CurryA: ' + str(pntA) + '点n'
answer += 'CurryB: ' + str(pntB) + '点n'
answer += '------------------------------n'
answer += '合計   : ' + str(pntA + pntB) + '点nn■ソースコードn'

f = open('curry.py','r')
answer += f.read()
f.close()

#answerの書き込み
f = open('answer.txt', 'w')
f.write(answer)
f.close()