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

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

新規登録して質問してみよう
ただいま回答率
85.50%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

1056閲覧

オブジェクト指向プログラミングがわからない(競技プログラミング)

kimtakuya_

総合スコア22

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

1グッド

2クリップ

投稿2020/03/13 11:25

編集2020/03/14 05:43

前提・実現したいこと

AtCoderの勉強中です。POJの問題(複数のアリが竿の上を歩いて衝突したら向きを反転、すべてのアリが竿から落ちる時間を調べる問題)を説いているのですが、クラスの扱いがいまいちよくわかっていません。この問題は下のコードで行っているよりもシンプルなアルゴリズムで解くことができ計算量を減らせることは知っていますが、クラスの勉強としてこのように書きました。
困っているのはAntのインスタンスとしてant1,ant2,ant3を生成することを下のコードでは一行一行、一匹ずつ記述していますが、
これをfor文などを使って任意のアリの数に対応などがさせたいです。
一番はじめに困ることとしては、変数名をfor文内で

for i in range(10) : 'ant_'+str(i) =Ant()

のようにすることができない点が困っています。
オブジェクト指向の勉強が前提なので、多少複雑なコードになってしまってもその方向でお願いします。

発生している問題・エラーメッセージ

エラーメッセージ エラーはありません。

該当のソースコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4L = 100 5x1 = 20 6x2 = 30 7x3 = 70 8 9 10class Ant: 11 def __init__(self, pos, speed, name): 12 self.name = name 13 self.pos = pos 14 self.speed = speed 15 self.history=[pos] 16 self.fall = False 17 18 def step(self): 19 self.pos += self.speed 20 self.is_fall() 21 if self.fall==False: 22 self.history.append(self.pos) 23 else: 24 self.history.append(np.nan) 25 26 def is_fall(self): 27 if self.pos < 0 or self.pos > L: 28 self.fall = True 29 30 31def is_conflict(ant_a, ant_b): 32 if abs(ant_a.pos - ant_b.pos) <= 1: 33 ant_a.speed = ant_a.speed*(-1) 34 ant_b.speed *= ant_b.speed*(-1) 35 print('turn!!', ant_a.name, ant_b.name) 36 print('turn!!', ant_a.speed, ant_b.speed) 37 print() 38 39 40def main(): 41 print('hello') 42 ant1 = Ant(x1, 1, 'ant1') 43 ant2 = Ant(x2, -1, 'ant2') 44 ant3 = Ant(x3, -1, 'ant3') 45 46 while True: 47 ant1.step() 48 ant2.step() 49 ant3.step() 50 for i in [ant1, ant2, ant3]: 51 for k in [ant1, ant2, ant3]: 52 if i != k: 53 is_conflict(i, k) 54 55 if ant1.fall and ant2.fall and ant3.fall: 56 break 57 58 # 描画してみる 59 plt.plot(ant1.history,label='ant1') 60 plt.plot(ant2.history,label='ant2') 61 plt.plot(ant3.history,label='ant3') 62 plt.legend() 63 plt.xlabel('time') 64 plt.ylabel('ant_pos') 65 plt.show() 66 67# 実行 68main() 69

試したこと(ご指摘を頂いたリストを使って書き直しました)

import numpy as np import random import matplotlib.pyplot as plt import logging plt.style.use('ggplot') # ログレベルを DEBUG に変更 logging.basicConfig(level=logging.ERROR) # 問題の設定(竿の長さとアリの数) L = 100 num = 50 class Ant: def __init__(self, pos, speed, name): self.name = name self.pos = pos self.speed = speed self.history = [pos] self.fall = False def step(self): self.pos += self.speed self.is_fall() if not self.fall: self.history.append(self.pos) else: self.history.append(np.nan) def is_fall(self): if self.pos < 0 or self.pos > L: self.fall = True def is_conflict(ant_a, ant_b): if abs(ant_a.pos - ant_b.pos) <= 1: ant_a.speed = ant_a.speed * (-1) ant_b.speed *= ant_b.speed * (-1) logging.info('turn!!' + ant_a.name + ',' + ant_b.name) logging.info('turn!! {},{}'.format(str(ant_a.speed), str(ant_b.speed))) def main(): ants = [Ant(0, 1, 'ant_1')] for ant_num in range(2, num + 1): _pos = random.randint(1, L) _speed = random.choice([-1, 1]) _name = 'ant_' + str(ant_num) ants.append(Ant(_pos, _speed, _name)) while True: for i in range(len(ants)): ants[i].step() for i in ants: for k in ants: if i != k: is_conflict(i, k) if sum([ants[i].fall for i in range(len(ants))]) == len(ants): break # 描画してみる for i in range(len(ants)): plt.plot(ants[i].history, label=ants[i].name) plt.legend() plt.xlabel('time') plt.ylabel('ant_pos') plt.show() # 実行 main()

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

s.k👍を押しています

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

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

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

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

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

archiver

2020/03/13 12:55

配列やリストじゃダメなの? 結果的に番号で管理することになるんだろうから、配列やリストを使う方が簡単だと思うけど。
Zuishin

2020/03/14 05:50

書き直した結果どうなったのか書かないと。
guest

回答1

0

ベストアンサー

動的に変数を作る方法もなくはありませんが、コードの書き方を勉強したいということであればlistを用意し、そこにインスタンスを格納してください。必要であれば添字で個々のインスタンスにアクセスできますし、ループで等も自在に扱えます。

逆に言うと変数名にはそういう機能はまったくないので、変数名で管理しようとするとコードが煩雑になります。

連番の変数が便利に扱えるような言語仕様にするより、組み込み型としてlistを提供する方が遥かに理に適っているとPythonの開発者たちが考えたことは明らかです。

投稿2020/03/13 13:01

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問