J言語研究会資料 2002/03/16 光は東方より−西洋では悪魔の数え方 インド,中国,日本の合理的な数え方 西川 利男 0.はじめに 上のような言い方などしたら, 国 際 的 に は と ん で も な い,不 穏 当 だ,ときつい クレームがつきそうである.しかし,あとになってよく考えると,なるほどと 納得されるはずである. このようなタイトルをつけたもうひとつのねらいは次のことにある.実はわ たくし,昨年7月から東京,お台場に新しく開館した日本科学未来館で, 「情報 科学技術と社会」という部門のボランティアを行っている.それとは違う部門 で「実験工房」というのがある.例えばおもちゃロボットを組み立てたり,超 伝導の磁気浮上の実験を行ったりという体験コーナーである. そこで,情報科学に関連した一種のものづくり実験の場として「コンピュー タ・プログラミング工房」というのが出来たら良いとかねて提言している.そ のプログラミング環境としてJ言語を用い,広く一般の人にJ言語を知っても らい,併せてプログラミングの楽しさを体験してもらうよう,働きかけている. まず,手始めとして去る2月3日(日)に内部のスタッフ向けにSWS セミ ナーとして「J言語の紹介とその利用」という題で一時間程度の講演・デモを 行った.まだ,一般向けのセミナーの企画まで至ってはいないが,それをねら うためのは,多少ショッキングなタイトル付けが必要になる. 一応,次のようなテーマを考えているが,諸兄姉のご意見をいただきたいと 思う. 第1話「お風呂の中の算数」 1,2,3,..100 と数えるところからはじめよう 第2話「お買い物は安くて,良いものを」 スーパーの値段調べから統計数学 へ 第3話「いろいろな国のあいさつと数え方−西洋の数と東洋の数」コンピュ ータ翻訳への入り口 第4話「図形で楽しむコンピュータ」 3次元グラフィックス,立体視,フラ クタル,カオス 1 1.いろいろな国のことばで数える まずは日本語,中国語,英語,ドイツ語,フランス語,スペイン語,エスペ ラント語で100までの数の数え方から始めよう. 日本語 いわずもがなだが,あらためて非常に. 中国語 合理的であることがわかる 英語 11, 12, .. 20 までが少々ややこしいがまだ許せる. ドイツ語 20, 21, .. は合理性をたっとぶドイツにしては変だ. フランス語 まさに悪魔の数え方である.これでは高尚な数学の理論は こねられても,お店のオバサンはさぞや困っているだろう. スペイン語 英語と同程度で標準的ヨーロッパ流の数え方である. エスペラント語 さすがだ.日本語,中国語と同様合理的である. フランス語について,そのややこしさを示す. 1 un 2 deux 3 trois 4 quatre 5 cinq 6 six 7 sept 8 huit 9 neuf 10 dix 11 onze 12 douze 13 treize 14 quatorze 15 quinze 16 seize 17 dix-sept 18 dix-huit 19 dix-neuf つづいて 20 vingt 21 vingt et un 22 vingt-deux 23 vingt-trois 30 trente 31 trente et un 32 trente-deux 40 quarante 41 quarante et un 50 cinquante 51 cinquante et un 60 soixante 61 soixante et un 69 soixante-neuf これからが,ややこしくなる 70 soixante-dix 71 soixante et onze 79 soixante-dix-neuf 80 quatre-vingts 81 quatre-vingt-deux 89 quatre-vingt-neuf 90 quatre-vingt-dix 92 quatre-vingt-onze 99 quatre-vingt-dix-neuf で,100 cent となる. 100までの任意の数を通常の数字で入力し,これを各言語の数え方に直し て表示するプログラムをJで作った.プログラム・リストは最後に示す.フラ ンス語だけは特別の関数を作ったが,悪魔の数え方の名に恥じない中々の複雑 なアルゴリズムである. 実行例を示す. run '' お好きな数(<100)を入れてください 8 日本語: はち 中国語: 八 パー 2 英語: eight ドイツ語: acht フランス語: huit スペイン語: ocho エスペラント語: ok *** 何語がよいですか? *** run '' お好きな数(<100)を入れてください 41 日本語: よんじゅういち 中国語: 四十一 スーシーイー 英語: forty one ドイツ語: einundvierzig フランス語: quarante et un スペイン語: cuarenta y uno エスペラント語: kvardek unu *** 何語がよいですか? *** run '' お好きな数(<100)を入れてください 72 日本語: ななじゅうに 中国語: 七十二 チーシーアル 英語: seventy two ドイツ語: zweiundsiebzig フランス語: soixante-douze スペイン語: setenta y dos エスペラント語: sepdek du *** 何語がよいですか? *** run '' お好きな数(<100)を入れてください 95 日本語: きゅうじゅうご 中国語: 九十五 チューシー ウー 英語: ninty five ドイツ語: fuenfundneunzig フランス語: quatre-vingt-quinze スペイン語: noventa y cinco エスペラント語: nawdek kvin *** 何語がよいですか? *** 3 2.古代ローマの計算は大変だった 次に西洋の源泉である古代ローマに始まり中世を通じて使われたローマ数字 (時計数字)を扱ってみよう . 通常の数表記−とくに空位の桁 ’ 0’ を考慮した表記法はインドに始まると いわれるが,これはアラビアに伝わり(日本ではアラビア数字といわれるが), 現代の数表記となった. 一方,ローマ数字は空位の’ 0’がないのは,中国,日本と同じだが,次のよう な(人間的といえばそれまでだが),表し方をする. 1: I 2: II 3: III 4: IV 5: V 6: VI 7: VII 8: VIII 9: IX 10: X さらに続いて 100 は C,1000 は M と別の文字を使う.これを空位の桁をあけ ずに続け書きする. パリの大学や寺院の入り口の壁に創立の年などがローマ数字で記されている とそれなりにカッコいいが,これを判読するには理屈はわかっていてもちょっ と見ただけでは読めたものではない. 以下のJのプログラムを作った. 通常数→ローマ数 rom ローマ数→通常数 drom 実行例は次のようである. rom 2313 MMCCCXIII rom 2303 MMCCCIII rom 1998 MCMXCVIII drom 'MMCCCXIII' 2313 drom 'MMCCCIII' 2303 drom 'MCMXCVIII' 1998 アルゴリズムの詳細はプログラム・リストを見ていただくとして,これは基 底変換などというよりは一種の機械翻訳である.とくに空位の桁に ’0’ をつけ ずベッタリ書いたローマ数字表記から J のボックスを用いて区切る処理はまさ に Persing でかなり複雑なプログラムになる. 4 3.おわりに 古代ローマ時代では筆算というより計算にはソロバンを用いたというが,よ くこれでローマ帝国の経済から凱旋門やコロッシウムなど土 木,建築の計算が できたものとふしぎにさえ思える.それに引き替え,インドの数表記,’0’ の 採用,また10進法に徹した中国,日本の数表記の合理性−「これぞ光は東方 より来たれり」,といっても良い.最近の元気を喪失した日本のありさまをみる につけても,自らにも聞かせつつ「もう少し自信を持って」,将来を考えたいと 思う. 付録 プログラム・リスト (1) いろいろな言語での数の読み方 NB. Multi-lingual Numbering NB. by T. Nishikawa 2002 -1-27 rd =: 1!:1 wr =: 1!:2&2 run =: 3 : 0 wr 'お好きな数(<100)を入れてください' N =. rd 1 wr '日本語: ','J' numb0 ".N wr '中国語: ','C' numb0 ".N wr '英語: ','A' numb1 ".N wr 'ドイツ語: ','G' numb1 ".N wr 'フランス語: ','F' numb2 ".N wr 'スペイン語: ','S' numb1 ".N wr 'エスペラント語: ','E' numb0 ".N '*** 何語がよいですか? ***' ) DA_J=: 'れい';'い ち';'に';'さ ん';'よん';'ご';'ろ く';'な な';'はち';'き ゅう';'じゅう';'ひゃく' DA_C=: ' 零 リン';'一 イー';'二 アル';'三 サン';'四 スー';'五 ウー';'六 リュー';'七 チー';'八 パー';'九 チュー';'十 シー';'百 バイ' DA_E=:'nulo';'unu';'du';'tri';'kvar';'kvin';'ses';'sep';'ok';'naw';'de k';'cent' 5 DA_A=:'zero';'one';'two';'three';'four';'five';'six';'seven';'eight';' nine';'ten';'eleven';'twelve';'thirteen';'fourteen';'fifteen';'sixteen ';'seventeen';'eighteen';'ninteen';'twenty';'thirty';'forty';'fifty';' sixty';'seventy';'eighty';'ninty';'hundred' DA_G=:'Zero';'ein';'zwei';'drei';'vier';'fuenf';'sechs';'sieben';'acht ';'neun';'zehn';'elf';'zwoelf';'dreizehn';'vierzehn';'fuenfzehn';'schz ehn';'siebzehn';'actzehn';'neunzehn';'zwanzig';'dreiszig';'vierzig';'f uenfzig';'sechzig';'siebzig';'achtzig';'neunzig';'hundert' DA_F=:'zero';'un';'deux';'trois';'quatre';'cinq';'six';'sept';'huit';' neaf';'dix';'onze';'douze';'treize';'quatorze';'quinze';'seize';'dix-s ept';'dix-huit';'dix -neuf';'vingt';'trente';'quarante';'cinq uante';'so ixante';'soixante-dix';'quatre-vingt';'quatre -vingt-dix';'cent' DA_S=:'cero';'uno';'dos';'tres';'cuatro';'cinco';'seis';'siete';'ocho' ;'nueve';'diez';'once';'doce';'trece';'catorce';'quince';'dieciseis';' diesiete';'dieciocho';'diecinueve';'veinte ';'treinta';'cuarenta';'cinc uenta';'sesenta';'setenta';'ochenta';'noventa';'ciento' num =: 3 : 0 : y. { ".'DA_', x. ) NB. for Japanese, Chinese, Esperanto numb0 =: 3 : 0 : if. (x. = 'A') +. (x. = 'G') +. (x. = 'S') do. 'Error - use function numb1' return. end. if. (x. = 'F') do. 'Error - use function numb2' return. end. if. y. = 100 do. ; x. num 11 return. end. if. y. > 10 do. y1 =. <. y.%10 [ y0 =. 10 │ y. R =. (x. num y1) , (x. num 10), (x. num y0) if. y1 < 2 do. R =. (x. num 10), (x. num y0) end. if. y0 = 0 do. R =. }: R end. if. x. = 'E' do. if. y1 > 1 do. (;x. num y1), (;x. num 10), ' ', (;x. num y0) else. (;x. num 10), ' ', (;x. num y0) end. 6 return. end. if. x. = 'C' do. (,> 2 {. each R),' ',(,> 3 }. each R) return. end. ; R return. end. ; x. num y. ) NB. for English, German, Spanish numb1 =: 3 : 0 : if. (x. = 'J') +. (x. = 'C') +. (x. = 'E') do. 'Error - use function numb0' return. end. if. x. = 'F' do. 'Error - use function numb2' return. end. if. y. = 100 do. ; x. num 28 return. end. if. y. > 20 do. y1 =. 18 + y1 =. <. y.%10 [ y0 =. 10 │ y. ('D1';'D0') =. (x. num y1), (x. num y0) if. y0 = 0 do. (;D1) return. end. if. x. = 'A' do. (;D1), ' ', (;D0) return. end. if. x. = 'G' do. (;D0), 'und', (;D1) return. end. if. x. = 'S' do. (;D1), ' y ', (;D0) return. end. if. x. = 'F' do. if. y. < 70 do. 'No' end. if. y0 : 1 do. (;D1), '-', (;D0) else. (;D1), ' et ', (;D0) end. return. end. D1, D0 return. end. D =. x. num y. if. (x. = 'G') *. (y. = 1) do. (; D),'s' return. end. ; D ) 7 NB. for French only numb2 =: 3 : 0 : if. x. : 'F' do. 'Error - French only' return. end. if. y. = 100 do. ; x. num 28 return. end. if. y. < 20 do. ;x. num y. return. elseif. y. < 71 do. y1 =. 18 + <. y.%10 [ y0 =. 10 │ y. elseif. y. < 80 do. y1 =. 24 [ y0 =. y. - 60 elseif. '' do. y1 =. 26 [ y0 =. y. - 80 end. ('D1';'D0') =. (x. num y1), (x. num y0) if. y0 = 0 do. (;D1) if. y. = 80 do. (;D1),'s' end. return. end. if. y. > 80 do. (;D1), '-', (;D0) return. end. if. (y0 = 1) +. (y0 = 11) do. (;D1), ' et ', (;D0) else. (;D1), '-', (;D0) end. ) (2) ローマ数字と通常の数との変換 NB. Roman Number System NB. Convert Ordinary/Roman Number NB. by T. Nishikawa 2002/2/25 wr=: 1!:2&2 R0 =: ' ';(,'I');'II';'III';'IV';(,'V');'VI';'VII';'VIII';'IX' R1 =: ' ';(,'X');'XX';'XXX';'XL';(,'L');'LX';'LXX';'LXXX';'XC' R2 =: ' ';(,'C');'CC';'CCC';'CD';(,'D');'DC';'DCC';'DCCC';'CM' R3 =: ' ';(,'M');'MM';'MMM';'MY';(,'Y');'YM';'YMM';'YMMM';'MZ' RR =: R3, R2, R1,: R0 NB. 5000 = 'Y', 10000 = 'Z' NB. Ordinary Number converted to Roman Number NB. rom 3906 => MMMCMVI 8 rom =: 3 : 0 select. y. case. 1 do. 'I' return. case. 10 do. 'X' return. case. 100 do. 'C' return. case. 1000 do. 'M' return. end. dt =. >.10&^.y. cf =. (dt#10) #: y. R =. (-dt) {. 4 10$R3,R2,R1,R 0 RM =.(,. cf) {"(1) R (; RM) -. ' ' ) NB. NB. NB. NB. NB. No. of digits takeout digits Roman numbers encode to Roman ravel & remove space NB. DeRomanize into Ordinary Number NB. drom 'MMMCMVI' => 3906 drom =: 3 : 0 Y =. y. ss =: 'MZ' E. y. tt =: 'CM' E. y. uu =: 'XC' E. y. vv =: 'IX' E. y. NINE =: (+/ss),(+/tt),(+/uu),(+/vv) if. 0 = +/NINE do. N =. drom08 y. return. end. if. 1 = (+/s =. 'MZ' E. Y) do. Y =. (-. +/s,: _1│.s)#Y if. 1 = (+/t =. 'CM' E. Y) do. Y =. (-. +/t,: _1│.t)#Y if. 1 = (+/u =. 'XC' E. Y) do. Y =. (-. +/u,: _1│.u)#Y if. 1 = (+/v =. 'IX' E. Y) do. Y =. (-. +/v,: _1│.v)#Y N9 =. drom08 Y N =. N9 + +/NINE#9000, 900, 90, 9 ) drom08 =: 3 : 0 NB. exclude Roman 9(MZ, CM, XC, IX) Y =. y. if. 0 < IX3 =. >./ +/¥('M'=Y)+.('Y'=Y) do. RM =. <IX3{.Y Y =. IX3}. Y else. RM =. <' ' 9 end. end. end. end. end. if. 0 < IX2 =. >./ +/¥('C'=Y)+.('D'=Y) do. RM =. RM, <IX2{.Y Y =. IX2}. Y else. RM =. RM, <' ' end. if. 0 < IX1 =. >./ +/¥('X'=Y)+.('L'=Y) do. RM =. RM, <IX1{.Y Y =. IX1}. Y else. RM =. RM, <' ' end. if. 0 < IX0 =. >./ +/¥('I'=Y)+.('V'=Y) do. RM =. RM, <IX0{.Y Y =. IX0}. Y else. RM =. RM, <' ' end. NN =. RR i. "(1) ,. RM ". (": , NN) -. ' ' ) 10
© Copyright 2024 Paperzz