10「ローマ数字変換器を作ってみよう」の問題と解説

今回はローマ数字を(通常の)アラビア数字に変換するプログラムです。
99名もの方が挑戦してくれました。本当にありがとうございます。

問題文

ローマ数字変換器を作ってみよう!

ローマ数字をアラビア(通常の)数字に変換するプログラムをPythonで作ってみましょう。

■ローマ数字について

ローマ数字はラテン文字の一部を使って、I, II, III, IV, X, XVなどのように数を表す方法です。I, V, X, L, C, D, Mがそれぞれ1, 5, 10, 50, 100, 500, 1000を表します。

通常は大きい数字から左から順に加算していきます。しかし例外的な減算則があり、4や9などはそれより小さい数の文字を左においてIVやIXと書きます。つまり、
IV = - I + V 4 = - 1 + 5
IX = - I + X 9 = - 1 + 10

のように表します。XIVは14となります。
XIV = X + (= I + V) 14 = 10 + (- 1 + 5)

詳しくは下記を参考。
http://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%9E%E6%95%B0%E5%AD%97

■プログラムについて

あまり複雑になりすぎない簡単なPythonプログラムにしてください。
使われるローマ文字はI, V, X, L, C, D, Mでこれらの組み合わせとなります。
4, 9, 40, 90 ,400, 900等の減算則に注意してローマ数字からアラビア(通常の)数字へのプログラムを作成してください。
実行関数はmain()として、main('XIV')の結果は以下のようにprintで表示されるようにしてください。
XIV = 14

下記の結果を出力するプログラムを送ってください。
main('XLIX')
main('MDCCCLXXXVIII')
main('MCMXLV')
main('MMMCMXCIX')

構文解析ツールついては適切なフィードバックはできませんので、それを使わずに解答してください。私の回答不要の場合は使ってもOKです(評点は付けます)。

■解答方法
作成したPythonプログラムをテキストファイル(roman.txt)に変換しアップロードしてください。

ローマ数字は簡単な規則でできていると思っていましたが、実際に解答者のやり方を見ると、いろいろなやり方(まとめ方)があるので、びっくりしました。

半分ぐらいがアルファベット文字列を他の文字列に置き換えてしまうという方法でした。まず例外(減算)処理のIV(4)やIX(9)をIIIIやVIIII等に変換し、その後、通常の(加算)処理として他の文字をI(1)やX(10)に置き換えるやり方です。
IV → IIII
IX → VIIII 等

私が考えたのは、文字を逐一変換していく方法です。この方法で重要なのは文字の評価を左からするのではなく、右から評価していくという事です。
通常の評価では隣り合った文字は、後の文字 ≧ 前の文字 となります。例えば、VIではV(5) > I(1) となるのでVの評価値は+5となります。
...XVII... ← 評価方向
一方、例外となる減算処理では、後の文字 < 前の文字 となります。例えば、CXでは X(10) < C(100) となるので、Xの評価値は-10はとなります。
...MXCXX... ← 評価の方向

このやり方では、IIX(8)やXXC(80)等のイレギュラーな文字列は扱えませんが、同じ文字(例えばIII)をひとまとまりとしてグルーピングすれば、そのようなイレギュラーな文字列も扱えます。

解答例

#!/usr/bin/python
#
#                               roman2.py
#

class Parser:

    def __init__(self):

        self.value = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1, '$':0}

    def compute(self, w):

        num = 0
        prev = '$'
        for x in w[::-1]:
            if self.value[x] >= self.value[prev]:
                factor = +1     # ADDITION
            else:
                factor = -1     # SUBTRACTION
            #print x, '%+d' % (factor * self.value[x])
            num += factor * self.value[x]
            prev = x            # STORE THE PREVIOUS CHARACTER
        return num

def main(s):
    
    p = Parser()
    print s, '=', p.compute(s)

#####
main('XLIX')
main('MDCCCLXXXVIII')
main('MCMXLV')
main('MMMCMXCIX')

どうでしょうか。皆さんはどんなローマ数字変換器ができたでしょうか。

CodeIQで問題作成してますので、他の問題も挑戦してみてください。
https://codeiq.jp/ace/kawagashira_nobuyuki/

大阪立て直しの処方箋:高校教育の質を高めよ

Increase Osaka Education Quality of High Schools!

政府統計データの解析から、大阪府の立て直しには高校教育の質の向上が必要であることが分かった。他に、保育園・幼稚園の数、小学校、小学校教師の数等も経済活性化に有効であることが分かった。

Governmental statistic data analysis revealed that educational quality like high school is the most important for Osaka economy. Furthermore, increasing the number of kindergartens, elementary schools, and their teachers is also critical.

政府統計データe-Statを利用し、大阪府のデータを解析した。大阪府の経済的要因124個を抽出し、ネットワークを描くことで、大阪府の隠れた活性化要因を見つけようと思う。
大阪府の経済要因ネットワーク図
124個の要因のネットワークは下記のようになった。

