POH6京子ちゃん問題をScalaで解いた
最近プログラミングさせてもらえてないので憂さ晴らしに、
同僚に教えてもらった問題に挑戦。
POH6「女子高生プログラマーの大バトル〜コボール文明の逆襲〜」
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年版:読んだ本読みたい本
読んだ本
技術書系
- リーダブルコード
- 心構えとして自分に浸透したと思うし、間違ってはいなかった!って、ちょっぴり自信もついた
- でも読み終えたからといってリーダブルなコードは書けない(当然、日々努力
文庫系
城をとる話 司馬遼太郎
雪の女王 ハンス・クリスチャン・アンデルセン(楠山正雄訳)
- あれな
- iBooksで¥0だったから読んでみたけど、古いんだろうなぁ訳がイマイチで読みにくかった
- かろうじてひまつぶしにはなった、また読もうとは思わない
読んでいる本
技術系
文庫系
- なし
Ebean.update()で更新されないカラムが発生
環境
症状
- 不規則に更新出来たり出来なかったりする項目がある。
- 再現性はあった。(でも変更前のレコードの状態が違うと別の項目が更新出来なくなる不思議~)
- 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にしましょうごめんなさいでした。