いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

(工事中)pythonでインタプリタ作成

Inutobaインタプリタ 全ソースコード

import sys
import os

サンプルプログラム1 クイックソート

クイックソートです。$d[0]~$d[9]の10個のデータを小さいものから順に並べ替えます。

dim $d[10]
dim $d1[10]
dim $d2[10]
#----------------
$d[0] = 5
$d[1] = 2
$d[2] = 1
$d[3] = 4
$d[4] = 6
$d[5] = 4
$d[6] = 8
$d[7] = 9
$d[8] = 6
$d[9] = 4
#----------------
a = 0
m = 10
#----------------
qsort(a, m)
#
for i = a to a + m -1
  print $d[i]
end
exit
#----------------
func qsort(a, m)
  if m <= 1
    return
  end
  n = divide(a, m)
  if n > 1
    qsort(a, n)
  end 
  if m - n - 1 > 1
    qsort(a + n + 1, m - n - 1)
  end
end
#----------------
#m個のデータ
#$d[a], $d[a + 1], ……, $d[a + m - 1]
#を先頭の要素 $d[a]を基準にして小さいものと、
#そうでないものに分けていったん $d1[]、$d2[]に入れる。
#$d1[]に入ったデータ数を返す。
#$d[a]は$d2[]の先頭に入る。
#$d[] は$d1[], $d2[] をつなげた配列となる。
#例: 521464 → 214456
#----------------
func divide(a, m)
  if m <= 1
    return
  end
  x = $d[a]
  p1 = 0
  p2 = 1
  $d2[0] = $d[a]
  for t = a + 1 to a + m - 1
    if x <= $d[t]
      $d2[p2] = $d[t]
      p2 += 1
    else
      $d1[p1] = $d[t]
      p1 += 1
    end
  end
  for i = 0 to p1 - 1
    $d[a + i] = $d1[i]
  end
  for i = 0 to p2 - 1
    $d[a + p1 + i] = $d2[i]
  end
  #$d1[]に入った要素の個数を返す
  return p1
end

サンプルプログラム2 バブルソート

バブルソートです。$d[0]~$d[9]の10個のデータを小さい順に並べ替えます。内側のforループでは隣り合うデータを次々に確認し、大小順を正しくします。これだけだと例えば一番小さいデータが$d[9]に入っていたときなど、これが$d[8]に移って終わってしまいます。だからこのループを9回繰り返せばよいわけです。具体的にはforループを2重にします。

dim $d[10]
#----------------
$d[0] = 5
$d[1] = 2
$d[2] = 1
$d[3] = 4
$d[4] = 6
$d[5] = 4
$d[6] = 8
$d[7] = 9
$d[8] = 6
$d[9] = 4
#----------------
for i = 0 to 8
  for j = 0 to 8
    if $d[j] > $d[j + 1]
      x = $d[j]
      $d[j] = $d[j + 1]
      $d[j + 1] = x
    end
  end
end
for i = 0 to 9
  print $d[i]
end
exit

サンプルプログラム3

import sys
import os

実験