n-knuu's logs

憧れ駆動。だいたい競プロ

Codeforces Round #308 Div.2 C - Vanya and Scales

問題

Codeforces Round #307(Div. 2) - C. Vanya and Scales
天秤があり、整数wとmが与えられる。重さm, w^0, w^1, w^2, ..., w^100のおもりを使って、天秤の両側を同じ重さにできるか。ただし、重さmのおもりは必ず使うものとする。

制約

2<=w<=10^9, 1<=m<=10^9

続きを読む

Codeforces Round #307 Div.2 C - GukiZ hates Boxes

問題

Codeforces Round #307(Div. 2) - C. GukiZ hates Boxes
一直線の列があり、列の各地点に箱の山が置かれている。箱が置かれている列の長さはnで、地点i(1<=i<=n)にはai個の箱が置かれているとする。この箱をm人で取り除きたい。各人は1秒に以下の2つの行動のどちらかができる。

  • 地点iからi+1に移動する
  • 地点iにある箱を1つ取り除く

最初、全員が地点0にいるとき、最小何秒で箱を取り除くことができるか。

制約

時間制限: 2秒
1 <= n, m <= 10^5
0 <= ai <= 10^9 (ただし、少なくとも1つの地点iでai != 0であることが保証されている)

続きを読む

Win-Lose Algorithm

はじめに

この記事は、Algorithm Games – topcoderに書いてあるWL-Algorithm(要はゲーム系の問題で、後ろから探索するもののうち単純に再帰して深さ優先探索していくやつ)についての備忘録です。*1
深さ優先探索、メモ化再帰pythonについて知っていれば、この記事は読めます。

*1:この名称は一般的ではなさそうなのでこの記事は釣りっぽい

続きを読む

Pythonのキューと優先度付きキュー

概要

Pythonでは、キューとしてlistとcollections.dequeとqueue.Queueが、優先度付きキューとしてheapqとqueue.PriorityQueueが使えることは知っていたのだけれど、どれを使えばいいのか毎回迷ってしまうのでとりあえず時間を計測してみた。

結論

特に気にしないなら、速さの面で有利なキューはcollections.dequeを、優先度付きキューはheapqを使う。

続きを読む

SRM509 div.2 1000 NumberLabyrinthDiv2

問題

TopCoder Statistics - Problem Statement
平面が与えられて、各格子には0〜9の数字もしくは空白(.)が与えられる。
数字の書いてある格子からは、4方向に数字の分だけジャンプして移動できる。0に来た場合はそれ以上移動できない。
スタート地点とゴール地点が与えられて、空白をK回まで書き換えてよいとした場合、移動回数の最小値を求めよ。
どうやってもゴールにたどり着けないときは-1を出力せよ。

続きを読む

SRM509 div.2 500 LuckyRemainder

div.1 250と同じ問題。

問題

TopCoder Statistics - Problem Statement
あるn桁の数字Xに対してsuper(X)を定義する。
super(X)=(Xからm桁(0 <= m < n)取り除いてできる数字の集合の総和)
例:super(123) = 123 + 12 + 13 + 23 + 1 + 2 + 3 = 177
Xが与えられるので、super(X)を9で割った余りを求めよ。

続きを読む

SRM659 div.2 500 PublicTransit

問題

http://community.topcoder.com/stat?c=problem_statement&pm=13793&rd=16462
R行C列のグリッド上に都市があり、距離をマンハッタン距離で計算するとする。
グリッド上に2つteleporterを設置して、その2つを距離0で移動できるとき、全点対の最大距離を最小に2つteleporterを配置したとき、その距離はいくらになるか

制約

0<=R<=10
0<=C<=10

続きを読む

HackerRank Pythonist

HackerRankのPythonistに参加しました。www.hackerrank.com
Pythonのいい練習になったのでメモを残しておきます。

コードはpython3で書きました。

続きを読む

2015年の目標

もう2月中旬だけど、春休みにも入ってある程度固まったから書いておく。

