めも

メモ.

最近買った本について (2019.07.25付近)

購入した本など.

いい本教えてください.

順番は特に意味はありません.

漫画でわかるFGO(著 リヨ)

FGOのリヨさんの絵柄が好きなので購入.

中国語版も出版されているらしいが、かなり探したものの日本から正規で購入できるルートが見つけられず断念.

もしも国内で販売している箇所ありましたら教えていただけると嬉しいです.

ついでに葛飾北斎もゲットしました、座布団も同時購入.

f:id:misos:20190816220722j:plain
FGO葛飾北斎

座布団は以下の物を使用, 大きすぎると思いましたがフィギュア自体が大きいためちょうどいいサイズでした.

リヨさんのtwitterは以下より. いいですね...

委員長のノゾミ(著 戸田 大貴)

未発売ですが...買ったことにします.

以下の動画(著者の方のチャンネルです)かどこかのタイミングのテトリス?の動画で知り、

早朝の配信が自分の活動時間とたまたまマッチして見続けていました.

www.youtube.com

赤くて覚めたくない (著 ハヌル)

twitterで漫画の存在を知り購入.

「感情」から書く脚本術(著 カール・イグレシアス, 島内哲朗)

もう少し早く読んでおきたかった本.

物語を作る上で必要な要素、対立がなぜ必要か...などほとんど全てのページがためになる内容だと思います.

長編の脚本を書く人でなくとも、読んで見る価値はあります.

「感情」から書く脚本術  心を奪って釘づけにする物語の書き方

「感情」から書く脚本術 心を奪って釘づけにする物語の書き方

技術者のための特許実践講座(著 小川 勝男)

特許周辺の知識が不足していると感じたため読破.

これと「技術者の逆襲 経営者の期待を超える発想と実践のノウハウ(著 藤井 隆満)」を読みましたが、こちらの内容が実践に近く有用でした.

あくまでエンジニア視点の本であり、特許資料の記述方法などを説明するものではないので注意してください.

統計的因果探索 -機械学習プロフェッショナルシリーズ- (著 清水 昌平)

以下の動画で因果探索に関する基本的な内容を触れています.

www.youtube.com

より詳しく知るために購入しましたが、まだ本をひらけていません...

日本人の英語 (著 マーク・ピーターセン)

英語で a, the などの付け方の理解を整理するために購入.

日本人の英語 (岩波新書)

日本人の英語 (岩波新書)

動作表現類語辞典 (著 マリーナ・カルダロン, マギー・ロイド=ウィリアムズ他)

よくweblioの類語表現のページを参照するのですが、

手に取れるサイズの本を本屋で見つけたため勢いで購入.

できればkindle版が欲しいのですが..

気が向いたらアンジェラ・アッカーマン著の感情類語辞典も読んでみようと思います.

俳優・創作者のための動作表現類語辞典

俳優・創作者のための動作表現類語辞典

  • 作者: マリーナ・カルダロン,マギー・ロイド=ウィリアムズ,シカ・マッケンジー
  • 出版社/メーカー: フィルムアート社
  • 発売日: 2019/07/26
  • メディア: 単行本
  • この商品を含むブログを見る

わたしのあたまのなかのにわ(作 水井 軒間)

イラスト作品集なので文章はないです.

以下の個展の場所が手近だったので足を向け、購入.

GirlsGeneration~少女の時間~2019夏 展 - AAA Gallery

やさしい人物画(A. ルーミス著, 北村孝一 訳)

購入。

前回

Leetcodeを進める:easyのみ(3)

easyの問題を中心に、pythonに限らず複数の言語で解いていく方針に。

コード:GitHub - Y-kyoto/leetcode

他の問題:leetcode カテゴリーの記事一覧 - めも

Problem657

概要:ロボットが上下左右に動き、その動き順が与えられる. 元の場所に戻ってこれるかを判定したい.

奇数回の動きでは元に戻ってこれないので false, 上下と左右の動き回数が同じならば戻ってこれるので true.

python3

class Solution:
    def judgeCircle(self, moves: str) -> bool:
        # 奇数回では戻れないので返す
        if len(moves)%2==1:return False
        # 各動作の出現回数
        ms = {"R":0, "L":0, "U":0, "D":0}
        # 各動作の出現回数をカウント
        for mv in moves:ms[mv]+=1
        return ms["R"]==ms["L"] and ms["U"]==ms["D"]

真面目に最後の点の座標を求める場合は↓.

class Solution:
    def judgeCircle(self, moves: str) -> bool:
        # 各動作の動きの定義
        ms = {"R":[1,0], "L":[-1,0], "U":[0,1], "D":[0,-1]}
        x, y = 0, 0

        # x/yを移動させる
        for mv in moves:
            m = ms[mv]
            x += m[0]
            y += m[1]

        return x==y==0

