Scala
このエントリはScala Advent Calendar jp 2010 : ATNDの25日のものです。メリークリスマス! クリスマスは楽しくみんなでパズルを解いて遊びましょう。 パズルみたいな探索問題をScalaで解く場合は、リストモナドを使うとキレイに書けます。 例: SEND+MORE=MO…
30分プログラム、その803。 qsort.scm - みずぴー日記をまたやってみた。 使い方 scala> QSort.sort(List(1,5,4,0,3)) res2: List[Int] = List(0, 1, 3, 4, 5) ソースコード object QSort { def sort[A <% Ordered[A]](xs : List[A]) : List[A] = { xs match…
30分プログラム、その797。anarchy golf - Roman numeralにインスパイアされました。 ローマ数字をIntに変換します。面倒だったので、I,V,Xにしか対応していません。 使い方 scala> Roman.toInt("II") res39: Int = 2 scala> Roman.toInt("IIV") res40: Int …
30分プログラム、その790。AAがZのあとにでてくるExcel順ソートを書いてみました。 Excelの列ラベルはZのあとにAAがでてくるから、辞書順ソートじゃうまくいかないよねー、というお話。[twitter:@ueda51]さんのつぶやきにインスパイアされた気がするけれど、…
30分プログラム、その781。n乗根を求めてみた。 n乗根なんてどうやって求めるんだろう、と思って調べてみたけど、ニュートン法で解いてた。あああ、なるほど。 使い方 scala> NthRoot.nthRoot(4,2) res7: Double = 2.0000000929222947 scala> NthRoot.nthRoo…
大名古屋ことGoogle グループの宿題で「Hadoopを動かしてみること」というのがあったので、試してみました。Javaを使う気にはならないので、Scalaで。 コード Hadoopの2章のコードを素直に写経する。一ファイル一クラスの制限がないのはいいね。 import java…
30分プログラム、その769。anarchy golf - ASCII Starsをやってみました。 わりと素直に書けちゃったので、特に語ることないです。 使い方 scala> show(4) res16: String = * *** ***** ******* ***** *** * ソースコード def wrap(s : String) = "*%s*".for…
30分プログラム、その765。標準入力を指定行数ごとに分割するプログラムを作ってました。 SeqとIteratorの違いで多いに苦しみました。ドキュメントはまったく読んでないのですが挙動と名前から類推するに、 xs.take(n) xsがSeqならxsは変化せずに、Iterator…
30分プログラム、その757。anarchy golf - Mirroring Characterにインスパイアされて、文字列の反転をやってみました。 基本的にreverseと同じですが、括弧だけは対応するものに置き換えるようです。例えば、"f(x)"を反転させると"(x)f"になります。 使い方 …
30分プログラム、その750。md5sumの計算をやってみました。 java.security.MessageDigestを使えば楽に計算できます。 ただ、InputStreamのreadにwhileを使っているのがイケてない気がしてます。InputStreamをSeq[Byte]に変換できたらクールなのになぁ。 使い…
30分プログラム、その742。数値と文字列の相互変換をやってみました。 単なる相互変換ではおもしろくないので、基数を指定できるようにしてみました。 使い方 scala> strToNum("42",13) res41: Int = 54 scala> numToStr(54,13) res42: String = 42 ソースコ…
30分プログラム、その735。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_259にインスパイアされて、Googleサジェストの候補をScalaで取得してます。 ScalaにはXMLリテラルがあって、パターンマッチもできるので楽ですね。属性をパターンマッチで…
30分プログラム、その728。wikipedia:整数分割をやってみた。"並び順を変えても同じ整数分割とみなす"という条件がわりときつくて、それを満たす引数を一個増やしています。 使い方 scala> partition(5) res9: Seq[List[Int]] = RangeG(List(1, 1, 1, 1, 1),…
30分プログラム、その719。モンテカルロ法で円周率計算をやってみました。モンテカルロ法はhttp://www.geocities.jp/turtle_wide/softcomp/al/p03.htmを参考にしました。π = (半径1の扇形の中に入った点の数) / (打った点の数の総数) * 4で出しています。と…
30分プログラム、その714。0x10と010のパースをやってみました。 Scalaは気軽にパーサ・コンビネータが使えるからいいよね。これを正規表現でやってたら、死んでた気がする。 使い方 scala> Number.parse("0x10") res0: Int = 16 scala> Number.parse("010")…
30分プログラム、その706。ヒット&ブローという数字当てゲームを作ってみました。 元々は二人用のゲームで 互いに4桁の数字を決める お互いに4桁数字を言い合う 場所と数字が一致すればヒット、数字だけがならボールと答える というルールです。最初、ゲーム…
30分プログラム、その700。Scalaでhexdumpを作ってみました。hexdumpは、与えられたファイルを16進数で表示するプログラムです。 $ hexdump a.txt 0000000 61 0a 62 0a 0a 0a 0a 0000007いわゆるバイナリエディタでみれるやつです。何かと便利ですよ、これ。…
30分プログラム、その690。中置記法から逆ポーランド記法への変換。 簡単かと思いきや、意外と難しい。とてもじゃないけど、括弧の対応はできなかった。 使い方 scala> val infix = new Infix() infix: Infix = Infix@a32e6f scala> infix += 1 scala> infix…
30分プログラム、その682。ScalaでSEND+MORE=MONEYを解いてみました。 Scalaのforはモナドらしいです。モナドと言えばリストモナド、リストモナドと言えばSEND+MORE=MONEYです。 というわけで、SEND+MORE=MONEYを解いてみました。 使い方 $ fsc SendMoreMone…
30分プログラム、その675。簡易HTTPサーバ。 Helloとしか返さない簡単なWebサーバです。Javadocとにらめっこしてたら30分なんてあっという間です。 使い方 $ fsc server.scala $ scala Main ソースコード import java.net.ServerSocket import java.io.Print…
30分プログラム、その671。Scalaでファイル一覧の取得をやってみました。 最初は、ScalaのAPIドキュメントを読んでいたんだけれども、どこにもファイル一覧を取得する関数が載ってない。 どうすんだよー、としばらく悩んでいたけど、JavaのAPIを使えばいいこ…
30分プログラム、その662。コマンドライン引数からランダムに1つ返すコマンドを作ってみた。イメージとしては、各面の文字を自由に決めれるサイコロ。そういえば最近、Scalaを触ってないことに気がついたので、リハビリがてら簡単なコマンドを作ってみた。 …
Toggle between test and implementation files for scala project by Maven2 · GitHub 何が問題なの? Maven2でScalaのプロジェクトはとっても便利。Maven2のルールに従ってファイルを置いておけば、よしなしにはからってくれる。でも、Hogeというクラスを定…
既知のバグ(NullPointerException when using case class with function-valued field · Issue #1087 · scala/bug · GitHub)だったようです。 Scalaコンパイラを落とすコード。 class A case class B extends A case class C(f : Unit => Unit) extends B $ …
最近、Scalaで遊んでるけれども、MacのScalaは起動が遅すぎる。 VMware FusionにいれたUbuntuで開発してもいいけど、端末しか使わないのにGNOMEを立ち上げるのはメモリがもったいない。それほど、メモリが潤沢にあるマシンでもないし。 というわけで、Debian…
Types and Programming Languages (The MIT Press)やプログラミング言語の基礎理論 (情報数学講座)を読んだけど、let多相がよく分からない。なんとなくは理解できるんだけど、どうもしっくりこない。 というわけで、let多相を持った簡単なプログラム言語を作…
30分プログラム、その511。Scalaで優先度付きキューを作ってみよう。 wikipedia:優先度つきキューによると、連想リストとキューを組合せるのが一番楽らしいので、それをそのままScalaに落し込んでやる。ちなみに、Scala Standard Library 2.12.8 - scala.col…
30分プログラム、その506。 「バブルソートってどう書くのー」って聞かれて、こう書くんだよーっとさらさらっと書いてやろうとしたら、普通に解らなかったので非常にあせった。 そういえば、クイックソートとかマージソートはたまに書くけど、バブルソートは…
30分プログラム、その500。Eclipseを毛嫌いばかりしていてもしょうがないので、久しぶりにEclipseを使ってみた。 詳しい使い方をスクリーンショットをまじえつつ書こうと思ったけど、わりと普通だったのでやめた。 インストールの仕方と使い方はHome | Scala…
30分プログラム、その448。Scalaのcase classを使って、Compositeパターンを作ってみる。ディレクトリみたいなツリー状になっているデータ構造を表現するのに、とっても便利なCompositeパターンをScalaで書いてみよう。 まずは普通に定義しよう。 まずは、増…