金魚亭日常

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

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

AtCoder ABC #068 / ARC #079

C問題

1から出てる船 と Nに向かう船 を別々に配列に保存しておいて, Nに向かう船それぞれの始点について,1から出てる船の終点と一致するものがあれば “POSSIBLE",なければ"IMPOSSIBLE”

D問題,E問題

DとEはセット.

Dは解説放送見てEditorial読んだら解けた.

Eは解説放送見てもよくわからない,というか実装できなくて,しかもEditorialの日本語と英語で解法が違っているような(英語の方は解説放送と同じ). 日本語の方が実装しやすかったので,そちらで解いた.

AtCoder ABC #068 / ARC #079

AtCoder Chokudai Speed Run #001

AtCoder の新しいウェブサイトのテストとして開催されたコンテスト.

12問 速解き.

A 最大値

数列の最大値を出力

max()

B 和

数列の和を出力

sum()

C カンマ区切り

数列をカンマ区切りで出力

join()

D ソート

数列をソートして半角スペース区切りで出力

sort(), join()

E 1は何番目?

index()

F 見える数

「数列 a に含まれる整数のうち、1≤j<i≤N を満たす任意の j において、 aj<ai を満たすような i がいくつあるか出力しなさい。」という問題.

0番目は必ず条件を満たすので,まず一つ.

あとは,数列を1からn-1まで順番に見ていって,自分より左の最大値より大きいかを判定する.

G あまり

読み込んだ数列を連結した数値を 1,000,000,007 で割る.

H LIS

数列から好きなだけ要素を取り除いて単調増加数列を作る時の,最大の長さを求める.

二分探索する.

I 和がNの区間

連続区間の和がNになるものの数.

左から順番に和を求めて行って,和がNを超えたら次に行く.

J 転倒数

バブルソートの交換回数.

転倒数,と来たら,BinaryIndexedTree (BIT) , とアリ本にも書いてあるのだけど,このスライドがわかりやすかった.

www.slideshare.net

K 辞書順で何番目?

こういう操作で数えられるが,よく見ると BIT が使える.

f:id:what_alnk:20170730140441p:plain

L辞書順で何番目?

N回交換してソートできるか.

なので,J 問題と同じくバブルソートの交換回数を求めて,Nと比較する.

これ,Nの方が多い場合,同じやつの交換を繰り返せばいいので,差が偶数かどうかで判定できることはわかるけど,Nの方が少ない場合はこれでいいのだろうか,と思った.

AtCoder Chokudai Speed Run #001

R の .Renviron の ${R_HOME}

これの話

etc/Rcmd_environ をコピーして .Renviron を作る場合,

R_SHARE_DIR=${R_HOME}/share

と書かれているが,この ${R_HOME} は何になっているのか,という話.

Rを起動した後に Sys.getenv() して確かめてみると,

C:/R/R-3.3.2

といったRのインストーディレクトリになっているが,.Renviron を解釈する段階では,

C:\R\R-3.3.2

になっているらしくて,

R_SHARE_DIR=${R_HOME}/share

R_SHARE_DIR=C:RR-3.3.2/share

になってしまうらしい.

これが起こるのは,R.exe だけで,RStudioでは起こらない.

レジストリHKEY_LOCAL_MACHINE\SOFTWARE\R-core\R\3.3.2\InstallPath (32bitの場合)を / 区切りにするとこの問題は起こらないらしいので,R_HOMEの値はもともとこのレジストリの値から来ているらしい.

回避策としては,R_HOME の値を .Renviron/区切りで書けばよい.

Go の ファイルから読み込んだ Unicode コードポイント文字列の Unquote

これの話

str := "\u3053\u3093\u306b\u3061\u306f\uff0c\u4e16\u754c\uff01"
fmt.Println(str)
// こんにちは,世界!

だが,

str := `\u3053\u3093\u306b\u3061\u306f\uff0c\u4e16\u754c\uff01`
fmt.Println(str)
// \u3053\u3093\u306b\u3061\u306f\uff0c\u4e16\u754c\uff01

なので,ダブルクオートで囲ってから,strconv.Unquote() を使うと,

str := `\u3053\u3093\u306b\u3061\u306f\uff0c\u4e16\u754c\uff01`
unquoted, _ := strconv.Unquote(`"` + str + `"`)
fmt.Println(str)
// こんにちは,世界!

となる.

ファイルから読む場合,

