MCMXCIX (1999)   2012.05.10 GenesisLightningTalks    SAWADA Tadashi a.k.a. @cesare
こんにちは
沢田正@cesare
さっそくですが
お題
自然数→ローマ数字    変換
roman(3)  → "III"
roman(1999)→ "MCMXCIX"
ローマ数字
•1 → I      • 6 → VI• 2 → II    • 7 → VII• 3 → III   • 8 → VIII• 4 → IV    • 9 → IX•5 → V
• 10 → X     • 60 → LX• 20 → XX    • 70 → LXX• 30 → XXX   • 80 → LXXX• 40 → XL    • 90 → XC• 50 → L
•1 → I     • 100 → C•5 → V     • 500 → D• 10 → X   • 1000 → M• 50 → L
よくある間違い•IC → 99• IM → 999
変換アルゴリズムを 考えてください   (3分)
条件•1 ∼ 3999• IIII はナシ
•1 → I     • 100 → C•5 → V     • 500 → D• 10 → X   • 1000 → M• 50 → L
gist.github.com/2586858
解決編
ポイント•分割して統治せよ•どの桁の変換もパターンは同じ•低い方から計算すると楽
ポイント1•分割して統治せよ•どの桁の変換もパターンは同じ•低い方から計算すると楽
1231 2  3C XX III
20892  0 8     9MM   LXXX IX
•ある桁の変換は他の桁に依存しない•0 は空文字列に変換すればOK
戦略1•   数値を桁ごとに分解する
ポイント2•分割して統治せよ•どの桁の変換もパターンは同じ•低い方から計算すると楽
•0 →        •5 → V•1 → I      • 6 → VI• 2 → II    • 7 → VII• 3 → III   • 8 → VIII• 4 → IV    • 9 → IX
•0 →        •5 → L•1 → X      • 6 → LX• 2 → XX    • 7 → LXX• 3 → XXX   • 8 → LXXX• 4 → XL    • 9 → XC
•0 →        •5 → D•1 → C      • 6 → DC• 2 → CC    • 7 → DCC• 3 → CCC   • 8 → DCCC• 4 → CD    • 9 → CM
戦略2•変換関数は共通にできそう•桁ごとの文字を変えればOK
ポイント3•分割して統治せよ•どの桁の変換もパターンは同じ•低い方から計算すると楽
高い方の桁から 計算すると、
123 → [ 1, 2, 3 ]     最初の要素は何の桁?
逆にする
123 → [ 3, 2, 1 ]•3 → 1の桁• 2 → 10の桁•1 → 100の桁
1234 → [ 4, 3, 2, 1 ]• 4 → 1の桁• 3 → 10の桁• 2 → 100の桁• 1 → 1000の桁
戦略3•数値の各桁を逆順に並べる•変換関数を低い方から順に使う
変換手順•数値を桁ごとに分解して逆順にする•桁ごとに変換する•変換結果を逆順に直す•文字を連結する
計算例
1999→ [ 9, 9, 9, 1 ]→ [ IX, XC, CM, M ]→ [ M, CM, XC, IX ]→ MCMXCIX
コード例• gist.github.com/2586858• github.com/cesare/roman-numeric
おまけ
Common Lisp の    場合
(format nil "~@r" 1234); => "MCCXXXIV"
Lisp 恐るべし((((;゚Д゚))))
One More Thing お題...
懇親会にて:)
以上、
ご清聴ありがとう ございました
end
Upcoming SlideShare
Loading in …5
×

MCMXCIX (1999)

1,609 views

Published on

