ボクらのScala練習問題その4

第8章 関数

関数を定義する

String型のパラメータを1つとり、空白を区切り記号にしてパラメータを繰り返すecho関数をスクリプトで定義してください。この関数は「Hello」がパラメータの場合「Hello Hello」を返します。

def echo(str: String): Unit = {
  println(str + " " + str)
}

echo("Hello")
return文

List内にパラメータで指定した要素があるか否かを取得する関数をScalaスクリプトで定義してください。この関数はListのexistsに相当するものです。

def exi(list: List[Int], value: Int): Boolean = {
  for(num <- list){
    if(num == value) return true
  }
  false
}

if(exi(List(1, 2, 3, 4), 2)) println("yes"); else println("no")
可変長パラメータ

String型のパラメータを必要な個数とり、空白を区切り記号にして結合した文字列をコンソールに出力するoutput関数をScalaスクリプトで定義してください。

def output(str: String*): Unit = {
  var sumstring = ""
  for(s <- str){
    sumstring += s + " "
  }
  println(sumstring)
}

output("test", "get", "put")
クロージャ

REPLで、変数fに2つのIntオブジェクトの加算を行う関数を設定し、「f(5, 6)」を実行して結果として11が返されることを試してください。

val f = (left: Int, right: Int) => left + right

println(f(10, 20))
ローカル変数

パラメータで2つのIntオブジェクトをとり、加減乗除の4つの演算結果を多値で返す関数をScalaスクリプトで作成してください。この関数では、加算、減算、乗算、除算はローカル関数で計算することとします。

def calc(left: Int, right: Int): (Int, Int, Int, Int) = {
  def add(left: Int, right: Int) ={
    left + right
  }

  def take(left: Int, right: Int) = {
    left - right
  }

  def multi(left: Int, right: Int) = {
    left * right
  }

  def division(left: Int, right: Int) = {
    left / right
  }

  (add(left, right), take(left, right), multi(left, right), division(left, right))
}

val(add, take, multi, division) = calc(10, 5)

ボクらのScala練習問題その3

第6章 文字列

文字列リテラルと生文字リテラル

REPL上で、「Hello World」の文字列を文字列リテラルと生文字リテラルで記述してください。

println("Hello World")
println("""Hello World""")
エスケープ文字

REPL上で正規表現「\d\d:\d\d:\d\d」を文字リテラルと生文字リテラルで記述してください。

scala> "\\d\\d:\\d\\d:\\d\\d"
scala> """\d\d:\d\d:\d\d"""
文字の連結

REPL上で、文字列「10」「11」「12」の三つの文字列を、「:」を区切り記号にして連結してください。

scala> "10" + ":" + "11" + ":" + "12"
indexOf

REPL上で、文字列「Hello World」の「W」の字のインデックスを取得したあと、このインデックスを使用して「World」の文字を切りだして新しい文字列を生成してください。

scala> val hello = "Hello World"
scala> val i = hello.indexOf("W")
scala> hello.substring(i, hello.length)
正規表現による置換

REPL上で、正規表現を用いて「2010-05-06T10:11:12」の文字列を「2010年5月6日10時11分12秒」に置換してください。

綺麗に書く方法がわからない……。

回答例見たら結局がりがり書くしかないみたい。まあ、そりゃそうか……

scala> val regex = """(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)""".r
regex: scala.util.matching.Regex = (\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)

scala> val regex(year, month, day, hour, minute, second) = "2010-05-06T10:11:12"
year: String = 2010
month: String = 05
day: String = 06
hour: String = 10
minute: String = 11
second: String = 12

scala> format("%d年%d月%d日%d時%d分%d秒", year.toInt, month.toInt, day.toInt, hour.toInt, minute.toInt, second.toInt)
201056101112
format

REPL上で、Stringのformatメソッドを用いて、文字列「10」「11」「12」の3つの文字列を、「:」を区切り記号にして連結してください。

"%s:%s:%s".format("10", "11", "12")

第7章 コレクション

List

REPL上で、Intオブジェクト「1」「2」「3」「4」「5」を格納するListオブジェクトをREPL上で生成してください。

