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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

370閲覧

Pythonでの関数の繰り返し処理

okari3

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2022/09/19 16:39

前提

Pythonを独学で始めたのですが、プログラム作成中に行き詰ってしまいました。
どなたか解決方法をご教示願います。
Python3.9を使用しています。

実現したいこと

引数にある処理をして戻り値をだす6つの関数(関数A~F)があり、
同じ関数が2回連続しないようにしつつ、7回処理をしたいです。

【例】
×)関数A→B→C→A→A→B→A(4,5回目の処理で関数Aが連続している)
〇)関数A→B→C→D→E→F→A(同じ処理が連続していない)

この処理を、すべての組み合わせで行いたいのですが、
どのように書けばよいでしょうか?

【具体例】
具体的には、直方体の3次元空間内で、任意のtargetの座標点が
6つの壁(天井・床)で7回反射したときの鏡像の座標を求めたいです。
以下のソースコードのdef mirror1から6までが処理したい関数です。

該当のソースコード

Python

1#初期条件 2#部屋の寸法 3xwide = 20 4ywide = 15 5zwide = 5 6#任意の座標点 7target = np.array([2, 2, 2]) 8 9#原点をとおる壁でのy方向の反射 10xzmirror = np.array([[1, 0, 0], [0, -1, 0], [0, 0, 1]]) 11#原点をとおる壁でのz方向の反射 12xymirror = np.array([[1, 0, 0], [0, 1, 0], [0, 0, -1]]) 13#原点をとおる壁でのx方向の反射 14yzmirror = np.array([[-1, 0, 0], [0, 1, 0], [0, 0, 1]]) 15#法線ベクトルを準備 16xn = np.array([-1, 0, 0]) 17yn = np.array([0, -1, 0]) 18zn = np.array([0, 0, -1]) 19 20#反射の鏡映座標を求める関数 21def mirror1(a): 22 x0_mir1 = np.dot(a, yzmirror) 23 return x0_mir1 24 25def mirror2(a): 26 y0_mir1 = np.dot(a, xzmirror) 27 return y0_mir1 28 29def mirror3(a): 30 z0_mir1 = np.dot(a, xymirror) 31 return z0_mir1 32 33def mirror4(a): 34 x1_mir1 = a - (2 * (np.dot(a, xn) + xwide)) * xn 35 return x1_mir1 36 37def mirror5(a): 38 y1_mir1 = a - (2 * (np.dot(a, yn) + ywide)) * yn 39 return y1_mir1 40 41def mirror6(a): 42 z1_mir1 = a - (2 * (np.dot(a, zn) + zwide)) * zn 43 return z1_mir1

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

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

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

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

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

guest

回答2

0

py

1import random 2 3def mirror1(a): print("A") 4def mirror2(a): print("B") 5def mirror3(a): print("C") 6def mirror4(a): print("D") 7def mirror5(a): print("E") 8def mirror6(a): print("F") 9 10functions = { mirror1, mirror2, mirror3, mirror4, mirror5, mirror6 } 11sequence = [random.choice(tuple(functions))] 12while len(sequence) < 7: 13 sequence.append(random.choice(tuple(functions - {sequence[-1]}))) 14 15a = 0 16for function in sequence: 17 a = function(a)

投稿2022/09/19 17:59

編集2022/09/19 18:08
shiracamus

総合スコア5406

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

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

0

ベストアンサー

python

1import numpy as np 2from itertools import product 3from functools import reduce 4from pprint import pprint 5 6# 7# 初期化部分は割愛 8# 9 10mirror_functions = [ 11 lambda a: np.dot(a, yzmirror), 12 lambda a: np.dot(a, xzmirror), 13 lambda a: np.dot(a, xymirror), 14 lambda a: a - (2 * (np.dot(a, xn) + xwide)) * xn, 15 lambda a: a - (2 * (np.dot(a, yn) + ywide)) * yn, 16 lambda a: a - (2 * (np.dot(a, zn) + zwide)) * zn, 17] 18 19mfx = [c for c in product(range(len(mirror_functions)), repeat=7) if all(i != j for i, j in zip(c, c[1:]))] 20result = [reduce(lambda acc, i: mirror_functions[i](acc), mf, target) for mf in mfx] 21 22pprint([*zip(mfx[40000:40010], result[40000:40010])]) 23 24# 25[((2, 3, 5, 0, 1, 0, 1), array([38, 2, 12])), 26 ((2, 3, 5, 0, 1, 0, 2), array([ 38, -2, -12])), 27 ((2, 3, 5, 0, 1, 0, 3), array([ 2, -2, 12])), 28 ((2, 3, 5, 0, 1, 0, 4), array([38, 32, 12])), 29 ((2, 3, 5, 0, 1, 0, 5), array([38, -2, -2])), 30 ((2, 3, 5, 0, 1, 2, 0), array([ 38, -2, -12])), 31 ((2, 3, 5, 0, 1, 2, 1), array([-38, 2, -12])), 32 ((2, 3, 5, 0, 1, 2, 3), array([ 78, -2, -12])), 33 ((2, 3, 5, 0, 1, 2, 4), array([-38, 32, -12])), 34 ((2, 3, 5, 0, 1, 2, 5), array([-38, -2, 22]))]

投稿2022/09/19 17:55

melian

総合スコア19703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問