金魚亭日常

読書,ガジェット,競技プログラミング

上海・蘇州 3泊4日

行ったとこ

1日目

  • 外灘観光

2日目

  • 蘇州に移動
  • 遊覧船
  • 山塘街

3日目

  • 上海に移動
  • 天山茶城

4日目

  • 田子坊

移動

浦東空港から上海に入った.

吉祥航空. ちなみに機内でスマホいじってると電源を切るように言われた.

空港から市内へは,地下鉄で1時間ぐらいだったが,せっかくなのでリニアに乗った. リニアは片道50元で,プラス5元出せば一日乗車券付きのものが買える.

市内の移動はほぼ地下鉄.

バスにも一度乗った. 冷房ありだと2元でなしだと1元らしい. 乗るときに払う.

タクシーは安いので,4人いると地下鉄よりもこちらの方が安いかも.

上海から蘇州は新幹線. 新幹線は日本のものとほぼ同じ. 切符を買う時はパスポートが必要.

レンタサイクルが流行っていたが,QRコード決済なので旅行者は使うのは難しいと思う.

SIM

ASUS の8インチタブレットIIJの海外トラベルSIMを緊急用に入れておいた. iPhoneSIMロックは解除しておいたが,結局現地のSIMは買わなかった. いざとなったら,ドコモの海外ローミングが一日980円で無制限キャンペーン中だったのでそれを使うつもりだった.

地図

百度地図で訪れる予定のエリアをダウンロードしておいた. GPSで現在位置は取れる. 番地が結構しっかり書いてあるので,道に迷うことはほぼなかった.

乗り換えを調べたい時は,SIMを入れてあるタブレットを使った.

インターネット

VPNGate のVPNを使っていたので,特に困ることはなかった. 事前にミラーサイトのURLの配信サービスに登録しておいたが,IIJの海外トラベルSIMは特に制限はかかっていなかったので取り越し苦労だった.

余談だが,XPS13 は宿のWi-Fiに繋いだ瞬間にブルースクリーンになったので使えなかった.

お金

空港で2万円両替して,1100元. さらにクレジットカードで400元引き出した.

ATMは地下鉄の駅に大体ある. ATMによって一度に引き出せる上限が100元のところがあって,連続で引き出せば100元以上引き出せるが,手数料はその都度かかる. レートは空港とATMとでほぼ同じだった.

食事は 30から50元ぐらい.

その他

  • 飲み物は外で買って持ち込むことが多かった
  • 宿のトイレは流すと詰まるのでゴミ箱に捨ててた

AtCoder ARC #080 E Young Maids [Rust]

勉強のために Rust にも移植. 150 ms.

慣れていなくて全然コンパイルが通らないんだけど,エラーメッセージに従ってなおして行くと通るようになって楽しい,みたいな感じになってくる.

ここは mut でしょ,って書いてたら mut じゃなくてよくね,って言われてほんまかいなと思って mut を外したら同じように動いていて,とにかく親切だった.

Go で書いた時はポインタ周りでハマってうまく動かない時があったんだけど,Rust だとそういうことは起こらなさそう.

AtCoder ARC #080 E

AtCoder ARC #080 E Young Maids

Python で解いてTLEだったので,Go に移植.

最初,通ったものの1600 ms とぶっちぎりで遅かったので,

qiita.com

を見てプロファイリングしてみたら,どうやら読むとこと書くとこが遅いっぽかったので,

最後に書き出すところを strings.Join() してから fmt.Println() 一回でやるようにして 1100 ms, 標準入力から読むところを,fmt.Scan() で読んでいたのを,

qiita.com

を参考にして bufioReadLine() でやるようにして,最終的に250 ms ぐらいになった.

あまり Buffer size を大きくしすぎるとMLEになるので程よいサイズで.

AtCoder ARC #080 E

VSCode の Integrated Terminal における 設定ファイルの読み込み順序(MacOS,Z shell)

VSCode の Integrated Terminal の PATH が重複があったり順番が変なことになっていたりして,色々調べた.

iTerm の場合,自分が設定を書いているファイルでは,

  1. ~/.zshenv
  2. /usr/libexec/path_helper 実行
    • PATH の 重複削除,システムのPATHが含まれている場合は削除
    • システムのPATHの後ろに削除後のユーザーPATHを追記
  3. .profile
  4. .zshrc

で PATH ができるが,VSCode の Integrated Terminal の場合,これがもう一周実行されているみたいだ. つまり,(4) まで実行された後のPATHに対して,(1) から (4) までがもう一度行われる.