主なもの

  1. プログラミング言語(より多くの言語の習得・習熟を目指す)
  2. 競技プログラミング(Div1への昇格・維持を目指す)
  3. 計算機科学・情報科学(基礎の復習と興味のある分野を学習する)

手元では各項目の下に、やりたいこととか読みたい本とかがいろいろあるけども、まだ決まってない

その他

  • プログラミングのための周辺の道具(EmacsVim、git、Unixzsh)についてより詳しく学ぶ
  • Githubをもっと積極的に活用する
  • もっと情報を発信していく

今年やったこと(プログラミング編)

これはknuu Advent Calender*1 初日の記事です!
今年やったこととか書きます!

春休み

競技プログラミング

AOJに登録して競技プログラミングを始める。春休みに200問くらい解く。

C++

競プロを始めた関係でC++をやろうと思って、独習C++をちょっとだけ読む*2
蟻本もちょっと読んでる*3

前期

学校の演習でコンパイラを作る

C言語のサブセットのTinyCという言語のコンパイラを作る。bisonとかflexとか触った。無駄な拡張をしまくって面白かった。(参考:Hardware and Software Laboratory Project 3B (Software Part))

FPGAに触る

学校の演習でFPGAでCPUを作る。動いたときはすごく達成感があったけど、やっぱりハードウェア方面よりソフトウェア方面のほうが好きだということを確認した。(参考:計算機科学実験及演習 3A)

Eigen

Eigen(C++の行列計算ライブラリ)を使った。暗黒通信団の資料がわかりやすかった。
http://mikaka.org/~kana/dl/pdf/pdf-eigennote.pdf

数値解析の授業で固有値計算法のヤコビ法とかやったのでそのコード書くために使った。
ヤコビ法
べき乗法

実装力向上

実装力を上げるためにいろいろ書いてみた。
練習問題としてここ(練習問題 - プログラミングスレまとめ in VIP)にあるものを書いたりした。

Git

gitの勉強した。本がわかりやすい。

入門git

入門git

GitHubも今後活用していきたい所存。knuu (くぬう) · GitHub

夏休み

Ingressに消えた

後期

Emacs

Emacs自体は1年前期の演習で使わされ始めてから惰性で使い続けてるが、適当にネットで拾った設定を切り貼りしてたら、コピペしてもうまく設定できない状態に陥ってたので本を買った

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

とりあえずこれの設定を丸写ししたらいい感じになった。(結局丸写し)
でもちゃんと設定できるようになったしいいや(適当)

Coq

授業でCoqの勉強してる。(Computation and Logic: Winter Semester 2014)

HTML・CSS

HTMLとCSSを(ドットインストールで)まともに少し勉強した。ドットインストールは結構わかりやすくてよかった。

zsh

WEB+DB vol.83を読んでzshに入門した。めっちゃいい感じ。

Python

Pythonを書き始める

Pythonを書き始めて1ヶ月がたった - n-knuu's logs
まあ久しぶりにブログでも書くかーって感じで書いたらめっちゃ伸びててびびった。
f:id:n_knuu:20141223224148p:plain
あと、前期の忙しくなった頃(7月くらい?)にいったん放棄していた競プロを、Pythonで再開した。

Codeforces

初参戦して1完だった。

来年やりたいこと

本を読む

とにかく読んでとにかくコード書く。
本欲しい(切実)

Amazon.co.jp

Vim


まあこれはプログラミング始めた頃の話なのだけど、いまでも開いてしまった時はターミナルをそっと閉じるようにしてる。
まあでもさすがにこれではまずいのでVimチュートリアルくらいは読んで、設定をできるくらいにはなっとこうと思う。まあEmacsは環境として最高でVimテキストエディタとして最高ってばっちゃも言ってたし。

競プロ

こどふぉDiv1に上がることを目標に頑張りたい。

プログラミング言語

Python, C++を鍛えたい。
Ruby, Haskell, JavaScript, Perl, D, Goあたりに触りたい



knuu Advent Calender、明日は id:n_knuu さんで今年やったこと(日常編)です!最終回です!