go

goではstring型に対してループを回す時、

  • stringのインデックスで取得した場合はbyteが取得できる
  • rangeでループした場合はruneが取得できる

ことに注意する. mには一文字単位のrune型のデータが入るので、stringに変換している. 使用しない変数は存在してはいけないので、 _(アンダーバー)で使用しないことを明記.

文字列の長さの取得についても,

  • len([]rune(str)): rune単位での文字列の長さ
  • len(str): byte単位での文字列の長さ

になる.

参考:Goのruneを理解するためのUnicode知識 - Qiita

func judgeCircle(moves string) bool {
    var mc = map[string]int{"R":0, "L":0, "U":0, "D":0}
    for _, m := range moves {
        mc[string(m)] = mc[string(m)] + 1
    }
    
    return mc["R"]==mc["L"] && mc["U"]==mc["D"]
}

Problem728

概要:left~right の範囲の数字について、数字の各桁の値で自分自身を割り算し、全ての桁で割り切れた数のリストを返す.

例:124 -> 124%1=0, 124%2=0, 124%4=0 => Trueなので答えに含める.

Python3

割り算なので, 0で割るケースのみ注意する. 文字列に変換して、各桁で割り算しながら試し、割り切れなかったら以降を確かめずに次の数へ行く.

class Solution:
    def selfDividingNumbers(self, left: int, right: int) -> List[int]:
        res = []

        for i in range(right-left+1):
            # left~rightの範囲をチェック
            i += left
            flag = True
            stri = str(i)

            # 0が含まれていたらスキップ
            if "0" in stri:
                continue

            # 割り切れない場合は答えに含めない
            for i_n in str(i):
                if not i%int(i_n)==0:
                    flag = False
                    break

            # 全て割れた場合は追加
            if flag:
                res.append(int(i))

        return res

all() を用いことで for ... で試した真偽値が全て真の時のみTrueになる条件が書ける. ゼロ割算が all以下で出てこないように、先に 0 が数字に含まれているかを評価する.

class Solution:
    def selfDividingNumbers(self, left: int, right: int) -> List[int]:
        res = []
        for i in range(right-left+1):
            stri = str(i+left)
            if not "0" in stri and all(((i+left)%int(i_n)==0 for i_n in stri)):res.append(i+left)

        return res

Problem905

概要:偶数をリストの前半、奇数をリストの後半に並べ直す.

python3

リストを2で割った時の値でソートし直す.

class Solution:
    def sortArrayByParity(self, A: List[int]) -> List[int]:
        A.sort(key = lambda x: x % 2)
        return A

Problem961

概要:長さ2Nのリストが渡され、そのうち N 個は同じ値が入っている. N 回出現する値を返す.

リストの長さから、2回以上出現した値=N回出現する値とわかるので二回目が見つかったタイミングでそれを答えにして返す.

Python3

class Solution:
    def repeatedNTimes(self, A: List[int]) -> int:
        for i, ai in enumerate(A):
            if ai in A[:i]:
                return ai

submission detail

C#

C#ではリストに特定の要素が含まれるかを調べる方法として

  • Find: Find(x=>...)の条件を満たす初めの要素を返す
  • IndexOf: インデックスを返し、存在しないならば-1
  • Contains: 含まれているならば true

の3つの方法が考えられる. ここではintしか使用しないとわかっているので List にすでに見た要素を追加していき、過去に一度でも見たことがある要素が存在するならそれを答えにする.

public class Solution {
    public int RepeatedNTimes(int[] A) {
        var intList = new List<int>();
        int res = 0;
        
        foreach (int a in A){
            if (intList.IndexOf(a)>=0){
                res = a;
                break;
            } else {
                intList.Add(a);
            }
        }
        
        return res;
    }
}

submission detail

Problem977

概要:二乗した数字の大きさでソートして返す. 入力としてソート済みの数値の列がくる.

Python3

先頭が0以上なら、ソートせずに全て二乗して返せばいい.

末尾が0以下なら、二乗して逆順にしてから返せばいい.

どちらでもないならば、ソートしてから返す.

class Solution:
    def sortedSquares(self, A: List[int]) -> List[int]:
        head, tail = A[0], A[-1]
        A = [x**2 for x in A]

        if head>=0:
            return A
        elif tail<=0:
            return reversed(A)
        else:
            A.sort()
            return A

最小限の構成、絶対値でソートしてから二乗して返す.

class Solution:
    def sortedSquares(self, A: List[int]) -> List[int]:
        A.sort(key=lambda x: abs(x))
        return [x**2 for x in A]

