はじめに
@Nemesis さんのJavaで湯婆婆を実装してみるという記事から話題になっている湯婆婆の実装をやってみたくなりました。自分が書ける言語でまだ実装されてなさそうな言語ないかなぁと探してみたところ、R言語による実装の記事はまだ出ていなさそう(もし出している方いたらすみません、私の調査不足です。)でしたので、やってみました。
コード
print("契約書だよ。そこに名前を書きな。")
name <- readline("名前: ")
print(paste("フン。", name, "というのかい。贅沢な名だねぇ。"))
rand = sample(1:nchar(name), 1)
newName = substring(name, rand, rand)
print(paste("今からお前の名前は", newName, "だ。いいかい、", newName, "だよ。分かったら返事をするんだ、", newName, "!!"))
コードの解説
契約書を渡す
print("契約書だよ。そこに名前を書きな。")
print関数を使うと出力ができます。
名前の入力
name <- readline("名前: ")
readline関数を使うと入力を行えます。入力で受け取った名前をnameという関数に入れます。
名前の確認
print(paste("フン。", name, "というのかい。贅沢な名だねぇ。"))
Rではpaste関数を使って文字列の結合ができます。
新しい名前を決める
rand = sample(1:nchar(name), 1)
newName = substring(name, rand, rand)
nchar関数を使うと文字列の長さを取得できます。
n:mとやるとnからmまで交差が1の等差数列を得ることができます。
sample(ベクトル, m)でベクトルから長さmの部分ベクトルが得られます。
substring(文字列, begin, last)で文字列からbegin番目からlast番目を部分文字列として取り出せます。今回はsubstring(name, rand, rand)でrand番目だけを取り出しています。
新しい名前を伝える
print(paste("今からお前の名前は", newName, "だ。いいかい、", newName, "だよ。分かったら返事をするんだ、", newName, "!!"))
名前の確認のところと大体同じです。
まとめ
湯婆婆をR言語を使って実装しました。知らなかった関数や忘れていた関数を思い出せる非常に良い試みでした。
参考
入力について
R-Tips 36.落穂ひろい http://cse.naro.affrc.go.jp/takezawa/r-tips/r/36.html
文字列操作関係
R-tips 17.文字列を操作する http://cse.naro.affrc.go.jp/takezawa/r-tips/r/17.html
hiratake55 の作業メモ R で文字列の長さを調べる http://hiratake55.hatenadiary.jp/entry/2016/08/31/R_で文字列の長さを調べる
乱数生成関係
竹中明夫 おまけ:さまざまなデータ列の生成 http://takenaka-akio.org/doc/r_auto/series.html
R-tips 60.確率分布と乱数 http://cse.naro.affrc.go.jp/takezawa/r-tips/r/60.html