メニュー

関連ページリンク

トップ > applet > applet - 人気ブログ(Blog)検索結果詳細 (2009年1月8日 7時)

2番目に書くプログラム

Hello,Worldの次に書くプログラムといえば、

  • フィボナッチ数
  • 階乗
  • エラトステネスのふるい

あたりが普通ですよね? ラノベ(asin:408630421X)も、エラトステネスのふるいから始まってたし。

ボクは階乗を書くことが多いです。

作者:mzp

更新日:2009年1月6日 0時0分

このブログのホーム

[Python][30分プログラム]遅延リストでフィボナッチ数

30分プログラム、その504。今日、ミーティングで遅延リストの話をしたので、遅延リストを使ってフィボナッチ数を書いてみる。

最初、

improt itertools

def ones():
  return itertools.chain([1],ones())

とやったら、えらい目にあってしまった。

しょうがないので、俺chainを作って

def ones():
  return chain(lambda: [1],lambda: ones())

と書けるようにした。

使い方

$ python fib.py
1
2
3
5
8
13
21
34
55
89
144
233

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
#
# fib.py -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/01/06 23:19:11
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

import itertools

def chain(*iterables):
    for it in iterables:
        for element in it():
            yield element

def tail(it):
    it.next()
    return it

def fibs():
    return chain(lambda :[1,2],lambda :
                     itertools.imap(lambda x,y: x + y,fibs(),tail(fibs())))

for (i,n) in itertools.izip(itertools.count(0),fibs()):
    print n
    if i > 10:
        break

参考

作者:mzp

更新日:2009年1月6日 0時0分

このブログのホーム