Leetcodeを進める:easyのみ(2)

  • Problem595
  • Problem709
  • Problem771
  • Problem804
  • Problem832
  • Problem938
  • Problem1021
  • Problem1108

easyの問題を中心に、pythonに限らず複数の言語で解いていく方針に。

コード:GitHub - Y-kyoto/leetcode

他の問題:leetcode カテゴリーの記事一覧 - めも

Problem595

概要:DBから面積と人口が指定以上の国を抽出する.

SQL問題、内容は簡単なのでインデントの仕方を覚えつつ提出.

# Write your MySQL query statement below
SELECT
    name,
    population,
    area 
FROM
    World 
WHERE 
    (
        area > 3000000
        OR population > 25000000
    )

Problem709

概要:英語の大文字を小文字に変換して返す、英語以外はそのままにする.

Python

str.lower(), str.upper() の小文字・大文字変換が用意されているので、一行で終わる.

class Solution:
    def toLowerCase(self, str: str) -> str:
        return str.lower()
  • ord: 文字からアスキーコードを取得して
  • chr: アスキーコードから文字へ戻す

アスキーコード上で32こ足した箇所に小文字が存在するので、大文字のアスキーコード(65:A 〜 90:Z)の範囲の文字がきたら +32して小文字にする. 上記と速度もメモリも変わらず.

class Solution:
    def toLowerCase(self, str: str) -> str:
        res = ""
        for c in str:
            oc = ord(c)
            if 64<oc<91:
                res += chr(oc+32)
            else:
                res += c
                
        return res
続きを読む

Leetcodeを進める:easyのみ(1)

easyの問題を中心に、pythonに限らず複数の言語で解いていく方針に。 なので、問題番号はバラバラになってます。

前回:

初挑戦時と回答

Problem 412

概要:3, 5の倍数の時にFizz、Buzzを出す。

工夫箇所特になし。

gist.github.com

Problem 21

概要:二つのリストがソート済みで渡されるので、ソート済みの一つのリストにして返す。

最終的な結果を保存するためのリストtempにつなげていき、temp.next以降につなげられたソート済みのリストを返す。

gist.github.com

Problem 20

概要:カッコ((), {}, [])の関係が正しく記述されているかを確認する。[}などは正しくないためFalseを返す。スタックにこれまでにみたカッコの前半(([{)を積んでいき、カッコの後半()]})を見つけたらポップする。できないならば、記述がおかしいとしてFalse。

gist.github.com

ubuntu18.04でPythonのコードを書くためのVSCode環境の用意

  • VSCodeのインストール
  • 基本的なショートカット
  • Anacondaへのパスを通す
  • インストールするエクステンション
    • python
    • Python Extended
    • Linter
    • autoDocstring
    • Trailing Spaces
    • Pythonに関係しないがインストールしたもの
      • Code runner
      • Markdown All in One
      • TODO Highlight
      • Settings Sync
      • Spell Right
      • Bookmarks
  • 参照

メモ.

VSCodeのインストール

.debファイルを上記からダウンロード.

UbuntuのGUI経由ならば、ダウンロードしたファイルをダブルクリックすれば「ソフトウェア」経由でインストールされるはず. 他のインストール方法は以下を参照.

Running Visual Studio Code on Linux

続きを読む

最近買った本について (2019.07.25付近)

購入した本など.

いい本教えてください.

順番は特に意味はありません.

漫画でわかるFGO(著 リヨ)

FGOのリヨさんの絵柄が好きなので購入.

中国語版も出版されているらしいが、かなり探したものの日本から正規で購入できるルートが見つけられず断念.

もしも国内で販売している箇所ありましたら教えていただけると嬉しいです.

ついでに葛飾北斎もゲットしました、座布団も同時購入.

f:id:misos:20190816220722j:plain
FGO葛飾北斎

座布団は以下の物を使用, 大きすぎると思いましたがフィギュア自体が大きいためちょうどいいサイズでした.

リヨさんのtwitterは以下より. いいですね...

委員長のノゾミ(著 戸田 大貴)

未発売ですが...買ったことにします.

以下の動画(著者の方のチャンネルです)かどこかのタイミングのテトリス?の動画で知り、

早朝の配信が自分の活動時間とたまたまマッチして見続けていました.

www.youtube.com

赤くて覚めたくない (著 ハヌル)

twitterで漫画の存在を知り購入.

「感情」から書く脚本術(著 カール・イグレシアス, 島内哲朗)

もう少し早く読んでおきたかった本.

物語を作る上で必要な要素、対立がなぜ必要か...などほとんど全てのページがためになる内容だと思います.

長編の脚本を書く人でなくとも、読んで見る価値はあります.

「感情」から書く脚本術  心を奪って釘づけにする物語の書き方