とりあえず,~/.zshenv には pyenv の設定しか書いていなかったので,これを ~/.zshrc に移動したが,まだおかしいのでなんとかしたい.

参考

qiita.com

takuya-1st.hatenablog.jp

qiita.com

AtCoder ARC #080 / ABC #069

C問題にはまってしまって,時間がかかりすぎた.

Dは簡単だったので,先に解けばよかった.

1201 -> 1183

C

2を0,1,2個含むものに分けて数える.

解説見ると,難しく考えていたみたいだ.

D

順番に出力すれば終わり. 端に行ったら折り返す.

「うなぎ」って言うらしい.


2017-08-08 update

E

Segment Tree と Priority Queue を使う.

Python で解いたがTLEだった. 試しにPyPy で提出して見たらちょっと通るのが増えたが,依然としてTLE.

2つの要素を比べるのなら min より if で書いた方が速いみたいだ.

AtCoder ARC #080 / ABC #069

2017年7月に読んだ本

リライト,リビジョン,リアクト,リライブ

本屋でたまたま見つけた,タイムリープものの4部作. リライト読んで,よくわからんとか思ったけど,全部読んだ今となってはリライトが一番わかりやすかった.

青白く輝く月を見たか?

Wシリーズ最新作

引きこもりの人工知能が出てくる.

know

正解するカド,を観た流れで. 予想以上に京都が舞台だった.

正解するカド,9話ぐらいで感想が大荒れだったけど,最後まで我慢してみれば,あれでよかったのではないかと思えた.

もののがたり 6

ここで終わっちゃったか,という感じなので,早く次が読みたい.

みみずくは黄昏に飛びたつ

結構面白いこと質問していてよかった.

憑物語恋物語

アニメ見てから読んでるので,やや冗長に感じることが多い.

貝木泥舟 はいいやつだと思う.

期間 : 2017年07月
読了数 : 10 冊
リライブ (ハヤカワ文庫JA)
法条遥 / 早川書房 (2015-03-20)
リアクト (ハヤカワ文庫JA)
法条 遥 / 早川書房 (2014-04-24)
リビジョン (ハヤカワ文庫JA)
法条 遥 / 早川書房 (2013-07-24)
know (ハヤカワ文庫JA)
野崎 まど / 早川書房 (2013-07-24)
リライト (ハヤカワ文庫JA)
法条 遥 / 早川書房 (2013-07-24)
青白く輝く月を見たか? Did the Moon Shed a Pale Light? (講談社タイガ)
森 博嗣 / 講談社 (2017-06-21)
もののがたり 6 (ヤングジャンプコミックス)
オニグンソウ / 集英社 (2017-06-19)
憑物語
西尾 維新 / 講談社 (2012-09-27)
恋物語 (講談社BOX)
西尾 維新 / 講談社 (2011-12-21)
みみずくは黄昏に飛びたつ
川上 未映子 , 村上 春樹 / 新潮社 (2017-04-27)

Rust で競プロ: 標準入力読み込み

まだ何がベストかわからないのだけど,とりあえず現状は,

N M

みたいに整数のペアが空白区切りで与えられた場合,

use std::io;
use std::str::FromStr;

fn main() {
    let stdin = io::stdin();
    let mut buf = String::new();
    stdin.read_line(&mut buf).ok();
    let mut it = buf.split_whitespace().map(|n| usize::from_str(n).unwrap());
    let (n, m) = (it.next().unwrap(), it.next().unwrap());
    println!("N: {}, M: {}", n, m);
}

のように読み込んでいる.

let stdin = io::stdin();
let mut buf = String::new();
stdin.read_line(&mut buf).ok();

で標準入力から1行読み込み,

let mut it = buf.split_whitespace().map(|n| usize::from_str(n).unwrap());

で空白で区切って,usize に変換し,

let (n, m) = (it.next().unwrap(), it.next().unwrap());

で変数に入れている.

usize にしているのは,あとでベクタを宣言するときの要素数に使いたいのでとりあえず.

空白で区切ったあとにイテレータにしているのは,it[0] とかでインデックスを考えるのがめんどくさいので. it.next() でとれた方が楽な気がする.

なので,数値のペアではなく a1 a2 ... an みたいな数列が与えられた場合は,

let v: Vec<i64> = buf.split_whitespace()
    .map(|n| i64::from_str(n).unwrap())
    .collect();

という感じにする.

とりあえず AtCoder の問題をいくつか解いてみた.

AtCoder ABC #067 Rust

AtCoder ABC #061 Rust