val list = List(1, 2, 3, 4, 5)
Listの長さ

練習問題「List」で生成したListオブジェクトが変数listに格納されているとします。
REPL上で、listの長さを取得してください。

list.length
Listの要素の取り出し

練習問題「List」で生成したListオブジェクトが変数listに格納されているとします。
REPL上で、listの2番目の要素を取得してください。

list(1)
Listに対する繰り返し処理

練習問題「List」で生成したListオブジェクトが変数listに格納されているとします。
REPL上で、Listの各要素に10を足した値をprintln関数でコンソールに表示してください。

for(num <- list){
  println(num + 10)
}
Array

REPL上で、Intオブジェクト「1」「2」「3」「4」「5」を格納するArrayオブジェクトを生成してください。

val ary = Array(1, 2, 3, 4, 5)
ListBuffer

REPL上で、Intオブジェクト「1」「2」「3」「4」「5」をListBufferオブジェクトに順に格納したあとにListオブジェクトを生成してください。

scala> import scala.collection.mutable.ListBuffer
scala> val listB = ListBuffer(1, 2, 3, 4, 5)
scala> listB.toList
ArrayBuffer

REPL上で、Intオブジェクト「1」「2」「3」「4」「5」をArrayBufferオブジェクトに順に格納したあとにArrayオブジェクトを生成してください。

scala> import scala.collection.mutable.ArrayBuffer
scala> val aryB = ArrayBuffer(1, 2, 3, 4, 5)
scala> aryB.toArray
不変Map

REPL上で、キー1が"one"、キー2の値が"tow"、キー3の値が"three"というデータをもつ不変Mapを生成して、キー2の値を取得してください。

val map = Map(1 -> "one", 2 -> "tow", 3 -> "three")
map(2)
可変Map

REPL上で、キー1が"one"、キー2の値が"tow"、キー3の値が"three"というデータをもつ可変Mapを生成して、キー2の値を取得してください。

import scala.collection.mutable
val numbers = mutable.Map[Int, String]()
numbers ++= List(1 -> "one", 2 -> "tow", 3 -> "three")
numbers(2)
不変Set

REPL上で、キー1が"one"、キー2の値が"tow"、キー3の値が"three"というデータをもつ不変Setを生成して、キー2の値を取得してください。

val set = Set(1, 2, 3, 4, 5)
set(2)
可変Set

REPL上で、キー1が"one"、キー2の値が"tow"、キー3の値が"three"というデータをもつ可変Setを生成して、キー2の値を取得してください。

import scala.collection.mutable
val numbers = mutable.Set[Int]()
numbers ++= List(1, 2, 3, 4, 5)
numbers(2)

ボクらのScala練習問題その2

第5章 制御構文

while文

REPL上で、while文を使って1から10までの数値をコンソールに出力してください。

var x = 1
while(x <= 10){
  println(x)
  x += 1
}
for〜yield

引数で渡された文字列をfor文で1つずつコンソールに出力するScalaスクリプトを作ってください。

val strings = args
for(str <- strings){
  println(str)
}
if文

引数で渡された文字列の長さを取得して5以上なら「Large」、5未満なら「Small」とコンソールに出力するScalaスクリプトを作ってください。文字列の長さはStringクラスのlengthメソッドで取得できます。

val i = args(0).length
if(i >= 5){
  println("Large")
} else {
  println("Small")
}
match文

引数で渡された文字列が「Jan」、「Feb」、「Mar」であればそれぞれ「1」、「2」、「3」を、それ以外の場合は「Unknown」をコンソールに出力するScalaスクリプトを作ってください。

val str = args(0)
val num = str match {
  case "Jan" => 1
  case "Feb" => 2
  case "Mar" => 3
  case _ => "Unknown"
}
println(num)
<||

***match文
>>
引数で渡された文字列が「Jan」、「Feb」、「Mar」であればそれぞれ「1」、「2」、「3」を、それ以外の場合は「Unknown」の文字列を返す関数を作ってください。練習問題「match文」で作成したScalaスクリプトをこの関数を使用するように改修してください
<<
>|scala|
def month(str: String): String = {
  str match {
    case "Jan" => "1"
    case "Feb" => "2"
    case "Mar" => "3"
    case _ => "Unknown"
  }
}

