なんとな~くしあわせ?の日記

ClojureとかAWSの設定とかをメモする技術ブログ

paizaオンラインハッカソン7 にScalaで挑戦

恋愛SLG: プログラミングで彼女をつくる|paizaオンラインハッカソン7

paiza.jp

見てるだけで悲しくなる題名ですが、そういうのにあえて挑戦するのが私です。あー彼女欲しい。

この先答え↓

「つり目セット」の問題

簡単。

object Main {
    def main(args: Array[String]) = {
        val input = scala.io.Source.stdin
        val lines: Seq[String] = input.getLines.toSeq
        val num: Int = Integer.parseInt(lines(0))
        for (i <- 1 to num) {
            print("Ann")
        }
    }
}
「眼帯」の問題

ScalaではListの差集合がとれるので、せっかくだし使いましょう。実務で使うこと無いし…

object Main {
  // N
  // M1
  // x_1 x_2 ... x_M1
  // M2
  // y_1 y_2 ... y_M2
  def main(args: Array[String]) = {
    val input = scala.io.Source.stdin
    val lines: Seq[String] = input.getLines.toSeq

    // N は、ある本の出版されている巻の総数です。
    // 出版されているのは、1 巻から始まり、N 巻までです。
    val N: Int = Integer.parseInt(lines(0))
    // M1 は、あなたの持っている巻の総数を表します。
    val M1: Int = Integer.parseInt(lines(1))
    // 次の行には、あなたの持っている巻のリストが与えられます。
    val x: List[Int] = lines(2).split(" ").map { line => Integer.parseInt(line.trim) }.toList
    // M2 は、中古本屋で売られている巻のリストの総数を表します。
    val M2: Int = Integer.parseInt(lines(3))
    // 次の行には、中古本屋で売られている巻のリストが与えられます。
    val y: List[Int] = lines(4).split(" ").map { line => Integer.parseInt(line.trim) }.toList

    if (N == M1) {
      println("None")
    } else {
      val result: List[Int] = (y diff x).sorted // ここでソートしないとテストに通らない
      if (result.isEmpty) {
        println("None")
      } else {
        println(result.mkString(" "))
      }
    }
  }
}
「ショートヘアセット」の問題
object Main {
  // a
  // b
  def main(args: Array[String]) = {
    val input = scala.io.Source.stdin
    val lines: Seq[String] = input.getLines.toSeq
    val a = Integer.parseInt(lines(0))
    val b = Integer.parseInt(lines(1))
    println(a+b)
  }
}
「ロングヘアセット」の問題

ScalaではCollectionに関数を渡してなんやらかんやらできるので使いましょう。高階関数です。

object Main {
  // yes
  // no
  def main(args: Array[String]) = {
    val input = scala.io.Source.stdin
    val lines: Seq[String] = input.getLines.toSeq
    val yes: Int = lines.count(e => e == "yes")
    val no: Int = lines.count(e => e == "no")
    
    if (yes > no) {
      println("yes")
    } else {
      println("no")
    }
  }
}
「ポニーテールセット」の問題

Scalaのfor文は若干特殊ですが、このようなこともできます

object Main {
  // n
  def main(args: Array[String]) = {
    val input = scala.io.Source.stdin
    val lines: Seq[String] = input.getLines.toSeq

    val n = Integer.parseInt(lines(0))
    for (i <- n to 0 by -1) {
      if (i==0) {
        println("0!!")
      } else {
        println(i)
      }
    }
  }
}
ツインテールセット」の問題

Scalaの除算はInt型、それに注意する Scala: Int同士の割り算は、Intが戻り値なので注意 - Qiita
・関数内に関数を書くよ

object Main {
  // c_1 p_1
  // c_2 p_2
  def main(args: Array[String]) = {
    val input = scala.io.Source.stdin
    val lines: Seq[String] = input.getLines.toSeq

    def drink(line: String): Float = {
      val c: Int = Integer.parseInt(line.split(" ")(0))
      val p: Int = Integer.parseInt(line.split(" ")(1))
      val f: Float = if (p != 0) { c.toFloat / p.toFloat } else { 0 }
      f
    }

    val drink1: Float = drink(lines(0))
    val drink2: Float = drink(lines(1))

    if (drink1 > drink2) {
      println("1")
    } else {
      println("2")
    }
  }
}
「セーラー服セット」の問題

・これなどは一行で書けたりします、head/tail/init/lastは使い勝手が良いです(ちなみにHaskell由来)

object Main {
  // n
  // s_1
  // s_2
  // ...
  // s_n
  def main(args: Array[String]) = {
    val input = scala.io.Source.stdin
    val lines: Seq[String] = input.getLines.toSeq
    println(lines.tail.mkString("_"))
  }
}
「カーディガン」の問題

・なかなか使いドコロのないfoldLeftを使ってみたかった Scalaでリスト処理

object Main {
  // n
  def main(args: Array[String]) = {
    val input = scala.io.Source.stdin
    val lines: Seq[String] = input.getLines.toSeq
    println(
      (1 to Integer.parseInt(lines(0))).toList.foldLeft(1)(_ * _)
    )
  }
}
「縞ニーソセット」の問題

・飽きてきた上に結構めんどくさかったので適当に解いてしまった

object Main {
  // n - 幅
  // m - 全体
  // RRRWWWRRRW
  def main(args: Array[String]) = {
    val input = scala.io.Source.stdin
    val lines: Seq[String] = input.getLines.toSeq
    val n = Integer.parseInt(lines(0))
    val m = Integer.parseInt(lines(1))
    val size = m / n
    
    for (i <- 1 to size) {
      if (i%2 != 0) {
        (1 to n).toList.foreach { _ => print("R") }
      } else {
        (1 to n).toList.foreach { _ => print("W") }
      }
    }
    val rest = m - n * size
    if (rest > 0) {
      val l = if (size % 2 != 0) "W" else "R"
      (1 to rest).foreach { _ => print(l) }
    }
  }
}

残りは明日?(最後のやつは結構難しそう)

「」の問題

「」の問題

「」の問題