ラベル Scala の投稿を表示しています。 すべての投稿を表示
ラベル Scala の投稿を表示しています。 すべての投稿を表示

2011年7月5日火曜日

素因数分解

プロジェクトオイラーの第5問解く前に素因数分解しないといけなさそうなので、とりあえず素因数分解の処理だけ書いてみました。

1~10の整数の素因数分解した結果リストを表示

【ソース】
object soinsubunkai{


 def main(args:Array[String]) :Unit = { 
  println((1 to 10).toList.map(getSoinsu(_)))
 }


 def soinsu(lst:List[Int],moto:Int,waru:Int):List[Int] = 
  if(moto>waru) {if (moto%waru==0) soinsu(lst:+waru,moto/waru,waru) 
  else soinsu(lst,moto,waru+1)} else {lst:+waru}


 def getSoinsu(num:Int):List[Int] = 
  if(num>1) soinsu(List(),num,2) else (List())
}




【処理結果】

List(List(), List(2), List(3), List(2, 2), List(5), List(2, 3), List(7), List(2, 2, 2), List(3, 3), List(2, 5))

2011年6月26日日曜日

オイラープロジェクトを解く~Project Euler Problem4 数字の回文?

クリアーo(´д`)o
You are the 87527th person to have solved this problem.

ミスりまくった。問題良く読もう・・・
にしても、なれればループより書くの早いね!

【前提】
Scalaで解く!

【問題】
素因数分解の問題

【解法】
本当は、x*(100 to 999)をフィルターした結果のmaxをリストにして再度maxにしたかったけど、
空っぽのListにはmaxなどのメソッドは使えないらしく、エラーになる。
まあ、ループしてるわけではないのであまり処理速度は変わらない気がするけど・・・

object  euler4 {


//全部展開するのは無駄すぎるので没にしたソース
// def main(args:Array[String]) :Unit 
//  println((100 to 999).toList.map(x=>(100 to 999).toList.map(y=>x*y)).flatten.filter(x=>checkKaisu(x)).max)
// def chekDigit(lst:List[Char]) :List[Char] = 
//   if(lst.length > 1 && lst.head==lst.last) chekDigit(lst.init.tail) else lst
// def checkKaisu(num:Long) :Boolean =
//      if(chekDigit(num.toString.toCharArray.toList).length < 2) true else false


def main(args:Array[String]) :Unit =
   println((100 to 999).toList.map(x=>(100 to 999).toList.map(y=>x*y).filter(z=>checkKaisu(z))).flatten.max )
def chekDigit(lst:List[Char]) :List[Char] = 
   if(lst.length > 1 && lst.head==lst.last) chekDigit(lst.init.tail) else lst
def checkKaisu(num:Long) :Boolean= 
  if(chekDigit(num.toString.toCharArray.toList).length < 2) true else false
}

2011年6月10日金曜日

オイラープロジェクトを解く~Project Euler Problem3 素因数分解

クリアーo(´д`)o
You are the 92046th person to have solved this problem.

一発で解けた・・・良かった。
でも、もっと綺麗にかけないものか・・・

【前提】
Scalaで解く!

【問題】
素因数分解の問題
http://projecteuler.net/index.php?section=problems&id=3

【解法】

object  euler3 {
def main(args:Array[String]) :Unit = println(warikire(600851475143L,2))


//割り切れるかどうか繰り返し判定していく関数
def warikire(i:Long,k:Long):Long={
if(i>k) { 
if (i%k==0) 
{
println(k)
warikire(i/k,k)
} else {
warikire(i,k+1)
}
}
else k
}
}

2011年6月9日木曜日

オイラープロジェクトを解く~Project Euler Problem2

クリアーo(´д`)o
You are the 確認し損ねた…th person to have solved this problem.

【前提】
Scalaで解く!

【問題】
http://projecteuler.net/index.php?section=problems&id=2

【解法】

object euler2 {
  def main(args : Array[String]) : Unit =
  {
   println(fibonacci(4000000).map(x=>if(gusu(x)) x else 0).sum)
  }
  def fibonacci(max:Int) :List[Int]= {
   addNext(List(1,2),max)
  }
  /**
   * リストにリストの最後から2番目と最後の数値を足した値を返す。
   */
  def addNext(lst : List[Int],max :Int) :List[Int] =
    if((lst.init.last + lst.last) < max) {addNext(lst :+ (lst.init.last + lst.last),max)} else {lst}
 
  def gusu(i:Int)=i/2==i.toDouble/2
 
}

2011年6月3日金曜日

フィボナッチ数の偶数番目の項の合計値を求める。

Project Euler Problem1 の問題を読み間違えてしまった・・・
もったいないのでメモ



Scalaでフィボナッチ数の偶数番目の項の合計値を求める。
※ほんとは偶数の項の合計を求める・・・o(´д`)o




object euler_2 {
  def main(args : Array[String]) : Unit = 
  {
 println(fibonacciNew(4000000))


 println(fibonacciNew(4000000).sum)
  }
  def fibonacciNew(max:Int):List[Int] = addNextNext(List(2),1,max)
  /**
   * リストに一個飛ばしでフィボナッチ数を追加する。
   */
    def addNextNext(lst : List[Int],before :Int,max :Int) :List[Int] = 
    if((lst.last * 2 + before) < max) {addNextNext(lst :+ (lst.last * 2 + before),lst.last + before ,max)} 
    else {lst}
    
}

フィボナッチ数の求め方

