CheckIO 题目解法(2)

1.  Roman numerals 将阿拉伯数字转成罗马数字,可以这样写,不过不是很高效:

def checkio(num):
    a_num = range(1, 11) + [50, 100, 500, 1000]
    r_num = ('I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X',\
             'L', 'C', 'D', 'M')
    num_dict = (dict(zip(a_num, r_num)))
    res = ''
    if num == 0:
        return ''
    if num in a_num:
        return num_dict[num]
    else:
        str_num = str(num)
        length = len(str_num)
         
        if length == 2:
            first_num = int(str_num[0])
            last_num = int(str_num[1])
            if first_num <= 3:
                res += num_dict[first_num].replace('I', 'X') + \
                       num_dict[last_num]
            elif first_num == 4:
                res += ('XL' + num_dict[last_num])
            elif first_num == 5:
                res += ('L' + num_dict[last_num])
            elif first_num != 9:
                res += ('L' + num_dict[first_num - 5].replace('I', 'X') + num_dict[last_num])
            else:
                res += ('XC' + num_dict[last_num])
 
        if length == 3:
            first_num = int(str_num[0])
            if first_num <= 3:
                res += num_dict[first_num].replace('I', 'C') + \
                       checkio(int(str_num[1:]))
            elif first_num == 4:
                res += ('CD' + checkio(int(str_num[1:])))
            elif first_num == 5:
                res += ('D' + checkio(int(str_num[1:])))
            elif first_num != 9:
                res += ('D' + num_dict[first_num - 5].replace('I', 'C') + checkio(int(str_num[1:])))
            else:
                res += ('CM' + checkio(int(str_num[1:])))
 
        if length == 4:
            first_num = int(str_num[0])
            res += ('M' * first_num + checkio(int(str_num[1:])))
             
    return res

 

2. Transposed Matrix  转置矩阵 Python CookBook里的方法:

def checkio(data):
    return map(list, zip(*data))

 

3. The Angles of a Triangle 给出三角形三条边,求出来三个角度,需要用余弦定理(CosA = (b*b + c*c - a*a)/(2*b*c))

import math

def checkio(a, b, c):
    res = [0, 0, 0]
    if not (a+b>c and a+c>b and b+c>a):
        return res
    else:
        cos_A = (b**2 + c**2 - a**2) / (2.0*b*c)
        num1 = int(round(math.degrees(math.acos(cos_A)))) # 四舍五入方法 int(round(num))
        cos_B = (c**2 + a**2 - b**2) / (2.0*a*c)
        num2 = int(round(math.degrees(math.acos(cos_B))))
        num3 = 180 - num1 - num2
        res = sorted([num1, num2, num3])
    return res

 

4.restricted-sum 计算一个数字列表的加和,但是不许使用sum, for, while, import, reduce这几个keywords,可以写这么一行:

def checkio(alist):
    return eval('+'.join(map(str,alist)))

 如果再加一个不能使用'+'的条件,那就这样:

def checkio(alist):
    return eval(chr(43).join(map(str,alist)))

 

 5.x-o-referee 判断井字棋游戏是否获胜的问题:

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

def checkio(game_status):
    # 判断3行
    row = [i[0] for i in game_status if i[0] in 'XO' and i.count(i[0]) == 3]
    if row:
        return row[0]
    # 根据中心点判断
    center = game_status[1][1]
    if center in 'XO':
        if [center, game_status[0][2], game_status[2][0]].count(center) == 3:
            return center
        elif [center, game_status[0][0], game_status[2][2]].count(center) == 3:
            return center
    # 判断3列
    for i in xrange(0, 3):
        first = game_status[0][i]
        if first in 'XO':
            second = game_status[1][i]
            third = game_status[2][i]
            if [first, second, third].count(first) == 3:
                return first
    return 'D'    

 6.even-last 把一个list的偶数下标和最后一个元素乘积返回:

def checkio(array = None):
    if array:
        #print array[::2]
        return array[-1] * sum(array[::2]) 
    return 0

7.  most-numbers 计算一个list中的最大值和最小值的差:

def checkio(*array):
    if len(array) == 0:
        return 0
    return round(max(array) - min(array), 3)

 8. digits-multiplication 把一个数字的非0数相乘起来:

def checkio(num):
    return reduce(lambda a,b: a*b, map(lambda s_num: int(s_num) if (s_num!='0') else 1, str(num)))

 9.common-words 得到两个字符串按照','分割的相同单词:

def checkio(stra, strb):
   return ','.join(sorted(list(reduce(lambda a,b: a&b, map(lambda s: set(s), [i.split(',') for i in [stra, strb]])))))

 10. fizz-buzz问题:

def checkio(num):
    if num % 3 == 0 and num % 5 == 0:
        return "Fizz Buzz"
    if num % 3 == 0:
        return "Fizz"
    if num % 5 == 0:
        return "Buzz"
    return str(num)

 

 

 

 

posted @ 2013-12-26 20:26  jaw-crusher  阅读(907)  评论(1编辑  收藏  举报