[[SCALAの記事一覧]] &topicpath; *はじめに [#c3d68e63] このページは関数脳を作るべく、関数言語を題材にした99個の問題を解くのではなく、 解いてある回答を見て学ぶために作ったページです。 再帰的に解いてあると、関数言語だなーという気分になるのは、じぶんだけでしょうか? まだ、全問といていませんが、極力1日1問のペースで解いていこうとおもっています。 *目次 [#b66f8a7d] #contents こんにちは、みなさんお元気ですか。 このページはプログラミング言語SCALAについてまとめたページです。 Androidアプリケーションの開発やクラウド開発、 そして企業のリソースをWebAPI化するなどの プログラミングには信頼性や資源の多さからJavaが有効だとおもいますが、 SCALAはそのJavaアプリケーションをさらに効率よく開発する可能性を秘めています。 *Scalaとは [#g9395f0f] Scalaは、JVM上で動作するオブジェクト指向+関数型言語で、 Javaとほぼ完全な相互利用が可能な言語です。 これまでの言語の集大成に近い言語です。 そのため、各言語の優れた概念を取り入れているわけです。 軽い気持ちで学ぶと、あちこちの言語の概念の基本を抑えたほうが近道なこともあり、 色々な言語の入門書をわたり歩くはめになります。 作者であるMartin Odersky教授はJavac開発の貢献者であるとともに、 Java5 Genericsの仕様策定にも参加しています。 というわけでSCALAはJava言語と親和性の高い関数型言語です。 コンパイルするとJavaのクラスファイルになるんですよ。 Javaのライブラリは膨大で他の言語に比べて日本語の処理方法がしっかりしています。 そしてコードが簡潔に書けるので生産性が高いといわれています。 たとえばBeanクラスを記述する場合、例は下記に記しますが、3分の1の コーディングですみます。 **その他の特徴 [#i82a745f] -関数を生成して返す関数を定義できる -配列のパターンマッチング -XMLを簡単に扱える -多重継承ができるので、メソッドを部品のように扱える JavaにはできないことができるのにJavaと親和性が高いのです。 **練習問題 S-99 Ninety Nine Scala Problems [#zc5b14a2] 何らかの練習問題をこなすことで力がつくとおもいます。自分で解くことも大切ですが模範回答から学ぶことも大切です。 このページは下記の S-99 Ninety Nine Scala Problems http://aperiodic.net/phil/scala/s-99/ の回答をつかって学習していくページです。 模範回答をみてえられる知識は実践向きの知識とも言えるかとおもいます。 パズルゲームを解いていくような気分で1日1問を解説していければとおもっています。 *対象者 [#a4017fbd] SCALAのインストールは完了し、HelloWorldを実行し終えた程度の読者を想定 SCALAをやるのは全くのはじめてという方向け SCALAはコンパイルすると、JAVA言語のクラスを生成する関数型言語です。 型推論を行ってくれるので、マスターすれば生産性が向上します。 *趣旨 [#k9b945e2] 有名な練習問題99問が回答付きで英語ながらも存在しているので、 回答をみながら、ポイントをまとめていこうかという趣旨です。 問題自体はリストを処理するAPIを知っている人向けなのですが、 問題が出てくる毎にそのメソッドを紹介していきます。 *参考:リストを操作するAPI [#dc8ce051] https://www.scala-lang.org/docu/files/api/scala/List.html ***ローカルにAPI資料をもってきたい場合 [#t5cff7df] sbazというインストーラからダウンロードします。 名前の由来は「Scala Bazaars」です。 DOSプロンプトで操作します。 rem はDOSのコメント行を意味しています。 rem sbazのあるディレクトリにカレントディレクトリを移します。 cd C:\scala\bin rem sbazを使えるようにします。 sbaz installed rem 一覧を取得します。 sbaz available rem ドキュメントをダウンロードします。 sbaz install scala-devel-docs 下記のフォルダにAPI資料をダウンロードできます。 C:\scala\doc\scala-devel-docs\api *1問 [#c993a2a7] 1問目は、回答を自分の環境で実行させること自体が学びが大きいです。 **手順 [#l78cdce7] -回答をP01.scalaというファイル名で保存します。 ***インタプリタ形式で確認するには、 [#scb13ea3] scalaでインタプリタ形式で :load .\P01.scala と入力すると 読み込んでくれます。 ***確認方法は [#xa5e1ff8] P01.last(List(1,2,3,4,5)) です。 ***最後の要素を取得する [#ffe2eca1] .last *2問 [#n5ca2709] 2問とは関係ないのだが、今度はEclipseでSCALAを実行させてみたいとおもう。 そのためには下記のプラグインをインストールすることが必要だ。 Scala IDE for Eclipse http://www.scala-lang.org/node/94 **Scala Eclipse Pluginの導入 [#fe8b9747] Eclipse開いて、「Help -> Install New Software... -> Workwithフォルダに Available Software -> Add Site..」でLocationに「http://www.scala-lang.org/scala-eclipse-plugin」と入れる あとは、直感的にわかるので省略 **確認用メイン [#u8fc4086] 回答をエクリプスから実行するにはメインメソッドが必要ですので、 下記のような実行用のメソッドを用意するといいでしょう。 object HelloScala { def main(args:Array[String]) { println("Hello Scala!") println("P03") println(P03.nth(2,List(1,2,3,4))) System.exit(0) } } **本題の2問目 [#ne66d693] // But pattern matching also makes it easy. def penultimate[T](l: List[T]): T = l match { case e :: _ :: Nil => e case _ :: tail => penultimate(tail) case _ => throw new NoSuchElementException } 1問目と比較してみる def last[T](l: List[T]): T = l match { case e :: Nil => e case _ :: tail => last(tail) case _ => throw new NoSuchElementException } ***scalaは配列要素をパターンマッチできるようだ。 [#p80b5dac] 2問目の最後から2つ目にマッチ case e :: _ :: Nil => e 1問目の最後にマッチ case e :: Nil => e ::は配列の要素間の区切り文字である。 ***配列の長さを取得する [#h772481a] .length ***右からn個の要素を取得する [#n1cb2746] .takeRight(2) ()はapplyメソッドと同等らしいです。 ***先頭を取得する [#z25fced1] .head *3問目 [#k49dbbd9] 回答に (n, l) match { } という構文が使用されている 第一パラメータっぽい変数nがmatch内で使えるようになっている ***n番目の要素を取得する [#gb93f5e2] 配列変数(n) *4問目 [#c6f8d542] ***def内にdefを入れ子にできる [#y1cc836a] 例 def foo = { def bar = { } bar } ***先頭以外の要素 [#o852f411] .tail *5問目 [#ma5248d6] ***配列を逆にする [#r0ba9d89] .reverse **配列を連結する演算子::と::: [#m7f4bb61] 配列を連結する演算子には::と:::があって、知らないと困る ***::の例 [#g9697964] List(1,2,3) :: List(4,5,6) 結果 2番目の配列の先頭に格納される List(List(1,2,3),4,5,6) ***:::の例 [#q33c0004] List(1,2,3) ::: List(4,5,6) 結果 List(1,2,3,4,5,6) ***配列の連結演算子:: [#s5798690] ***match内での先頭とそれ以外の分割(効率はn^2なので小さい配列向き) [#y9c37311] case h :: tail => reverse(tail) ::: List(h) ***Nil=List() と List(1,2)=1::2::Nil [#r3204da6] 配列の書き方で 1 :: 2 と書くとエラーになるが 1 :: 2 :: Nil と書くと List(1,2) として認識される **配列の要素をまずは、初期値を処理し、次からは次の要素と処理結果とを処理させる [#b244a202] ややこしいが、その分応用できる箇所をすっきりと記述できる。 .foldLeft 左からぱたぱた倒れていくような感じの関数で初期値と、 名前なしの関数を与えるようなイメージ -例 (List(2,3,4).foldLeft (1)) {(x,y) => x+y} -結果 10 これは1から4までの数字を合計するというもの まず、1と2が、xとyに格納されて計算結果が自動的に左側のxに格納される 次にxと3が計算され、xに格納 どうようにxと4が計算され結果が出力されるという感じだ。 xとかyとかがなくても、次の書式で対応可能だ。 (List(2,3,4) foldLeft 1) {_+_} ***foldLeft・foldRightは別名があり、それぞれ「/:」「:\」とも書ける。 [#j35ee226] foldLeft は /: とも書けるので次のようにより簡潔に書ける (1 /: List(2,3,4))(_+_) 初期値が先頭にきている感じだ。 ()を閉じ終えてからくる()が、処理。 ***回答を理解できるようになったので解説してみる [#mddb4ff8] というわけで、次の処理内容をみてみると以下のことが理解できる def reverse[T](l: List[T]): List[T] = l.foldLeft(List[T]())((r, h) => h :: r) List[T]()は初期値であり、空の配列である。 最初は空の要素と左の要素が処理され最初の要素がrに格納される 次の要素はhに格納され最初の要素はrなので、(2番目の要素,最初の要素) が格納される。 **応用:Beanを定義する。 [#hf8ee7ab] ここまでは、配列の中身が数値とかだったので、もう少し込み入った情報を扱いたい場合もあるかとおもいますので、Beanの扱いについて説明いたします。 その前にオーバライトの書き方を紹介します。 ***Javaメソッドのオーバライド [#d7458651] defの前にoverrideをつけます。 override def toString="(name:"+name+ " value:"+value+")" **case classを使った定義方法 [#jfa5c6e4] -例 case class FieldValue(name:String , value:String ) { override def toString = "(name:"+name+ " value:"+value+")" } たったの3行です。おそらく1行でもいけるでしょう。 **通常のBeanの設定方法 [#hae76bdb] ***Beanの定義 [#e770c35c] class FieldValue(_name : String , _value : String) { val name = _name val value = _value override def toString="(name:"+name+ " value:"+value+")" } ***コンストラクションを増やしたい場合 [#z7935a70] 例 class FieldValue(_name : String , _value : String) { val name = _name val value = _value override def toString="(name:"+name+ " value:"+value+")" def this(_name:String) = this(_name,null) } ***Beanインスタンスの作成 [#ta18a7e3] val field1 = new FieldValue("key1","data1") val field2 = new FieldValue("key2","data2") val field3 = new FieldValue("key2","data2") val field4 = new FieldValue("key2","data2") ***Beanの配列 [#eea500d5] List(field1,field2,field3,field4) *問6 [#jb8a4b39] 答えは簡単に def isPalindrome[T](l: List[T]): Boolean = l == l.reverse だった。 **scalaのfor文 [#cad712c0] 配列以外でループさせたい場合につかうかもしれない for (x <- (0 to 10)){ println(x) } ***takeWhile [#b6a12347] ちなみにループ中にループを抜けたい場合はtakeWhileをつかう var continue = true for (x <- (1 to 20).takeWhile(e => continue)) { println(x) continue = x < 5 } var continue = true (1 to 20).takeWhile(e => continue).foreach { x => println(x) continue = x < 5 } -ただし、上記の例でバージョン2.7.7では意図した結果になるのに対して、2.8Betaだとcontinueのスコープがずれてしまい、別々の変数とみなされてしまいます。 とりあえず、バクかなとおもって本家にバグ報告してみたところ下記の回答がかえってきました。 **SCALAの本家から回答が帰ってきました。 [#v9d8ed93] this is the result of an intentional change. Range is strict now. one way to get lazy behavior would be to insert toStream: "(1 to 20).toStream.takeWhile". in general, though, mixing for comprehensions and side-effects is discouraged. つまり下記のように(1 to 20)の部分を(1 to 20).toStreamとすればよいようです。 var continue = true for (x <- (1 to 20).toStream.takeWhile(e => continue)) { println(x) continue = x < 5 } **配列の連結 [#lb9151aa] 配列の連結は先頭にしかできないので どうしても末尾にしたい場合は、 reverseをつかって先頭に追加してから、 またreverseでもどしたりする。 **文字列格納用配列の宣言 [#m0b9dc5b] var result :List[String] = List() が正解で var result = List() ......NG Error だと、空配列しか受け付けない配列として宣言したことになるようです。 ***配列の追加 [#of21c1dc] 配列が先頭にしか追加できない result = "a" :: result だとエラーにならないけど result = result :: "a" だとエラーになるってこと ***戻り値のあるメソッドの書き方注意点 [#mc57b072] メソッドの戻り値がある場合は、メソッドの中身を書く際に={中身}とすること そうしないと illegal start of declaration というエラーがかえってきます。 ***キャストの仕方 [#h4071f02] クラスの型を正しく指定しないといけませんので指定します。 BufferedSourceでキャストする方法 .asInstanceOf[BufferedSource]. ***動的変数を持つ関数の作り方 [#a10ec873] 動的変数は try catch の中のプログラムをブロックとして、 あとで追加できるようにする仕組みで、ファイルを閉じるなどの 必ず行うような処理を簡潔に書くことができます。 def 動的関数名(引数)(動的変数 => Unit){ } ***動的変数を持つ関数の使い方 [#ib5c9174] 動的関数名(引数){(動的変数 ) => 処理内容 } **文字列を配列に変換する [#nc5cd2c6] ファイルから読み込んだ文字列の場合、いったん配列にしてやらないといけない だから文字列を配列に変換するメソッドをつくってみました。 def to_a(text:String):List[String] ={ var result :List[String] = List() var len = text.length; for (x <- (0 to text.length -1)){ result = text.substring(len-x-1,len-x) :: result } result } 別解:JavaのtoCharArrayをつかう例。これだけでもいいけどArray型になってしまうため、型変換メソッドも用意しました。 //ArrayをList配列に変換します。 def toListoReverse(array:Array[Char]):List[Char]={ var result :List[Char] = List() array.foreach{ x=>result = x :: result } result } //文字列を配列に変換します。 def toList(string:String):List[Char]={ toListoReverse(string.toCharArray).reverse } **ファイルの読み込みを動的変数で簡潔にする [#s98a5e3d] ファイルの読み込みはclose処理をいれなきゃいけないのですが、 動的関数をつかえば、簡潔に表現できます。 import scala.io.Source import scala.io.BufferedSource import java.io._ // ファイルの読み込みを動的変数で簡潔にする def read(path: String)(block: Source => Unit) ={ var fis :FileInputStream =null var sou :Source =null try { fis= new FileInputStream(path) sou= Source.fromInputStream(fis) block(sou) }finally{ sou.asInstanceOf[BufferedSource].close fis.close } } //readメソッドの使い方はこんな感じ read("sample.txt"){(in:Source) => for(line <- in.getLines){ println(line.stripLineEnd) } } ファイルをcloseする箇所が省けているのがわかります。 ***応用:ファイルの内容を一気に配列化するメソッド [#re0a257f] //ファイルをすべて読み配列で返します。 def readAll(path: String):List[String]={ var result :List[String] = List() read(path){(in:Source) => for(line <- in.getLines){ result = line.stripLineEnd :: result } } result.reverse } //使い方 readAll("sample.txt").foreach(println _) とってもシンプルになりました。 *問07 [#u51f94f7] **scala.Anyとは [#sea29c93] Scala のすべてのクラスの継承元となる基底クラス (Int、Float、Double などの型やその他の数値型) は scala.Any 型です。 **入れ子状態になっている配列の入れ子を解消してフラットな配列にする [#pfa20fee] flatMapをつかいます。flatMapは基礎的メソッドです。 def flatten(l: List[Any]): List[Any] = l flatMap { case l: List[_] => flatten(l) case e => List(e) } -flatmapもmapもArray()で行えば、Arrayをかえしますし、Listで行えばListをかえします。 - => 記号は左側にブロック変数を指定できるので重要です。 - さらにブロック変数はcaseによってリストのパターンごとの処理が可能になっています。 *問08 [#e36ac1fa] **値が一致する要素を削除する [#v5207dcb] match処理内のcase処理部分でつかいます。 tail.dropWhile(_ == e) 普通に式を評価しようとするとvalue dropwhile is not a member of Listとエラーになります。 *問09 [#m0f568a4] **多重代入 [#r04dde2d] ScalaもRubyのように多重代入ができるんですねぇ。 scala> val (aa,bb)=(11,22) aa: Int = 11 bb: Int = 22 ***List形式の場合の多重代入 [#tfc30d30] scala> var list = List(1,2,3) list: List[Int] = List(1, 2, 3) scala> var List(aa,bb,cc)=list aa: Int = 1 bb: Int = 2 cc: Int = 3 ***一致するシンボルと、それ以降を分離する。span [#b07ff58f] spanをつかいます。 -例 l.span(_ == l.head) scala> var l = List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e) scala> l.span(_ == l.head) res16: (List[Symbol], List[Symbol]) = (List('a, 'a, 'a, 'a),List('b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e)) *問10 [#d9f67211] 前回で定義したメソッドと連携して最小限のメソッド実装で問題を解いていきます そのためには前回定義したメソッドをimportします。 import P09.pack インポートするためには参照元の.scalaファイルがコンパイルされている必要があります。 さもなくば、下記のエラーが出ます。 P09 is not a member of problem というわけで、 scalac P09.scala でコンパイルすればいいんですが、 今後プロジェクトでこの99の問題をコンパイルし続けるとディレクトリ内はソースとクラスファイルでごちゃごちゃになってしまいます。 それを防ぐためには、ソースファイルとクラスファイルの出力先を分けたたほうがいいですし、 そして問題の回答としてできてくる99個のファイルは一つのパッケージにしなきゃつらいですね。 となると、package化の必要があります。と、なると -フォルダ構成は プロジェクト名 +---src +---problem <---パッケージ名 +---target +classes <----出力フォルダ で、いちいちscalacのオプションを書くのは面倒なのでバッチファイルをつくりました。 拡張子の.scalaは省略してもいいようにしてあります。 --ただし、jarファイルのクラスパスをまとめてコンパイルするにはさらなるクラスパスの追加が必要です。 **バッチファイルでの特定の拡張だけのパスを集める最小限的のサンプル [#r054caaa] @echo off set CP=. set BASE=. setlocal ENABLEDELAYEDEXPANSION for %%f in (%BASE%\*.jar) do set CP=!CP!;%%f echo %CP% ---setlocalはこのバッチファイルだけで有効なことを意味します。 ---ENABLEDELAYEDEXPANSIONを指定しないと、for文が並列で評価されてしまい、クラスパスが連結されません。 ---forには /R というサブディレクトリも検索対象にするオプションがあるはずですが、なぜか自分の環境(XP)では動作しませんでした。 **クラスパスの指定に偽ワイルドカード [#z3e0e43b] Java SE 6 では、クラスパスの指定に偽ワイルドカードが使えるようになるようです。 なんで偽かっていうと ---java -cp ./*.jar;./lib/*.jar のように *.jar とか書くとダメ ---java -cp ./*;./lib/* のみ対応 設定箇所はプロジェクトのディレクトリです。 -compile.bat REM プロジェクトのディレクトリを設定 SET PROJECT=C:\scala\problem SET SRC=%PROJECT%\src SET CLASS=%PROJECT%\bin scalac -sourcepath %SRC% -classpath %CLASS% -d %CLASS% %SRC%\%1.scala -実行方法 compile.bat problem\P09 **ビルドツールの出番 [#j9107d6c] でもimportするということは、ファイル同士に依存関係が出てくるということです。 ということは、 いまは例題を1から順番にやっているだけなので順番にコンパイルしていけばいいのですが、 業務でつかうとなれば、ビルドツールのANTまたは、MAVENをつかったほうがよさそうです。 **ビルドツールMAVEN [#p35eafcc] ダウンロード http://maven.apache.org/download.html 仮に解凍したディレクトリの名称をmavenに変更して下記に設置したとします。 C:\maven -環境変数を設定します。 -M2_HOME=C:\maven -M2=%M2_HOME%\bin -PATH=%PATH%;%M2% -mavenの環境変数設定の確認 mvn --version -mvnでscalaをつかうためのおまじない --参考 ---http://codezine.jp/article/detail/4476?p=2 ---http://akisute.com/2009/11/maven2scalahello-world.html 参考サイトによればできたプロジェクトにpom.xmlがありますが、プラグインのバージョンを合わせるためこれを修正しなくてはなりませんが、 お決まりの操作なので バッチファイルとrubyでつくったスクリプトを用意しました。 なんで、rubyかって?単に簡潔に書けそうな気がしたからです。 --プロジェクト作成バッチファイル **mkprj.bat [#wec0a917] SET PROJECT=%1 SET PACKAGE=%2 SET RUBYSCRIPT=c:\scala\bin\scalaproject.rb @echo off if exist %PROJECT% GOTO PROCESS1 SET CREATE=org.apache.maven.plugins:maven-archetype-plugin:1.0-alpha-7:create SET PARAM= -DarchetypeGroupId=org.scala-tools.archetypes SET PARAM=%PARAM% -DarchetypeArtifactId=scala-archetype-simple SET PARAM=%PARAM% -DarchetypeVersion=1.2 SET PARAM=%PARAM% -DremoteRepositories=http://scala-tools.org/repo-releases mvn %CREATE% %PARAM% -DgroupId=%PACKAGE% -DartifactId=%PROJECT% :PROCESS1 if exist %PROJECT%\pom.xml.bat GOTO PROCESS2 ruby %RUBYSCRIPT% c:\scala\bin\scalaproject.rb %PROJECT% %PACKAGE% %3 :PROCESS2 --使い方 ---したに示したテキストファイル処理Rubyスクリプトがあることが前提のバッチファイルです。 ---プロジェクトフォルダがないことが前提です。 cd プロジェクトの親ディレクトリ mkprj プロジェクト名 パッケージ名 合わせたいscalaバージョン --例 mkprj problem99 problem 2.7.7 **scalaproject.rb [#qfa58e1d] #プロジェクト名を第一引数にとります。 #パッケージ名を第2引数にとります。 #バージョンを第3引数にとります。 puts "argv[0]:"+ARGV[1] projectname =ARGV[1] filename = projectname + "\\pom.xml" file = open(filename) # 保存用バッファ buffer = file.read().split("\n"); file.close # バックアップ用ファイルを開く bkup = File.open(filename + ".bak" , "w"); # ファイルから読み込んでバックアップに書き込む bkup.write(buffer); bkup.close # ファイルを書き込みモードで開き直す file = File.open(filename , "w"); #処理 cnt = 0 buffer.each {|line| cnt = cnt + 1 #64行目から66行目をカットします。 if !(64..66).include?(cnt) #以前のバージョン2.7.0を今のバージョンに置き換えます。 file.puts line.gsub("2\.7\.0",ARGV[3]) #初期値では if cnt==94 heredoc= <<EOS <!-- このlaunchers要素を新規に作る。idとmainClassは必須。 --> <launchers> <launcher> <id>app</id> <mainClass>PACKAGE.App</mainClass> <!-- 以下、任意要素。 args と jvmArgs を指定できます。 --> <!-- <args> <arg>arg1</arg> </args> <jvmArgs> <jvmArg>-Xmx128m</jvmArg> <jvmArg>-Djava.library.path=...</jvmArg> </jvmArgs> --> </launcher> </launchers> EOS file.puts heredoc.gsub("PACKAGE",ARGV[2]) end end } file.close **実行 [#c825ff25] mkprj.bat problem99 problem 2.7.7 はなぜかコンパイルし終わると停止するので2度実行しています。 mkprj.bat problem99 problem 2.7.7 mkprj.bat problem99 problem 2.7.7 cd problem99 mvn scala:run **問09をMavenで実行させてみる。 [#i8df2544] -P09.scala package problem object P09 { def pack[T](l: List[T]): List[List[T]] = { if (l.isEmpty) List(List()) else { val (packed, next) = l.span(_ == l.head) if (next == Nil) List(packed) else packed :: pack(next) } } } -P10.scala package problem object P10 { import problem.P09.pack def encode[T](l: List[T]): List[(Int, T)] = pack(l).map(e => (e.length, e.head)) } -App.scala 改 package problem /** * Hello world! * */ object App extends Application { println( "Hello World!" ) import problem.P10._ println(encode(List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e))) } **実行 [#tf761882] mvn scala:run とりあえず、ソースをかけば、コンパイルから実行までやってくれるのがわかった。 さすがに、scalecを直接やるよりは遅い ***クラスファイルの出力先 [#t56c78be] プロジェクトフォルダ\target\classes ***インタプリタ形式でscalaを動かしたい場合 [#eccca17d] cd プロジェクトフォルダ\target\classes scala *問11 [#y2180116] **単純な括弧、たとえば、(1,2)の要素を取得する [#nb895eea] 今まで、List型の要素取得方法を学んだ scala> List(1,2)(1) res12: Int = 2 しかし、同様の操作を上記のListを省いた形式にあてはめようとするとえらーになる。 scala> (1,2)(1) <console>:7: error: scala.Tuple2.apply[Int, Int](1, 2) of type (Int, Int) does not take parameters ***単なる括弧の要素を取得する方法 [#p3f396f6] scala> (1,2)._1 res11: Int = 1 --この単なる括弧の正体はscala.Tuple2である。 scala> scala.Tuple2.apply[Int, Int](1, 2) == (1,2) res16: Boolean = true 引数の型の数だけTupleクラスが用意されていて、APIを見る限り22個までは用意してあるらしい -22個の例 scala> (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22) res22: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22) 正常に解釈される -23個の例 scala> (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23) <console>:7: error: value Tuple23 is not a member of package scala (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23) 宣言されていないのでエラーとなった。 *問12 [#vba60999] **List.make(2,'a)はList('a,'a) [#v18c1998] **これまでの問題で定義してきたメソッドをあたかもListのビルトインメソッドのように扱う [#bbf78db3] 問題文では、decode(List( (4, 'a), (1, 'b), (2, 'c), (2, 'a), (1, 'd), (4, 'e))) であったが、これを -List((4, 'a), (1, 'b), (2, 'c), (2, 'a), (1, 'd), (4, 'e)).decode で答えが出るようにするには、 case class P12[T](val nums : List[(Int, T)]){ def decode:List[T] = nums.flatMap(e => List.make(e._1, e._2)) } implicit def xxx[T]( num:List[(Int, T)]) = P12(num) -対比のため掲載するが、もとの回答ではつぎのようになる object P12 { def decode[T](l: List[(Int, T)]): List[T] = l.flatMap(e => List.make(e._1, e._2)) } -ポイント --case classでは classで引数をとるようになっており、defの引数が一つ減っている。 *問13 [#jdfa5258] **spanの結果を多重代入する [#y5b22cf6] val (packed, next) = l.span(_ == l.head) *問14 [#t5c21c38] **flatMapを使った方法を思いつくかという問題 [#p995fdd9] #areaedit *問15 [#v7bc29a2] **List.make(n, _)をつかって要素を増やした記述 [#q74067a4] def drop[T](n: Int, l: List[T]): List[T] = { def dropR(c: Int, curList: List[T]): List[T] = (c, curList) match { case (_, Nil) => Nil case (1, _ :: tail) => dropR(n, tail) case (_, e :: tail) => e :: dropR(c - 1, tail) } dropR(n, l) } 回答をみて気がつくのは、defの定義方法である。通常{}でくくるかとおもうが、 いきなり( )表現をつかっている。一つの配列からつくられる高階関数内に処理を書けるからだとおもう。 case文の使い方で気がつくことは、eとtailである、この2つは、どこにも定義や代入の記述がないことをみると、予約されている変数だろう。パターンマッチの書き方も()に応じて用意してあるのだろう。たしか()はTuple2だったはずだ。 #areaedit(end) #areaedit *問16 [#mf5b3ecb] **この問題の回答例1番目で学べるのはカウンターを使って周期的にcase文を選択させていることが学べます。 [#w54f70f2] **zipWithIndex [#v99716b0] Rubyでのeach_with_indexみたいにインデックス番号付きに変換します。 ***例文 [#wd42b26d] List(2, 3, 5).zipWithIndex.foreach(t => println(t._2 + ":" + t._1)) for ((d, i) <- List(2, 5, 6).zipWithIndex) {println(i + ":" + d)} List(7, 3, 1).zipWithIndex.foreach{case (d, i) => println(i + ":" + d)} **filter [#ee114a99] 条件式に一致する要素を抽出します。 def drop[T](n: Int, l: List[T]): List[T] = l.zipWithIndex.filter(v => (v._2 + 1) % n != 0).map(_._1) } #areaedit(end) *問17 [#g18f5769] **splitAtというビルトインメソッドで分割する例 [#p6015899] -例 def split[T](n: Int, l: List[T]): (List[T], List[T]) = l.splitAt(3) -例 takeとdropをつかって先頭と末尾を分割し取得する例 def split[T](n: Int, l: List[T]): (List[T], List[T]) = (l.take(n), l.drop(n)) #areaedit *問18 [#bfd8a868] slice関数を使った回答が一番簡単な問題です。 def slice[T](start: Int, end: Int, l: List[T]): List[T] = l.slice(start, end) #areaedit(end) #areaedit *問19 [#k6bcc473] dropとtakeを使って:::で連結することで、rotateを実現しています。 #areaedit(end) #areaedit *問20 [#t3f24544] 問17でも使った、spiltAtとmatchを使って解くと解ける問題 #areaedit(end) #areaedit *問21 [#t3f24544] これも問17でも使った、spiltAtとmatchを使って解くと解ける問題 spiltAtを使ってからmatchを使うとpreとpostに分割されている。 そこで、 case (pre, post) => と、書きます。 #areaedit(end) *問22 [#v30bba7a] #areaedit 組み込みの変数にRangeが用意されていますが、第二引数未満の整数のリストを作成するようです。 def range(start: Int, end: Int): List[Int] = List.range(start, end + 1) #areaedit(end) *問23 [#lae006e4] #areaedit 乱数の使い方を知っていると解ける (new util.Random).nextInt(l.length) #areaedit(end) *問24 [#mfb2e24e] #areaedit 配列を生成するには下記のようにRangeを使うとよい List.range(1, max + 1) #areaedit(end) *問25 [#s702653f] #areaedit mutable array のupdateを使う #areaedit(end) *問26 [#yfe9b244] #areaedit sublist@を使う // P26 (**) Generate the combinations of K distinct objects chosen from the N // elements of a list. // In how many ways can a committee of 3 be chosen from a group of 12 // people? We all know that there are C(12,3) = 220 possibilities (C(N,K) // denotes the well-known binomial coefficient). For pure mathematicians, // this result may be great. But we want to really generate all the possibilities. // // Example: // scala> combinations(3, List('a, 'b, 'c, 'd, 'e, 'f)) // res0: List[List[Symbol]] = List(List('a, 'b, 'c), List('a, 'b, 'd), List('a, 'b, 'e), ... object P26 { def combinations[T](n: Int, l: List[T]): List[List[T]] = { // flatMapSublists is like list.flatMap, but instead of passing each element // to the function, it passes successive sublists of L. def flatMapSublists[U](l: List[T], f: (List[T]) => List[U]): List[U] = l match { case Nil => Nil case sublist@(_ :: tail) => f(sublist) ::: flatMapSublists(tail, f) } if (n == 0) List(Nil) else flatMapSublists(l, (sl) => combinations(n - 1, sl.tail).map((c) => sl.head :: c)) } } **難しい記述 [#p0dc7cf4] -def flatMapSublists[U](l: List[T], f: (List[T]) => List[U]): List[U] の[U]の書き方 -sublist@の書き方 -slの定義について #areaedit(end) *問27 [#f0a6d1f6] #areaedit すでに問題26で得ている解法というか、メソッドを使えば、この問題27を単純化できることに気がつく object P27 { import P26.combinations def group3[T](l: List[T]): List[List[List[T]]] = for { a <- combinations(2, l) noA = l -- a b <- combinations(3, noA) } yield List(a, b, noA -- b) def group[T](ns: List[Int], l: List[T]): List[List[List[T]]] = ns match { case Nil => List(Nil) case n :: ns => combinations(n, l).flatMap(c => group(ns, l -- c).map(rest => c :: rest)) } } **配列の組み合わせによるfor文 [#m087461b] scalaではfor文は配列の要素をループのカウントがわりに用いることができる。 **yield文 [#zca5424d] for文のあとに記述することで、 for文のループ中の要素をyield文中のプログラムを実行することが可能です。 ** --表記 [#d0d5cd6c] noA = l -- a 配列lから、配列aの要素を除いたモノを返す #areaedit(end) *問28 [#pb5e47d7] #areaedit slacaの配列のソートはsortメソッドが用意されています。 このsortメソッドに比較コードを書くことでsortが実施されます。 比較コードには、scala独特の _ で比較対象の要素を示すことが可能です。 問題bの方は、既に問題10で作成した、要素の長さの配列を得るメソッドを活用します。 既に作った関数をうまく使うことができるかどうかという問題でもあるわけですね。 #areaedit(end) *問29 [#va10fb0e] 素数を扱う問題で 7.isPrime と記述できるなんて、数値がオブジェクトでありなおかつ、そのメソッドを定義できるということですよね。 Scala言語がいかに洗練された言語かがわかります。 class S99Int(val start: Int) { def isPrime = primes.takeWhile(_ <= Math.sqrt(start)).forall(start % _ != 0) } object S99Int { def primes: Stream[Int] = Stream.cons(2, Stream.from(3, 2).filter(_.isPrime)) } *コメントがあればご記入ください。 [#gf6c9a5a] - mEVZLL <a href="http://egefktzvtlkk.com/">egefktzvtlkk</a>, [url=http://wcbakjsswhnq.com/]wcbakjsswhnq[/url], [link=http://fyfwrevcvtgv.com/]fyfwrevcvtgv[/link], http://qssyodbpsuep.com/ -- [[knhyiede]] &new{2010-03-11 (木) 11:44:13}; - HZygqv <a href="http://ibgejrqumlpe.com/">ibgejrqumlpe</a>, [url=http://vjbyzpbdxkgk.com/]vjbyzpbdxkgk[/url], [link=http://rkdaoobpulrw.com/]rkdaoobpulrw[/link], http://dlfrcuvrswpm.com/ -- [[imqmchks]] &new{2010-03-16 (火) 05:59:35}; - http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957857&option=cialis cialis 袢袨袤袢袨袪袩袡袢袥袩袢 http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra viagra >:( -- [[Oteoslpi]] &new{2010-03-18 (木) 19:56:39}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra viagra 袹被袯 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20cialis cialis 袪袪袪袣袪袥袣袨袪袦 http://www.jobzilla.ca/details/company/2507/search/?opt=viagra viagra %))) -- [[Dkjwhuvn]] &new{2010-03-18 (木) 19:56:45}; - http://www.findtheneedle.co.uk/company-telephone.asp?telephone=4438443434 canadian pharmacy 袶袣被袬袧袮袪袮袯袧袦 http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis cialis 8]] http://www.jobzilla.ca/details/company/2507/search/?opt=viagra viagra 袪袭袧袺 http://www.uk-local-search.co.uk/business/buy+viagra+cheap+generic/1851115/ viagra >:-]] -- [[Ubsfxicv]] &new{2010-03-18 (木) 19:56:51}; - http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp viagra 袩袡袪袧袧 http://www.findtheneedle.co.uk/company-telephone.asp?telephone=4438443434 viagra 8D http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957857&option=cialis#1 cialis %DDD http://www.ratemds.com/doctor-ratings/957853/NY/New-York/Lousanne?tag=viagra viagra >:] -- [[Dkthcgbs]] &new{2010-03-18 (木) 19:56:54}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20cialis cialis %PPP http://www.hotfrog.ca/Companies/Canadian-viagra-distributions/Cheap-viagra-20520 viagra 8-]] http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957857&option=cialis#1 cialis :-[[[ -- [[Zwaoygur]] &new{2010-03-18 (木) 19:57:08}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20cialis cialis 袣袩袩袨袡袧袢袦袪袧 http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis cialis %D http://www.jobzilla.ca/details/company/2507/search/?opt=viagra viagra >:] http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis cialis %-DD -- [[Bgzvqrgb]] &new{2010-03-18 (木) 19:57:20}; - http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra 袣袪袬袩袹袲袥袤袰袧袣 http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis cialis %-OOO http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra viagra 8) http://www.uk-local-search.co.uk/business/buy+viagra+cheap+generic/1851115/ viagra 袡袧袩袩袤袡袦袧袧袦袤 -- [[Popzpmrh]] &new{2010-03-18 (木) 19:57:26}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra viagra 袤袦袡袨 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis cialis :-( -- [[Yakhqbwf]] &new{2010-03-18 (木) 19:57:29}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra viagra 袥袩袢袨袢袤袨 http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra viagra 袧袦袢袤袦袡袤袥袡袧 http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis cialis 袯袺袱袩 http://www.uk-local-search.co.uk/search.aspx?q=royal%20viagra viagra >:-OO -- [[Epexdtgj]] &new{2010-03-18 (木) 19:57:34}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra viagra 袢袣袣袪袢袣袢袧袧袣 http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp viagra 袥袦袧袥袣袨袤袢 http://www.armenian.com/cgi-bin/links.cgi?searchstring=noprescription%20cialis cialis 袦袩袦袤袤 -- [[Atitehtx]] &new{2010-03-18 (木) 19:57:40}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra viagra 袢袣袣袪袢袣袢袧袧袣 http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp viagra 袥袦袧袥袣袨袤袢 http://www.armenian.com/cgi-bin/links.cgi?searchstring=noprescription%20cialis cialis 袦袩袦袤袤 -- [[Atitehtx]] &new{2010-03-18 (木) 19:58:34}; - http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp viagra 袷袰袡袶袡袥袶袳袧袰 http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra%20store viagra >:-( http://www.jobzilla.ca/details/company/2507/search/?opt=viagra viagra 袤袨袡袧袥袧 -- [[Gsbiwpsr]] &new{2010-03-19 (金) 11:39:41}; - http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra#1 viagra =))) http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp viagra 袢袩袢袩袤袥袥 http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra viagra 袤袪袤袢袢袤袥袣袧袣袤袤 http://www.findtheneedle.co.uk/products/2700385-buy-cheap-viagra-pack.asp viagra 袥袧袤袡 -- [[Cfuzeekz]] &new{2010-03-19 (金) 11:39:50}; - http://www.hotfrog.ca/Companies/Canadian-viagra-distributions viagra :DD http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra viagra 袩袯袸袸袣 -- [[Hkqddipi]] &new{2010-03-20 (土) 03:24:09}; - http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra#1 viagra 袩袧袣袩袧 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis%20store cialis 袰袭袨袱袷袲袥袴袮被袮袺 http://www.ratemds.com/doctor-ratings/957853/NY/New-York/Lousanne?tag=viagra viagra 袡袪袪 -- [[Brgfunrk]] &new{2010-03-20 (土) 03:24:12}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra%20store viagra %PPP http://www.jobzilla.ca/details/company/2507/search/?opt=viagra viagra 袸袸袰袡袬袢袹袤袢 -- [[Nhzinoyc]] &new{2010-03-20 (土) 03:24:14}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra viagra 袣袧袨袥袥袧袪袨 http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra viagra >:-D http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis cialis 8-PPP http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957857&option=cialis#1 cialis 袪袦袪 -- [[Frrcgwlw]] &new{2010-03-20 (土) 03:24:55}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20cialis cialis 袧袡袤袡 http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra viagra =]]] -- [[Hqfwgagg]] &new{2010-03-20 (土) 19:05:17}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra viagra 袨袧袦袦袣袤袢袣袢袡袧 http://www.hotfrog.ca/Companies/Canadian-viagra-distributions/Cheap-viagra-20520 viagra 袬袯袹被袹袷被袪 http://www.findtheneedle.co.uk/jobs/1830-bioinformatics-analyst-40plan43541.asp viagra 袧袡袧袤袨袣袧袩袤袨袡 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis%20store cialis 袪袤袥袩袣袣袩袥 -- [[Ktyzksee]] &new{2010-03-20 (土) 19:05:39}; - http://www.findtheneedle.co.uk/company-telephone.asp?telephone=4438443434 canadian viagra 被袧袩袺袢袪 http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra >:-( http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis cialis 袨袰袲袢袬袹袩袩袶袯袭 -- [[Rbmoqkvz]] &new{2010-03-20 (土) 19:06:07}; - http://www.findtheneedle.co.uk/jobs/1830-bioinformatics-analyst-40plan43541.asp viagra %OO http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra viagra :-((( http://www.armenian.com/cgi-bin/links.cgi?searchstring=generic%20cialis cialis =))) http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis%20store cialis %-((( -- [[Lnjefpuv]] &new{2010-03-20 (土) 19:06:20}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra viagra 袱袯袢袩袭袢袹袭袴袭袹袤 http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra viagra 袤袥袢袥袦袤袣袤袡袪 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis%20pills cialis :-OO -- [[Itgzdexz]] &new{2010-03-20 (土) 19:06:33}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra viagra 8-DDD http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp viagra 袣袡袩 http://www.findtheneedle.co.uk/jobs/1830-bioinformatics-analyst-40plan43541.asp viagra 袪袦袪袦袪袣袩袣袢 http://www.ratemds.com/doctor-ratings/957853/NY/New-York/Lousanne?tag=viagra viagra 袪袩袩袨袨袦袤袣袦袧袧 -- [[Unjlpdey]] &new{2010-03-20 (土) 19:06:54}; - http://www.hotfrog.ca/Companies/Canadian-viagra-distributions/Cheap-viagra-20520 viagra >:D http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra viagra 袨袨袺袬袷袹袬袵 http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957857&option=cialis#1 cialis 袩袴袹袲袺袯袣袹袹袢 http://www.ratemds.com/doctor-ratings/957853/NY/New-York/Lousanne?tag=viagra viagra >:))) -- [[Hgremvxv]] &new{2010-03-20 (土) 19:07:08}; - http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis cialis 袤袶袵袺袷袶袲袰袮袮袤袧 http://www.jobzilla.ca/details/company/2507/search/?opt=viagra viagra 袤袨袥袪袪袤袡袢袣袦袧袦 http://www.armenian.com/cgi-bin/links.cgi?searchstring=noprescription%20cialis cialis %))) -- [[Vrcwmtiu]] &new{2010-03-20 (土) 19:07:32}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra viagra :]]] http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp viagra %-] http://www.ratemds.com/doctor-ratings/957853/NY/New-York/Lousanne?tag=viagra viagra 袡袣袦 http://www.findtheneedle.co.uk/company-postcode.asp?postcode=K1G canadian viagra 袣袡袪袡袩袣袤袨袣袡袥袢 -- [[Zrtggukx]] &new{2010-03-20 (土) 19:07:54}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=generic%20cialis cialis >:-OOO http://www.ratemds.com/doctor-ratings/957853/NY/New-York/Lousanne?tag=viagra viagra 袣袤袢 -- [[Oczimjfv]] &new{2010-03-20 (土) 19:08:12}; - http://www.hotfrog.ca/Companies/Canadian-viagra-distributions buy viagra 袧袢袩袦袢袦袪袩袩袨袪袥 http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis generic cialis 袣袢袩袥袡袪袨袤袨袣袦 http://www.findtheneedle.co.uk/jobs/1830-bioinformatics-analyst-40plan43541.asp?anal=viagra buy viagra 袧袪袡袢袣袩袨袥袨袡袩 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis%20store cheap cialis 袭袬袺袨袳 -- [[Spxfpeud]] &new{2010-03-22 (月) 11:32:06}; - http://www.hotfrog.ca/Companies/Canadian-viagra-distributions/Cheap-viagra-20520 cheap viagra 袣袩袤袪袧袥袹袨袤袢袺袳 http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra%20store cheap viagra 袮袴被袮袢袣袭袴袴袱袳袰 -- [[Mfzqsixj]] &new{2010-03-22 (月) 11:32:30}; - http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp?title=viagra generic viagra 袧袨袶 http://www.stlouisbusinesslist.com/category/business.asp?uid=5021837&function=interview&option=viagra cheap viagra 袡袤袦袣袡袥袪袧袧 http://www.findtheneedle.co.uk/products/2700385-buy-cheap-viagra-pack.asp generic viagra :(( http://www.ratemds.com/doctor-ratings/957853/NY/New-York/Lousanne?tag=viagra buy viagra 袮袭袰袣袢 -- [[Pfcvshwq]] &new{2010-03-22 (月) 11:32:35}; - http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra buy viagra 袬袵袬袱袴袣袡袲袴袸 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis%20pills generic cialis 袤袩袢袥袪袡 -- [[Qcjqwvmm]] &new{2010-03-22 (月) 11:32:38}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra cheap viagra 袴袡袬袳袭 http://www.uk-local-search.co.uk/search.aspx?q=royal%20viagra cheap viagra =-( http://www.armenian.com/cgi-bin/links.cgi?searchstring=noprescription%20cialis generic cialis =-)) http://www.ratemds.com/doctor-ratings/957853/NY/New-York/Lousanne?tag=viagra generic viagra 袦袦袸袲袡袮袦袭袰袩袶袰 -- [[Xqjhaghk]] &new{2010-03-22 (月) 11:32:43}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra cheap viagra =] http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp?title=viagra cheap viagra >:-O -- [[Wuvfoolb]] &new{2010-03-22 (月) 11:32:58}; - http://www.hotfrog.ca/Companies/Canadian-viagra-distributions generic viagra 袦袥袥袪袢 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra generic viagra 8P http://www.findtheneedle.co.uk/press-releases/21984-viagra-coupon-for-findtheneedle-users.asp generic viagra 袪袥袢袩袥袥袩袥袢袪 http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra buy viagra 袨袦袢袪袡袣 -- [[Kekcdtez]] &new{2010-03-22 (月) 11:33:09}; - http://www.findtheneedle.co.uk/jobs/1830-bioinformatics-analyst-40plan43541.asp?anal=viagra cheap viagra 袩袡袥袡 http://www.uk-local-search.co.uk/search.aspx?q=royal%20viagra generic viagra 袶袵袲 -- [[Twvhweoz]] &new{2010-03-22 (月) 11:33:11}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20cialis generic cialis 袰袭袬袨袹袬袮袳被袮袪袺 http://www.hotfrog.ca/Companies/Canadian-viagra-distributions/Cheap-viagra-20520 generic viagra 袩袳袶袸袳袢袶袤袯 -- [[Rnnltqug]] &new{2010-03-22 (月) 11:33:23}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra buy viagra >:PP http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra%20store buy viagra %) http://www.uk-local-search.co.uk/search.aspx?q=royal%20viagra buy viagra =]] http://www.armenian.com/cgi-bin/links.cgi?searchstring=noprescription%20cialis generic cialis 袩袡袢袩袣袦袡袧 -- [[Turrbkeq]] &new{2010-03-22 (月) 11:33:28}; - http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp?title=viagra buy viagra %[[[ http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra cheap viagra 袧袪袤袢袦袨袩袪袥袢 http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra generic viagra 袥袨袯袣袷袮袱 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis%20pills cheap cialis 袪袯袳袩袰袭袦袭袺 -- [[Lfzixsit]] &new{2010-03-22 (月) 11:33:33}; - http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957857&option=cialis cheap cialis 被袭袡 http://www.uk-local-search.co.uk/business/buy+viagra+cheap+generic/1851115/ buy viagra 袥袥袩袧袢袢袢袨袪袤袧袩 -- [[Jtcgkzln]] &new{2010-03-22 (月) 11:33:39}; - http://www.hotfrog.ca/Companies/Canadian-viagra-distributions cheap viagra 袭袩袩袰袰袨 http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra generic viagra >:-D http://www.uk-local-search.co.uk/business/buy+viagra+cheap+generic/1851115/ buy viagra 袦袡袪袤袨袦袡袪 -- [[Wyznwzxq]] &new{2010-03-22 (月) 11:33:41}; - http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra#1 cheap viagra 袤袪袤袢袢袦袨 http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp?title=viagra generic viagra %DD http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20cialis buy cialis %PPP http://www.jobzilla.ca/details/company/2507/search/?opt=viagra generic viagra 袩被袳袮袯袳袯袵袱袣 -- [[Cnichrrp]] &new{2010-03-22 (月) 11:33:47}; - http://www.hotfrog.ca/Companies/Canadian-viagra-distributions cheap viagra >:-PPP http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis generic cialis =-P -- [[Uvjbhqpg]] &new{2010-03-22 (月) 11:34:14}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra cheap viagra 袡袬袣袵袶袣袯 http://www.findtheneedle.co.uk/products/2700385-buy-cheap-viagra-pack.asp cheap viagra 袯袰袯袡被袧袴袤 -- [[Hsnoyjbr]] &new{2010-03-22 (月) 11:34:20}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra cheap viagra 袳袺袨袮袧 http://www.armenian.com/cgi-bin/links.cgi?searchstring=noprescription%20cialis cheap cialis 袢袢袥袩袤 -- [[Vpukjhbe]] &new{2010-03-22 (月) 11:34:25}; - http://www.hotfrog.ca/Companies/Canadian-viagra-distributions/Cheap-viagra-20520 generic viagra 被袦袯袳袰袩袺袤袰袧袶 http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra generic viagra 袢袧袧袡袧袡袦袥 http://www.findtheneedle.co.uk/products/2700385-buy-cheap-viagra-pack.asp buy viagra 袹袥袱袡袬 -- [[Npnjvtgu]] &new{2010-03-22 (月) 11:35:21}; - http://www.findtheneedle.co.uk/press-releases/21984-viagra-coupon-for-findtheneedle-users.asp cheap viagra >:[[ http://www.stlouisbusinesslist.com/category/business.asp?uid=5021837&function=interview&option=viagra buy viagra 袪袪袪袦袪袦袨袪袩 http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra%20store buy viagra 袪袰袵袧袲袭袨袬袪袦袮袶 -- [[Rbizdfsg]] &new{2010-03-22 (月) 11:35:43}; - http://www.hotfrog.ca/Companies/Canadian-viagra-distributions/Cheap-viagra-20520 cheap viagra 袱袱袲袷 http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra buy viagra 袥袥袸袲袥 -- [[Rsinbdnl]] &new{2010-03-22 (月) 11:36:05}; - http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis generic cialis %-DD http://www.findtheneedle.co.uk/jobs/1830-bioinformatics-analyst-40plan43541.asp?anal=viagra cheap viagra 袡袥袨袥袤袨 http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra%20store cheap viagra 袡袥被袡袱袲袧袭 -- [[Fcrhglvr]] &new{2010-03-24 (水) 12:59:09}; - http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra#1 buy viagra %D http://www.jobzilla.ca/details/company/2507/search/?opt=viagra generic viagra 袶被袰袭被袢 http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra%20store buy viagra >:-OO -- [[Ayfdsxgp]] &new{2010-03-25 (木) 10:41:56}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis generic cialis 袧袶袣袳袷袦袢袨袧袩袰袨 http://www.stlouisbusinesslist.com/category/business.asp?uid=5021837&function=interview&option=viagra cheap viagra 袪袤袥 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis%20store buy cialis 袲袤袶袩袳袪袮袪袦袢袥 -- [[Wyhmbisz]] &new{2010-03-25 (木) 10:42:00}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra cheap viagra 袪袪袢袤 http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra%20store buy viagra 袨袷袯袷袥袷袶袬袲袱袲 -- [[Rkimhwpx]] &new{2010-03-25 (木) 10:42:01}; - http://www.findtheneedle.co.uk/companies/128701-canadian-healthcare-center.asp?title=viagra buy viagra %-(( http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20cialis buy cialis 袨袺袪袩被袨袹 http://www.findtheneedle.co.uk/products/2700385-buy-cheap-viagra-pack.asp generic viagra 袶袭袺袺袢袲袣袯 -- [[Rkjehmyp]] &new{2010-03-25 (木) 10:42:03}; - http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra#1 generic viagra 袤袩袡袧袩袣袪袨袩袣 http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis cheap cialis 袵袨袩袣袢 http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957857&option=cialis#1 cheap cialis 袨袤袰袦袨袩袥袨袲袯袨袯 -- [[Ceobzqor]] &new{2010-03-25 (木) 10:42:05}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra cheap viagra 袥袧袨袤 http://www.jobzilla.ca/details/company/2507/search/?opt=viagra buy viagra 袢袨袣袣袧袡 http://www.uk-local-search.co.uk/business/buy+viagra+cheap+generic/1851115/ buy viagra 袪袰袥袭袵袤袡袭袢 -- [[Kmsllwre]] &new{2010-03-25 (木) 10:42:07}; - http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957857&option=cialis cheap cialis 袩袩袣袥袥袩袤袦袦袢袢 http://www.findtheneedle.co.uk/press-releases/21984-viagra-coupon-for-findtheneedle-users.asp cheap viagra :]] -- [[Uxtxovxb]] &new{2010-03-25 (木) 10:42:09}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=cheap%20viagra buy viagra 袨袤袢被袹袥被袬袨 http://www.hotfrog.ca/Companies/Canadian-viagra-distributions/Cheap-viagra-20520 buy viagra :-]] http://www.findtheneedle.co.uk/jobs/1830-bioinformatics-analyst-40plan43541.asp?anal=viagra generic viagra 袺袭袬袰袢袡袭袷袭袹 http://www.findtheneedle.co.uk/press-releases/21984-viagra-coupon-for-findtheneedle-users.asp generic viagra =OOO -- [[Kidnkjse]] &new{2010-03-25 (木) 10:42:11}; - http://www.findtheneedle.co.uk/press-releases/21984-viagra-coupon-for-findtheneedle-users.asp buy viagra 袭袰袭袬 http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra cheap viagra 袯袬袶袨 http://www.stlouisbusinesslist.com/category/business.asp?uid=5021837&function=interview&option=viagra cheap viagra 袤袩袦袦 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis%20store cheap cialis 袲袹袲袷袥袹袹袡 -- [[Yjnthgkx]] &new{2010-03-25 (木) 10:42:13}; - http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis cheap cialis 袢袩袩袦袨袢袣袥 http://www.armenian.com/cgi-bin/links.cgi?searchstring=buy%20viagra buy viagra :((( http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis%20store cheap cialis 袢袩袣袢袥袦袥袩袥 http://www.findtheneedle.co.uk/company-postcode.asp?postcode=K1G&code=viagra cheap viagra 袢袥袢袤袣袣袤袩袣袦袩袣 -- [[Meniixgu]] &new{2010-03-25 (木) 10:42:14}; - http://www.ratemds.com/doctor-ratings/957857/LA/Los-Angeles/Adacialisoli?tag=cialis cheap cialis %-DD http://www.findtheneedle.co.uk/press-releases/21984-viagra-coupon-for-findtheneedle-users.asp generic viagra 袪袦袩袪袦袧袩袢 http://www.jobzilla.ca/details/company/2507/search/?opt=viagra generic viagra 袪袥袧 -- [[Qyctcvws]] &new{2010-03-25 (木) 10:42:16}; - http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra cheap viagra 袨袧袩袦 http://www.armenian.com/cgi-bin/links.cgi?searchstring=generic%20cialis generic cialis >:DDD http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra%20store cheap viagra 袢袢袢袤袡 -- [[Hnmauorc]] &new{2010-03-25 (木) 10:42:18}; - http://www.armenian.com/cgi-bin/links.cgi?searchstring=viagra cheap viagra 袥袤袢 http://www.armenian.com/cgi-bin/links.cgi?searchstring=noprescription%20cialis cheap cialis 袡袰袹袯袨袬被袰 -- [[Cihblgvj]] &new{2010-03-25 (木) 10:42:20}; - http://www.ratemds.com/filecache/doctor-ratings.jsp?did=957853&option=viagra cheap viagra =-)) http://www.stlouisbusinesslist.com/category/business.asp?uid=5021837&function=interview&option=viagra cheap viagra 袥袹袡袥袴袹袯 http://www.findtheneedle.co.uk/products/2700385-buy-cheap-viagra-pack.asp cheap viagra 袺袲袮袧被袯袷袥 http://www.findtheneedle.co.uk/company-postcode.asp?postcode=K1G&code=viagra buy viagra 袤袤袣袦 -- [[Rlgmbwab]] &new{2010-03-25 (木) 10:42:22}; - http://www.findtheneedle.co.uk/jobs/1830-bioinformatics-analyst-40plan43541.asp?anal=viagra generic viagra 袨袦袤 http://www.armenian.com/cgi-bin/links.cgi?searchstring=cialis cheap cialis 袡袩袨袩袦袣袪 http://www.uk-local-search.co.uk/search.aspx?q=royal%20viagra buy viagra %(( -- [[Byzjdarq]] &new{2010-03-25 (木) 10:42:24}; #comment