*1:そんなものはない

*2:現時点でまだ読み終えてない

*3:こちらも現時点でまだ読み終えてない

Pythonを書き始めて1ヶ月がたった

10月30日にPythonを突発的に始めて1ヶ月がたった。
始めて2週間で学校の課題(Webアプリ)を書いたりした。
技術的にためになる話はないけど、まあ日々のログとして書いておく。

経緯

  • 以前からPythonはやろうと思ってた
  • 学校の教養科目でPythonを書く科目をとってみた

以下は時期的な話。

やったこと(時系列順)

入門

1日でさらっと読み流した。プログラミングやったことない人には難易度高そうという印象。雰囲気つかむだけならすぐに読めると思う。

  • みんなのPython Webアプリ編 HTML版

2日で読んだ。HTTPレスポンスの処理とかテンプレートエンジンとかORMとかを自分で作って、セキュリティ対策とか認証とかも自分でやってWebアプリを1から作ろうぜ!って本。始めてWebアプリを作ったのでいい本なのかどうかは判断しかねるけれども、自分は読んでよかったと思う。



Django

ここまでやって、Javaで書いてたWebアプリもPythonで書き直せばいいんじゃね?となる。

選んだ理由は「Python フレームワーク」でググると最初に出てきたからとかたぶんそんな理由。


やりたいこと(というか演習の最低限作らなきゃいけない部分)がだいたい載ってた。入門としてはすごくよかったと思う。

日本語版は1.4までしか翻訳が進んでないので上のDjango入門とはバージョンが違うが、英語をゆっくり読んでる時間もなかったので、適当に読み替えながらやった。まあわからないところは英語版読まなきゃいけないんだけどね。
syncdbが新しいバージョンだとできないんだったっけ…? よくわかってない上に、多分上のDjango入門を読んだほうがいい。



その後いろいろ



とりあえずツイートの仕方とリプライの送り方だけわかった。

  • 11月4日にみんなのPython 第3版とPythonクックブック 第2版を買った

これを読み進めつつ、課題のWebアプリを書いた。みんPyは2週間できっちり読み終えた。

  • 11月14日にScrapyに触った

みんPyを読んでたら、いとも簡単にWebページを引っ張ってきてhtmlを解析していたことに驚いて、これなら簡単にクローラとか作れるんじゃないのと思って調べたらScrapyを知った。

このページのプログラムを動かして遊んだ。

ページ内の画像を一括ダウンロードするプログラムが割と簡単に書けた。とは言っても、プログラム中に予めURLとか保存先フォルダをプログラム中に書いておかないといけないというお粗末なもの。

但し読んだのは和訳版。

まだ試作段階なので公開してない


感想

ほとんどC言語しか書いたことがなかったので、Pythonは新鮮だった。
"""なんかすごい"""
こんな感想しか書けないボキャブラリーの貧困さよ。
年内にPythonクックブックを読み終えて、エキスパートPythonプログラミングとか入門 ソーシャルデータあたり読みたい。








Pythonの日本語の本

最終更新: 2015年12月8日

追記(2017年12月13日)

最近はpythonの本が多すぎて追いきれないため、おそらく以降更新はしません。
ご了承下さい。

ゲームプログラミング

Pythonゲームプログラミング入門

Rのインストールと簡単な計算

3回生にもなって、社会統計学実習Bなる全学共通科目(一般教養科目)をとることにした。
理由は、シラバスにRをやるってかいてあったから。

初回のガイダンスを聞いてると、どうやら統計のことを受講者がまだあんまりやってないらしく(1・2回生が多いしそりゃそうだ)、統計の基本的なことをやりつつ、それをRで例を実際に計算してみる、みたいな実習らしい。
まあこんなことでもしないと自分からはやらないだろうし、統計学の復習になるからいいやと思い受けてみることにした。

とりあえずRのインストールと基本的な操作をメモしておこうと思う。

Rのインストール

