おでぶ日記

研究とか趣味のことをいろいろと

2015/11 購入したもの

合計:5858円

せかいいちのねこ

せかいいちのねこ (MOEのえほん)

せかいいちのねこ (MOEのえほん)

少年が大事にしているねこのぬいぐるみが本当の猫になろうとする話。ぬいぐるみ系に弱い。
1512円。

よつばと 13

2年9ヶ月ぶりの新刊。本当に待った。よつばのおばあちゃんが出てきた。お気に入りのジャンボは出てこず。相変わらずのやんだのゆるさが最高だった。
648円。

猫を助ける仕事 保護猫カフェ、猫付きシェアハウス (光文社新書)

猫を助ける仕事 保護猫カフェ、猫付きシェアハウス (光文社新書)

猫を助ける仕事 保護猫カフェ、猫付きシェアハウス (光文社新書)

はじめての不倫学 「社会問題」として考える (光文社新書)を買おうとした結果、なぜかこの本に 笑。猫好きなので、少しでも猫のためになにかできればと。
757円。生協の10%割引あり。

スタンフォードの自分を変える教室 (だいわ文庫)

スタンフォードの自分を変える教室 (だいわ文庫)

スタンフォードの自分を変える教室 (だいわ文庫)

最近ダメダメなので、自己啓発本を読もうと思った。
やる意志も大事だけど、やらない意志っていうのも大事ということ。瞑想してみようかなと思った。
719円。生協の10%割引あり。

荒川アンダーザブリッジ

ついに最終巻。14巻から出る期間が長かったので、読み直さないといろいろ思いだせない。途中からギャグ系から電波系に移行した印象。
533円(税抜き)。バイトの5%割引あり。

レインツリーの国

レインツリーの国 (新潮文庫)

レインツリーの国 (新潮文庫)

甘々な恋愛小説が読みたくて購入。妖精作戦の話題が出てきて驚き。
430円(税抜き)。バイトの5%割引あり。

WIRED Vol.19

WIRED VOL.19 (GQ JAPAN 2015年12月号増刊) /特集 ことばの未来

WIRED VOL.19 (GQ JAPAN 2015年12月号増刊) /特集 ことばの未来

周りの友人が買っていて、面白そうな記事がいくつかあったので購入。
450円。生協の10%割引あり。

footballista 12

月刊フットボリスタ 2015年12月号

月刊フットボリスタ 2015年12月号

サッカーのデータ分析についての特集だったので購入。
809円。生協の10%割引あり。

checkiO - Fibonacci Golf

概要

http://www.checkio.org/mission/fibonacci-golf/
コードゴルフということで、とりあえず動くものを書いて修正して行く方針。

自分のコード

とりあえず書いたのがこれ。長い...

def fibgolf(type, num):
    if num == 0 and type in [u'lucas']:
        return 2
    if num == 0 and type in [u'perrin']:
        return 3
    if num == 0:
        return 0
    if num == 1 and type in [u'perrin']:
        return 0
    if num == 1:
        return 1
    if num == 2 and type in [u'tribonacci', u'padovan']:
        return 1
    if num == 2 and type in [u'perrin']:
        return 2
    if type == u'fibonacci':
        return fibgolf(u'fibonacci', num-1) + fibgolf(u'fibonacci', num-2)
    if type == u'tribonacci':
        return fibgolf(u'tribonacci', num-1) + fibgolf(u'tribonacci', num-2) + fibgolf(u'tribonacci', num-3)
    if type == u'lucas':
        return fibgolf(u'lucas', num-1) + fibgolf(u'lucas', num-2)
    if type == u'jacobsthal':
        return fibgolf(u'jacobsthal', num-1) + 2*fibgolf(u'jacobsthal', num-2)
    if type == u'pell':
        return 2*fibgolf(u'pell', num-1) + fibgolf(u'pell', num-2)
    if type == u'perrin':
        return fibgolf(u'perrin', num-2) + fibgolf(u'perrin', num-3)
    if type == u'padovan':
        return fibgolf(u'padovan', num-2) + fibgolf(u'padovan', num-3)

末尾再帰じゃないから時間がかかる&長いため修正。

