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 …

Excel順ソート

30分プログラム、その790。AAがZのあとにでてくるExcel順ソートを書いてみました。 Excelの列ラベルはZのあとにAAがでてくるから、辞書順ソートじゃうまくいかないよねー、というお話。[twitter:@ueda51]さんのつぶやきにインスパイアされた気がするけれど、…

n乗根を求めてみた。

30分プログラム、その781。n乗根を求めてみた。 n乗根なんてどうやって求めるんだろう、と思って調べてみたけど、ニュートン法で解いてた。あああ、なるほど。 使い方 scala> NthRoot.nthRoot(4,2) res7: Double = 2.0000000929222947 scala> NthRoot.nthRoo…

ScalaでHadoopを使ってみた。

大名古屋ことGoogle グループの宿題で「Hadoopを動かしてみること」というのがあったので、試してみました。Javaを使う気にはならないので、Scalaで。 コード Hadoopの2章のコードを素直に写経する。一ファイル一クラスの制限がないのはいいね。 import java…

「ASCII Starts」をやってみる

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"になります。 使い方 …

md5sumの計算

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 ソースコ…

Google サジェストを使ってみる

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で出しています。と…

0x10と010をパースしてみよう

30分プログラム、その714。0x10と010のパースをやってみました。 Scalaは気軽にパーサ・コンビネータが使えるからいいよね。これを正規表現でやってたら、死んでた気がする。 使い方 scala> Number.parse("0x10") res0: Int = 16 scala> Number.parse("010")…

数字当てゲーム

30分プログラム、その706。ヒット&ブローという数字当てゲームを作ってみました。 元々は二人用のゲームで 互いに4桁の数字を決める お互いに4桁数字を言い合う 場所と数字が一致すればヒット、数字だけがならボールと答える というルールです。最初、ゲーム…

Scalaでhexdump

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…

ScalaでSEND+MORE=MONEY

30分プログラム、その682。ScalaでSEND+MORE=MONEYを解いてみました。 Scalaのforはモナドらしいです。モナドと言えばリストモナド、リストモナドと言えばSEND+MORE=MONEYです。 というわけで、SEND+MORE=MONEYを解いてみました。 使い方 $ fsc SendMoreMone…

簡易HTTPサーバ

30分プログラム、その675。簡易HTTPサーバ。 Helloとしか返さない簡単なWebサーバです。Javadocとにらめっこしてたら30分なんてあっという間です。 使い方 $ fsc server.scala $ scala Main ソースコード import java.net.ServerSocket import java.io.Print…

Scalaでls

30分プログラム、その671。Scalaでファイル一覧の取得をやってみました。 最初は、ScalaのAPIドキュメントを読んでいたんだけれども、どこにもファイル一覧を取得する関数が載ってない。 どうすんだよー、としばらく悩んでいたけど、JavaのAPIを使えばいいこ…

サイコロコマンド - コマンドライン引数からランダムに1つ返すコマンド

30分プログラム、その662。コマンドライン引数からランダムに1つ返すコマンドを作ってみた。イメージとしては、各面の文字を自由に決めれるサイコロ。そういえば最近、Scalaを触ってないことに気がついたので、リハビリがてら簡単なコマンドを作ってみた。 …

Hoge.scalaとHogeSpec.scalaを移動するるEmacsLispを書いた

Toggle between test and implementation files for scala project by Maven2 · GitHub 何が問題なの? Maven2でScalaのプロジェクトはとっても便利。Maven2のルールに従ってファイルを置いておけば、よしなしにはからってくれる。でも、Hogeというクラスを定…

Scalaコンパイラを落とす3行のコード

既知のバグ(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で開発するためにDebianをインストールしようぜ

最近、Scalaで遊んでるけれども、MacのScalaは起動が遅すぎる。 VMware FusionにいれたUbuntuで開発してもいいけど、端末しか使わないのにGNOMEを立ち上げるのはメモリがもったいない。それほど、メモリが潤沢にあるマシンでもないし。 というわけで、Debian…

let多相を持ったプログラム言語を作ろう

Types and Programming Languages (The MIT Press)やプログラミング言語の基礎理論 (情報数学講座)を読んだけど、let多相がよく分からない。なんとなくは理解できるんだけど、どうもしっくりこない。 というわけで、let多相を持った簡単なプログラム言語を作…

Scalaで優先度付きキュー

30分プログラム、その511。Scalaで優先度付きキューを作ってみよう。 wikipedia:優先度つきキューによると、連想リストとキューを組合せるのが一番楽らしいので、それをそのままScalaに落し込んでやる。ちなみに、Scala Standard Library 2.12.8 - scala.col…

バブルソート

30分プログラム、その506。 「バブルソートってどう書くのー」って聞かれて、こう書くんだよーっとさらさらっと書いてやろうとしたら、普通に解らなかったので非常にあせった。 そういえば、クイックソートとかマージソートはたまに書くけど、バブルソートは…

Scala plugin for eclipseを試してみた

30分プログラム、その500。Eclipseを毛嫌いばかりしていてもしょうがないので、久しぶりにEclipseを使ってみた。 詳しい使い方をスクリーンショットをまじえつつ書こうと思ったけど、わりと普通だったのでやめた。 インストールの仕方と使い方はHome | Scala…

ScalaでCompositeパターン

30分プログラム、その448。Scalaのcase classを使って、Compositeパターンを作ってみる。ディレクトリみたいなツリー状になっているデータ構造を表現するのに、とっても便利なCompositeパターンをScalaで書いてみよう。 まずは普通に定義しよう。 まずは、増…