とりあえず筑波大のミラー統計数理研究所のミラー統計数理研究所のミラーをおいておく。
「CRAN」で検索しても出てくる。CRANってのはRのパッケージでユーザが作ったライブラリを公開してたりするらしい。

実際にRを開くと、プロンプトが表れるだけのそっけない感じで、書いたものの再利用もしにくい。
そこで、IDEであるRStudioも一緒に入れたほうが良い。
RStudioのインストールはここのInstallers for ALL Platformsのところから。
RStudioのいいところは定義した変数なり関数なりを表示しておいてくれるところだと現時点では思ってる。
RStudioのエディタで書いたプログラムをカーソルなりで一部だけ選択して実行なんてこともできる。

R言語

以下はR言語についてのメモ。
#以下はコメントとして扱われる。

代入
a <- 1 #整数の代入
Pi <- 3.14 #小数の代入
x <- c(1, 2, 3) # リストの代入、c(…)はリストをつくる関数。

型は勝手に推測してくれるらしい。

計算

演算子は以下。

演算子 意味
+ 加算
- 減算
* 乗算
/ 除算
^ 累乗
%% 剰余
%/% 整数除算

以下は関数。

sqrt(x) # xのルート
abs(x) # xの絶対値
x <- scan("<ファイル名>") # <ファイル名>を開いて、xに代入。
# 空白区切りのデータなどを<ファイル名>に入れて上のようにすると、xはリストとなる。
リスト

リストの演算は、リストの要素ごとの演算となる。
つまり、リストarrayに対してarray+2とすると、リストの各要素に2が加算される。
以下は、リストに適用する関数など。

data[n] # リストdataのn番目の要素
length(data) # リストdataの長さ(要素の個数)
max(data) # リストdataの最大値
min(data) # リストdataの最小値
sort(data) # リストdataを昇順ソート

mean(data) # リストdataの平均
median(data) # リストdataの中央値
var(data) # リストdataの標本分散(不偏分散)
sd(data) # リストdataの標準偏差
cor(data1, data2) # リストdata1とdata2の共分散、covじゃないのか…

hist(data) # リストdataのヒストグラムを描く
#histでは、引数として題名、x軸名、y軸名、クラス数(何個に分けてヒストグラムを集計するか)を指定できる。
hist(data, main="題名", xlab="x軸名", ylab="y軸名", nclass=クラス数)
# hist(data)とだけ書いた場合、下のようになる。
hist(data, main="Histogram of data", xlab="data", ylab="Frequency", nclass=dataの範囲)

plot(data1, data2) # x要素をdata1, y要素をdata2とした散布図を描く
# plotも、引数として題名、x軸名、y軸名を指定できる。
# さらに、プロットする点の形も指定できる。(例えば"+"など)
plot(data1, data2, main="題名", xlab="x軸名", ylab="y軸名", pch=点の形)
# plot(data1, data2)とだけ書いた場合、下のようになる。
plot(data1, data2, main="", xlab="data1", ylab="data2", pch="○")
#さらに、その散布図に縦線や横線を加えることもできる。
abline(v=mean(data1)) # data1の平均(mean)のところに縦線(vはverticalの略)を引く
abline(h=mean(data2), lty=2) # data2の平均のところに横線(hはhorizontalの略)を引く
# ltyはline typeの略で、線の種類を指定できる
# lty=2は破線で、デフォルトでは直線(lty=1)
関数定義

関数を定義する関数functionを利用する。

#関数fooの定義
foo<-function(引数){
  statement 1
  statement 2
  …
  statement n
}

Rの関数の返り値は、関数内で最後に実行した式の結果である。
つまりここでは、statement n の結果が関数の値として返される。

例えば、xを二乗する関数square(x)は以下のように定義できる。

square<-function(x){
  x*x
}

とりあえずやったところまで。(2014/10/11)
C++の勉強とか蟻本の勉強とか全然進んでない。

入門git 第Ⅰ部(第1章〜第3章)

以前TLで見かけた入門gitを買って読んでる。

入門git

入門git

薄いのですぐに読み終えられそう。

第1章