仕事中心と生活中心
大阪府の要因ネットワークは大きく2つの極に分かれた。それは「仕事中心の世界」と「生活中心の世界」だ。図では、上側の赤い部分が「仕事中心の世界」があり、下側の緑の部分が「生活中心の世界」となっている。
「仕事中心の世界」は、主に、大人や従業員関連の要因からなっており、「生活中心の世界」は世帯関連の要因がひしめき合っている。
この大きな2つの極とは別に、「生活中心の世界」の近くに学校と老人からなる「教育の世界」が存在する。おそらく、学校制度と老人の生活とが何らかの形で結びついているのであろう。

どの指標が良いのか?
各経済要因の相関係数を計算し、経済要因同士の強さとして相関係数を使って、要因ネットワークを描いた。ネットワーク内における要因(ノード)の重要性はグーグルランク等の指標で測ることができるが、隠れた経済要因を見つけるためにbetweennessという指標を計算してみた。betweennessとはネットワーク全体の中でその要因を必ず通過しなければならないボトルネックとなる弱点(?)を測るための指標である。このbetweennessに注目して解析してみよう。

Betweennessトップ10

このbetweennessの指標で見ると、「労働者数」、「一般世帯数」がそれぞれ1位、2位となっている。労働者や世帯数が増えれば、経済が活性化するのは当然であろう。
ここで注目して欲しいのは、「学生1人当たりの高校数」(3位)、「園児1人当たりの保育園・幼稚園数」(6位)、「児童1人当たりの小学校数」(9位)、「児童1人当たりの小学教師数」(10位)という教育関連の要因が上位に入っていることだ。元大阪市長橋下徹氏が教育改革について熱く議論し、変革しようとしているのも合点がいく。大阪において教育への投資が最も経済活性化に効いてくるのだ。
他には「郵便局数」も4位となっており、コミュニティの中心として郵便局の役割が重要になっているのかも知れない。

大阪経済の概要
前掲のネットワーク図を簡略化すると以下のようなダイアグラムになる。

ここで注目すべきは、真ん中に位置する「税金収入額と納税者数」である。他の自治体では「税金収入額と納税者数」は「仕事中心の世界」の中か近く位置するのが普通であるが、大阪の場合は大きな極(仕事中心の世界と生活中心の世界)の間に位置している。税金関連要因が大きな要因群から離れているということは、他の要因の影響を受けにくいという事で、税金自体の収集が難しいことを表していると言える。大阪が財政難に苦しんでいるのも、このダイアグラムを見ると一目瞭然である。税金関連要因に隣接しているのは、「金融業を含めた第3次産業労働者数」と「一般世帯数」であるので、税金を増やすにはこの要因を増加させる必要がある。

高校数の少ない市区町村
人口に対する高校数が大阪の活性化につながっている。従って、人口に対する高校数が少ない市区町村に対し、高校数を増やし行くのが良い政策であると思う。人口に対する高校数の少ない市区町村は以下の通りである。とりあえずは、人口密集地域にある大阪市の東成区、東住吉区、西区、浪速区淀川区堺市の北区に高校を作ることからはじめるのが良いだろう。

大阪は教育重視の政策が必要
以上のように、大阪の活性化には教育へ投資が重要である。特に、高校、小学校、小学校教師、保育園・幼稚園を増やすことが早急な課題である。長期的視野に立てば、教育への投資が最も大阪の発展につながり、経済が活性化すれば、次第に財政難の問題も解決するのではないかと思う。

横浜は中学生、中学教師が活性化の鍵。保育園・幼稚園の増加が老人問題解決に

ネットワーク解析で探る横浜市の経済構造

横浜市国勢調査データのネットワーク解析から以下のことが分かった。

中学生、中学校教師、大型小売店、百貨店の増加が商業を活性化させる。
・交通事故が他にも影響を与えてしまう重要な課題
保育園・幼稚園の増加が老人問題や生活者の問題を解決する
・製造業一般の発展が必要。

Network Analysis of Yokohama City

Junior high school students and teachers, and big stores and department stores will activate the commerce in Yokohama.
The traffic accidents is a critical problem since it affects all aspects of Yokohama economy.
The increase of number of kindergartens will solve the problem of aged people or daily life.
Manufacturing is important for Yokohama.

Falconのspeed-to-flyを計算してみた

ハンググライダーをやってみて、先輩からシンクの時はスピードを上げた方が良いというアドバイスを受けた。しかし、どうしてもその理屈が納得いかなかった。だが、テキストを読んでみて、はじめてその意味に納得した。シンクではベストグライドのスピードが変わるのだった。シンクだけではなく、リフト、向かい風、追い風(フォロー)でもベストグライドのスピードが変わるのだ。目から鱗

Calculation of speeds-to-fly for Wills Wing Falcon. The best glide speed varies for sink, lift, head wind, and tail wind.

そこで、Falconのspeed-to-flyを計算してみた。

ちょっとわかりにくい所もあるけど、計算結果は以下の通り。

km/h m/s
34   0.5
35   0.7
37   1.2
40   2.2
42   3.3
44   5.0

