読者です 読者をやめる 読者になる 読者になる

10分

from functools import reduce

for _ in range(11):
    x, y = map(int, input().rstrip().split(' '))
    r = [x << i for i, k in enumerate(reversed(bin(y)[2:])) if int(k) == 1]
    if r:
        r = reduce(lambda x,y: x^y, r)
    else:
        r = 0

    print('%d@%d=%d' % (x, y, r) )

brson氏のcookbook

他になんもやる気が起きないのでとりあえず目を通した。error_chain!マクロを使ってunwrap()(a.k.a panic!)の弊害を避けたコードを書いている。雰囲気では読めるのだが、雰囲気以上の理屈がわからないのでよくわからない。そもそもbookのエラー処理の項すらよく読んでいないので、どうにかしたい。ベストプラクティスを知りたいという気持ちを強く持ち今後の動向を追いかけていきたい。

Pythonでインスタンス変数を初期化するだけの`__init__`を省略する

こんなクラスを作るとします。インスタンス変数を初期化するだけの退屈なコードです。

class Foo:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

foo = Foo(1, 2, 3)

だるいですね。

namedtupleを使うと__init__を捨てて楽に初期化できます。

Foo = namedtuple('Foo', 'a', 'b', 'c')
foo = Foo(1, 2, 3)

ただnamedtupleは不変データ構造なのでattributeに再代入不可なんですが。

foo.a = 1
# => AttributeError: can't set attribute

namedtupleを継承することによりクラスにメソッドを追加できます。

class Foo(namedtuple('Dummy', ['a', 'b', 'c'])):
    def __init__(self, a, b, c):
        pass

    def accum(self):
        return self.a + self.b + self.c

たぶん日本語でももっとちゃんとした説明した記事があると思います。以下のダベりに触発された記事でした。

What are the most repetitive pieces of code that you keep having to write? : Python

MathJaxをMarkdownと混在させると正しく描画されない現象

はてなで数式が正しく描画されない ugya-!!!という気持ちになったのでググった。

Issues with Markdown

まず問題点。

markdownではアンスコ_が強調ブロックとして扱われる。latexで下付き文字を使おうとしたとき、これが変に解釈され問題が起きる。というように読める(英語力ぅ…)

One issue that comes up, however, with Markdown is that the underscore character (_) is interpreted by Markdown as a way to wrap text in emph blocks while LaTeX (MathJax) interprets the underscore as a way to create a subscript.

それに対する応急処置的な解決法。_\_に置き換える。デメリットはlatexの数式と相互運用しづらい思われる。いちいち書き換えるのが面倒だ。

もう少しまともな解決方法は、<div></div>タグで数式を囲むことである。これはmarkdownプロセッサが<div>タグ内の数式を無視することを期待するものである。たぶんたいていこれでうまくいく(はてなではうまくいった)。

divはディスプレイ数式を処理するには十分だが、文中に数式を表示するインライン数式を扱うには不十分だ。行中に数式を収めようとしても、divタグがあるとそこで勝手に改行を行われるからである(ブラウザごとに違うのかも知れないが仕様も挙動も知らない)。

インライン数式を表示するには、まず以下の設定を追加する。

MathJax.Hub.Config({
    tex2jax: {
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
    }
});

すると、バッククオート記号`で囲んだ数式が表示されるようになる。

このコードの説明はここでなされている。上の設定は`の実体である<code>タグをMathJaxに無視させる設定である。

例:私が表示したかったもの

これにより次のコードが

`$\sum_{i=1}^{\pi(\sqrt(n))} \frac{n}{p_i} \approx  \frac{n}{2} + n \sum_{i=2}^{\frac{2 \sqrt{n}}{\ln{n}}} \frac{1}{i \ln{i} } \approx \frac{n}{2} + n \int_{i=2}^{\frac{2\sqrt{n}}{\ln{n}}} \frac{1}{i \ln i} \approx n \ln{\ln{n}} + O(n)$`

以下のように表示される(はず)。

$\sum_{i=1}^{\pi(\sqrt(n))} \frac{n}{p_i} \approx \frac{n}{2} + n \sum_{i=2}^{\frac{2 \sqrt{n}}{\ln{n}}} \frac{1}{i \ln{i} } \approx \frac{n}{2} + n \int_{i=2}^{\frac{2\sqrt{n}}{\ln{n}}} \frac{1}{i \ln i} \approx n \ln{\ln{n}} + O(n)$

Friends (CheckIO)

iterablesetの対で友人関係を表現するデータ構造Frindsクラスを作る。

Friendsは以下のメソッドをサポートする。

  • 友達の追加add, 同じデータすでに存在するときFalse, そうでないときTrueを返す。
  • 削除remove, データが存在しないときFalse, 存在するならTrueを返し削除する。
  • メンバのリストアップnames
  • ある名前が与えられたときそれの友達であるものの集合を返すconnected

集合操作ができれば難なく解けるのだがconnectedがちょい雑です。

class Friends:
    def __init__(self, connections):
        self.connections = list(connections)

    def add(self, connection):
        if connection in self.connections:
            return False
        self.connections.append(connection)
        return True

    def remove(self, connection):
        if connection in self.connections:
            self.connections.remove(connection)
            return True
        return False

    def names(self):
        return set().union(*self.connections)

    def connected(self, name):
        return set().union(*[s - set([name]) for s in self.connections if name in s])

ghosts age (CheckIO)

雑にフィボナッチ数列を作り、雑にゆうれいちゃんの不透明度の数列を作り、indexを取ると答えが合っていた。

ハロウィンネタなのでscaryな解求むということらしいが面白みのない凡庸なクソコードである。

def checkio(opacity):
    opcs = [10000]
    fibs = [1, 2]
    i = 1
    idx = 0
    while fibs[-1] < 5000:
        fibs.append(fibs[-1] + fibs[-2])
    while opcs[-1] >= 0:
        if i in fibs:
            opcs.append(opcs[-1] - fibs[idx])
            idx += 1
        else:
            opcs.append(opcs[-1] + 1)
        i += 1
    return opcs.index(opacity)

2つの日付の差分を取る(CheckIO)

2つの日付がタプルで与えられる(year, month, day)。その差分を日数で取り絶対値を返す問題。

from datetime import datetime, timedelta

def days_diff(date1, date2):
    return abs((datetime(*date2) - datetime(*date1)).days)

if __name__ == '__main__':
    assert days_diff((1982, 4, 19), (1982, 4, 22)) == 3
    assert days_diff((2014, 1, 1), (2014, 8, 27)) == 238
    assert days_diff((2014, 8, 27), (2014, 1, 1)) == 238