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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

3回答

2798閲覧

座標を使った演算方法

MrKametyou

総合スコア14

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2016/10/16 08:20

編集2016/10/16 08:27

python

1a = raw_input() # 8 3 3 2b = a.split() 3 4n = b[0] #8 5p = b[1] #3 6d = b[2] #3 7x = [] 8y = [] 9PO = [] 10 11for i in range(1,int(n) + 1): #1 2 3 4 5 6 7 8 12 c = raw_input() #一回目 3 -2 10 ,二回目 -1 1 15,三回目 -1 4 10 四回目 3 2 20 13五回目 4 3 20 六回目 -3 -4 25 七回目2 -3 15 八回目 0 2 10 14 e = c.split() 15 x.append(e[0])#3,-1,-1,3,4,-3,2,0 16 y.append(e[1])#-2,1,4,2,3,-4,-3,2 17 PO.append(e[2])#10,15,10,20,20,25,15,10 18```![,,](ff17859b7ecf1582725d09869e06c942.png) 19 20座標を使っての計算をしたいです。 21nはその数の個数を表しており、この図だと8です。 22dは円の半径を表しています。この図だと3です。 23pは無視してください。 24そしてcにはそれぞれの数のx座標とy座標、そしてその数がもつ特有の数だとおもってください 25たとえばこの図だとn=1のx座標は3、y座標は-2、1がもつ数は10です。 26そして私はこの図だと1から8まで計算していって、どこが一番その数が持つ特有の数の合計が多いかを知りたいです。例えばこの図だと8に円があれば324を巻き込んでその特有の数の合計が一番多いことがわかります。(10+10+15+20 = 55) 27どのようにもとめたら良いのでしょうか? 28また、一応僕はそれぞれのx座標、y座標、その数が持つ特有の数をリストに加えたのですが意味はあるのでしょうか? 29よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ikedasさんの言うことに一理ありますが、
あなたがやりたいことがアルゴリズム的に面白そうだったので
遊び感覚で以下のようなものを作りました。
計算方法は多分あってると思いますが...
実行結果を見てプログラムを考えてもいいですが、ソースもつけときました。
入力は、x座標,y座標 値 です。値の前だけ空白を入れてください
変数などは多少変えましたがあなたのやりたいようなことだと思います。
一応あなたのソースの入力値で実行しましたがエラーは出なかったですが、
エラーが出ても対処はご自分でお願いします。
重要と書かれている場所が理解できれば、目的とするプログラムができると思いますが...。
for分等を使うとわからなくなるとかかれていましたが、
まず、for分を用いず定数で作っていったほうがいいのではないでしょうか。
また、ソースを見た感じ変数の意味が分かりづらく感じました。

###実行画面と結果

# 実行画面 # INPUT [*] 個数 半径 >> 8 3 [1] 座標 値 >> 3,-2 10 [2] 座標 値 >> -1,1 15 [3] 座標 値 >> -1,4 10 [4] 座標 値 >> 3,2 20 [5] 座標 値 >> 4,3 20 [6] 座標 値 >> -3,-4 25 [7] 座標 値 >> 2,-3 15 [8] 座標 値 >> 0,2 10 # OUTPUT --------------------------------------------------------------------------------- [*] 半径 >> 3 入力1:(x, y) = (3, -2) >> [10] 入力2:(x, y) = (-1, 1) >> [15] 入力3:(x, y) = (-1, 4) >> [10] 入力4:(x, y) = (3, 2) >> [20] 入力5:(x, y) = (4, 3) >> [20] 入力6:(x, y) = (-3, -4) >> [25] 入力7:(x, y) = (2, -3) >> [15] 入力8:(x, y) = (0, 2) >> [10] --------------------------------------------------------------------------------- 省略 --------------------------------------------------------------------------------- 入力 8:(x, y) = (0, 2) >> [10] 対象 1:(x, y) = (3, -2) >> [10] 距離 >> (x2 - x1, y2 - y1) = (3 - 0, 2 - (- 2)) = (3, 4) >> 半径 外 入力 8:(x, y) = (0, 2) >> [10] 対象 2:(x, y) = (-1, 1) >> [15] 距離 >> (x2 - x1, y2 - y1) = (0 - (- 1), 2 - 1) = (1, 1) >> 半径 内 [*] 値の合計は 10 + 15 = 25 入力 8:(x, y) = (0, 2) >> [10] 対象 3:(x, y) = (-1, 4) >> [10] 距離 >> (x2 - x1, y2 - y1) = (0 - (- 1), 4 - 2) = (1, 2) >> 半径 内 [*] 値の合計は 25 + 10 = 35 入力 8:(x, y) = (0, 2) >> [10] 対象 4:(x, y) = (3, 2) >> [20] 距離 >> (x2 - x1, y2 - y1) = (3 - 0, 2 - 2) = (3, 0) >> 半径 内 [*] 値の合計は 35 + 20 = 55 入力 8:(x, y) = (0, 2) >> [10] 対象 5:(x, y) = (4, 3) >> [20] 距離 >> (x2 - x1, y2 - y1) = (4 - 0, 3 - 2) = (4, 1) >> 半径 外 入力 8:(x, y) = (0, 2) >> [10] 対象 6:(x, y) = (-3, -4) >> [25] 距離 >> (x2 - x1, y2 - y1) = (0 - (- 3), 2 - (- 4)) = (3, 6) >> 半径 外 入力 8:(x, y) = (0, 2) >> [10] 対象 7:(x, y) = (2, -3) >> [15] 距離 >> (x2 - x1, y2 - y1) = (2 - 0, 2 - (- 3)) = (2, 5) >> 半径 外 基準:8 合計:55 半径内にあったもの 入力 [2] [3] [4] --------------------------------------------------------------------------------- 最大 >> 入力 [8] 値:55 --------------------------------------------------------------------------------- Process finished with exit code 0

