はてなダイアリーふっかつと逆FizzBuzz問題をScalaで解こう(前編)

いつ登録したのかも覚えていないけれどもはてなダイアリーを復活。

"ぐだぐだ言ってないでコードを書けよハゲ"のもとに、
Scalaスケーラブルプログラミング(通称コップ本)やAndroid開発の勉強のTipsやらを更新予定。





なにやら日付に対して1日記しか書けないみたいなのでここに書く。

今日やったこと
FizzBuzz問題Scalaで解こう(前編)
http://d.hatena.ne.jp/matarillo/20120515/p1
例によって後編があるのかは謎


言わずと知れたスノトラのScalaに興味を持つきっかけとなったページ
このページを見なければなごやかScalaへも参加していない。
なごやかScala#9ページ
(http://partake.in/events/3896c379-6e8a-4e43-afe4-bbde0330b228)

というわけで、まだコップ本もまともに読めていないのにはじめる。

ノートパソコンに入っている環境は下記のとおり。
ちなみにスノトラのノートパソコンさんは6年くらい前に買ったPentium M(2.13GHz)で液晶が壊れかけでちらつき、バッテリーは充電できないお察しPCなのでどなたかおすすめのパソコンがあれば教えてください。(Mac除く)


・adt-bundle-windows-x86(Android開発環境が全部入りになっててビビった)
・pleades(日本語でok)
Scala-2.9.2
Scala IDE for Eclipse


覚えたこと
Scalaアプリケーションを動かすためのコードの書き方
Scalaのfor文の書き方


きちんとわかってはいないけどちょっとわかったこと
Scalaのパターンマッチ
・リストの平坦化


まったくわけわかめなこと
・部分関数(PartialFunction)


疑問点
・下記コード中にそれっぽくコメントで記述



とりあえず今日作ったコードをまんまコピペ

**
 * 下記ページのfizzbuzz、逆fizzbuzzのやり方とそれに対するあれこれ
 * http://d.hatena.ne.jp/matarillo/20120515/p1
 */
object fizzBuzz {

  val isFizzBuzz = ((x: Int) => x % 3 == 0 || x % 5 == 0)
//上と下の違いは?
//  def isFizzBuzz (x: Int): Boolean = {
//    return x % 3 == 0 || x % 5 == 0
//  }
  
  val toFizzBuzz = ((x: Int) => (x % 3,x % 5) match {     
                 case (0,0) =>   "fizzbuzz"
                 case (0,_) => "fizz" 
                 case _ => "buzz"     
  })

  //↑こうじゃないの?
  val toFizzBuzz2 = ((x: Int) => (x % 3,x % 5) match {     
                 case (0,0) =>   "fizzbuzz"
                 case (0,_) => "fizz" 
                 case (_,0) => "buzz"
                 case _     => ""     
  })

  
  //逆FizzBuzzページより
  //Partial Functionは述語関数と写像をまとめただけのものです。
  val fizzbuzz = new PartialFunction[Int,String] {     
                 def isDefinedAt(x:Int) = isFizzBuzz(x)
                 def apply(x:Int) = toFizzBuzz(x)   
  }
  
  def main (args : Array[String]): Unit = {

//とりあえずこうすればfizzbuzzできるよね
//    for (i <- 1 to 100) {
//    	printf("%3d:", i)
//    	println(toFizzBuzz2(i))
//    }

    //逆FizzBuzzページより
    //こうするだけで、このPartial Functionが定義する結果を集めることができます。
    val fizzBuzzCollect = (1 to 100).collect( fizzbuzz )
    //あつまるのはわかるが、シーケンス中のfizz,buzz,fizzbuzzがどの値に対応するのかわかるの?

    //逆FizzBuzzページより
    //まず述語関数でfilterをかけて、写像を適用することになります。
    val fizzBuzzMap = (1 to 100).filter( isFizzBuzz ).map( toFizzBuzz )
    //1~100に対してfizzbuzzかどうか確認してfizzbuzzならば文字列に変換しマップに入れる?
    
    //一応確認
    if ( fizzBuzzCollect == fizzBuzzMap ) {
      println("同じだよ")
    } else {
      println("違うよ")
    }

    //逆FizzBuzzページより
    //まず述語関数でfilterをかけて、写像を適用することになります。
    val fizzBuzzList = for( x<- (1 to 100); if( isFizzBuzz(x))) yield toFizzBuzz(x)
    //全部IndexedSeqになるんだよねぇ・・・
    //不思議な書き方だなぁ
    
        //一応確認
    if ( fizzBuzzCollect == fizzBuzzList ) {
      println("同じだよ")
    } else {
      println("違うよ")
    }
    
    //ここから逆fizzbuzz
    
    //(1,1),(1,2),(1,3),・・・,(1,100)のリストを作成する
    val all = (1 to 100).map(x=> (x to 100).map( y=> (x,y) )).flatten

    //こまかくやっていくとこんな感じ?
    //(1 to 100).map(x => (x to 100))→(1,2,・・・,100),(2,3,・・・,100),・・・,(99,100),(100)
    //↑1~100,2~100,・・・,98~100,99~100,100
    //(1 to 100).map(x=> (x to 100).map( y=> (x,y) ))→
    //  {(1,1),(1,2),・・・,(1,100)},{(2,2),(2,3),・・・,(2,100)},・・・,{(98,99),(99,99),(99,100)},{(100,100)}
    // ↑これはリスト毎の要素で重複するものがすんごいたくさんある状態?
    //(1 to 100).map(x=> (x to 100).map( y=> (x,y) )).flatten→平坦化
    //↑(1,1),(1,2),(1,3),・・・,(2,2),(2,3),(2,4),・・・,(98,99),(98,100),(99,99),(99,100),(100,100)  
   }
}
                                                                                    • -

コード表示テスト

public class Hoge {

 public static main (args[]) {
  system.out.println("hoge");
 }

}

メモ
">|java|"と

"||<"で囲むとコード見やすくなる