パリオのインジケーターのシンク部分にセロハンテープを張って、speed-to-flyを書き込んだ。

インジケータ部分は見にくいので、シンク・スピード対応表も貼っておいた。

参考
Chapter 7: Using Speeds-to-Fly in Performance Flying by Dennis Pagen

都知事選解析:舛添、伊豆諸島、東京都東部で人気。田母神を支持する中心部の保守層。

都知事選の選挙結果を解析したところ、舛添氏は伊豆諸島、東京都東部で人気があった。宇都宮氏と田母神氏は対立。宇都宮氏は北部で、田母神氏は中心部で人気。浮動票は細川氏に流れた。

Data Analysis of Tokyo gubematorial election in 2014 revealed that Masuzoe was popular in Izu islands and eastern Tokyo. Utsunomiya was opposed to Tamogami each other. Utsunomiya is popular in the north, although Tamogami is in the center of Tokyo. Floating votes were going into Hosokawa.

先日の都知事選の投票結果は、舛添要一氏が当選し、以下のような順位になった。
1. 舛添要一
2. 宇都宮健児
3. 細川護煕
4. 田母神俊雄
5. 家入一真
6. ドクター・中松

さて、これらの候補者はどの市区町村で得票数を上げたのであろうか。この選挙結果から何か面白いことはわからないだろうか。そこで、私は選挙結果のデータから主成分分析をすることにした。

するど、固有ベクトルは次のようになった。

要因1〜3の3つの寄与率はそれぞれ86.1%, 9.0%, 4.0%で、累積寄与率99.5%となった。つまり、この3つの要因で、選挙結果の99.5%を説明できるという事だ。要因でプラスに働くものを緑、マイナスを黄色で塗った。

要因1〜3の累積寄与率が99.5%なので、上位4位の候補者での票争いとなっている。

要因1は、当選した舛添氏支持者を表しているようだ。この要因1のグループは宇都宮氏と細川氏に反対しているが、積極的に舛添氏を指示しているの舛添派と言える。
要因2は、宇都宮氏は好きだが、田母神氏は嫌いという人々だ。逆にこの値がマイナスだと田母神氏は好きだが、宇都宮氏は嫌いということだ。この要因2のグループは、親宇都宮・反田母神と呼ぼう。
要因3は、舛添氏と宇都宮氏のことは好きだが、細川氏は嫌いというグループだ。細川氏を嫌いという動機で、舛添、宇都宮票を増やしている浮動票の層と言える。したがって、反細川と呼ぼう。

候補者と支持者の相互の関係が分かりにくいので、関係図を書いてみる。

全体としては舛添氏の圧勝だ。宇都宮氏と田母神氏が対立している。細川氏は、これと言った特徴も無いので、三者のどれにも投票したくない浮動票を獲得しているようだ。

東京都の市区町村の投票傾向を調べるために、要因1と2のスコアで散布図を書いてみると面白いことが分かってきた。x軸は要因1の舛添派で、右に行くほど舛添支持である。y軸は親宇都宮・反田母神で、上に行けば宇都宮支持、下に行けば田母神支持となっている。

図を見ると、舛添氏は伊豆諸島に人気で、江戸川区墨田区江東区葛飾区等の東部でも人気である。東京都の東部とは江戸から続く歴史のある地区で人気という事だ。宇都宮氏は、清瀬市東久留米市等の北部で人気だ。面白いのは、田母神氏は東京の経済中心地の千代田区中央区、港区等の支持が強い。

舛添氏は伊豆諸島、東京都東部で人気があり、圧倒的勝利を収めた。田母神氏は得票数が四位であったが、東京都の中心部の千代田区中央区、港区等で人気であった。東京都の中央部は経済の中心でもあり、富裕層が集中しているが、それらの層が保守化しているのが気になるところである。

茨城県、医療・福祉で活性化

茨城県国勢調査データをネットワーク解析したところ、茨城県の隠れた活性化因子がみつかった。それは、医療・福祉の充実化である。

茨城県では税金収入元と納税者が分かれている。
税金収入の多くは都市部生活者から来ている。
しかし、納税者の多数は農村部に存在している。
つまり、都市部に住む少数の納税者が大部分の税金を収めている。
税金収入を増やすためには都市部の活性化が必要。
だが、茨城全体の経済を活性化させるには医療・福祉の充実化が最も良い政策。

福岡県は娯楽産業で活性化

福岡県は娯楽産業で税金収入が増加。商業・製造業労働者の増加も福岡県全体の経済を活性化させる。

福岡県は娯楽産業で活性化(スライド資料)

国勢調査データを使って、福岡県のネットワーク分析を行った。

福岡県の経済社会は女性中心の社会と過去の社会の2つに大きく分かれることが分かった。

福岡県の活性化には以下のことが必要。
最も効果的に税金収入を増やす道は、娯楽産業の活性化である。
商業と製造業の促進も、福岡県全体の経済の活性化につながる。
インフラ整備(電気・ガス・熱・水道業)、教育・学習支援業(塾など)、商業地価格も税収増加の要因となっている。