Ruby

逆ポーランド電卓を実装してみました。

第30回Ruby/Rails勉強会に参加しました - サイログ。MiyakoとかRubyとかなんとか+Miyako ACCESS MAPより。 初級者レッスンで逆ポーランド電卓のお題が出ていたようなので、僕も実装してみました。やっぱりエラーチェックが面倒です… def rpn(expr) result =…

第27回 Ruby/Rails勉強会@関西に参加しました

15分遅刻しました。行きの間に雨が降らなくてよかった。 関数型言語 Ruby by keisuken さん 遅延評価。require "lazy_proc"。こんなのかあるんだ。 パターンマッチ。case when。クラスで分岐。Haskellだとリストの展開ぽいのがすごい便利なんだけどなぁ。req…

Arrayをcar、cdrでまわす

Rubyを関数型っぽく使うには、Arrayをcar、cdrでまわせるとうれしいかもと思ってこんなのを書いてみました。これはこれでいい感じかも。 class Cell def initialize(ary, index = 0) @ary, @index = ary.to_a, index @index = @ary.size if @index > @ary.si…

O(log n)の累乗

ついでにO(log n)の累乗も書いてみました。負数はあつかえません。負だったら符号を反転とかする必要があるのですが、手抜きしてます。 O(n)版。 def pow1(n, m) (0 ... m).inject(1) {|a, i| a * n } end O(log n)版。 def pow2(n, m) a = 1 while m > 0 d,…

O(log n)でフィボナッチ数を求める

O(log n)でフィボナッチ数のN番目を求める方法をRubyで実装してみました。この間のSICP勉強会で教えてもらったやつです。 まず普通のフィボナッチ数。こいつはO(n)です。 def fib1(n) a, b = 0, 1 n.times do a, b = a + b, a end a end O(log n)版のフィボ…

Project Euler進捗報告

これまでの結果をリファクタリングしてレポジトリに登録しました。今1〜22までクリアしました。まぁぼちぼちやっていきたいと思います。 Google Code Archive - Long-term storage for Google Code Project Hosting. 簡単な数学関係のアルゴリズムがいっぱい…

Y Combinator

Haskellだったら(普通遅延評価なので)とても簡単なYコンビネータ。Rubyでの作り方を見付けました。

Project Euler Problem 16

require 'enumerator' module Enumerable def sum inject(0) {|a, n| a + n } end end class Integer def to_digit_ary to_s.enum_for(:each_byte).map {|c| c - ?0 } end end def f(n, m) (n ** m).to_digit_ary.sum end p f(2, 15) p f(2, 1000)

Project Euler Problem 14

