タグ

programmingとalgorithmに関するmEGGrimのブックマーク (5)

  • 竹内関数で音楽生成 - aike’s blog

    Lisperの人ならみんな知ってる竹内関数(たらいまわし関数)という関数があります。 定義としてはこんな感じ。 そのシンプルな定義からは想像もつかないほど複雑で膨大な再帰呼び出しがおこなわれるとても興味深い関数です。たとえば引数にTarai(10,5,0)を与えると343,073回も再帰呼び出しされたりします。 この関数呼び出しの引数がどのように変化するか知りたくてプログラムを書いて調べてみたところ、Tarai(10,5,0)の場合は3つの引数がそれぞれ0〜10(xは-1〜10)の間で少しずつ変化するなかで、2つの値を固定してひとつの値が下降していくような挙動があったりして、なんだか音楽の3和音のコード進行を思わせるような動き方です。 そういうことなら、ということで実際に音にして聴いてみました。Tarai関数が呼ばれるたびに引数のx、y、zを、0=ミ、1=ファ、2=ソ、……、のように音に割

    竹内関数で音楽生成 - aike’s blog
  • Preferred Research サマーインターン2011問題を解いてみた - ブログ執筆中

    http://research.preferred.jp/2011/07/intern2011_problem/ 基方針: 異なる種類の文字同士を見つけて消去して、最後に残った文字の種類を出力する。 出現回数が最大の文字をaと呼ぶことにする. aの出現回数はn/2より大きい、別の言い方をすれば、a以外の文字の出現回数の合計はaの出現回数よりも小さい。そのため、異なる種類の文字同士を見つけて消去していくと、仮に消去の組み合わせの一方が全てaだったとしても、文字種が1種類になるときには必ずaが残る。 文字列をstrとすると、回答は以下: i = 0 j = 1 while j != n if str[i] == str[j] j += 1 else str[i] = ILLEGAL_VALUE str[j] = ILLEGAL_VALUE while str[i] == ILLEGAL_VA

    Preferred Research サマーインターン2011問題を解いてみた - ブログ執筆中
  • さあ、Yコンビネータ(不動点演算子)を使おう! - よくわかりません

    前回、おとうさんにもわかるYコンビネータ!(絵解き解説編) - よくわかりませんというエントリで、Yコンビネータ(不動点演算子)と再帰の絵解き解説をしました。 Yコンビネータ自身は、結局のところ再帰を産み出してくれるだけです。関数(正確にはλという単純な文字列変換ルール)だけで出来て、プログラミングに関するいろんな原理の研究を可能にするのが凄い訳です。その辺のさわりを、きしださんが解説されています。しかし、単なる再帰なら、実際のプログラミングではYコンビネータなんて使わなくても出来ます。 じゃあ、Yコンビネータとか不動点とかは、偉い学者さんとかが研究に使えばいいもので、普通のプログラマには何の意味もないモノなのでしょうか? というわけで、今回はポジティブに、Yコンビネータや不動点で出てくる考え方を、理論だけじゃなく、実際のプログラミングに応用する例を見てみましょう。 今回、プログラムの例を

  • そろそろ分かっておきたいY Combinator - I am Cruby!

    Rubyもうすぐ年明けだし,Yコンビネータの魔法みたいな動きに惑わされる人たちがでてくるんじゃないかなと思ってRubyで解説してみます. 参考に[ruby-list:35058] Y CombinatorY CombinatorY Combinator Y Combinatorって何?3年周期くらいでお騒がせのYさんってそもそも何なのかという話ですが,動機として 再帰の時に自分の名前を使わずに,なんとかして関数そのものを呼びたい というのがあって,例えば階乗とかしたいときに def fact(n); n == 0 ? 1 : n * fact(n-1); end # ここを消したい! と言う事です.何が嬉しいのかというと,さっぱり分かりませんし,arguments.calleeとか普通に名前使える所では使えばいいんじゃないのかな. 前置きRuby1.9のlambdaでは ->{|n| pu

  • 常識を覆すソートアルゴリズム!その名も"sleep sort"! - Islands in the byte stream (legacy)

    TwitterのTLで知ったのだが、少し前に海外掲示板で"sleep sort"というソートアルゴリズムが発明され、公開されたようだ。このアルゴリズムが面白かったので紹介してみる。 Genius sorting algorithm: Sleep sort 1 Name: Anonymous : 2011-01-20 12:22 諸君!オレは天才かもしれない。このソートアルゴリズムをみてくれ。こいつをどう思う? #!/bin/bash function f() { sleep "$1" echo "$1" } while [ -n "$1" ] do f "$1" & shift done wait example usage: ./sleepsort.bash 5 3 6 3 6 3 1 4 7 2 Name: Anonymous : 2011-01-20 12:27 >>1 なん…だと

    常識を覆すソートアルゴリズム!その名も"sleep sort"! - Islands in the byte stream (legacy)
  • 1