Hatena::ブログ(Diary)

みずぴー日記

2010-10-04(月)

F#はじめました

| F#はじめました - みずぴー日記 を含むブックマーク

30分プログラム、その805。

インストール

使い方

$ mono $FSHARP_HOME/bin/fsc.exe
$ cp $FSHARP_HOME/bin/FSharp.Core.* .
$ mono fact.exe
3628800

ソースコード

let rec fact n =
    if n = 0 then
        1
    else
        n * (fact (n - 1))

printf "%d\n" (fact 10);;

参考

2010-10-03(日)

コインの両替

| コインの両替 - みずぴー日記 を含むブックマーク

30分プログラム、その804。コインの両替。

coin.scm - みずぴー日記に再チャレンジ。

使い方

gosh> exchange-coin
((2000 1) (100 1) (10 4) (1 2))

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
(use util.match)
(use gauche.sequence)
(and '() 1)
(define (exchange cost coins)
  (if (< cost 0)
      '()
      (match coins
	     (() '())
	     ((c . cs) (if (<= c cost)
			   (cons c (exchange (- cost c) (cons c cs)))
			   (exchange cost cs))))))

(define (group xs)
  (map (lambda (xs) (list (car xs) (length xs)))
       (group-sequence xs)))

(define (exchange-coin cost)
  (group (exchange cost '(10000 5000 2000 1000 500 100 50 10 5 1))))

参考

2010-09-28(火)

クイックソート

| クイックソート - みずぴー日記 を含むブックマーク

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 {
      case Nil =>
	Nil
      case x::xs => {
	val (ys, zs) = xs.partition(_ < x)
	sort(ys) ++ List(x) ++ sort(zs)
      }
    }
  }
}

参考

2010-09-27(月)

マージソート

| マージソート - みずぴー日記 を含むブックマーク

30分プログラム、その802

3年前のマージソート(msort.rb - みずぴー日記)をまたやってみた。

使い方

gosh> (msort '(3 1 2))
(1 2 3)

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
(use util.match)
(use srfi-1)

(define (merge xs ys)
  (match (cons xs ys)
	 [(() . ()) ()]
	 [(xs . ()) xs]
	 [(() . ys) ys]
	 [((x . xs) . (y . ys))
	  (if (< x y)
	      (cons x (merge  xs        (cons y ys)))
	      (cons y (merge (cons x xs) ys)))]))

(define (split xs)
  (receive (a b)  (partition cadr
			     (zip xs (circular-list #t #f)))
	   (values (map car a) (map car b))))

(define (msort xs)
  (if (or (null? xs) (null? (cdr xs)))
      xs
      (receive (ys zs) (split xs)
	       (merge (msort ys) (msort zs)))))

参考

2010-09-24(金)

wc、3たび

| wc、3たび - みずぴー日記 を含むブックマーク

30分プログラム、その801。

何度かといてるwc(wc.py - みずぴー日記,http://d.hatena.ne.jp/mzp/20090714/wc)を、また作ってみた。

仕様がちがっとるやんorz。

使い方

$ python wc.py foo.txt
 21  75 431

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
from __future__ import with_statement
import sys
import re


def lines(s):
    return len(s.split("\n"))

def chars(s):
    return len(s)

def words(s):
    return len(re.split('\W+', s))

for path in (sys.argv[1:] if len(sys.argv[1:]) != 0 else ["/dev/stdin"]):
    with file(path, 'r') as fp:
        s = fp.read()
        print "%3d %3d %3d" % (lines(s),words(s),chars(s))

参考

2010-09-22(水)

逆ポーランド記法。もしくは3年前の自分との勝負

| 逆ポーランド記法。もしくは3年前の自分との勝負 - みずぴー日記 を含むブックマーク

30分プログラム、その800。

3年前にやったお題(2007-04-16 - みずぴー日記)を再び解いてみた。

多少、スマートになってるようで、ちょっと安心した。

使い方

$ perl rpn.pl 3 2 1 + \*
9

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
use strict;
use warnings;
use Data::Dumper;
{
    package stack;

    sub new {
	my $class = shift;
	return bless [],$class;
    }

    sub push{
	my ($self,$v) = @_;
	push @$self,$v;
    }

    sub pop {
	my ($self) = @_;
	pop @$self;
    }
}

sub rpm(@){
    my $stack = stack->new;
    foreach (@_) {
	if(m![-+*/]!) {
	    my $a = $stack->pop;
	    my $b = $stack->pop;
	    $stack->push(eval "$a $_ $b");
	}elsif (/\d+/) {
	    $stack->push($_);
	}
    }
    $stack->pop
}

print rpm(@ARGV),"\n";

参考

2010-08-31(火)

buffalo

| buffalo - みずぴー日記 を含むブックマーク

30分プログラム、その799。anarchy golf - Buffaloにインスパイアされました。

"Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo"という文法的に正しい英文を出力するプログラムです。

使い方

16> buffalo:main().
"Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo"

ソースコード

-module(buffalo).
-compile([export_all]).

capitalize([])->
    [];
capitalize([C|Cs])->
    [string:to_upper(C)|Cs].
id(X) -> X.

main()->
    C = fun capitalize/1,
    I = fun id/1,
    string:join(lists:map(fun (F) -> F("buffalo") end ,
			  [C,I,C,I,I,I,C,I]),
		" ").

参考

2010-08-30(月)

漢数字への変換

| 漢数字への変換 - みずぴー日記 を含むブックマーク

30分プログラム、その798。数字から漢数字への変換をやってみました。

1以上1億未満の数字にのみ対応してます。

使い方

*Main> kanji 10
十
*Main> kanji 42
四十二
*Main> kanji 12345
一万二千三百四十五

ソースコード

import qualified System.IO.UTF8 as U

right  = ["", "一", "二","三","四","五","六","七","八","九"]
left = ["", "二","三","四","五","六","七","八","九"]
sep p xs ys  = ys ++ [ x ++ p ++ y | x <- xs, y <- ys]

xs = sep "万" (tail ys) ys
    where ys = foldl (\x p -> sep p left x) right ["十","百","千"]

kanji n = U.putStrLn (xs !! n)

参考

clairvyclairvy 2010/08/30 18:44 ごぬんなさい.
間違いなく仕事です.
一応行ってみようと思いますが,
普通の時間には行けそうにないです.自分がヤバス

2010-08-24(火)

改行しかしない

| 改行しかしない - みずぴー日記 を含むブックマーク

30分プログラム、その797。anarchy golf - Carriage no returnにインスパイアされました。

使い方

- no_return "abc\ndef";
val it = "abc\n   def" : string

ソースコード

fun lines s =
    String.tokens (fn c => c = #"\n") s;
fun unlines xs =
    String.concatWith "\n" xs;

fun pad n =
    String.implode (List.tabulate (n,(fn _ => #" ")));

fun fst (x,_) = x;
fun snd (_,y) = y;

fun concat_with_pad xs =
    List.foldl
	(fn (x,(n,ys)) => (String.size x + n, (pad n) ^ x :: ys))
	(0,[])
	xs;

fun no_return str =
    unlines (List.rev (snd (concat_with_pad (lines str))));

参考

2010-08-22(日)

ローマ数字の変換

| ローマ数字の変換 - みずぴー日記 を含むブックマーク

30分プログラム、その797。anarchy golf - Roman numeralにインスパイアされました。

ローマ数字をIntに変換します。面倒だったので、I,V,Xにしか対応していません。

使い方

scala> Roman.toInt("II")
res39: Int = 2

scala> Roman.toInt("IIV")
res40: Int = 3

scala> Roman.toInt("XIV")
res38: Int = 14

ソースコード

object Roman {
  val map = Map('I' -> 1,
		'V' -> 5,
		'X' -> 10)

  def toInt(s : String) : Int =
    s.foldRight((0,0)){ case (c, (m, current)) =>
      val n = map(c)
      if(n < m){
	(m, current - n)
      }else{
	(n max m, current + n)
      }
    }._2
}

参考