def fibgolf(type, num):
    a0, a1, a2 = 0, 1, 1
    if type in [u'fibonacci', u'lucas', u'jacobsthal', u'pell']:
        if type == u'lucas': a0, a1 = 2, 1
        while num > 0:
            if type == u'jacobsthal': a0, a1 = a1, 2*a0+a1
            elif type == u'pell': a0, a1 = a1, a0+2*a1
            else: a0, a1 = a1, a0+a1
            num -= 1
        return a0
    if type in [u'tribonacci']:
        while num > 0:
            a0, a1, a2 = a1, a2, a0+a1+a2
            num -= 1
        return a0
    if type in [u'padovan', u'perrin']:
        if type == u'perrin': a0, a1, a2 = 3, 0, 2
        while num > 0:
            a0, a1, a2 = a1, a2, a0 + a1
            num -= 1
        return a0

動いたけど、58点(1000点から引き算式)。最高点610点、なんじゃそりゃ!?
さらに改良。

def fibgolf(type, num):
    a0, a1, a2 = 0, 1, 1
    if type in [u'fibonacci', u'lucas', u'jacobsthal', u'pell']:
        if type == u'lucas': a0, a1 = 2, 1
        while num > 0:
            if type == u'jacobsthal': a0, a1 = a1, 2*a0+a1
            elif type == u'pell': a0, a1 = a1, a0+2*a1
            else: a0, a1 = a1, a0+a1
            num -= 1
        return a0
    if type in [u'tribonacci', u'padovan', u'perrin']:
        if type == u'perrin': a0, a1, a2 = 3, 0, 2
        while num > 0:
            if type==u'tribonacci':a0, a1, a2 = a1, a2, a0+a1+a2
            else:a0, a1, a2 = a1, a2, a0 + a1
            num -= 1
        return a0

99点。

def fibgolf(type, num):
    [a0, a1, a2] = [2, 1, 1] if type == u'lucas' else [3, 0, 2] if type == u'perrin' else [0, 1, 1]
    while num > 0:
        [a0, a1, a2] = [a1, a2, a0+a1+a2] if type==u'tribonacci' else [a1, a2, a0 + a1] if type in [u'padovan', u'perrin'] else [a1, (2 if type == u'jacobsthal' else 1) * a0 + (2 if type == u'pell' else 1) * a1, a2]
        num -= 1
    return a0

337点。

CheckiO - Solve Digit Stack

概要

http://www.checkio.org/mission/digit-stack/
"POP","PUSH","PEEK"を実装。

考えたこと

  • 命令別の処理
  • stackが空だったときの処理

自分のコード

def digit_stack(commands):
    stack = []
    sum = 0
    for command in commands:
        if command.split(" ")[0] == "PUSH":
            stack.append(int(command.split(" ")[1]))
        elif command.split(" ")[0] == "POP":
            if len(stack) != 0:
                tmp = stack.pop()
                sum += tmp
            else:
                sum += 0
        elif command.split(" ")[0] == "PEEK":
            if len(stack) != 0:
                sum += stack[-1]
            else:
                sum += 0
    print(stack, sum)
    return sum

クリアできた。

他の人のコード

def digit_stack(commands):
    stack, sum = [], 0
    for cmd in commands:
        if 'PUSH' in cmd:
            stack.append(int(cmd.split(' ')[1]))
        elif cmd=='POP':
            sum += stack.pop() if stack else 0
        else:
            sum += stack[-1] if stack else 0
    return sum

またまた、短いし、やっていることは一緒っぽい...

CheckiO - Verify anagrams

概要

久しぶりにcheckに挑戦。Python始めた頃に練習としてやっていた(約1年前)。
http://www.checkio.org/mission/verify-anagrams/
アナグラム

考えたこと

必要だと思った処理は以下。

  • 文字列を1文字ずつ分割してリストにいれる
  • 与えられた文字列をすべて小文字にする。
  • 空白を削除
  • 何らかの基準でソートして、比較結果を返す

自分のコード

def verify_anagrams(first_word, second_word):
    res1 = []
    first_word = first_word.lower()
    second_word = second_word.lower()
    for i in first_word:
        if i != " ":
            res1.append(i)
    res2 = []
    for i in second_word:
        if i != " ":
            res2.append(i)
    return (sorted(res1) == sorted(res2))

クリアできた。

他の人のコード

def verify_anagrams(first_word, second_word):
    return sorted(first_word.replace(' ', '').lower()) == sorted(second_word.replace(' ', '').lower())

短い…、しかもやっていることは一緒。if文使って弾かなくても、replace(' ','')で解決できるな〜。