「感情」から書く脚本術 心を奪って釘づけにする物語の書き方

技術者のための特許実践講座(著 小川 勝男)

特許周辺の知識が不足していると感じたため読破.

これと「技術者の逆襲 経営者の期待を超える発想と実践のノウハウ(著 藤井 隆満)」を読みましたが、こちらの内容が実践に近く有用でした.

あくまでエンジニア視点の本であり、特許資料の記述方法などを説明するものではないので注意してください.

統計的因果探索 -機械学習プロフェッショナルシリーズ- (著 清水 昌平)

以下の動画で因果探索に関する基本的な内容を触れています.

www.youtube.com

より詳しく知るために購入しましたが、まだ本をひらけていません...

日本人の英語 (著 マーク・ピーターセン)

英語で a, the などの付け方の理解を整理するために購入.

日本人の英語 (岩波新書)

日本人の英語 (岩波新書)

動作表現類語辞典 (著 マリーナ・カルダロン, マギー・ロイド=ウィリアムズ他)

よくweblioの類語表現のページを参照するのですが、

手に取れるサイズの本を本屋で見つけたため勢いで購入.

できればkindle版が欲しいのですが..

気が向いたらアンジェラ・アッカーマン著の感情類語辞典も読んでみようと思います.

俳優・創作者のための動作表現類語辞典

俳優・創作者のための動作表現類語辞典

  • 作者: マリーナ・カルダロン,マギー・ロイド=ウィリアムズ,シカ・マッケンジー
  • 出版社/メーカー: フィルムアート社
  • 発売日: 2019/07/26
  • メディア: 単行本
  • この商品を含むブログを見る

わたしのあたまのなかのにわ(作 水井 軒間)

イラスト作品集なので文章はないです.

以下の個展の場所が手近だったので足を向け、購入.

GirlsGeneration~少女の時間~2019夏 展 - AAA Gallery

やさしい人物画(A. ルーミス著, 北村孝一 訳)

購入。

前回

pythonで2つの日付・月・年の間のすべての日付・月・年を等間隔に取得したい

タイトル通りです。 指定した二つの日付の間の全ての日を取得したい。 また、指定した日付の間の全ての月や年も取得したい。

必要なモジュール

from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta

dateutil.relativedeltaにて月・年の時間差分を計算することができる。 今回は年月日のみの計算だが、year, month, day, hour, minute, second, microsecondのオプションが用意されている. timedelta では日付の差分までしか取得できないので、年や月の足し引きを行いたい場合は dateutil.relativedelta を使用することになる.

コード

二つのタイムスタンプを受け取り、 day ならば二つの間の間の全ての日付を、 month ならば二つの間の間の全ての月を、 yearならば二つの間の間の全ての年を出力します.

dateutil.relativedeltaで終わりの日付を超えるまで足し続けるようにした方がよかったですね.

gist.github.com

出力例

get_alldate_between_startend(date(2010, 10, 8), date(2010, 10, 12), tsbase="day")

[datetime.date(2010, 10, 8),
 datetime.date(2010, 10, 9),
 datetime.date(2010, 10, 10),
 datetime.date(2010, 10, 11),
 datetime.date(2010, 10, 12)]

get_alldate_between_startend(date(2010, 12, 8), date(2013, 3, 9), tsbase="month")

# 出力
[datetime.date(2010, 12, 1),
 datetime.date(2011, 1, 1),
 datetime.date(2011, 2, 1),
 datetime.date(2011, 3, 1),
 datetime.date(2011, 4, 1),
 datetime.date(2011, 5, 1),
 datetime.date(2011, 6, 1),
 datetime.date(2011, 7, 1),
 datetime.date(2011, 8, 1),
 datetime.date(2011, 9, 1),
 # ... 省略 ...
 datetime.date(2013, 7, 1),
 datetime.date(2013, 8, 1),
 datetime.date(2013, 9, 1),
 datetime.date(2013, 10, 1),
 datetime.date(2013, 11, 1),
 datetime.date(2013, 12, 1),
 datetime.date(2013, 1, 1),
 datetime.date(2013, 2, 1),
 datetime.date(2013, 3, 1)]

get_alldate_between_startend(date(2010, 12, 8), date(2013, 3, 9), tsbase="year")

# 出力
[datetime.date(2010, 1, 1),
 datetime.date(2011, 1, 1),
 datetime.date(2012, 1, 1),
 datetime.date(2013, 1, 1)]

関連:日付特徴の作成

Pythonクローリング&スクレイピング[増補改訂版] -データ収集・解析のための実践開発ガイド

Pythonクローリング&スクレイピング[増補改訂版] -データ収集・解析のための実践開発ガイド