goo blog サービス終了のお知らせ 

パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

少しだけ前進

2018-12-27 | Python


昨日の続きです。100ステップを目標にしてみました。

みんなにはないしょだよ!

import sys
import copy #配列などのコピー用
import time
import itertools #順列など作成でたまーに使う
def get(til,x,y):
    if 0>x or 0>y or x>6 or y>6:return 0
    return til[x+y*7]
def walk3(til,p,tr):
    _,x,y,_=p[0]
    sp,pp=[(x,y,"MOVE",0,0)],[(x,y)]
    bTpoint,bWalk=0,"PASS"
    while len(sp)>0:
        for h in range(4):
            sx,sy,sm,mv,tp=sp[0]
            if mv>19:continue #20歩は歩かない
            tx,ty=sx+dx[h],sy+dy[h] #移動先の座標
            if (tx,ty) in pp:continue #同じところを歩かない
            if ( (get(til,sx,sy) & [8,4,2,1][h]) >0) and ( (get(til,sx+dx[h],sy+dy[h]) & [8,4,2,1][[2,3,0,1][h]])>0): #移動できるか判断
                sm+=dm[h] #移動情報を追加
                if (tx,ty) in tr:tp+=1 #宝をとったら
                if tp>bTpoint:bTpoint,bWalk=tp,sm
                sp+=[(tx,ty,sm,mv+1,tp)]
                pp+=[(tx,ty)]
        del sp[0]
    return bWalk,bTpoint
def slideMe(p,c,l,mdx,mdy):
    rp=copy.deepcopy(p)
    c,x,y,t=rp[0]
    if l==y:x=[6,0,1,2,3,4,5,6,0][x+mdx+1] #端っこループ
    if c==x:y=[6,0,1,2,3,4,5,6,0][y+mdy+1]
    rp[0]=c,x,y,t
    return rp
def slideTreasure(tr,c,l,mdx,mdy):
    rtr=copy.deepcopy(tr)
    for i in range(len(rtr)):
        x,y=tr[i]
        if l==y:x=[6,0,1,2,3,4,5,6,0][x+mdx+1]
        if c==x:y=[6,0,1,2,3,4,5,6,0][y+mdy+1]
        rtr[i]=x,y
    return rtr    
def slideRight(til,line,p,newTile,tr):
    for i in range(line*7+1,line*7+7):til[i]=tile[i-1] #スライドさせて
    til[line*7]=newTile #スライド開始箇所におく
    return til,slideMe(p,-1,line,1,0),slideTreasure(tr,-1,line,1,0)
def slideLeft(til,line,p,newTile,tr):
    for i in range(line*7,line*7+6):til[i]=tile[i+1]
    til[line*7+6]=newTile
    return til,slideMe(p,-1,line,-1,0),slideTreasure(tr,-1,line,-1,0)
def slideDown(til,line,p,newTile,tr):
    for i in range(6):til[i*7+7+line]=tile[i*7+line]
    til[line]=newTile
    return til,slideMe(p,line,-1,0,1),slideTreasure(tr,line,-1,0,1)
def slideUp(til,line,p,newTile,tr):
    for i in range(6):til[i*7+line]=tile[i*7+7+line]
    til[42+line]=newTile
    return til,slideMe(p,line,-1,0,-1),slideTreasure(tr,line,-1,0,-1)  
def questItem(tr,q,pNum): #宝の中からクエスト(ポイント対象)になっているものを返す
    rtr=[]
    for i in tr:
        x,y,name,pid=i
        if pid==pNum and ((name,pid) in q):rtr+=[(x,y)] 
    return rtr 
dx,dy,dm,dfunc=[0,1,0,-1],[-1,0,1,0],[" UP"," RIGHT"," DOWN"," LEFT"],[slideUp,slideRight,slideDown,slideLeft] #dfunk 方向によって呼び出す関数を変更
tm=[]
loop47=itertools.product(range(4), range(7)) #方向4方向 各押す場所7ヶ所 2重ループのはずすため(使わないほうがいいかも)
while True:
    starttime = time.time()
    turn_type = int(input())
    tile,p,tr,q=[],[],[],[] #タイル情報、プレイヤー情報、宝情報、クエスト情報
    for i in range(7):tile+=[int(t,2) for t in input().split()] #tileデータを2進数とみなして10進数化
    for i in range(2):p+=[([int(i) for i in input().split()])] #num_player_cards, player_x, player_y, player_tile
    for i in range(int(input())):#num_items
        item_name, item_x, item_y, item_player_id = input().split()
        tr+=[(int(item_x),int(item_y),item_name,int(item_player_id))]
    for i in range(int(input())):#num_quests
        quest_item_name, quest_player_id = input().split()
        q+=[(quest_item_name,int(quest_player_id))]
    tr=questItem(tr,q,0)
    if turn_type==0:
        _,x,_,nt=p[0]
        nt=int(str(nt),2) #自分の持っているタイル
        bst,bm=0,"PUSH "+str(x)+" UP" #困った時は気持ち上がってみる
        for h, i in loop47:
            til,rp,rtr=dfunc[h](copy.deepcopy(tile),i,p,nt,tr) #タイルを動かして
            _,st=walk3(til,rp,rtr) #リンクがいくつ宝を手にできるか
            if bst<st:bst,bm=st,"PUSH "+str(i)+dm[h]     
        print(bm)
    else:print((walk3(tile,p,tr))[0]) #帰ってきた値をタプルにしてその中の移動コマンドを実行(表示)
    tm+=[(time.time()-starttime)] #時間計測
    print(int(sum(tm)*1000/len(tm)), file=sys.stderr)
    print(int(tm[-1]*1000), file=sys.stderr) #時間表示ms(1000倍しないと0になる)


最新の画像もっと見る

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。
ブログ作成者から承認されるまでコメントは反映されません。