*Scala解答例 [#p9ba346f]

[[練習問題]]

解答例は次の環境でテストしています
-Scala 2.10.2
-Java 1.7.0_21 32bit
-sbt 0.12.4
-Scala version 2.11.6
-Java(TM) SE Runtime Environment (build 1.8.0_40-b25) 64-bit
-sbt 0.13.8

ほとんどの解答例は[[ideone.com:http://ideone.com/]]でそのまま実行できます

つっこみは[[Top>/]]の避難所まで

#contents

**[[ループ練習>練習問題#eb2c4338]] [#s1c6b422]
***問1 [#ke7969de]
 object Main extends App {
   for (i <- 1 to 5) {
     println("Hello World!")
   }
 }

別解
 object Main extends App {
   (1 to 5) foreach { _ =>
     println("Hello World!")
   }
 }

***問2 [#ybb0b896]
 object Main extends App {
   val j = args(0).toInt
 
   for (i <- 1 to j) {
     println("Hello World! " + i)
   }
 }

別解
 object Main extends App {
   val j = args(0).toInt
 
   (1 to j) foreach { i =>
     println("Hello World! " + i)
   }
 }

**[[FizzBuzz>練習問題#t52e5a48]] [#ga808233]
 object Main extends App {
   def fizzBuzz(n: Int) =
     if (n % 15 == 0) {
       "FizzBuzz"
     } else if (n % 5 == 0) {
       "Buzz"
     } else if (n % 3 == 0) {
       "Fizz"
     } else {
       n.toString
     }
 
   (1 to 100).map(fizzBuzz).foreach(println)
 }

**[[素数判定>練習問題#o8db2119]] [#ldc71efe]
***判定 [#v8e35b34]
 object Main extends App {
   def prime(n: Int) =
     2 <= n && !(2 until (math.sqrt(n) + 1.0).toInt).exists(n % _ == 0)
 
   val n = args(0).toInt
 
   println(n.toString + "は" + (if (prime(n)) "素数" else "非素数"))
 }

***列挙 [#j53b2078]
 object Main extends App {
   def primes(xs: Stream[Int] = Stream.from(2)): Stream[Int] =
     xs.head #:: primes(xs.tail.filter(_ % xs.head != 0))
 
   primes() takeWhile {
     _ <= 100
   } foreach {
     println
   }
 }

**[[うるう年測定>練習問題#i0d67516]] [#xd158eb1]
 import java.util.GregorianCalendar
 
 object Main extends App {
   val cal = new GregorianCalendar()
 
   while (true) {
     print("西暦を入力してください> ")
     val y = readInt()
     if (y <= 0) sys.exit()
 
     printf("%dはうるう年%s\n", y,
       if (cal.isLeapYear(y)) "です" else "ではありません")
   }
 }

**[[転置行列>練習問題#q9f27a17]] [#o9735320]
 import scala.annotation.tailrec
 
 object Main extends App {
   type Mx = List[Array[String]]
 
   @tailrec
   def matrix(xs: Mx = Nil): Mx = {
     val sep = """\s+""".r
     val s = readLine()
     if (s.length <= 0) xs else matrix(xs :+ sep.split(s))
   }
 
   matrix().transpose.foreach(x => println(x.mkString(" ")))
 }

**[[カレンダー出力>練習問題#i5e3e061]] [#xde7305e]
-build.sbt

 name := "vipcal"
     
 version := "1.0"
     
 scalaVersion := "2.10.2"
 
 libraryDependencies ++= Seq(
     "org.scala-lang" % "scala-swing" % "2.10.2",
     "org.swinglabs.swingx" % "swingx-core" % "1.6.5-1"
 )

-Main.scala

 import scala.swing._
 import org.jdesktop.swingx.{JXDatePicker, JXMonthView}
 import java.awt.event.{ActionEvent, ActionListener}
 
 object Main extends SimpleSwingApplication {
   override lazy val top = new MainFrame with ActionListener {
     self =>
 
     val monthView = new JXMonthView()
     val datePicker = new JXDatePicker(monthView.getToday)
 
     datePicker.addActionListener(self)
 
     contents = new BoxPanel(Orientation.Vertical) {
       contents += Component.wrap(datePicker)
       contents += Component.wrap(monthView)
     }
 
     def actionPerformed(e: ActionEvent) {
       val d = datePicker.getDate
       monthView.setFirstDisplayedDay(d)
       monthView.setFlaggedDates(d)
     }
   }
 }

#ref(http://i.imgur.com/uAqI9dn.png,nolink,カレンダー)

**[[配列いじり>練習問題#w5561ad6]] [#ode26856]
 object Main extends App {
   def tailZero(xs: Array[Int]) =
     xs.head +: Array.fill(xs.tail.size){ 0 }
 
   val a = Array(3, 5, 2, 4, 2)
 
   println(a.mkString(" "))
   println(tailZero(a).mkString(" "))
 }

**[[Caesar暗号解読>練習問題#h54a0395]] [#g5a75e45]
 object Main extends App {
   val ciphertext =
     """qdq-gi.q-a ziatmxxitmdqibtqi-ustbi ri.qmoqrcxi.qbubu zir
       |-ibtqi-qp-qaai ripmymsqkir -ibtqi-qy dmxi ri.cnxuoi rruoumxakir
       |-ibtqiqzmobyqzbkii-q.qmxi -imyqzpyqzbi rixmeaki -puzmzoqai
       |-i-qscxmbu zaimzpir -i btq-iymbbq-a;iz -iatmxximzgi.q-a
       |zinqiuzimzgiemgipuao-uyuzmbqpimsmuzabir -ia. za -uzsiacotiimi.qbubu zj""".stripMargin.filter(_ != '\n')
 
   val chars = """abcdefghijklmnopqrstuvwxyz .,-"""
 
   def rot(s: String, count: Int) =
     s.splitAt(s.length - count - 1) match {
       case (a, b) => b + a
     }
 
   (1 until chars.length) map {
     i => chars.zip(rot(chars, i)).toMap
   } map {
     p => ciphertext.map(c => p.getOrElse(c, c))
   } filter(_.contains("person")) foreach {
     println
   }
 }

**[[フィボナッチ数列>練習問題#p59f794f]] [#v6061921]
 import scala.annotation.tailrec
 
 object Main extends App {
   @tailrec
   def fibs(a: Int, b: Int)(n: Int): Int =
     n match {
       case 0 => a
       case _ => fibs(b, a + b)(n - 1)
     }
   val fib = fibs(0, 1) _
 
   val n = args(0).toInt
 
   printf("%d: %d\n", n, fib(n))
 }

**[[ひらがな2文字をランダムで出力するプログラム>練習問題#s98f80e0]] [#r8373c52]
 import java.util.Random
 
 object Main extends App {
   val first = 'ぁ'.toInt
   val last = 'ん'.toInt
 
   val rnd = new Random()
 
   def randomHiragana = Array.fill(2)((first + rnd.nextInt(last - first + 1)).toChar).mkString("")
 
   for (i <- 0 until 10) {
     println(randomHiragana)
   }
 }

**[[配列から大きい要素とその添字を求めるプログラム>練習問題#u170a96a]] [#y312d087]
 object Main extends App {
   val array = Array(12, 6, 8, 3, 10, 1, 0, 9)
 
   array.zip(array.indices).sortBy(_._1).reverse.take(3) foreach {
     i => printf("%d -> %d\n",i._2, i._1)
   }
 }

**[[累乗>練習問題#x6e30de3]] [#t3a731fd]
***課題1 [#k9aa5b74]
 object Main extends App {
   def pow(a: Int, n: Int): BigInt = {
     var x = BigInt(1)
     var i = n
     while (i > 0) {
       x = x * a
       i -= 1
     }
     x
   }
 
   println(pow(2, 0))
   println(pow(2, 1))
   println(pow(2, 2))
   println(pow(2, 10))
   println(pow(2, 1024))
   println(pow(2, 1000007))
 }

***課題1(Stream版) [#r285d3c4]
 object Main extends App {
   def pow(a: Int, n: Int) = {
     val x = BigInt(a)
     Stream.fill(n)(x).product
   }
 
   println(pow(2, 0))
   println(pow(2, 1))
   println(pow(2, 2))
   println(pow(2, 10))
   println(pow(2, 1024))
   println(pow(2, 1000007))
 }

***結果 [#ef174388]
 1
 2
 4
 1024
 179769313486231590772930519078902473361797697894230657273430081157732675805
 500963132708477322407536021120113879871393357658789768814416622492847430639
 474124377767893424865485276302219601246094119453082952085005768838150682342
 462881473913110540827237163350510684586298239947245938479716304835356329624
 224137216
 126728399734987497608933422288664361609390390294880861860689870266005881386
 中略
 4810776629789295701471878694639518221425715604831630000128