いろんな用語説明。
リポジトリは金庫と出納簿、作業ツリーが金庫の中身、みたいな感じだろうか。
書くの面倒いので割愛

第2章

2.1 Gitのインストール

gitはcommand line toolをinstallした時に、Apple git-48なるものが一緒に入ってるからそのまま使うことを試みる。
で、git-guiなるgitのGUI出てきて紹介されてるからとりあえず開いてみようとして「git gui」と入力して実行してみる。
でも、そんなコマンドねーよって怒られるから何でだ〜と思ってたら、Apple git-48がだめっぽいので、brew install gitする。
それでも、git --versionしてみてもまだApple git-48が入ってるらしいし、なんでやねんと思ってると、PATHの関係でだめっぽいので、export PATH=/usr/local/bin:$PATHしたらbrewで入れたgitの方になってた。よかった。(でもGUIで使うなら、多分SourceTreeつかうだろうなあ)

2.2 Gitの設定

git configコマンドを使う。とりあえず、本の通りに設定してみる。
user nameとemailのデフォルトの設定

git config --global user.name "名前"
git config --global user.email "メール"

--grobalオプションはデフォルトの設定をするときにつける。
なんかgrobalって入力してしまう。

git config --global --list

で今までgit config --globalで設定した一覧が見れる。

git config --global color.ui "auto"

これは色の設定で、設定しておくとあとから見やすい、かも。

2.3 GitのGUI

ふーんって感じ。git-guiとかgitkとかある。Apple git-48ではコマンドがないって怒られる。brewで入れたgitなら大丈夫。
MacだとGitXなるがあるらしい。とりあえず後回し。

2.4 Gitのヘルプ

git help <command>

でマニュアルが見れるらしい。

第3章

コマンド一覧

リポジトリの作成(追跡したいディレクトリで)

git init

1つのファイルをコミット(新たなファイルを作った時でも、変更を加えた時でも同じ)

git add ファイル名
git commit -m "コミットメッセージ"

-mを指定しなければ、エディタが開かれて、コミットメッセージを入力して、保存する。
全てのファイルをコミットしたければ、以下を入力する。

git commit -a

エディタはvimがデフォルトで設定されているので、emacsに変更したければ以下を入力すれば良い。

git config --global core.editor emacs

コミットのログは以下で見れる。(過去n個のコミットのログを見たければ、-nオプションをつければ良い)

git log
git log -n

以下を入力すれば、コミットのログがそれぞれ1行で表示できる。

git log --pretty=oneline

また作業ツリーの状態は以下で確認できる。

git status

作業ツリーの状態は、ステージされてない状態と、ステージされてる状態と、コミットされた状態の3つがあるっぽい。
ステージされてない状態でgit addするとステージされてる状態になり、git commitすると、コミットされた状態になる。
コミットメッセージは複数行入力できて、

git commit -m "コミットメッセージ1" \
-m "コミットメッセージ2"

とすれば良い。
ブランチを作成/削除したいときは以下を入力する。

git branch ブランチ名 ブランチ元
git branch -d ブランチ名

ブランチを切り替えるときは以下を入力する。

git checkout ブランチ名

タグを打ちたいときは以下を入力する。(リポジトリにあるtagを確認したい時はタグ名とブランチ名を入力しなければ良い)

git tag タグ名 ブランチ名

リベースしたいときは以下を入力する。

git checkout リベース先ブランチ名
git rebase リベースしたいブランチ名

リモートリポジトリのクローンを作るためには以下を入力する。

git clone リモートリポジトリの場所

蟻本2-4

動的計画法を一旦飛ばして読み進めてる(個数制限なしナップサック問題の漸化式の変形がわからんかった)

プライオリティキュー

使い方

#include <queue>

priority_queue<int> pque; // int型のプライオリティキューpque

pque.push(num); // numをpqueにpush
pque.top() // pqueの最大値
pque.pop() // pqueの最大値をpop
pque.empty() //pqueが空ならtrue

