質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

927閲覧

ロボットの方向と進む距離から最終座標の求め方

kokohadoko

総合スコア6

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/14 04:27

ロボットの進む方向が命令された時のプログラムを書こうと思い、
場合分けを考えましたが、方向X距離が考えられ、16パターン式を作る必要があると思ったんですけど、
考え方があっているか、他の関数があるか教えてください。

スタート地点X,Yから、
・前に進む あるいは 方向転換する(右、左、180度)
・前は2,右は1,左は1,後は1

スタートは頭がY座標のプラス方向
スタート (2,2)
命令①  前に進め (2,4)
命令②  後ろに進め (2,3)
命令③  右に旋回  (2,3)
命令④  前に進め  (4,3)

x,y= map(int, input().split()) M,R,B,L = map(int, input().split()) n=int(input()) numi="F" for i in range(n): a,b = input().split() #print(a,b) if a=="m": if b=="F": x=x y=y+M elif b=="R": x=x+R y=y elif b=="L": x=x+L y=y elif b=="B": x=x y=y-B elif a=="t": if b=="F": x=x y=y+M elif b=="R": x=y y=x elif b=="L": x=y y=x elif b=="B": x=x y=y-B print(x,y)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

気になった点をいくつか。
・移動するとき(a=="m"?)にLもRもx増える方向で良いんでしょうか。
・方向転換するとき(a=="t"?)にFとBで移動しているのでは良いんですか?
・方向転換するときにxとyを入れ替えていますが、LもRも同じ操作なのは直感的におかしいかと。
・最後にx,y座標を出力してますが、方向転換してるうちにxとy入れ替えてるのは最後戻さなくて良いんですか。

改善案
方向転換時に、いまの座標でなく、移動差分を回転させたほうがわかりやすい気がします。

追記

・進行方向directionをkey, 進むベクトルをvalueとした辞書を作ると、if文で場合分けしなくてもmove_dct[direction]とかで呼び出せます。
・進むベクトルをnumpy配列にしとくと、現在座標とそのまま足し算できます。たとえば現在座標をpos = np.array([x,y])とすると、移動後の座標はpos + move_dct[direction]

たとえばこんな感じ(F,R,L,Bはその方向の一歩の長さ)
move_dct = {"F":np.array([0,1])*F, "R":np.array([1,0])*R, "L":np.array([-1,0])*L, "B":np.array([0,-1])*B}

方向転換はちょっとスマートなのが思いつきませんでしたが、たとえば下記のように関数化してやって、move_dctを更新していくとか。

python3

1def roted_dct(direction, move_dct): 2 if direction == "R": 3 for k in move_dct: 4 move_dct[k][0], move_dct[k][1] = move_dct[k][1], -move_dct[k][0] 5 elif direction == "L": 6 for k in move_dct: 7 move_dct[k][0], move_dct[k][1] = -move_dct[k][1], move_dct[k][0] 8 else: # B 9 for k in move_dct: 10 move_dct[k][0], move_dct[k][1] = -move_dct[k][0], -move_dct[k][1] 11 return move_dct

こうしてやれば、for文の中身はif文一つで、移動か方向転換かの場合分けだけになります。

投稿2021/04/14 04:36

編集2021/04/14 06:30
jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokohadoko

2021/04/14 06:16

下記でできましたが、重く、簡潔にできるか検討します。 x,y= map(int, input().split()) M,R,B,L = map(int, input().split()) n=int(input()) muki=1 for i in range(n): a,b = input().split() #print(a,b) if a=="m": if muki%4==1: if b=="F": x=x y=y+M #print(i,x,y) elif b=="R": x=x+R y=y #print(i,x,y) elif b=="L": x=x-L y=y #print(i,x,y) elif b=="B": x=x y=y-B #print(i,x,y) elif muki%4==2: if b=="F": x=x+M y=y #print(i,x,y) elif b=="R": x=x y=y-R #print(i,x,y) elif b=="L": x=x y=y+L #print(i,x,y) elif b=="B": x=x-B y=y #print(i,x,y) elif muki%4==3: if b=="F": x=x y=y-M #print(i,x,y) elif b=="R": x=x-R y=y #print(i,x,y) elif b=="L": x=x+L y=y #print(i,x,y) elif b=="B": x=x y=y+B #print(i,x,y) elif muki%4==0: if b=="F": x=x-M y=y #print(i,x,y) elif b=="R": x=x y=y+R #print(i,x,y) elif b=="L": x=x y=y-L #print(i,x,y) elif b=="B": x=x+B y=y #print(i,x,y) elif a=="t": if b=="R": muki=muki+1 #print(i,x,y) elif b=="L": muki=muki-1 #print(i,x,y) elif b=="B": muki=muki-2 #print(i,x,y) print(x,y)
jeanbiego

2021/04/14 06:31

シンプルになりそうな案を追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問