下面两段代码出自http://rosettacode.org/wiki/Roman_numerals/Encode#Python
点击(此处)折叠或打开
- def to_roman(x):
- anums = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
- rnums = "M CM D CD C XC L XL X IX V IV I".split()
- ret=[]
- for a,r in zip(anums,rnums):
- n,x=divmod(x,a)
- ret.append(r*n)
- return "".join(ret)
- def test_to_roman():
- test=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25,30,40,
- 50,60,69,70,80,90,99,100,200,300,400,500,600,666,700,800,900,
- 1000,1009,1444,1666,1945,1997,1999,2000,2008,2010,2011,2500,
- 3000,3999)
- for i in test:
- print("number {} to roman is {}".format(i,to_roman(i)))
- #test_to_roman()
点击(此处)折叠或打开
- def to_arabic(x):
- decoder=dict(zip('MDCLXVI',(1000,500,100,50,10,5,1)))
- result=0
- for r,r1 in zip(x,x[1:]):
- rd,rd1=decoder[r],decoder[r1]
- if rd < rd1:
- result+=-rd
- else:
- result+=rd
- return result+decoder[x[-1]]
- def test_to_arabic():
- ll='MCMXC MMVIII MDCLXVI'.split()
- for i in ll:
- print(to_arabic(i))
- test_to_arabic()
点击(此处)折叠或打开
- def to_arabic2(s):
- #s: sequence
- decoder=dict(zip('MDCLXVI',(1000,500,100,50,10,5,1)))
- result=0
- for i in range(len(s)-1):
- value=decoder.get(s[i])
- vnext=decoder.get(s[i+1])
- if value < vnext:
- result+=-value
- else:
- result+=value
- return result+decoder.get(s[-1])
- def test_to_arabic2():
- ll='MCMXC MMVIII MDCLXVI'.split()
- for i in ll:
- print(to_arabic2(i))
- test_to_arabic2()
Puzzle:
A merchant has a 40 kg weight which he used in his shop. Once, it fell from his hands and was broken into 4 pieces. But surprisingly, now he can weigh any weight between 1 kg to 40 kg with the combination of these 4 pieces.
So question is, what are weights of those 4 pieces?
这个哥们的代码写的太通用了,还加上pieces. 即N个pieces,sum(n)==L, 同时可以表示1->L,很有趣的题目
点击(此处)折叠或打开
- import itertools as it
- def find_weights(weight,pieces):
- full=range(1,weight+1)
- all_nums=set(full)
- comb=[x for x in it.combinations(full,pieces) if sum(x)==40]
- funcs=(lambda x: 0, lambda x: x, lambda x: -x)
- for c in comb:
- sums=set()
- for fmap in it.product(funcs,repeat=pieces):
- s=sum(f(x) for x,f in zip(c,fmap))
- if s>0:
- sums.add(s)
- if sums==all_nums:
- return c
- print(find_weights(40,5))