Problem 68
ものすごく適当に作った.当たりをつけた.多分大きい数字は外.なので上位5つは外.[6,7,8,9,10]だろうと.
で中身をぐちょぐちょと[1,2,3,4,5]で廻して答えがあれば多分それだ!(とりあえず答えが出るか試すという適当さ)16桁とか17桁って10が中にあるか外にあるかで決まるのね.終わるまで気付かなかった.外に置いといたんだから16文字判定がいら無い.最初は6からなんだから,6+[7,8,9,10]にしとくとわざわざ6の場所を探してそこから足し算するなんてことしなくてよくなるね!という感じで作りながらどんどん変えていった感じです.あとPythonにはpermutationsがあるんですね!と同じようなこと以前にも思った気がする.ただtupleで返すのは頂けないです.短くなったから使うけど.自作分削っただけですが.
from itertools import permutations answer =[] for outs in permutations(range(7,11)): outs = [6] + list(outs) for ins in permutations(range(1,6)): ins = list(ins) if len(set([sum([outs[i]] + ins[i:i+2]) for i in xrange(len(outs) - 1)] +[outs[-1] +ins[0] +ins[-1]])) == 1: da = [[outs[i]] + ins[i:i+2] for i in xrange(len(outs)-1)] +[[outs[-1]]+[ins[-1]]+[ins[0]]] answer.append(int(''.join( [''.join(map(str,da[k])) for k in xrange(len(outs))]))) print max(answer)
itertoolsに追加されたのはver2.6からとかかな?codepadじゃ使えなかったので自作使いました.
def permutations(lis): if len(lis) == 1: yield lis else: (x,xs) = (lis[0:1],lis[1:]) for t in permutations(xs): for i in range(len(t)+1): yield t[:i] + x + t[i:]
outsとinsのlist()が要りません.あっても多分動くけど.
やっていることは汚いです.
外の5つに0−5と位置に番号を割り振ります.中の5つに同じように0−5を割り振ります.
割り振り方はイメージでは外の0は一番北の奴.そこから時計回り.中の0は外の0とつながって001となるように.'0'01,'1'12,'2'23,'3'34,'4'40となるように割り振る.(''がある奴が外の番号)そしたらその割り振った番号を配列のインデックスとして使って,順列で生成した外の配列と中の配列の中の値を取得,全部足して,全部同じか確認.確認したら,0から順に001,112,223,以下同じ,数字の列を足して答えに入れて置く.最後にその中のmaxを吐き出すという流れです.もっと短く書ける気がする….でもこれ以上頑張っても速くはならない気がする.二つ目の数も固定とかしない限りは.