def collatz(cache, n) len = 1 while n != 1 if n < cache.size and cache[n] len += cache[n] break end d, r = n.divmod(2) n = r.zero? ? d : 3 * n + 1 len += 1 end len end def f(upper) max_n, max_len = 0, 0 cache = Array.new(upper + 1) (1 .. u…

Project Euler Problem 13

module Enumerable def sum inject(0) {|a, n| a + n } end end class String def lines(limit = 0) split(/\n/, limit) end end src = <

Project Euler Problem 11

require 'enumerator' module Enumerable def product inject(1) {|a, n| a * n } end end class String def lines(limit = 0) split(/\n/, limit) end def words scan(/\w+/) end end def product_max(data) data.map do |line| line.enum_cons(4).map {|a|…

Project Euler Problem 10

module Enumerable def sum inject(0) {|a, n| a + n } end end def sieve(upper) table = Array.new(upper + 1, false) (2 .. upper).inject([]) do |primes, guess| unless table[guess] primes << guess (guess * 2).step(upper, guess) {|n| table[n] = …

Project Euler Problem 9

def comb(*enums, &block) comb2(enums, 0, [], &block) end def comb2(enums, index, params, &block) return block.call(*params) if index >= enums.size enums[index].each do |x| params << x comb2(enums, index + 1, params, &block) params.pop end …

Project Euler Problem 8

require 'enumerator' def f(s) (0 .. s.size - 5).map do |i| s[i, 5].enum_for(:each_byte).inject(1) {|a, c| a * (c - ?0) } end.max end src = <

Project Euler Problem 7

class Integer def upto_inf n = self loop do yield(n) n += 1 end end end def prime?(primes, n) not primes.any? {|m| (n % m).zero? } end def f(index) i, primes = 1, [2] 3.upto_inf do |n| if prime?(primes, n) primes << n i += 1 return n if i …

Project Euler Problem 6

module Enumerable def sum inject(0) {|a, n| a + n } end end def f(enum) sum1 = enum.map {|n| n ** 2 }.sum sum2 = enum.sum ** 2 sum2 - sum1 end p f(1 .. 10) p f(1 .. 100)

Project Euler Problem 5

module Enumerable def product inject(1) {|a, n| a * n } end end def sieve(upper) table = Array.new(upper + 1, false) (2 .. upper).inject([]) do |primes, guess| unless table[guess] primes << guess (guess * 2).step(upper, guess) {|n| table[n…

Project Euler Problem 4

def comb(*enums, &block) comb2(enums, 0, [], &block) end def comb2(enums, index, params, &block) return block.call(*params) if index >= enums.size enums[index].each do |x| params << x comb2(enums, index + 1, params, &block) params.pop end …

Project Euler Problem 3

def sieve(upper) table = Array.new(upper + 1, false) (2 .. upper).inject([]) do |primes, guess| unless table[guess] primes << guess (guess * 2).step(upper, guess) {|n| table[n] = true } end primes end end def f(upper) sieve(Math.sqrt(upper…

Project Euler Problem 2

module Enumerable def sum inject(0) {|a, n| a + n } end end def fibs(upper) n1, n2, fibs = 0, 1, [] while n2 < upper n1, n2 = n2, n1 + n2 fibs << n2 end fibs end def f(upper) fibs(upper).select {|n| (n % 2).zero? }.sum end p f(4_000_000)

Project Euler Problem 1

module Enumerable def sum inject(0) {|a, n| a + n } end end def f(enum) enum.select {|n| (n % 3).zero? or (n % 5).zero? }.sum end p f(1 ... 10) p f(1 ... 1000)

Project Euler始めました

最近プログラム書いてないなぁ、これはいかんと思って始めてみました。ぼちぼちやってきます。 About - Project Euler Project Euler - PukiWiki

第24回 Ruby/Rails勉強会@関西に参加しています

以下個人的なメモです。 NetBeans Ruby Pack / Rails 2.0 by moniqさん ガウディ本。無茶苦茶厚い。言語を特定しない。抽象レベルを上げる。 Webがもともとどういう考え方で作られたのか? RESTの話は断念。。。 NetBeans 6.1。RSpecはるびま連載中。Mercuri…

第24回 Ruby/Rails勉強会@関西に参加します

懇親会は今回パスして、最近カフェ部で噂のこの喫茶店でホットケーキを食べる予定です。

narascheme作りました

Google Code Archive - Long-term storage for Google Code Project Hosting. Ruby上で動く3impの3章のヒープベースの評価器です。3.5節の変数へのアクセスの効率化も実装済みです。 これは生駒読書会#2の成果です。とりあえず読書会終了時点のスナップショ…

Arcfourを実装してみました

新山さんがここで実装してるのを見て、僕もRubyで実装してみました。

RaccでSchemeパーサを作る(2)

マクロ関係、数のややこしいところ(有理数、虚数)以外は大体実装しました。これで生駒読書会#2にのぞもう!

第23回Ruby/Rails勉強会に参加しました。

病院に寄っていたら1時間くらい遅刻しました。残念。 以下、個人的なメモです。

RaccでSchemeパーサを作る

3/2(日)の生駒読書会#2に向けて、Schemeのパーサを準備しておこうと思って作ってみました。なんちゃってSchemeで遊ぶくらいなので、機能はまだまだ足りません。R5RSと見比べると足りないのはだいたいこんな感じかな。 ペア。 文字。 n進数。小数。複素数。 q…

Gcodeへのコンパイルと(正格な)評価器

Compiling to Gcode - 趣味的にっきの続きです。 G-machine COSC406 Compiler Implementation Techniques p.18までソースからGcodeへのコンパイルと(正格な)評価器を実装してみました。