プライオリティキューはキューの中身が(デフォルトでは)降順に並べ替えられてるだけで、操作方法(使う関数)は同じ。
中身を昇順にしたければ、宣言の部分を、

priority_queue<int, vector<int>, greater<int> > que;

とすればいいらしい。中身はリファレンス見たけどわからなかった。(vectorとgreaterがわからなかったけど省略した)
これでDijkstraが実装できるぞー(やったぜ)

Expedition(POJ2431)

全部試すとO(2^N)でまあ全探索は無理。
「ガソリンスタンドを通ると燃料缶がもらえて、なくなったところで今持ってる燃料缶を使う。使った回数は?」って言いかえた方が自分はわかりやすかった。ガソリンスタンドの場所気にしなくていいって考えは使えそう。
1番量の多い缶から補給するから貪欲法って言っていいのだろうか。補給場所に制限があったら使えなさそう(補給した次のガソリンスタンドでは補給しちゃダメとか)。
計算量は最悪は全部燃料使った時だからO(N)。
POJに通そうと思ってちょこっと修正したら、サンプルは通ったのにRuntimeErrorだった。

Fence Repair(POJ3253)

前回はO(N^2)の方法が載ってたけどプライオリティキューだとO(NlogN)でいけますね〜という話だけど、前回の時点で、O(NlogN)でソート+O(logN)で挿入がN回だからO(NlogN)でいけることに気がついてた。二分探索のリファレンス見るの面倒だったから実装してないけども。

二分探索木

ちゃんと実装するとポインタの操作がつらそう(せやろか)。やっぱりあってよかったSTL
setとかmapとか。

setの使い方

#include <set>

set<int> s; // int型のset sの宣言

s.insert(num); // numをsにinsert
s.erase(num); // numをsから削除

set<int>::iterator ite; setを探索する用のイテレータite
s.begin() // sの先頭(一番初めの一つ前)のイテレータ、最初の要素のイテレータではない
s.end() // sの末尾(一番最後の一つ後)のイテレータ、最後の要素のイテレータではない
s.find(num); // findはnumがあればnumのイテレータが、なければs.end()が帰る
s.count(num); // countはnumがあれば1が、なければ0が帰る(setは重複がないから必ず0か1になる)

勝手にソートしてくれるから二分探索木になってるそうな。

mapの使い方

#include <map>

map<int, const char*> a; // int型のキーとchar*型の値を持つmap mの宣言

m.insert(make_pair(num, "hogehoge")); // キーがnumで値がhogehogeであるpairをmにinsert
m[num]="hogehoge" // 上と同じ結果が得られる(配列風の書き方ができる)
m.erase(num); // numをmから削除

map<int, const char*>::iterator ite; mapを探索する用のイテレータite
m.begin() // mの先頭(一番初めの一つ前)のイテレータ、最初の要素のイテレータではない
m.end() // mの末尾(一番最後の一つ後)のイテレータ、最後の要素のイテレータではない
m.find(num); // findはnumがあればnumのイテレータが、なければs.end()が帰る
m.find(num)->first // numが帰る(ポインタ風の書き方ができる)
m.find(num)->second // "hogehoge"が帰る

キー付きのsetという解釈してる。

両方ともここ(C/C++ リファレンス)を参考にした。
単に二分木つくるだけだと根に一番小さい値を持ってきた場合とか、アホみたいに深くなるけど、これらは勝手にバランスとって平行二分木になってくれるらしい。やっぱりC++つよい。

Union-Find木

グループ化されたいくつかの木について、

  • 2つの数が同じグループに属するか調べる
  • 2つの数の属するグループを統合する

という2つのことが効率的にできるデータ構造らしい。
計算量はO(α)とかいうほとんどお見かけしないやつ。αはAckermannの逆関数らしい。
以前、計算量の話でちらっと見かけたことはあったけど、お初にお目にかかった。

食物連鎖(POJ1182)

最初解説読んでも意味わからんかったけど、数学的帰納法っぽく考えたらいけそうな時はいけそうってなった。
これで全通り調べられてるのにTLEしないのは驚愕っぽい。