ソース

python

1# -*- coding:utf-8 -*- 2 3# メインメソッド 4def main(): 5 show = True # 表示するかどうか 6 num = set_init_data() 7 n = num[0] # 個数 8 r = num[1] # 半径 9 10 data = input_data(n, r, show) # 入力方法:x座標,y座標 値 <---- 値の前だけ半角空白を入れる 11 pos = data[0] # 座標 12 value = data[1] # 値 13 14 15 # 最大値を調べ出力 16 max1 = __max_value1(value, data) 17 max2 = __max_value2(value, judge(n, r, pos, value, show)) 18 max_value = __max_value_show(compere(max1, max2)) 19 20 # 一応書いとく 21 if max2 is not None and max2 != max_value: 22 print u"[*] 半径内にものが含まれているものの最大" 23 __max_value_show(max2) 24 25 26 return 0 27 28# 整数変換 29def convert_int(input_list): 30 for i in range(len(input_list)): 31 input_list[i] = int(input_list[i]) 32 return input_list 33 34# 初期設定 35def set_init_data(): 36 print u"[*] 個数 半径 >>", 37 init_num = convert_int(raw_input().split()) 38 return init_num[0], init_num[1] 39 40# (重要)データ入力 41def input_data(n, r, show = True): 42 pos = [] # 添え字, 座標 43 value = [] # 値 44 45 for i in range(n): 46 print u"[%s] 座標 値 >>" % (i + 1), 47 point = raw_input().split() 48 pos.append((i, convert_int(point[0].split(',')))) 49 value.append(int(point[1])) 50 51 if show is True: 52 print 53 print "---------------------------------------------------------------------------------" 54 print u"[*] 半径 >> %s" % r 55 for i in range(n): 56 print u"入力%s:(x, y) = (%s, %s) >> [%d]" % (i + 1, pos[i][1][0], pos[i][1][1], value[i]) 57 return pos, value 58 59# 式の表示用 60def negative(num): 61 if num < 0: 62 return u"(- " + str(-num) + u")" 63 return str(num) 64 65# (重要)判定 66def judge(n, r, pos, value, show = True): 67 hit_list = [] # 半径に存在するものの情報リスト 68 69 if show is True: 70 print 71 print "---------------------------------------------------------------------------------" 72 73 for i in range(n): 74 sum_value = value[i] # 値の合計 75 hit = None # 範囲に含まれたら情報を入れる 76 target_list = [] # 基準半径内に存在するものを表示するため 77 78 for j in range(n): 79 if i != j: 80 # 距離の計算 81 x2 = max(pos[i][1][0], pos[j][1][0]) 82 x1 = min(pos[i][1][0], pos[j][1][0]) 83 y2 = max(pos[i][1][1], pos[j][1][1]) 84 y1 = min(pos[i][1][1], pos[j][1][1]) 85 x = x2 - x1 86 y = y2 - y1 87 88 if show is True: 89 print u"入力 %s:(x, y) = (%d, %d) >> [%d]" % (i + 1, pos[i][1][0], pos[i][1][1], value[i]) 90 print u"対象 %s:(x, y) = (%d, %d) >> [%d]" % (j + 1, pos[j][1][0], pos[j][1][1], value[j]) 91 print u"距離 >> (x2 - x1, y2 - y1) = (%s - %s, %s - %s) = (%s, %s)" % (x2, negative(x1), y2, negative(y1), x, y), 92 93 # 基準の半径内に対象がいるかどうか 94 if show is True: 95 print u">> 半径", 96 if x <= r and y <= r: 97 if show is True: 98 print u"内" 99 print u"[*] 値の合計は %s + %s = %s\n" % (sum_value, value[j], sum_value + value[j]) 100 sum_value += value[j] 101 hit = (i, value[j], sum_value) 102 target_list.append(j) # 対象の保存 103 else: 104 if show is True: 105 print u"外\n" 106 107 # 基準半径内の情報をリストに保存と表示 108 hit_list.append(hit) 109 110 # 表示用 111 if show is True: 112 print u"基準:%s" % (i + 1), 113 if hit_list[i] is None: 114 print u"半径内に何もない 値:%s" % value[i], 115 116 elif hit_list[i] is not None: 117 print u"合計:%s" % (hit_list[i][2]) 118 print u"半径内にあったもの 入力", 119 for t in range(len(target_list)): 120 print u"[%s] " % (target_list[t] + 1), 121 print 122 print "---------------------------------------------------------------------------------" 123 print 124 125 return clear(hit_list) 126 127# None クリアー 128def clear(hit_list): 129 out_list = [] 130 for i in range(len(hit_list)): 131 if hit_list[i] is not None: 132 out_list.append(hit_list[i]) 133 return out_list 134 135# データでの最大値を求める 136def __max_value1(value, data): 137 target = [] 138 max_value = value[0] 139 140 for i in range(len(value) - 1): 141 if max_value <= value[i + 1]: 142 max_value = value[i + 1] 143 144 for i in range(len(value)): 145 if max_value == data[1][i]: 146 target.append(data[0][i][0] + 1) 147 return target, max_value 148 149# (重要)半径内に含まれる合計の最大値を求める 150def __max_value2(value, hit_list): 151 # 入力値がひとつのとき 152 if len(value) == 1: 153 return None 154 155 # 半径内にものが含まれないとき 156 if len(hit_list) == 0: 157 return None 158 159 target = [] 160 max_value = hit_list[0][2] 161 for i in range(len(hit_list) - 1): 162 if max_value <= hit_list[i + 1][2]: 163 max_value = hit_list[i + 1][2] 164 165 for i in range(len(hit_list)): 166 if hit_list[i][2] == max_value: 167 target.append(hit_list[i][0] + 1) 168 return target, max_value 169 170# __max_value1と__max_value2 の比較 171def compere(max1, max2): 172 if max2 is None: 173 return max1[0], max1[1] 174 175 if max1[1] < max2[1]: 176 return max2[0], max2[1] 177 return max1[0], max1[1] 178 179# 最大の入力した番号と値を表示するため 180def __max_value_show(max_value): 181 print u"最大 >> 入力", 182 for i in range(len(max_value[0])): 183 print u"[" + str(max_value[0][i]) + u"]", 184 print u" 値:%s " % max_value[1] 185 print "---------------------------------------------------------------------------------" 186 return max_value[0], max_value[1] 187 188 189# 実行 190if __name__ == '__main__': 191 main()

