2013年10月23日水曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 13章(新しいクラスの作成と既存クラスの変更), 13.1(練習問題)、組み込みクラスの拡張、を解いてみる。

その他参考書籍

バースデーヘルパー!

コード(BBEdit)

sample.rb

#!/usr/bin/env ruby2.0
#-*- coding: utf-8 -*-

class Array
    def shuffle
       recursive_shuffle self, [] 
    end
    
    private
    def recursive_shuffle unshuffled_array, shuffled_array
        return shuffled_array if unshuffled_array.length == 0
        l = unshuffled_array.length
        r = rand l
        shuffled_array.push unshuffled_array[r]
        tmp = unshuffled_array.slice(0, r) + 
              unshuffled_array.slice(r + 1, l)
        recursive_shuffle tmp, shuffled_array
    end
end

class Integer
    def factorial
        return '負の数' if self < 0
        return 1 if self <= 1
        self * (self - 1).factorial
    end
    def to_roman
        nums = self
        result = ""
        num_roman = {1000 => 'M',
                     100 => {5 => 'D',
                             1 => 'C'},
                     10 => {5 => 'L',
                            1 => 'X'},
                     1 => {5 => 'V',
                           1 => 'I'}}
        keys = num_roman.keys.sort.reverse
        k = keys.shift
        n = nums / k
        nums = nums % k
        c = num_roman[k]
        pre_c = c
        result += c * n
        keys.each do |k|
            roman = num_roman[k]
            roman_five = roman[5]
            roman_one = roman[1]
            n = nums / k
            nums = nums % k
            if n == 9
                result += roman_one + pre_c
            elsif n == 4
                result += roman_one + roman_five
            else
                result += roman_five * (n / 5)
                result += roman_one * (n % 5)
            end
            pre_c = roman_one
        end
        result
    end
end

puts [1,2,3,4,5,6,7,8,9,10].shuffle.join ' '

puts "10 ! = #{10.factorial}"
n = 1234
puts "#{n}: #{n.to_roman}"

入出力結果(Terminal)

$ ./sample.rb
8 6 4 10 9 2 7 1 3 5
10 ! = 3628800
1234: MCCXXXIV
$

ちなみにpython3.4の場合。

コード(BBEdit)

sample.py

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import random

class MyList(list):
    def shuffle(self):
        return self.recursiveShuffle([])
    
    def recursiveShuffle(self, shuffled_list):
        unshuffled_list = self
        if len(unshuffled_list) == 0:
            return shuffled_list
        r = random.randint(0, len(unshuffled_list) - 1)
        shuffled_list.append(unshuffled_list[r])
        tmp = unshuffled_list[0:r] + unshuffled_list[r + 1:]
        return MyList(tmp).recursiveShuffle(shuffled_list)
            
class MyInt(int):
    def factorial(self):
        if self < 0:
            return '負の数'
        if self <= 1:
            return 1
        return self * MyInt(self - 1).factorial()
    def romanNumeral(self):
        num = self
        result = ''
        num_roman = {
            1000: 'M',
            100: {5: 'D', 1: 'C'},
            10: {5: 'L', 1: 'X'},
            1: {5: 'V', 1: 'I'}
        }
        keys = sorted(num_roman.keys(), reverse=True)
        k = keys.pop(0)
        n = num // k
        num = num % k
        c = num_roman[k]
        pre_c = c
        result += c * n
        for k in keys:
            roman = num_roman[k]
            roman_five = roman[5]
            roman_one = roman[1]
            n = num // k
            num = num % k
            if n == 9:
                result += roman_one + pre_c
            elif n == 4:
                result += roman_one + roman_five
            else:
                result += roman_five * (n // 5)
                result += roman_one * (n % 5)
            pre_c = roman_one
        return result

n = MyInt(1294)

print(' '.join(map(lambda x: str(x), 
                   MyList([1,2,3,4,5,6,7,8,9,10]).shuffle())))
print('10! = {0}'.format(MyInt(10).factorial()))
print('{0}: {1}'.format(n, n.romanNumeral()))

入出力結果(Terminal)

$ ./sample.py
8 1 2 10 7 3 5 6 4 9
10! = 3628800
1294: MCCXCIV
$

0 コメント:

コメントを投稿