おれおれマークダウンでLATEXとRubyで数列

LATEXで数列を表示するのはけっこうめんどうなのでRubyを使って簡単に書ける方法を考えてみます。

まず普通にLaTeXでやると、

```math {disp} end: ``` lang: math filename: {disp} option: disp
1,\;2,\;3,\;\cdots
実行結果1,2,3,

埋め込みのRubyで素直に書くと、

```ruby {exec} end: ``` lang: ruby filename: {exec} option: exec
print "$$"
print "1,\\;2,\\;3,\\;\\cdots"
print "$$"
実行結果1,2,3,

もうちょっと汎用的に書くと、

```ruby {exec} end: ``` lang: ruby filename: {exec} option: exec
class Sequence
  def getTerm(n)
    n
  end
end
print "$$"
s = Sequence.new
(1..3).each do |i|
  print ",\\;" if i > 1
  print s.getTerm(i)
end
print ",\\;\\cdots"
print "$$"
実行結果1,2,3,

これなら3乗とかでも、

```ruby {exec} end: ``` lang: ruby filename: {exec} option: exec
class Sequence
  def getTerm(n)
    n ** 3
  end
end
print "$$"
s = Sequence.new
(1..3).each do |i|
  print ",\\;" if i > 1
  print s.getTerm(i)
end
print ",\\;\\cdots"
print "$$"
実行結果1,8,27,

Sequenceクラスに直書きはださいので外に出しましょう。

```ruby {exec} end: ``` lang: ruby filename: {exec} option: exec
class Sequence
  attr_accessor :func
end

print "$$"
s = Sequence.new
s.func = lambda{|n| n ** 2}

(1..3).each do |i|
  print ",\\;" if i > 1
  print s.func.call(i)
end
print ",\\;\\cdots"
print "$$"
実行結果1,4,9,

整理しましょう。

```ruby {exec} end: ``` lang: ruby filename: {exec} option: exec
class Sequence
  attr_accessor :func
  attr_accessor :base

  def initialize(func, base)
    @func = func
    @base = base
  end

  def show(count)
    (@base..@base + count - 1).each_with_index do |n, i|
      print ",\\;" if i > 0
      print @func.call(n)
    end
    print ",\\;\\cdots"
  end
end

print "$$"
s = Sequence.new(lambda{|n| n ** 2}, 2)
s.show(4)
print "$$"
実行結果4,9,16,25,

なんとなく形が見えてきました。

フィボナッチ数列とかはどうしましょう?

```ruby {exec} end: ``` lang: ruby filename: {exec} option: exec
class Sequence
  attr_accessor :func
  attr_accessor :base

  def initialize(func, base)
    @func = func
    @base = base
  end

  def show(count)
    (@base..@base + count - 1).each_with_index do |n, i|
      print ",\\;" if i > 0
      print @func.call(n)
    end
    print ",\\;\\cdots"
  end
end

print "$$"
s = Sequence.new(
      func = lambda { |n|
        return 0 if n == 0
        return 1 if n == 1
        func.call(n - 1) + func.call(n - 2)
      },
      0)
s.show(10)
print "$$"
実行結果0,1,1,2,3,5,8,13,21,34,

問題なく出力できるようです。

コメント

このブログの人気の投稿

五十音配列付き新下駄配列

WSLでの親指シフトはどうやらMozcで実現可能と気がつくまで

親指シフト新下駄配列の可能性