Scalaでフィボナッチ数を求める

object fibonacci{
  def main(args : Array[String]) : Unit = 
  {
 println(fibonacci(100))
  }
  def fibonacci(max:Int) :List[Int]= {
 addNext(List(1,2),max)
  }
  /**
   * リストにリストの最後から2番目と最後の数値を足した値を返す。
   */
  def addNext(lst : List[Int],max :Int) :List[Int] = 
    if((lst.init.last + lst.last) < max) {addNext(lst :+ (lst.init.last + lst.last),max)} 
    else {lst}
}

2011年5月30日月曜日

オイラープロジェクトを解く~Project Euler Problem1

初クリアーo(´д`)o
You are the 147887th person to have solved this problem.


【前提】
Scalaで解く!


【問題】
http://projecteuler.net/index.php?section=problems&id=1


【解法】

object euler_1 {

def main(args : Array[String]) : Unit = 
print((1 to 999).toList.map(x=>check(x)).sum)
def warikire(i:Int,k:Int)=
i/k==i.toDouble/k.toDouble
def check(i:Int):Int=
if (warikire(i,3) || warikire(i,5)) i else 0
}



2011年5月29日日曜日

EclipseでScala

NetBeansのプラグインがどうしても上手くインストールできなかったので結局Eclipseでやることに。

1.プラグインは以下のパスからダウンロード
http://www.scala-ide.org/

2.オレンジ色のボタンをクリックするとプラグインダウンロード用のサイトパスがクリップボードに
保存される。
あとは、Eclipseのプラグインインストールサイトに追加すればOK

と思ったけど、またエラー・・・

当分、Scalaはテキストで開発します・・・

と、思ったけど最新が2.9Beta版やったので、一個前の安定版をダウンロードしてみることに。

http://download.scala-ide.org/update-1.0.0-milestones-2.8.1.final


そしたら上手くいきました。
とりあえず、eclipseでやっとこう。

NetBeansのインストールとScalaプラグイン

結局このやり方は上手くいきませんでした・・・
Scala CoreプラグインをインストールしようとしたらRats Parser(org-netbeans-libs-xtc-1.15.nbm)のバージョンが1.4だからだめというメッセージが表示されてインストールできない。
インストールしているのは1.5なんですけど。
というわけで調査中

----------------------------------------------------------------------------------
よく考えたらNetBeans使ったことなかった。
Scalaプラグインの精度がEclipseよりいいらしいのでインストールしてみた。
※Scalaの開発環境構築は以下の記事参照
http://baseballandse.blogspot.com/2011/05/scala.html

1.NetBeansの本家サイトからダウンロード
http://netbeans.org/index.html

2.インストーラを実行する。
















3.ライセンス条項、JUnitのインストール共にチェックを付けて実行





















4.IDEのインストールパスと、インストール済みのJDKのパスを確認
















5.インストール開始!
















6.NetBeansをインストールしたら、Scalaのプラグインをダウンロードして解凍する。
http://sourceforge.net/projects/erlybird/files/nb-scala/6.7v1/

7.ダウンロードしたファイルを選んでインストールする。

















プラグインの追加をクリックする。




インストールボタンをクリックする。

以上。

2011年5月6日金曜日

Scala 素数判定と√

√nはmath.sqrt(n)とのこと。
これを利用して、素数かどうか判定する関数を作成する。

素数=2以上√n以下の整数で割り切れない自然数(のはず)なので、

割り切れるかどうかを判別する関数を作成。
⇒2以上√nのリストを上記関数でチェックする。
⇒割り切れる数がなければ素数。

-----------------------------------------

//割り切れるかどうか判定する関数
def warikire(i:Int,k:Int)=i/k==i.toDouble/k.toDouble

//素数判定関数
def sosu(i:Int)=(2 to math.sqrt(i).toInt).exists(warikire(i,_))==false

sosu(10)
Boolean = false
sosu(13)
Boolean = true
-----------------------------------------
(a to b)でa以上b以下の整数のリストを取得できる。
このリストに対して、warikire関数を満たすメンバーが存在するかどうかチェックする。
存在しない場合、existsの結果がfalseで帰ってくるので、false==falseとなった場合に、
sosu関数の結果としてtrueを返す。

てな仕組み。

関数型言語、かなり面白い・・・

Scalaで偶数判定

偶数かどうかを判定する関数

-----------------------------------------
(定義)
def gusu(i:Int)=i/2==i.toDouble/2


(使用例)
gusu(4)
res1: Boolean = true


gusu(4)
res2: Boolean = false

-----------------------------------------

2011年5月4日水曜日

Scalaのセットアップ

ScalaがJavaのランタイムで動くと聞いたので、やってみることに。

関数型オブジェクト指向言語らしい

1.以下のサイトからダウンロード
http://www.scala-lang.org/downloads

2.圧縮ファイルを解凍する。

3.解凍したファイルをCドライブ直下とかに置く

4.例のごとく、binまでのパスを環境変数のpathに設定する。
例)
C:\Program Files\Common Files;C:\Ruby\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\scala_SDK\bin


5.コマンドプロンプトで"scala"を実行。
対話型の入力モードになる。
print("Hello World")
と入力してEnterで

Hello World

と表示される。

1+2と入力しEnterで

res0: Int = 3

と表示される。

6.「Ctrl-D」か「:quitを入力」で終了
※exitでもOKぽい。


ちなみにAPI集は以下のページ
http://www.scala-lang.org/api/current/index.html