おれおれマークダウンで$\LaTeX$とRubyで数列

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

まず普通に$LaTeX$でやると、

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

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

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

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

```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,\;\cdots$$

これなら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,\;\cdots$$

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,\;\cdots$$

整理しましょう。

```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,\;\cdots$$

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

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

```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,\;\cdots$$

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

コメント

このブログの人気の投稿

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

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

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