投稿2016/10/20 11:42

D.I

総合スコア42

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

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

0

また、一応僕はそれぞれのx座標、y座標、その数が持つ特有の数をリストに加えたのですが意味はあるのでしょうか?

こ質問のコードのようなやりかたでリストに入れておけば、後にプログラムの中で、たとえば「1つめの点のx座標」ならx[0]、「8つめの点のy座標」ならy[7]として、入れたものを使うことができますね。ですから、意味はあるのではないですか。

ほかのひとはほかのやりかたをするかもしれません。たとえば、x、y、POに入れる代わりに、

lang

1 points.append({'x': e[0], 'y': e[1], 'score': e[2]})

といったふうに、辞書を使って点ごとにひとまとめにする方法もありますね。これだと「1つめの点のx座標」ならpoints[0]['x']、「8つめの点のy座標」ならpoints[7]['y']として、入れたものを使うことができますね。

どのやりかたにも意味があります。どういうやりかたが一番よいかは、プログラムを書く人が決めることです。


なお、先日も言いましたが、大学に通っているのなら、まず教員の方に質問してはどうですか。授業料を払っているのですから、彼らはあなたの質問に答える義務があるのです。教科書を読み、授業を聞いても理解できないのなら、責任の一端は教員にあるのです。

いっぽう、このサイトで質問に回答している私たちは、授業であなたに出された課題を解決するための無料宿題代行業者ではありません。その点、くれぐれもお間違えのないようお願いします。

投稿2016/10/17 04:15

ikedas

総合スコア4335

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

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

0

普通に各点間の距離を計算して、それが3以下になる組み合わせを探せばいいだけなのでは?

投稿2016/10/16 08:27

swordone

総合スコア20651

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

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

MrKametyou

2016/10/16 08:36 編集

すいません。 三以下を求めて行く方法が分かりません
swordone

2016/10/16 08:36 編集

ひらめくも何も、高校数学の知識。座標平面の見方さえわかれば中学生でも可能。
MrKametyou

2016/10/16 08:40

もちろん計算だけならできますが プログラミングとなるとfor 文等を使っていくのでわからなくなってしまいます。
MrKametyou

2016/10/16 08:41

文法的にわからないということです
ikedas

2016/10/16 13:22

確認させてください。円の中心は、必ず1から8のどれかの点にあるのですか、そうとは限らないのですか。たとえば (1.5, 0) に中心のある円は1、4、8の点を内部に含みますが、中心はどの点でもありません。こういう場合を考えないのか、考えるのか、どちらでしょう。
MrKametyou

2016/10/16 15:04

すみません。説明不足でした。考えません。 円の中心はそれぞれの数(1~8)になります。 つまり1から順に円を置いていって円がどの数の中心になるとその数の特有の数が一番大きいかを判断します。この図だと8を中心とした場合に一番大きいということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問