2 Comments
3 Likes
Statistics
Notes
No Downloads
Views
Total views
1,609
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
3
Comments
2
Likes
3
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • 4,000 以上の数は表現できない。\n
  • 100 の前に置けるのは 10 だけ。\n1000 の前に置けるのは 100 だけ。\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • 100 + 20 + 3 に分ける\n\n
  • \n
  • \n
  • \n
  • \n
  • 1の桁\nI V X\n
  • 10の桁\nX L C\n
  • 100の桁\nC D M\n文字が違うだけで、並べ方のパターンは共通。\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • 1番目の要素は1の桁\n2番目の要素は10の桁\n3番目の要素は100の桁\n\n
  • 何番目の要素は何の桁なのか、が固定になっている。\n計算しやすい。\n
  • \n
  • \n
  • \n
  • \n
  • 後で Twitter に流す\n
  • \n
  • \n
  • (format) は C で言うところの printf()\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • MCMXCIX (1999)

    1. 1. MCMXCIX (1999) 2012.05.10 GenesisLightningTalks SAWADA Tadashi a.k.a. @cesare
    2. 2. こんにちは
    3. 3. 沢田正@cesare
    4. 4. さっそくですが
    5. 5. お題
    6. 6. 自然数→ローマ数字 変換
    7. 7. roman(3) → "III"
    8. 8. roman(1999)→ "MCMXCIX"
    9. 9. ローマ数字
    10. 10. •1 → I • 6 → VI• 2 → II • 7 → VII• 3 → III • 8 → VIII• 4 → IV • 9 → IX•5 → V
    11. 11. • 10 → X • 60 → LX• 20 → XX • 70 → LXX• 30 → XXX • 80 → LXXX• 40 → XL • 90 → XC• 50 → L
    12. 12. •1 → I • 100 → C•5 → V • 500 → D• 10 → X • 1000 → M• 50 → L
    13. 13. よくある間違い•IC → 99• IM → 999
    14. 14. 変換アルゴリズムを 考えてください (3分)
    15. 15. 条件•1 ∼ 3999• IIII はナシ
    16. 16. •1 → I • 100 → C•5 → V • 500 → D• 10 → X • 1000 → M• 50 → L
    17. 17. gist.github.com/2586858
    18. 18. 解決編
    19. 19. ポイント•分割して統治せよ•どの桁の変換もパターンは同じ•低い方から計算すると楽
    20. 20. ポイント1•分割して統治せよ•どの桁の変換もパターンは同じ•低い方から計算すると楽
    21. 21. 1231 2 3C XX III
    22. 22. 20892 0 8 9MM LXXX IX
    23. 23. •ある桁の変換は他の桁に依存しない•0 は空文字列に変換すればOK
    24. 24. 戦略1• 数値を桁ごとに分解する
    25. 25. ポイント2•分割して統治せよ•どの桁の変換もパターンは同じ•低い方から計算すると楽
    26. 26. •0 → •5 → V•1 → I • 6 → VI• 2 → II • 7 → VII• 3 → III • 8 → VIII• 4 → IV • 9 → IX
    27. 27. •0 → •5 → L•1 → X • 6 → LX• 2 → XX • 7 → LXX• 3 → XXX • 8 → LXXX• 4 → XL • 9 → XC
    28. 28. •0 → •5 → D•1 → C • 6 → DC• 2 → CC • 7 → DCC• 3 → CCC • 8 → DCCC• 4 → CD • 9 → CM
    29. 29. 戦略2•変換関数は共通にできそう•桁ごとの文字を変えればOK
    30. 30. ポイント3•分割して統治せよ•どの桁の変換もパターンは同じ•低い方から計算すると楽
    31. 31. 高い方の桁から 計算すると、
    32. 32. 123 → [ 1, 2, 3 ] 最初の要素は何の桁?
    33. 33. 逆にする
    34. 34. 123 → [ 3, 2, 1 ]•3 → 1の桁• 2 → 10の桁•1 → 100の桁
    35. 35. 1234 → [ 4, 3, 2, 1 ]• 4 → 1の桁• 3 → 10の桁• 2 → 100の桁• 1 → 1000の桁
    36. 36. 戦略3•数値の各桁を逆順に並べる•変換関数を低い方から順に使う
    37. 37. 変換手順•数値を桁ごとに分解して逆順にする•桁ごとに変換する•変換結果を逆順に直す•文字を連結する
    38. 38. 計算例
    39. 39. 1999→ [ 9, 9, 9, 1 ]→ [ IX, XC, CM, M ]→ [ M, CM, XC, IX ]→ MCMXCIX
    40. 40. コード例• gist.github.com/2586858• github.com/cesare/roman-numeric
    41. 41. おまけ
    42. 42. Common Lisp の 場合
    43. 43. (format nil "~@r" 1234); => "MCCXXXIV"
    44. 44. Lisp 恐るべし((((;゚Д゚))))
    45. 45. One More Thing お題...
    46. 46. 懇親会にて:)
    47. 47. 以上、
    48. 48. ご清聴ありがとう ございました
    49. 49. end

    ×