[F#][30分プログラム]F#を試してみた

30分プログラム、その503。OCamlに似てるけど、互換性はそれほどないと評判のF#を触ってみた。

ちょっとしか触っていないけど、内包表記があったり、小粋な演算子(|>とか<|とか)が定義されていたりと、いい言語な気がする。今、学校でC#を使っているけれど、これをF#に置き換えれたら、かなり幸せになれる気がする。

ただ、Windowsでしか動かないから、使うのが結構面倒くさい。一応、MacPortsにも入っているから、あとで試そうと思う。

使い方

VisualStudioに読み込んで、Ctrl-F5で以下のような結果が得られる。

fact(10) = 3628800
fib(5)   = 120

ソースコード

#light

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

let rec fact = function
   0 -> 1
 | n -> n * fact (n-1)

let _ =
    printfn "fact(10) = %d" <| fact 10;
    printfn "fib(5)   = %d" <| fib 5

参考

作者:mzp

更新日:2009年1月5日 14時17分

このブログのホーム

[F#]F#とOCamlの違い

F# - Microsoft Research についてきたTutorial.fsを読みながら、F#とOCamlの違いついてメモしてみます。

拡張子が.fs

OCamlは.mlだけど、F#は.fs。

コメントが//

OCamlのコメントは(* ... *)だけど、F#は//。

範囲

let oneToTen = [1..10]

内包表記

/// The squares of the first 10 integers
let squaresOfOneToTen = [ for x in 0..10 -> x*x ]

ディクショナリ

let lookupTable = dict [ (1, "One"); (2, "Two") ]

let oneString = lookupTable.[1]

パイプライン

2008-11-12 - まぁ、そんなもんでしょう。の+>と同じですね。

let squares3 = [1; 2; 3; 4] |> List.map (fun x -> x*x)

@@と同じの<|もある。

fact <| 1 + 2

型やフィールドが大文字で始まる

OCamlでこれって許されていたかな?どっちにしろ、違和感がある。

type Card = { Name  : string;
              Phone : string;
              Ok    : bool }

クラスのインタフェース

お、だんだんずれてきたぞ。

// Types: classes
// ---------------------------------------------------------------

/// A 2-dimensional vector
type Vector2D(dx:float, dy:float) =
    // The pre-computed length of the vector
    let length = sqrt(dx*dx + dy*dy)
    /// The displacement along the X-axis
    member v.DX = dx
    /// The displacement along the Y-axis
    member v.DY = dy
    /// The length of the vector
    member v.Length = length
    // Re-scale the vector by a constant
    member v.Scale(k) = Vector2D(k*dx, k*dy)


// Types: interfaces
// ---------------------------------------------------------------

type IPeekPoke =
    abstract Peek: unit -> int
    abstract Poke: int -> unit

print

// Print a result using %A for generic printing
printfn "listC = %A" listC

作者:mzp

更新日:2009年1月5日 0時0分

このブログのホーム

[Perl][30分プログラム]Whitespace実装用のスタック

30分プログラム、その502。最近、Whitespaceとかbrainfuckとかの難読言語が流行っているらしいので、ボクもWhitespaceを実装してみようと思う。というわけで、まずはスタックを実装してみた。

wikipedia:Whitespaceに載っていた5つのスタック操作は実装してみた。

  • push: 数値をスタックに積む
  • dup: スタックの1番上を複製する
  • dup_n: スタックのn番目をコピーして一番上に積む
  • swap: スタックの1番目と2番目を交換する
  • pop: スタックの1番上を物を捨てる

使い方

# stackを作る
my $stack = Stack->new;

# 3つほど数字をpushする
$stack->push(42)->push(1)->push(0);

# 先頭を複製して、pushする
$stack->dup;

# 先頭を削除する
$stack->pop;

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# whitespace-stack.pl - whitespace実装用のstack
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/01/03 22:23:06
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;
use Data::Dumper;

package Stack;
sub new{
    my ($class) = @_;
    bless([],$class);
}

sub push{
    # push integer
    my ($self,$n) = @_;
    push @$self,$n;
    $self;
}

sub dup{
    # duplicate a top of stack
    my ($self) = @_;
    $self->push($self->[-1]);
}

sub dup_n{
    # duplicate n-th of stack
    my ($self,$n) = @_;
    my $val = $self->[-$n];
    $self->push($val);
}

sub swap{
    # swap 1-st of stack and 2-nd of stack
    my ($self,$n) = @_;
    my $first  = $self->[-1];
    my $second = $self->[-2];
    $self->[-1] = $second;
    $self->[-2] = $first;
    $self;
}

sub pop{
    # remove a top of stack
    my ($self,$n) = @_;
    pop @$self;
    $self;
}

package main;

my $stack = Stack->new;
$stack->push(42)->push(1)->push(0);
print Dumper($stack);

$stack->dup;
print Dumper($stack);

$stack->pop;
print Dumper($stack);



参考

作者:mzp

更新日:2009年1月3日 0時0分

このブログのホーム

あけましておめでとうございます

f:id:mzp:20090102233813p:image

↑干支のつもり。

みなさま、あけましておめでとうございます。今年もよろしくお願いします。

今年は就職先を決めないといけない年なので、ステキな会社があったら教えてください。とりあえず、コードを書ける会社がいいです。

作者:mzp

更新日:2009年1月2日 0時0分

このブログのホーム

[Erlang][30分プログラム]ESDLを試したけど、失敗した

30分プログラム、その501。ErlangのSDLバインディング、ESDLを試したけど、うまくいかなかった。

画像をロードして表示するだけのはずなのに、まっしろなウインドウが表示されるだけ。なんとなく、MacPortsで入れたSDLが悪いんじゃないかという気がしてる。

追記(2009-01-03): Ubuntuで動かしたら、うまくいきました。

f:id:mzp:20090103124342p:image

使い方

1> sdl_test:go().

ソースコード

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

-include_lib("esdl/include/sdl.hrl").
-include_lib("esdl/include/sdl_video.hrl").
-include_lib("esdl/include/sdl_events.hrl").
go() ->
    _Server = sdl:init(?SDL_INIT_VIDEO),
    sdl_util:debug(1),
    ScreenRef = sdl_video:setVideoMode(640, 480, 8, ?SDL_ANYFORMAT bor ?SDL_RESIZABLE),
    Screen = sdl_video:getSurface(ScreenRef),
    Bmp = sdl_video:loadBMP("air.bmp"),
    sdl_video:blitSurface(Bmp,null,Screen,null),
    sdl_video:updateRect(Screen,0,0,640,480),
    loop().

loop() ->
    case sdl_events:waitEvent() of
	#quit{} ->
	    exit(normal);
	_ ->
	    loop()
    end.

参考

作者:mzp

更新日:2009年1月2日 0時0分

このブログのホーム

[Scala][30分プログラム]Scala plugin for eclipseを試してみた

30分プログラム、その500。Eclipseを毛嫌いばかりしていてもしょうがないので、久しぶりにEclipseを使ってみた。

詳しい使い方をスクリーンショットをまじえつつ書こうと思ったけど、わりと普通だったのでやめた。

インストールの仕方と使い方はScala Plugin for Eclipse | The Scala Programming Languageは見ればわかるよ。

スクリーンショット

f:id:mzp:20081231223832p:image

参考

作者:mzp

更新日:2008年12月31日 0時0分

このブログのホーム

2番目に書くプログラム

Hello,Worldの次に書くプログラムといえば、

  • フィボナッチ数
  • 階乗
  • エラトステネスのふるい

あたりが普通ですよね? ラノベ(asin:408630421X)も、エラトステネスのふるいから始まってたし。

ボクは階乗を書くことが多いです。

作者:mzp

更新日:2009年1月5日 15時0分

このブログのホーム

[Python][30分プログラム]遅延リストでフィボナッチ数

30分プログラム、その504。今日、ミーティングで遅延リストの話をしたので、遅延リストを使ってフィボナッチ数を書いてみる。

最初、

improt itertools

def ones():
  return itertools.chain([1],ones())

とやったら、えらい目にあってしまった。

しょうがないので、俺chainを作って

def ones():
  return chain(lambda: [1],lambda: ones())

と書けるようにした。

使い方

$ python fib.py
1
2
3
5
8
13
21
34
55
89
144
233

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
#
# fib.py -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/01/06 23:19:11
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

import itertools

def chain(*iterables):
    for it in iterables:
        for element in it():
            yield element

def tail(it):
    it.next()
    return it

def fibs():
    return chain(lambda :[1,2],lambda :
                     itertools.imap(lambda x,y: x + y,fibs(),tail(fibs())))

for (i,n) in itertools.izip(itertools.count(0),fibs()):
    print n
    if i > 10:
        break

参考

作者:mzp

更新日:2009年1月5日 15時0分

このブログのホーム

[F#][30分プログラム]F#を試してみた

30分プログラム、その503。OCamlに似てるけど、互換性はそれほどないと評判のF#を触ってみた。

ちょっとしか触っていないけど、内包表記があったり、小粋な演算子(|>とか<|とか)が定義されていたりと、いい言語な気がする。今、学校でC#を使っているけれど、これをF#に置き換えれたら、かなり幸せになれる気がする。

ただ、Windowsでしか動かないから、使うのが結構面倒くさい。一応、MacPortsにも入っているから、あとで試そうと思う。

使い方

VisualStudioに読み込んで、Ctrl-F5で以下のような結果が得られる。

fact(10) = 3628800
fib(5)   = 120

ソースコード

#light

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

let rec fact = function
   0 -> 1
 | n -> n * fact (n-1)

let _ =
    printfn "fact(10) = %d" <| fact 10;
    printfn "fib(5)   = %d" <| fib 5

参考

作者:mzp

更新日:2009年1月5日 5時17分

このブログのホーム

[F#]F#とOCamlの違い

F# - Microsoft Research についてきたTutorial.fsを読みながら、F#とOCamlの違いついてメモしてみます。

拡張子が.fs

OCamlは.mlだけど、F#は.fs。

コメントが//

OCamlのコメントは(* ... *)だけど、F#は//。

範囲

let oneToTen = [1..10]

内包表記

/// The squares of the first 10 integers
let squaresOfOneToTen = [ for x in 0..10 -> x*x ]

ディクショナリ

let lookupTable = dict [ (1, "One"); (2, "Two") ]

let oneString = lookupTable.[1]

パイプライン

2008-11-12 - まぁ、そんなもんでしょう。の+>と同じですね。

let squares3 = [1; 2; 3; 4] |> List.map (fun x -> x*x)

@@と同じの<|もある。

fact <| 1 + 2

型やフィールドが大文字で始まる

OCamlでこれって許されていたかな?どっちにしろ、違和感がある。

type Card = { Name  : string;
              Phone : string;
              Ok    : bool }

クラスのインタフェース

お、だんだんずれてきたぞ。

// Types: classes
// ---------------------------------------------------------------

/// A 2-dimensional vector
type Vector2D(dx:float, dy:float) =
    // The pre-computed length of the vector
    let length = sqrt(dx*dx + dy*dy)
    /// The displacement along the X-axis
    member v.DX = dx
    /// The displacement along the Y-axis
    member v.DY = dy
    /// The length of the vector
    member v.Length = length
    // Re-scale the vector by a constant
    member v.Scale(k) = Vector2D(k*dx, k*dy)


// Types: interfaces
// ---------------------------------------------------------------

type IPeekPoke =
    abstract Peek: unit -> int
    abstract Poke: int -> unit

print

// Print a result using %A for generic printing
printfn "listC = %A" listC

作者:mzp

更新日:2009年1月4日 15時0分

このブログのホーム

[Perl][30分プログラム]Whitespace実装用のスタック

30分プログラム、その502。最近、Whitespaceとかbrainfuckとかの難読言語が流行っているらしいので、ボクもWhitespaceを実装してみようと思う。というわけで、まずはスタックを実装してみた。

wikipedia:Whitespaceに載っていた5つのスタック操作は実装してみた。

  • push: 数値をスタックに積む
  • dup: スタックの1番上を複製する
  • dup_n: スタックのn番目をコピーして一番上に積む
  • swap: スタックの1番目と2番目を交換する
  • pop: スタックの1番上を物を捨てる

使い方

# stackを作る
my $stack = Stack->new;

# 3つほど数字をpushする
$stack->push(42)->push(1)->push(0);

# 先頭を複製して、pushする
$stack->dup;

# 先頭を削除する
$stack->pop;

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# whitespace-stack.pl - whitespace実装用のstack
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/01/03 22:23:06
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;
use Data::Dumper;

package Stack;
sub new{
    my ($class) = @_;
    bless([],$class);
}

sub push{
    # push integer
    my ($self,$n) = @_;
    push @$self,$n;
    $self;
}

sub dup{
    # duplicate a top of stack
    my ($self) = @_;
    $self->push($self->[-1]);
}

sub dup_n{
    # duplicate n-th of stack
    my ($self,$n) = @_;
    my $val = $self->[-$n];
    $self->push($val);
}

sub swap{
    # swap 1-st of stack and 2-nd of stack
    my ($self,$n) = @_;
    my $first  = $self->[-1];
    my $second = $self->[-2];
    $self->[-1] = $second;
    $self->[-2] = $first;
    $self;
}

sub pop{
    # remove a top of stack
    my ($self,$n) = @_;
    pop @$self;
    $self;
}

package main;

my $stack = Stack->new;
$stack->push(42)->push(1)->push(0);
print Dumper($stack);

$stack->dup;
print Dumper($stack);

$stack->pop;
print Dumper($stack);



参考

作者:mzp

更新日:2009年1月2日 15時0分

このブログのホーム

あけましておめでとうございます

f:id:mzp:20090102233813p:image

↑干支のつもり。

みなさま、あけましておめでとうございます。今年もよろしくお願いします。

今年は就職先を決めないといけない年なので、ステキな会社があったら教えてください。とりあえず、コードを書ける会社がいいです。

作者:mzp

更新日:2009年1月1日 15時0分

このブログのホーム

[Erlang][30分プログラム]ESDLを試したけど、失敗した

30分プログラム、その501。ErlangのSDLバインディング、ESDLを試したけど、うまくいかなかった。

画像をロードして表示するだけのはずなのに、まっしろなウインドウが表示されるだけ。なんとなく、MacPortsで入れたSDLが悪いんじゃないかという気がしてる。

追記(2009-01-03): Ubuntuで動かしたら、うまくいきました。

f:id:mzp:20090103124342p:image

使い方

1> sdl_test:go().

ソースコード

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

-include_lib("esdl/include/sdl.hrl").
-include_lib("esdl/include/sdl_video.hrl").
-include_lib("esdl/include/sdl_events.hrl").
go() ->
    _Server = sdl:init(?SDL_INIT_VIDEO),
    sdl_util:debug(1),
    ScreenRef = sdl_video:setVideoMode(640, 480, 8, ?SDL_ANYFORMAT bor ?SDL_RESIZABLE),
    Screen = sdl_video:getSurface(ScreenRef),
    Bmp = sdl_video:loadBMP("air.bmp"),
    sdl_video:blitSurface(Bmp,null,Screen,null),
    sdl_video:updateRect(Screen,0,0,640,480),
    loop().

loop() ->
    case sdl_events:waitEvent() of
	#quit{} ->
	    exit(normal);
	_ ->
	    loop()
    end.

参考

作者:mzp

更新日:2009年1月1日 15時0分

このブログのホーム

[Scala][30分プログラム]Scala plugin for eclipseを試してみた

30分プログラム、その500。Eclipseを毛嫌いばかりしていてもしょうがないので、久しぶりにEclipseを使ってみた。

詳しい使い方をスクリーンショットをまじえつつ書こうと思ったけど、わりと普通だったのでやめた。

インストールの仕方と使い方はScala Plugin for Eclipse | The Scala Programming Languageは見ればわかるよ。

スクリーンショット

f:id:mzp:20081231223832p:image

参考

作者:mzp

更新日:2008年12月30日 15時0分

このブログのホーム