f, _ := ioutil.ReadFile("text.txt")
str := strings.TrimRight(string(f), "\n")
unquoted, _ := strconv.Unquote(`"` + str + `"`)

という順番.

StringIO 的にやるには,

f := bytes.NewBufferString(`\u3053\u3093\u306b\u3061\u306f\uff0c\u4e16\u754c\uff01`).Bytes()
str := strings.TrimRight(string(f), "\n")
unquoted, _ := strconv.Unquote(`"` + str + `"`)

でいいと思われる.

Windows に Rails をインストールする

環境は,

  • Windows 10 Pro 1703 build 15063.483
  • Ruby 2.4.1 (RubyInstaller 2.4.1-2 x64)
  • MSYS2

Ruby 2.4 をインストール

まず,RubyInstaller で Ruby 2.4.1 をインストール.

といっても,以前に Ruby 2.4.0-8 をインストールしていたので,それを最新版にする.

アンインストールは必要なくて,Ruby 2.4.1-2 (x64) のインストーラを実行すると,上書きインストールされた.

MSYS2 は別途インストールしてあるので,最後のチェックは外す. なお,MSYS2の再設定は必要なかった.

また,インストールしてあった gem もそのままだった.

>ridk version
---
ruby:
  path: C:/Ruby/Ruby24-x64
  version: 2.4.1
  platform: x64-mingw32
ruby_installer:
  package_version: 2.4.1-2
  git_commit: a2667ee
msys2:
  path: c:\msys64
  title: MSYS2 64bit
  version: '20161025'
cc: x86_64-w64-mingw32-gcc (Rev2, Built by MSYS2 project) 6.3.0
sh: GNU bash, version 4.3.46(2)-release (x86_64-pc-msys)

Rails をインストール

Bundler を使う

  • Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

gem "rails"

インストール

>bundle install --path vendor/bundle

...

>bundle exec rails -v
Rails 5.1.2

インストール後の確認

無事にエラーもなくインストールされたので,以下の記事を参考にインストール後の確認する.

RubyInstaller2でWindows環境にRuby 2.4 + Rails 5.0.2をインストールする

rails newすると,bundle install が実行されてシステム全体の方にインストールされてしまうので,ここ を参考にして,

> mkdir rails-sandbox
> copy Gemfile rails-sandbox
> cd rails-sandbox
> bundle install --path vendor/bundle
> bundle exec rails new .
> bundle exec rails s

http://localhost:3000 にアクセスして確認

Screen Shot 2017-07-22 at 23.48.47-fullpage.png

scaffold画面の作成

>bundle exec rails g scaffold Blog title content:text
>bundle exec rails db:migrate
>bundle exec rails s

http://localhost:3000/blogs にアクセスして確認すると,

ActionView::Template::Error (TypeError: オブジェクトでサポートされていないプロパティまたは
メソッドです。):
    4:     <title>RailsSandbox</title>
    5:     <%= csrf_meta_tags %>
    6:
    7:     <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track'
: 'reload' %>
    8:     <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
    9:   </head>
   10:

というエラーが出たが,これはNode.js がインストールされてないかららしいので,インストール.

>node -v
v6.11.1

>npm -v
3.10.10

インストールしたら,コマンドプロンプトを再度起動し,

>bundle exec rails s

http://localhost:3000/blogs にアクセスして確認

Screen Shot 2017-07-22 at 23.56.18-fullpage.png

Screen Shot 2017-07-22 at 23.56.42-fullpage.png

Screen Shot 2017-07-22 at 23.56.51-fullpage.png

その他

irb

日本語の入力は普通にできた

rails console

以下のエラーで起動しなかったが,

C:/Ruby/Ruby24-x64/lib/ruby/site_ruby/rbreadline.rb:6135:in `delete': invalid byte sequence in UTF-8 (ArgumentError)

~/.irbrc に元からあった

require 'irb/ext/save-history'
require 'irb/completion'

IRB.conf[:SAVE_HISTORY] = 200

コメントアウトすると起動した.

Issue に挙がっているからそのうちなおるかもしれない(Pull request もある)

Invalid byte sequence in UTF-8 when running console

日本語の入力に関しては,

IRB.conf[:USE_READLINE] = false

.irbrc に書いても書かなくても,

irb(main):001:0> puts "あ"
あ
=> nil
irb(main):002:0> s = "あ"
=> "\x{82A0}"

という結果だった