ルーズリーフ

公私におよぶ経験値獲得履歴的ななにか。

POH6京子ちゃん問題をScalaで解いた

最近プログラミングさせてもらえてないので憂さ晴らしに、
同僚に教えてもらった問題に挑戦。

POH6「女子高生プログラマーの大バトル〜コボール文明の逆襲〜」

paiza.jp

Scala使ったとはいえ・・・・激しく残念な使い方をしてます。
本当はかっこいいScalaコードには程遠いけど、

なんだ実はScalaってこんなもんか!全然怖くないじゃん!

って思ってもらえればいいやと開き直って、最近ブログ書いてないし晒しておきます。

マサカリは歓迎します、むしろ待ってます。
社内で自分が書いたScalaコードのレビューってしてもらったことないせいかなかなか進歩がない...

import scala.collection.mutable.ListBuffer

object Main extends App {
  val sc = new java.util.Scanner(System.in)
  
  val n = sc.nextInt
  val nList = List.fill(n)(sc.nextInt)
  val m = sc.nextInt
  val mList = List.fill(m)(sc.nextInt)

  val goal = ListBuffer.empty[Int];
  val tp = ListBuffer.empty[Int];

  def last(elm :Int, pre :Int) :Int = {
    if (elm == 0) -1 // End
    else {
      val now = elm + pre
      val ni = now - 1
      now match {
        case x if x == n => x // Goal
        case x if x > n | x < 1 => -1 // Over
        case x if tp.contains(x) => -1 // Loop
        case x => tp += x; last(nList(ni), x) // Next
      }
    }
  }

  mList.foreach { elm =>
    tp.clear()
    if (goal.contains(elm)) println("Yes")
    else {
      last(elm, 1) match {
        case x if x == n => goal += elm; println("Yes")
        case _ => println("No")
      }
    }
  }
}

色々詰まったり迷った部分

  • 場所をインデックスで持つか何マス目で持つか、迷ったあげく「何マス目」かで持ちまわることに

  • テストでタイムアウトが出てしまい、一度計算してゴールできることがわかっている結果は goal に入れることに

    • ついでにダメって判明した数字も別のリストに入れておけばよかったなと今更反省
  • 移動が無限ループしてしまうのを避けるために、一度通ったマスは tp に入れることに

    • ここに気付くのに時間かかったあげくclearしなきゃいけないとかカッコ悪い泣きたい

そもそも if-else と match を入れ子にするとかイヤだ吐きそう・・・・。
相変わらず、関数型の強みを理解しきれていないせいで、カッコいい書き方思いつかない。
カッコよく書くとどうなるのか知りたいので、ぜひ模範解答ください!!!

とまあ泣き言も書きましたが、別にこの程度でも「Scalaつかったよ!」って言えるのがScalaの凄いところでもあります。
ほんと、とりあえず書いてみればいいんじゃないかな!!w

もうちょっとカッコよくかけたらまた更新!
その時は変数名ももう少し考えてあげます...w

2015年版:読んだ本読みたい本

読んだ本

技術書系

  • リーダブルコード
    • 心構えとして自分に浸透したと思うし、間違ってはいなかった!って、ちょっぴり自信もついた
    • でも読み終えたからといってリーダブルなコードは書けない(当然、日々努力

文庫系

読んでいる本

技術系

  • SQLアンチパターン

    • 色々と過去に思いを馳せながら、項目拾い読みしてる
  • すごいHaskellたのしく学ぼう!

    • 読書会が滞ってしまって頓挫ちゅう、今年こそリスタートする

文庫系

  • なし
続きを読む

Ebean.update()で更新されないカラムが発生

環境
  • Play 2.2 Java
  • MySQL 5.6
  • Java 1.7
    (原因からみるとあんまり関係ないだろうけど一応)
症状
  • 不規則に更新出来たり出来なかったりする項目がある。
    • 再現性はあった。(でも変更前のレコードの状態が違うと別の項目が更新出来なくなる不思議~)
  • Exceptionは発生しない。ちゃんと更新出来ている項目もある。
結論
  • 一部で、setter(user.setName(name))ではなく、代入(user.name = name)で値を入れようとした事が原因。
  • どうやらPlay-Ebean間のオブジェクトごにょごにょ中に、代入だと落ちるっぽい。(※時間があったら調べる)

↓原因特定の助けになったStackOverFlow記事。
playframework - EBean is not doing updates! it's trying to do inserts and failing - Stack Overflow

ほんと日々の困った!はGoogle先生とStackOverFlow様様ですね。

まぁ私としては、そもそもModelクラスのフィールド変数が public だったことがこのトラブルの元凶だったねごめんね!!って感じです。
書き手が違うとこういうことがあるのかなるほど、体験をしてしまった。
よく見かけるEbeanのサンプルだとpublicなので、何も考えずにそうしてましたが、ちゃんとprivateにしましょうごめんなさいでした。