码迷,mamicode.com
首页 > 编程语言 > 详细

24点牌 递归算法

时间:2017-10-14 17:09:38      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:index   __new__   other   def   __name__   get   com   length   app   

# -*- coding: utf-8 -*-
import sys

class My24(int):

    def __new__(cls, int_num, trace=‘‘, last_opt=‘‘):
        obj = int.__new__(cls, int_num)
        return obj

    def __init__(self, int_num=0, trace=‘‘, last_opt=‘‘):
        self.val = int_num
        self.trace = trace if trace else str(int_num)
        self.last_opt = last_opt
        super(int, self).__init__(int_num)

    def __hash__(self):
        return hash(self.trace)

    def adjust_trace(self, opt):
        if opt in [‘*‘, ‘/‘] and self.last_opt in [‘+‘, ‘-‘, ‘/‘]:
                return ‘(‘ + self.trace + ‘)‘
        return self.trace

    def mk_trace(self, other, opt):
         return "{} {} {}".format(self.adjust_trace(opt), opt, other.adjust_trace(opt))

    def show_trace(self):
        print(self.trace)

    def __add__(self, other):
        trace = self.mk_trace(other, ‘+‘)
        last_opt = ‘+‘
        num = self.val + other.val
        return My24(num, trace, last_opt)

    def __sub__(self, other):
        trace = self.mk_trace(other, ‘-‘)
        last_opt = ‘-‘
        num = self.val - other.val
        return My24(num, trace, last_opt)

    def __div__(self, other):
        trace = self.mk_trace(other, ‘/‘)
        last_opt = ‘/‘
        num = self.val / other.val
        return My24(num, trace, last_opt)

    def __mul__(self, other):
        trace = self.mk_trace(other, ‘*‘)
        last_opt = ‘*‘
        num = self.val * other.val
        return My24(num, trace, last_opt)


def possibel_val(a, b):
    """ 不要负的和小数"""
    if a > b:
        a, b = b, a
    vals = [a + b, a * b]
    vals.append(b - a)
    if a and b % a == 0:
        vals.append(b / a)
    return vals

def possibel_val_by_list(list1, list2):
    return_list = []
    [return_list.extend(possibel_val(a, b)) for a in set(list1) for b in set(list2) ]
    return return_list

def comput24(*numbs):
    length = len(numbs)
    if length == 1:
        return [numbs[0]]
    if length == 2:
        return possibel_val(*numbs)
    elif length == 3:
        possibel_1 = possibel_val_by_list(numbs[:1], comput24(*numbs[1:]))
        possibel_2 = possibel_val_by_list(comput24(*numbs[:2]), numbs[2:])
        possibel_3 = possibel_val_by_list([numbs[1]], comput24(numbs[0], numbs[2]))
        return possibel_1 +  possibel_2 + possibel_3
    elif length == 4:
        possibel_1 = possibel_val_by_list([numbs[0]], comput24(numbs[1], numbs[2], numbs[3]))
        possibel_2 = possibel_val_by_list([numbs[1]], comput24(numbs[0], numbs[2], numbs[3]))
        possibel_3 = possibel_val_by_list([numbs[2]], comput24(numbs[0], numbs[1], numbs[3]))
        possibel_4 = possibel_val_by_list([numbs[3]], comput24(numbs[1], numbs[2], numbs[0]))

        possibel_5 = possibel_val_by_list(comput24(*numbs[:2]), comput24(*numbs[2:]))
        possibel_6 = possibel_val_by_list(comput24(numbs[0], numbs[2]), comput24(numbs[1], numbs[3]))
        possibel_7 = possibel_val_by_list(comput24(numbs[0], numbs[3]), comput24(numbs[1], numbs[2]))
        return possibel_1 + possibel_2 + possibel_3 + possibel_4 + possibel_5 + possibel_6 + possibel_7

def print_val_trace(possibels):
    if not isinstance(possibels, (list, tuple, set)):
        print possibels.val, ‘<=‘, possibels.trace
        return
    for item in possibels:
        print item.val, ‘<=‘, item.trace

def run(a, b, c, d, target_val=24):
    a, b, c, d = int(a), int(b), int(c), int(d)
    result = comput24(*map(My24, [a, b, c, d]))
    result = sorted(list(set(result)))
    print(result)
    if target_val not in result:
        print "result not find"
    else:
        index = result.index(target_val)
    while result[index] == target_val:
        print_val_trace(result[index])
        index += 1

if __name__ == ‘__main__‘:
    if len(sys.argv) > 1:
        print sys.argv
        run(*sys.argv[1:])
    else:
        run(3, 3, 3, 8)

  

24点牌 递归算法

标签:index   __new__   other   def   __name__   get   com   length   app   

原文地址:http://www.cnblogs.com/chens-smile/p/7667338.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!