val str = args(0)
println(month(str))
try/catch/finally

引数で指定されたファイルの内容をコンソールに出力するScalaスクリプトを作ってください。このスクリプトではtry/catch/finallyを用いてリソースの開放を正しく行います。ファイルの入力にはjava.io.FileReaderを用います。

import java.io.{BufferedReader, FileReader}

val str = args(0)
val in: BufferedReader = null
try {
  in = new BufferedReader(new FileReader(str))
  val line = in.readLine()
  for(str <- line){
    println(str)
  }
} catch {
  case _ => println("io error")
} finally {
  if(in != null){
    in.close()
  }
}

MacBook Air 11インチ欲しい!
iPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたいiPhoneアプリが作りたい

自炊で数十冊取り込んだ経験から「自炊の森」について一言

店内の漫画を「自炊」するレンタルスペースが仮オープン、裁断済み書籍を提供、ネット上は懸念の声多数

自炊って、慣れないうちはかなりの確率で失敗するし、修復できなくなるよ?

紙だって一回とり込むごとにかなり劣化するし。

満足できるスキャニングが出来る人なんて、同じ本を使うなら2人くらいが限度だと思う。

今年読んだ本ベスト3

今年もあとわずか。色々と一年間の出来事を振り返る時期がまいりました。

今年もジャンル問わず思いつくままに乱読を重ねましたが、そのなかで特に面白かったベスト3をご紹介します。

鋼の錬金術師27巻

堂々完結!

いやーもう、面白かった。

余計な感想はパス。ただただ面白いので、シリーズ未読の方はぜひ1巻からどうぞ。

群れのルール 群衆の叡智を賢く活用する方法

最小限のルールで最大限の現象を

虫や鳥など群れを成す生きものたちが、どのようなメカニズムによって群れを作るのか、またその群れによって得ているものはなんなのかを示した本。

自然界に存在する群れは急な環境変化や不確実な状況に対応するためシンプルかつ柔軟なシステムとして本能に刻み込まれている。人間が頭を捻っても思いつかない答えを、賢いとも思えないようなアリや蜂たちが解けるのはなぜなのか? そこから、人間は何を学ぶことができるのか?

どのトピックも刺激に満ちていて、読みながら興奮して鼻息でまくってました。

ゲームデザイン

同じものを見て・聞いても、この人の考えに辿りつけない

"俺の屍を越えてゆけ"など独創的なゲームをデザインした桝田省治さんのゲームデザイン論、というよりは発想法の本。

参考になるというよりは、ただこの人自身が面白くてついつい読み返してしまう。不思議な本。

iPhoneアプリ電子書籍としても販売されています。ちなみに両方買いました。デバイスが変わっても面白さは変わらない。

Schemeはじめました

自分の中で関数型言語をちゃんと理解したいという欲求がムラムラと湧いてきて止まらないので、卒研の合間に息抜きとしてSchemeの勉強を始めることにしました。

下準備

処理系のインストール

WindowsSchemeの勉強を始めるのに便利なのはこちら。

Racket

昔はMzSchemeって名前だったのですが、気がついたらRacketって名前に変わってました。イメチェン?

Windows向けのインストーラを落としてインストールし、.exeなどのファイルが入っているディレクトリへパスを通します。

Emacsでの準備

EmacsにはSchemeの編集モードscheme-modeがデフォルトで入っているので、.emacsに必要事項を書けばOKです。

(setq scheme-program-name "mzscheme.exe")
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)
(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)

 ; C-c s で emacs 上で MzScheme が走るようにする
(add-hook 'scheme-mode-hook
         (lambda ()
	   (define-key global-map "\C-cs" 'run-scheme)))

一行目は利用したい処理系の名前を書けばOK。(ex. Gauche なら"gosh -i")

これで準備は完了。

参考資料

現在これを見ながらちょっとづつ進めています。

もうひとつの Scheme 入門

これが終わったらScheme手習いを購入してみようかと。「再帰」、というものが自分の中にまだ回路として成立していないので、一度ガッツリ学習してみようと思います。