20220228のPythonに関する記事は19件です。

頻出語が一目瞭然 | Word_Cloud | Python | DataViz

WordCloudとは、文章の中から単語を選び出し、その出現頻度によって単語の大きさを変えながら並べる手法です。Pythonのモジュール Word_Cloud を使って簡単に作ることができます。 Githubにも日本語での説明とともにレポジトリを載せていますので是非参考にしてください。 https://github.com/mikoto-studio/word_cloud この説明では、求人の職務概要に出てくる頻出語を大きく表示させてみます。 デザイン性が高く一覧性に優れた分析がとても簡単にできるので、是非初心者の方にもおすすめです。 準備 pythonバージョンチェック Python -V pipのパッケージチェック pip list pipからダウンロード: pip install wordcloud もしくは condaからダウンロード: conda install -c conda-forge wordcloud 確認 pip list 元のテキストを保存 nano AWS_ProgramManagerRegionPlanner.txt Program Manager / Region Planner - AWS Data Center Planning Amazon Web Services (AWS) Tokyo, Tokyo, Japan On-site 2 days ago 6 applicants Full-time · Mid-Senior level 10,001+ employees · IT Services and IT Consulting 25 connections See how you compare to 6 applicants. Try Premium for free Actively recruiting Program Manager / Region Planner - AWS Data Center Planning Amazon Web Services (AWS) Tokyo, Tokyo, Japan On-site Description Come build the future with us! The AWS Data Center Planning Team is searching for a Program Manager / Region Planner to support the global infrastructure demand and supply planning processes for multiple AWS regions. You will work across the AWS Organization to align on both short- and long-range demand plans for data center capacity and the infrastructure response through the acquisition of space and power. You will oversee the forecasting process which establishes capacity plans and support strategic execution, including the acquisition of long lead infrastructure for the AWS regions. You will conduct modeling and scenario analysis and make data-driven recommendations that inform capacity and capital expenditure decisions. You will partner with key stakeholders to bridge changes in demand, address short- and long-term capacity constraints, and write supporting documentation for capital expenditures. You will monitor and help escalate the health of the infrastructure business to executive leadership. If you enjoy being at the forefront of industry growth and development, operating in a highly ambiguous, rapidly growing environment and driving long range business strategy, this is the role for you. Responsibilities Include Execute demand planning processes to help drive alignment across multiple stakeholders to develop infrastructure capacity plans for the acquisition of data center space and power. Review long term supply solutions and collaborate with Capacity planning stakeholders to ensure long term demand is met. Program manage and support activities required to gain capital expenditure approval for data center infrastructure Dive deep into planning models to identify risks and opportunities for region health and support resolution of constraints by demand and supply owners Conduct scenario and root-cause analysis to make data-driven recommendations which inform data center capacity acquisition decisions Communicate ideas concisely for purposes ranging from informative to need for approvals from executives. Basic Qualifications BA/BS degree (Preferably in Engineering, Finance, Business, or Mathematics) or equivalent work experience Preferred Qualifications Strong written composition and verbal communication skills Experience partnering with stakeholders to collect requirements and develop quantitative and qualitative analysis to solve business problems experience in capacity planning, production planning, operations planning, or inventory planning experience (e.g. forecasting, planning, optimization, etc.) Intermediate to advanced knowledge of Excel (look-ups & pivot tables) Amazon is a committed to a diverse and inclusive workplace. Amazon is an equal opportunity employer and does not discriminate on the basis of race, national origin, gender, gender identity, sexual orientation, protected veteran status, disability, age, or other legally protected status. Company - Amazon Data Services Japan GK Job ID: A1831001 pythonファイル nano MyExamples_JD1.py from wordcloud import WordCloud テキストファイル読み込み text = open("AWS_ProgramManagerRegionPlanner", encoding="utf8").read() 画像作成 wordcloud = WordCloud(max_font_size=40).generate(text) 画像保存 wordcloud.to_file("MyExamples_JD1.png") 実行 pyhon3 examples/MyExamples_JD1.py 上記で指定した場所、何も指定がなければ同じフォルダにPNGファイルができていると思います。 開けるとこのよう下図のようなWordCloudができています!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Python] takes 0 positional arguments but 1 was givenエラーの解消

経緯 Pythonでtakes 0 positional arguments but 1 was givenとエラーが出た。 直訳すると「引数は0のはずなのに一つ渡されている」とのこと。一つも渡していないはずなのに...。 class Test: def test_method(): print("test") t = Test() t.test_mothod() # Test.test_method() takes 0 positional arguments but 1 was given 原因と解決方法 Pythonのクラス内で定義した関数を外から呼び出す場合、自動的に第一引数にレシーバーが渡される。それを引き取るための引数を定義してあげる必要がある。慣習的にはselfを使う。 class Test: def test_method(self): # selfを追記 print("test") ちょっと確認 selfの中には何が入っているのか? class Test: def test_method(self): print(self) # <__main__.Test object at 0x10ca28b80> t = Test() print(t) # <__main__.Test object at 0x10ca28b80> t.test_method() 同じオブジェクトが出力されているのが確認できる。selfの中にはレシーバのインスタンス自身が格納されていることが確認できる。 self以外でもいいのか? class Test: def test_method(okame): print(okame) # <__main__.Test object at 0x10ca28b80> t = Test() t.test_method() 全く問題ない。わざわざ変える必要もないけど。 class Test: def test_method(self, second): print(self) # <__main__.Test object at 0x10ca28b80> print(second) # 2 t = Test() t.test_method(2) 第2引数は第1引数のように呼び出す。非常にややこしい。 t.test_method(2) ≒ t.test_method(t, 2)のようなものと考えればわかりやすいか。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pythonでいい感じに書く

背景 最近、Pythonでソースコードを書くようになったのですが、 書き始めて半年ということでまだまだキレイな書き方、 効率的な書き方ができておりません。 一緒に開発しているベテランエンジニアさんのソースコードを見て、 あぁ〜こういう風に書くのか〜、と勉強になったので メモがてら記事にしてみます。 通常のif文 通常は下記のように書きます。 if a == 'a': return True else: return False なんてことないif文ですが、単純なif、elseの場合は あまりこういう風には書かないようです。 1行にまとめたif文 上のif文は1行にまとめられます。 return True if a == 'a' else return False 要は三項演算子です。 ただ、JSやPHPなどの言語とは違って最初に(True)の時の処理が来て、 その後に条件式が来るんですよね。 これまでJS、PHPをメインで書いていたので、少し戸惑いましたw 通常:for文でlistに追加 続いてはfor文です。 arr = [] for i in range(5): arr.append(i*2) print(arr)  // [0, 2, 4, 6, 8] こちらも通常通り書いたらなんてことないです。 リスト内包表記 上の処理は下記のように簡単に書けるようです。 arr = [i*2 for i in range(5)] print(arr) 最初見た時、何をしているかわかりませんでしたw 終わりに Pythonを書き始めてまだまだ日が浅いため、大した内容では ないですが、他の言語から移ってきた人間の視点で「こういう書き方あるんだ〜」 というものをまとめてみました。 また気になるものがあればメモがてら記載してみようと思います!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Python】injectorでDIコンテナを実装する

個人開発中、依存先が多いクラスをインスタンス化する場面がありました。 その時は依存先を全部インスタンス化→依存元をインスタンス化する時に引数で渡して実装しました。 1度だけなら問題になりませんが毎回この手順で実装する場合、実装の手間が増える上に可読性も下がります。 この問題を解消するためにDIコンテナを採用します。 DIコンテナをざっくりと説明すると、「インスタンス生成時に依存関係をいい感じに解決してくれる仕組み」です。 今回は injector モジュールを利用してPythonでDIコンテナを実現します。 環境 Python3.8.10 injector 0.19.0 injectorの採用理由 使用例を理解しやすかった 採用事例が多い(体感ですが) Pure Pythonだけで完結するため特定FWに依存しない 直近のコミットが2021年10月と比較的新しく、今後もメンテナンスが続くと見込まれる PythonのDI用ライブラリとしてinjectorの他には python-injector・siringa・di-py がありますがいずれもStar数が少なくコミットも止まっているため不採用としました。 インストール手順 下記コマンドでインストールします。 $ pip install injector コマンドが終了したら正常にインストールできているか確認します。 $ pip show injector Name: injector Version: 0.19.0 Summary: Injector - Python dependency injection framework, inspired by Guice Home-page: https://github.com/alecthomas/injector Author: Alec Thomas Author-email: alec@swapoff.org License: BSD Location: /usr/local/lib/python3.8/dist-packages Requires: typing-extensions Required-by: 上のように表示されれば成功です。 使用例 DIコンテナを実装するには以下の4要素が出てきます。 依存元クラス 依存対象のインターフェースおよびその実装クラス 1 インターフェースと具象クラスの紐づけを記述するクラス 依存元クラスの呼び出し用モジュール 各モジュールのサンプルコードが以下になります。 1. 依存元クラス usecase.py # ① injectorモジュールからinjectデコレータをインポート from injector import inject from Animal import Animal class UseCase(): # 依存先オブジェクトの注入対象であることをinjectデコレータで宣言 @inject def __init__(self, animal: Animal) -> None: # ③型アノテーションは必須 self.animal = animal def action(self) -> None: print(f'{self.animal.cry()}') ① injectorモジュールからinjectデコレータをインポート 特に言及することはありません。 ② 依存先オブジェクトの注入対象であることをinjectデコレータで宣言 依存先が注入されることを明記します。 ③ 型アノテーション 型アノテーションで依存先クラスを指定しないと動作しないので注意です。 依存対象のインターフェースおよびその実装クラス animal.py from abc import ABCMeta, abstractmethod # 抽象クラス class Animal(metaclass=ABCMeta): @abstractmethod def cry(self) -> None: raise NotImplementedError # 抽象クラスを実装した具象クラス class Cat(Animal): def __init__(self): pass def cry(self) -> str: return 'cry meow meow.' 依存対象のインターフェースとその実装クラスは特に特筆する点はありません。 Pythonにはインターフェースがないので抽象クラスで代用しています。 インターフェースと具象クラスの紐づけを記述するクラス DIコンテナの実装において最重要なクラスです。 dependency.py from injector import Injector from Animal import Animal, Cat from sample2 import A class Dependency(): def __init__(self) -> None: # 依存関係を設定する関数を読み込む self.injector = Injector(self.__class__.config) # 依存関係を設定するメソッド @classmethod def config(cls, binder): # 抽象クラスをインスタンス化する際にCatクラスを使うよう登録する binder.bind(Animal, Cat) # injector.get()に引数を渡すと依存関係を解決してインスタンスを生成する def resolve(self, cls): return self.injector.get(cls) ポイントはbinder.bind() で「この抽象クラスをインスタンス化する時はこの具象クラスを使う」と設定している箇所です。2 依存元クラスの呼び出し用モジュール # importは省略 if __name__ == "__main__": # Dependency クラスをインスタンス化 injector = Dependency() # Aクラスのインスタンスを生成 a = injector.resolve(A) print(vars(a)) 実行結果は以下の通りです。 $ python3 injector_sample/main.py {'animal': <Animal.Cat object at 0x7f28157be460>} Catクラスインスタンスを初期化することなくAクラスインスタンスを生成することができました。 AクラスインスタンスのプロパティとしてCatクラスインスタンスも保持されています。 injectorクラスを使えばAクラスインスタンスを利用できる状態になっています。 これにより、利用する側はAクラスの知識を持たずに済みます。 まとめ DIコンテナを使うことでプログラムをより可読性と保守性の高い状態に保つことができます。 参考資料 Injector API reference Pythonライブラリinjectorの使い方 Python の DI コンテナ実装の紹介と活用例 Pythonにはインターフェースがありませんが、抽象クラスで代用可能です。 ↩ 具象クラス同士を紐づけることも可能です。(この場合だとbind(Cat, Cat)) ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ROS2でyamlファイルからパラメータを設定する。

ROS2ではROS1と同様にノードにパラメータを設定することができます。 ROS2にはROS1であったようなパラメータサーバーはなく、ノード間でのパラメータのやり取りは個々のノードがパラメータサーバーの役割となり、やり取りをするようです。ROS2のparameter概要 - Qiita パラメータの設定にはノード起動時にコマンドラインで指定する方法や、事前に用意したyamlファイルから読み込む方法があります。 この記事では個々のノード間でのパラメータのやり取りは考えずに、シンプルにyamlファイルからパラメータをノードに読み込む方法について解説していきます。 この記事は、ROS2での基本的なノードの作成等チュートリアルを完了している人が対象となります。 【参考URL】 YAMLファイルによるROS2のパラメータ設定 - Qiita ROS2 YAML For Parameters - The Robotics Back-End Using parameters in a class (Python) — ROS 2 Documentation rclcpp::Node Class Reference - ROS 2 Docs rclcpp::Parameter Class Reference - ROS 2 Docs Do I always have to declare parameters? - ROS Answers 環境 Ubuntu20.04 ROS2:foxy 流れ ・Yamlファイルの作成 ・パラメータを読み込むノードの作成 ・実行確認 Yamlファイルの作成 params.yamlというファイルを作成します。 ファイル名や置く場所はどこでもいいのですが、慣習的にパッケージ直下にconfig/ディレクトリを作成してそこに保存しておくのが一般的のようです。 node_name1: ros__parameters: param1: 30 # int param2: 3.3 # double param3: "string" # string param4: true # bool param5: [3, 33] # 配列の書き方 param9: # ↓こういう配列の書き方もOK - "hoge" - "fuga" - "piyo" test_node1:という記載でこのパラメータを使用するノードを指定しています。ここで指定されたノード以外はこのパラメータを使用できません。その後ros__parameters:の下にパラメータを記載していきます。 複数のノードのパラメータをいっぺんに書くこともできます。 node_name1: ros__parameters: param1: 30 # int param2: 3.3 # double param3: "string" # string param4: true # bool param5: [3, 33] # 配列の書き方 param9: # ↓こういう配列の書き方もOK - "hoge" - "fuga" - "piyo" node_name2: ros__parameters: param1: 30 # int param2: 3.3 # double param3: "string" # string また、複数のノードから共通するパラメータを読み込みたいこともあるかと思います。そういう場合はワイルドカード/**を使います。 /**: ros__parameters: shared_param1: 30 # int shared_param2: 3.3 # double shared_param3: "string" # string このように/**:の下に書いたパラメータはどのノードからも読めるようになります。 パラメータを読み込むノードの作成 パラメータを読み込んでその値をパブリッシュするノードを作成します。 #include <chrono> #include <string> #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" using namespace std::chrono_literals; class MinimalPublisher : public rclcpp::Node { size_t count_; std::string text_; rclcpp::TimerBase::SharedPtr timer_; rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_; void timer_callback() { std_msgs::msg::String message; message.data = text_ + std::to_string(count_++); RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str()); publisher_->publish(message); } public: MinimalPublisher() : Node("node_name1"), count_(0) { // 使用するパラメータの宣言 declare_parameter("param1", 1); declare_parameter("param2", 1.3); declare_parameter("param3", "hoge"); count_ = get_parameter("param1").as_int(); text_ = get_parameter("param3").as_string(); publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10); timer_ = this->create_wall_timer(500ms, std::bind(&MinimalPublisher::timer_callback, this)); } }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::spin(std::make_shared<MinimalPublisher>()); rclcpp::shutdown(); return 0; } このコードではコンストラクタでパラメータの取得を行なっています。 まずdeclare_parameter("param1", 1)で使用するパラメータを定義しています。declare_parameterの二つ目の引数はこのパラメータの初期値です。もしyamlファイルが読み込まれなかったらこの値が使用されます。 このようにパラメータの定義をしないとパラメータを使うことができません。もし、定義せずにパラメータを使いたかったら、ノードの継承時にこのようにオプションを指定してやると定義せずに使用できるようになります。 MinimalPublisher() : Node("node_name1", rclcpp::NodeOptions().allow_undeclared_parameters(true)), count_(0) { パラメータが定義されたらget_parameter("param1").as_int()というように型に合わせてパラメータを取得します。型の指定はas_int()以外にも as_bool() as_int() as_double() as_string() as_byte_array() as_bool_array() as_integer_array() as_double_array() as_string_array() といったものがあります。rclcpp::Parameter Class Reference - ROS 2 Docs pythonで書く場合はこちら # -*- coding: utf-8 -*- import rclpy from rclpy.node import Node from std_msgs.msg import String class MinimalPublisher(Node): def __init__(self): super().__init__('node_name1') # 使用するパラメータの宣言 self.declare_parameter('param1', 1) self.declare_parameter('param3', 'hoge') self.i = self.get_parameter('param1').get_parameter_value().integer_value self.text = self.get_parameter('param3').get_parameter_value().string_value self.publisher_ = self.create_publisher(String, 'topic', 10) timer_period = 0.5 # seconds self.timer = self.create_timer(timer_period, self.timer_callback) def timer_callback(self): msg = String() msg.data = self.text + str(self.i) self.publisher_.publish(msg) self.get_logger().info('Publishing: "%s"' % msg.data) self.i += 1 def main(args=None): rclpy.init(args=args) minimal_publisher = MinimalPublisher() rclpy.spin(minimal_publisher) # Destroy the node explicitly # (optional - otherwise it will be done automatically # when the garbage collector destroys the node object) minimal_publisher.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() C++の場合とほとんど同じです。__init__()の中でパラメータの定義をしています。 パラメータを取得する部分がC++とちょっと毛色が違って、self.get_parameter('param1').get_parameter_value().integer_valueといった感じになっています。型によってこのinteger_valueの部分を変えるのですが、それはそれぞれ以下のようになっています。単語をC++と統一してほしいですね。 bool_value integer_value double_value string_value byte_array_value bool_array_value integer_array_value double_array_value string_array_value 実行確認 パラメータは実行時にyamlファイルを指定することで設定できます。 ros2 run cpp_pubsub talker --ros-args --params-file /root/dev_ws/src/cpp_pubsub/config/params.yaml このような形で--ros-args --params-fileをつけてyamlファイルまでのパスを記載します。 実行されると、 [INFO] [1646042565.450613176] [node_name1]: Publishing: 'string30' [INFO] [1646042565.950033552] [node_name1]: Publishing: 'string31' [INFO] [1646042566.448344552] [node_name1]: Publishing: 'string32' と表示されるでしょう。'string30'といったように数字がパラメータで指定した30から始まってるのがわかります。 ここでパラメータファイルを指定しないで実行してみましょう。 ros2 run cpp_pubsub talker [INFO] [1646042677.348611422] [node_name1]: Publishing: 'hoge1' [INFO] [1646042677.852959589] [node_name1]: Publishing: 'hoge2' [INFO] [1646042678.349298673] [node_name1]: Publishing: 'hoge3' パラメータが反映されておらず、コード上に記載した初期値が使用されているのがわかります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Explanation of Evaluation index 'MAP@5' in Happywhale - Whale and Dolphin Identification Competition.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Lambda(Python)から直接画像を出力する方法(覚書)

SVGを出力したい 特に何も考えずに Content-Type だけしっかり指定してあげればOK。 return { 'statusCode': 200, 'headers': { 'Content-Type': 'image/svg+xml', }, 'isBase64Encoded': False, 'body': '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">svg version="1.1" xmlns="http://www.w3.org/2000/svg">...', } PNGを出力したい こっちが主題になります。 Pythonで画像を取り扱う場合、何らかのライブラリを使用することになると思いますが、今回はおそらく一番使われてるであろうPillowを使っていることにします。 他のライブラリでも応用できると思います。 import io import base64 from PIL import Image # : # ここら辺で画像を色々なんとかして最終的に`image`に何か入ってると思いねぇ # : bytes_io = io.BytesIO() image.save(bytes_io, format='PNG') return { 'statusCode': 200, 'headers': { 'Content-Type': 'image/png', }, 'isBase64Encoded': True, 'body': base64.b64encode(bytes_io.getvalue()).decode('UTF-8'), } ポイントはPillow.Image.save()でio.BytesIOに書き込み、getvalue()で取得したbytes型をBase64でエンコードしてやる、ってところです。 出力がバイナリの場合はisBase64EncodedをTrueにした上でBase64でエンコードしたデータをbodyに入れる必要があります。 書き込み時のformatをJPEG等に変更すればその形式で出力することができます。 あとはSVGと同様にContent-Typeを指定してあげればOKです。 最後に この記事書いてる人は実はあんまりPython得意じゃありません。 なのでもっと良い方法あるよ!って方はコメントとかで教えてください。 ついで(?)に弊社ではサーバーサイドエンジニアを募集していますので、まずはざっくばらんにお話ししてみませんか? 下記からご応募お待ちしております。 ▼ https://herp.careers/v1/lanchester/Bucw0mXRKogc ▼ https://www.wantedly.com/companies/lanchester ▼採用動画について:https://moovy.jp/job/651
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Google ColaboratoryからBigQueryを実行する方法

N番煎じ。自分用のメモ。 クエリを実行して結果を取得 まずはBigQueryのアカウント認証。 from google.colab import auth from google.cloud import bigquery auth.authenticate_user() 画面が起動するので、使用するGoogleのアカウントを選び、「許可」を選択。 次に、BigQueryのproject idを指定。project idはBigQuery上で確認できる。 PROJECT_ID = 'xxxxxxxx' さらに、dataframeとして扱うためにpandasをインポート。 import pandas as pd 関数も定義。 def dry_run(query): client = bigquery.Client(project=PROJECT_ID) job_config = bigquery.QueryJobConfig() job_config.dry_run = True query_job = client.query(query, job_config=job_config) print("This query is {:3.2f} G bytes.".format(query_job.total_bytes_processed / 1e9)) def run(query): client = bigquery.Client(project=PROJECT_ID) job_config = bigquery.QueryJobConfig() return client.query(query).to_dataframe() dry_run 関数は、クエリ実行時の容量を確認(ドライラン)する関数。 なお、ドライランの実行には料金はかからない。 詳細はGoogleの公式ページ。 run 関数は、実際にクエリを実行して結果をdataframeとして返す関数。 それでは、実際にqueryを指定して実行してみる(公開データを使用)。 query = \ """ SELECT name, COUNT(*) as name_count FROM `bigquery-public-data.usa_names.usa_1910_2013` WHERE state = 'WA' GROUP BY name """ dry_run(query) # This query is 0.07 G bytes. df = run(query) df クエリを実行してテーブルを作成・上書き こちらを参考にした。 関数を定義して実行する。 def create_table(sql, table_id): client = bigquery.Client(project=PROJECT_ID) job_config = bigquery.QueryJobConfig(destination=table_id) # job_config = bigquery.QueryJobConfig(destination=table_id, write_disposition=bigquery.WriteDisposition.WRITE_TRUNCATE) # 上書きする場合 query_job = client.query(sql, job_config=job_config) query_job.result() print("Query results loaded to the table {}".format(table_id)) return # table_id = "PROJECT_ID.dataset.table_name" create_table(query, table_id) 既存のテーブルを上書きする場合には write_disposition=bigquery.WriteDisposition.WRITE_TRUNCATE とする。 実行には注意する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pythonでMetatrader5からヒストリカルデータをダウンロードする方法

Metatrader5のダウンロード、設定 このリンクからMetatrader5をダウンロードし、インストールしてください。 デモアカウントが存在するか確認し、存在しない場合デモアカウントを作成します。 ツールからオプションを開き、チャートバーに移動します。 チャートバーにある一番下のチャート最大バー数のパラメーターをUnlimitedに変更します。 Metatrader5パッケージのインストール コンソールで以下のコマンドを実行し、Metatrader5パッケージをインストールしてください。 pip install Metatrader5 pythonでFXの履歴データをダウンロードする import MetaTrader5 as mt5 import pandas as pd # MetaTrader5に接続する init = mt5.initialize() assert init # EURUSDの1時間足で現在のバーから100のバーを取得する r = mt5.copy_rates_from_pos("EURUSD", mt5.TIMEFRAME_H1, 0, 100) # 取得したデータからDataFrameを作成する df = pd.DataFrame(r) # 秒での時間をdatetime形式に変換する df['time']=pd.to_datetime(df['time'], unit='s') # dfの最後の5行を表示する print(df.tail()) time open high ... tick_volume spread real_volume 95 2022-02-28 05:00:00 1.11574 1.11608 ... 4243 0 0 96 2022-02-28 06:00:00 1.11507 1.11528 ... 2865 0 0 97 2022-02-28 07:00:00 1.11456 1.11586 ... 2616 0 0 98 2022-02-28 08:00:00 1.11565 1.11683 ... 4197 0 0 99 2022-02-28 09:00:00 1.11590 1.11762 ... 3957 0 0 # CSVファイルとして保存する。 df.to_csv("EURUSDH1.csv") www.mql5.comから引用
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

もし北京オリンピックカーリング女子が、総当たり戦ではなく、敗戦即敗退のトーナメント方式だったら...

はじめに まず、この記事を書く前に、北京オリンピック銀メダルに輝いた、カーリング女子、日本代表のロコ・ソラーレに敬意を表しまして、改めておめでとうございます。と申し上げます。 大会開催期間中、2022年2月10日から20日まで、決勝トーナメント進出圏内で、一進一退の攻防で手に汗握る熱戦を、毎日固唾を飲んで観戦しておりました。 無事にカーリング女子、日本代表のロコ・ソラーレが、決勝トーナメントに進出し、見事北京オリンピックで銀メダルを獲得したので、前回の、もしカーリング女子北京オリンピック最終予選が、敗戦即敗退のトーナメント方式だったら... に引き続き、今回も北京オリンピックカーリング女子を題材に、敗戦即敗退のトーナメント方式を試していきたいと思います。 まずは、出場全10チームの総当たり対戦成績表を下記に示します。 北京オリンピックカーリング女子の総当たり対戦成績表 スイス スウェーデン イギリス 日本 カナダ アメリカ 中国 韓国 デンマーク ROC スイス - × ◯ ◯ ◯ ◯ ◯ ◯ ◯ ◯ スウェーデン ◯ - × ◯ ◯ ◯ × ◯ ◯ ◯ イギリス × ◯ - ◯ × ◯ × × ◯ ◯ 日本 × × × - ◯ ◯ ◯ × ◯ ◯ カナダ × × ◯ × - ◯ × ◯ ◯ ◯ アメリカ × × × × × - ◯ ◯ ◯ ◯ 中国 × ◯ ◯ × ◯ × - ◯ × × 韓国 × × ◯ ◯ × × × - ◯ ◯ デンマーク × × × × × × ◯ × - ◯ ROC × × × × × × ◯ × × - 決勝トーナメントの準決勝で、日本はスイスに勝利していますが、今回は総当たり戦の成績のみで、トーナメントを調査してみます。 10チームで不戦勝のあるトーナメント表を作成する 今回は出場チームは10チームです。前回参加チーム9チームでの不戦勝を含んだトーナメント表について調査してみましたが、今回は不戦勝が2つ存在するので9チームに比べて更にトーナメント表の組合せが増えそうです。 今回は、準々決勝に進むための1回戦2試合4チーム、準々決勝から出場する6チームのトーナメント表を作成します。 上半分の準決勝のトーナメントを「Uの山」、下半分の準決勝のトーナメントを「Vの山」、上から1つ目の準々決勝のグループを「Wのグループ」、上から2つ目の準々決勝のグループを「Xのグループ」、上から3つ目の準々決勝のグループを「Yのグループ」、一番下の準々決勝のグループを「Zのグループ」、とします。 ┏━ A ┏━┫ ┃ ┗━ B ┏━ W ━┫ ┃ ┃ ┏━ C ┃ ┗━┫ ┏━ U ━┫ ┗━ D ┃ ┃ ┃ ┃ ┏━━━ E ┃ ┗━ X ━┫ ┃ ┗━━━ F R ━┫ ┃ ┏━━━ G ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J ┏━ A ┏━┫ ┏━ W ━┫ ┗━ B ┃ ┃ ┃ ┗━━━ C ┏━ U ━┫ ┃ ┃ ┏━ D ┃ ┃ ┏━┫ ┃ ┗━ X ━┫ ┗━ E ┃ ┃ S ━┫ ┗━━━ F ┃ ┃ ┏━━━ G ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J ┏━ A ┏━┫ ┏━ W ━┫ ┗━ B ┃ ┃ ┃ ┗━━━ C ┏━ U ━┫ ┃ ┃ ┏━━━ D ┃ ┗━ X ━┫ ┃ ┗━━━ E ┃ T ━┫ ┏━ F ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ G ┃ ┃ ┃ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J 上から、Wのグループに1回戦が2試合あるトーナメント表をR、WのグループとXのグループに1回戦が1試合ずつあるトーナメント表をS、WのグループとYのグループに1回戦が1試合ずつあるトーナメント表をTとします。全部で3つの組合せがありそうです。 10チームのトーナメント表は全部で何通りあるか? 野球のような先攻・後攻の区別のない、前回9チームのトーナメント表は全部で11340通りになることがわかりました。今回10チームになった場合、全部で何通りになるか、前回同様スクリプトを作成して試してみましょう。 免責事項 その前に、このスクリプトの実行は自己責任でお願いします。本スクリプトを実行することにより生じるいかなる問題に関しましても、筆者は一切責任を負いません。予めご了承ください。 10チームのトーナメントの組合せのスクリプトをPythonで作成する 10チームのトーナメントの組合せを全て洗い出すスクリプトを下記に掲載します。Brute force的な片っ端から探索しているスクリプトでツッコミどころ満載ですが、ご愛嬌ということで、目を瞑ってください。 # -*- coding: utf-8 -*- import itertools # チーム名の登録 TEAMS = ('スイス', 'スウェーデン', 'イギリス', '日本', 'カナダ', 'アメリカ', '中国', '韓国', 'デンマーク', 'ROC') # チームの総数 ALL = len(TEAMS) # 総当たり対戦成績表 table = {'01': '1', '02': '0', '03': '0', '04': '0', '05': '0', '06': '0', '07': '0', '08': '0', '09': '0', '10': '1', '12': '2', '13': '1', '14': '1', '15': '1', '16': '6', '17': '1', '18': '1', '19': '1', '20': '0', '21': '2', '23': '2', '24': '4', '25': '2', '26': '6', '27': '7', '28': '2', '29': '2', '30': '0', '31': '1', '32': '2', '34': '3', '35': '3', '36': '3', '37': '7', '38': '3', '39': '3', '40': '0', '41': '1', '42': '4', '43': '3', '45': '4', '46': '6', '47': '4', '48': '4', '49': '4', '50': '0', '51': '1', '52': '2', '53': '3', '54': '4', '56': '5', '57': '5', '58': '5', '59': '5', '60': '0', '61': '6', '62': '6', '63': '3', '64': '6', '65': '5', '67': '6', '68': '8', '69': '9', '70': '0', '71': '1', '72': '7', '73': '7', '74': '4', '75': '5', '76': '6', '78': '7', '79': '7', '80': '0', '81': '1', '82': '2', '83': '3', '84': '4', '85': '5', '86': '8', '87': '7', '89': '8', '90': '0', '91': '1', '92': '2', '93': '3', '94': '4', '95': '5', '96': '9', '97': '7', '98': '8'} # 10チームの順列をタプルとして生成する PERMUTATION = tuple(itertools.permutations([str(n) for n in range(ALL)], ALL)) # トーナメントの組合せをカウントする変数 r_combination = 0 s_combination = 0 t_combination = 0 # 全チームの優勝回数を格納するリスト wins = [0] * ALL # 結果をテキストファイル'results.txt'に出力する with open('results.txt', 'w') as fw: # popitem() & delを使用して、高速に処理するため、10チームの順列を降順に並べ替え、辞書に登録する permutation = {} for seq in reversed(PERMUTATION): permutation[int(''.join(seq))] = ''.join(seq) # 全ての順列が無くなるまで探索する while permutation: _, seq = permutation.popitem() # 先攻・後攻は区別しないので、先攻↔︎後攻が入れ替わった組合せを除外するする。 # 除外する組合せは全部で127通り del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] # トーナメント表Rの組合せ数をカウントする r_combination += 1 # 準々決勝に進出する2チームを決める quaterfinals = table[f'{seq[0]}{seq[1]}'] quaterfinals += table[f'{seq[2]}{seq[3]}'] # 準決勝に進出する4チームをリストに格納する semifinals = table[f'{quaterfinals[0]}{quaterfinals[1]}'] semifinals += table[f'{seq[4]}{seq[5]}'] semifinals += table[f'{seq[6]}{seq[7]}'] semifinals += table[f'{seq[8]}{seq[9]}'] # 決勝に進出する2チームをリストに格納する finals = table[f'{semifinals[0]}{semifinals[1]}'] finals += table[f'{semifinals[2]}{semifinals[3]}'] # 優勝チームを決定する win = int(table[f'{finals[0]}{finals[1]}']) # 優勝チームの優勝回数を +1 増やす wins[win] += 1 # 優勝チームとその時のトーナメント表を出力する print(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]}') fw.write(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]} [') for i, team in enumerate(seq): if i < ALL - 1: fw.write(f'{TEAMS[int(team)]}, ') else: fw.write(f'{TEAMS[int(team)]}]\n') # トーナメント表S用に辞書を作成する permutation = {} for seq in reversed(PERMUTATION): permutation[int(''.join(seq))] = ''.join(seq) # トーナメント表S用に、全ての順列を探索する while permutation: _, seq = permutation.popitem() # 除外する組合せは全部で63通り del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] # トーナメント表Sの組合せ数をカウントする s_combination += 1 # 準々決勝に進出する2チームを決める quaterfinals = table[f'{seq[0]}{seq[1]}'] quaterfinals += table[f'{seq[3]}{seq[4]}'] # 準決勝に進出する4チームをリストに格納する semifinals = table[f'{quaterfinals[0]}{seq[2]}'] semifinals += table[f'{quaterfinals[1]}{seq[5]}'] semifinals += table[f'{seq[6]}{seq[7]}'] semifinals += table[f'{seq[8]}{seq[9]}'] # 決勝に進出する2チームをリストに格納する finals = table[f'{semifinals[0]}{semifinals[1]}'] finals += table[f'{semifinals[2]}{semifinals[3]}'] # 優勝チームを決定する win = int(table[f'{finals[0]}{finals[1]}']) # 優勝チームの優勝回数を +1 増やす wins[win] += 1 # 優勝チームとその時のトーナメント表を出力する print(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]}') fw.write(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]} [') for i, team in enumerate(seq): if i < ALL - 1: fw.write(f'{TEAMS[int(team)]}, ') else: fw.write(f'{TEAMS[int(team)]}]\n') # トーナメント表T用に辞書を作成する permutation = {} for seq in reversed(PERMUTATION): permutation[int(''.join(seq))] = ''.join(seq) # トーナメント表T用に、全ての順列を探索する while permutation: _, seq = permutation.popitem() # 除外する組合せは全部で31通り del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}')] # トーナメント表Tの組合せ数をカウントする t_combination += 1 # 準々決勝に進出する2チームを決める quaterfinals = table[f'{seq[0]}{seq[1]}'] quaterfinals += table[f'{seq[5]}{seq[6]}'] # 準決勝に進出する4チームをリストに格納する semifinals = table[f'{quaterfinals[0]}{seq[2]}'] semifinals += table[f'{seq[3]}{seq[4]}'] semifinals += table[f'{quaterfinals[1]}{seq[7]}'] semifinals += table[f'{seq[8]}{seq[9]}'] # 決勝に進出する2チームをリストに格納する finals = table[f'{semifinals[0]}{semifinals[1]}'] finals += table[f'{semifinals[2]}{semifinals[3]}'] # 優勝チームを決定する win = int(table[f'{finals[0]}{finals[1]}']) # 優勝チームの優勝回数を +1 増やす wins[win] += 1 # 優勝チームとその時のトーナメント表を出力する print(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]}') fw.write(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]} [') for i, team in enumerate(seq): if i < ALL - 1: fw.write(f'{TEAMS[int(team)]}, ') else: fw.write(f'{TEAMS[int(team)]}]\n') # 確認用、トーナメント表Rの組合せの総数を表示する print(f'トーナメント表Rの組合せ: {r_combination}') fw.write(f'トーナメント表Rの組合せ: {r_combination}\n') # 確認用、トーナメント表Sの組合せの総数を表示する print(f'トーナメント表Sの組合せ: {s_combination}') fw.write(f'トーナメント表Sの組合せ: {s_combination}\n') # 確認用、トーナメント表Tの組合せの総数を表示する print(f'トーナメント表Tの組合せ: {t_combination}') fw.write(f'トーナメント表Tの組合せ: {t_combination}\n') # 全10チームが優勝した回数を表示する for i, team in enumerate(TEAMS): print(f'{team}: {wins[i]}') fw.write(f'{team}: {wins[i]}\n') スクリプトの説明 前回でも使用した、itertoolsです。全10チームのトーナメントの順列を作成するために使用します。 import itertools 北京オリンピックに出場したカーリング女子全10チームを登録しています。 # チーム名の登録 TEAMS = ('スイス', 'スウェーデン', 'イギリス', '日本', 'カナダ', 'アメリカ', '中国', '韓国', 'デンマーク', 'ROC') # チームの総数 ALL = len(TEAMS) 総当たり対戦成績表になります。{'0': 'スイス', '1': 'スウェーデン', ... '9': 'ROC'}というルールで登録しています。 総当たり対戦成績表の見方は、例えば、{'01': '1'}の場合、スイスとスウェーデンが対戦して、スウェーデンが勝利する。という意味になります。 他にも、{'38': '3'}であれば、日本とデンマークが対戦して、日本が勝利する。といった感じです。 # 総当たり対戦成績表 table = {'01': '1', '02': '0', '03': '0', '04': '0', '05': '0', '06': '0', '07': '0', '08': '0', '09': '0', '10': '1', '12': '2', '13': '1', '14': '1', '15': '1', '16': '6', '17': '1', '18': '1', '19': '1', '20': '0', '21': '2', '23': '2', '24': '4', '25': '2', '26': '6', '27': '7', '28': '2', '29': '2', '30': '0', '31': '1', '32': '2', '34': '3', '35': '3', '36': '3', '37': '7', '38': '3', '39': '3', '40': '0', '41': '1', '42': '4', '43': '3', '45': '4', '46': '6', '47': '4', '48': '4', '49': '4', '50': '0', '51': '1', '52': '2', '53': '3', '54': '4', '56': '5', '57': '5', '58': '5', '59': '5', '60': '0', '61': '6', '62': '6', '63': '3', '64': '6', '65': '5', '67': '6', '68': '8', '69': '9', '70': '0', '71': '1', '72': '7', '73': '7', '74': '4', '75': '5', '76': '6', '78': '7', '79': '7', '80': '0', '81': '1', '82': '2', '83': '3', '84': '4', '85': '5', '86': '8', '87': '7', '89': '8', '90': '0', '91': '1', '92': '2', '93': '3', '94': '4', '95': '5', '96': '9', '97': '7', '98': '8'} [0, 1, ... 9]のレンジを、['0', '1', ... '9']のリストに変換して、そのリストの全ての順列を、itertools.permutations()を使って生成しています。生成された全ての順列をタプルに変換し、PERMUTATIONに格納しています。 r_combinationは、トーナメント表R、s_combinationは、トーナメント表S、t_combinationは、トーナメント表Tの組合せを格納するリストです。 winsは、全チームの優勝回数を格納するリストです。優勝回数の結果表示に使用しています。 # 10チームの順列をタプルとして生成する PERMUTATION = tuple(itertools.permutations([str(n) for n in range(ALL)], ALL)) # トーナメントの組合せをカウントする変数 r_combination = 0 s_combination = 0 t_combination = 0 # 全チームの優勝回数を格納するリスト wins = [0] * ALL 結果をテキストファイル'results.txt'として出力しています。 # 結果をテキストファイル'results.txt'に出力する with open('results.txt', 'w') as fw: popitem() & delを使用して、高速に処理するため、10チームの順列を降順に並べ替え、辞書に登録しています。 # popitem() & delを使用して、高速に処理するため、10チームの順列を降順に並べ替え、辞書に登録する permutation = {} for seq in reversed(PERMUTATION): permutation[int(''.join(seq))] = ''.join(seq) 全ての順列が無くなるまで探索しています。keyは必要無いので、保存していません。 # 全ての順列が無くなるまで探索する while permutation: _, seq = permutation.popitem() ここが肝となりますが、全順列を探索している最中に、以前探索した組合せと先攻↔︎後攻が入れ替わった組合せは同一と見做し、その組合せをdelを使用して削除しています。先攻↔︎後攻が入れ替わった組合せは、トーナメント表Rの場合、全部で127通りあります。 今回困った点は、前回9チームの時は、既に試したトーナメントの組合せを配列に登録して、同じ組合せが出現したら、スキップするという方法を取っていたのですが、その方法で10チームのトーナメントを試すと、丸一日スクリプトを走らせても終わりませんでした。 今回改良した点は、配列を辞書型に変更して、試したトーナメントと同じ組合せを、キーの値で削除するという方法を取ることにより、大幅なスピード改善に繋がりました。 # 先攻・後攻は区別しないので、先攻↔︎後攻が入れ替わった組合せを除外するする。 # 除外する組合せは全部で127通り del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[3]}{seq[2]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[0]}{seq[1]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[2]}{seq[3]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[2]}{seq[1]}{seq[0]}{seq[5]}{seq[4]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] 例えば、トーナメント表Rの1回戦、第1試合の先攻↔︎後攻が入れ替わった組合せは、同一トーナメントと見做します。 ┏━ A ↔︎ B ┏━┫ ┃ ┗━ B ↔︎ A ┏━ W ━┫ ┃ ┃ ┏━ C ┃ ┗━┫ ┏━ U ━┫ ┗━ D ┃ ┃ ┃ ┃ ┏━━━ E ┃ ┗━ X ━┫ ┃ ┗━━━ F R ━┫ ┃ ┏━━━ G ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J 1回戦、2試合、準々決勝、3試合の先攻↔︎後攻が全て入れ替わった組合せも、同一トーナメントと見做します。 ┏━ A ↔︎ B ┏━┫ ┃ ┗━ B ↔︎ A ┏━ W ━┫ ┃ ┃ ┏━ C ↔︎ D ┃ ┗━┫ ┏━ U ━┫ ┗━ D ↔︎ C ┃ ┃ ┃ ┃ ┏━━━ E ↔︎ F ┃ ┗━ X ━┫ ┃ ┗━━━ F ↔︎ E R ━┫ ┃ ┏━━━ G ↔︎ H ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ↔︎ G ┗━ V ━┫ ┃ ┏━━━ I ↔︎ J ┗━ Z ━┫ ┗━━━ J ↔︎ I Wのグループの準々決勝の先攻↔︎後攻が入れ替わった組合せも、同一トーナメントと見做します。 ┏━ A ↔︎ C ┏━┫ ┃ ┗━ B ↔︎ D ┏━ W ━┫ ┃ ┃ ┏━ C ↔︎ A ┃ ┗━┫ ┏━ U ━┫ ┗━ D ↔︎ B ┃ ┃ ┃ ┃ ┏━━━ E ┃ ┗━ X ━┫ ┃ ┗━━━ F R ━┫ ┃ ┏━━━ G ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J Vの山の準決勝の先攻↔︎後攻が入れ替わった組合せも、同一トーナメントと見做します。 ┏━ A ┏━┫ ┃ ┗━ B ┏━ W ━┫ ┃ ┃ ┏━ C ┃ ┗━┫ ┏━ U ━┫ ┗━ D ┃ ┃ ┃ ┃ ┏━━━ E ┃ ┗━ X ━┫ ┃ ┗━━━ F R ━┫ ┃ ┏━━━ G ↔︎ I ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ↔︎ J ┗━ V ━┫ ┃ ┏━━━ I ↔︎ G ┗━ Z ━┫ ┗━━━ J ↔︎ H しかし、Wのグループの1回戦の1試合とXのグループの準決勝の先攻↔︎後攻が入れ替わった組合せは、同一トーナメントと見做しません。なぜなら、このトーナメントでは優勝チームが変わってくるからです。 ┏━ A ↔︎ E ┏━┫ ┃ ┗━ B ↔︎ F ┏━ W ━┫ ┃ ┃ ┏━ C ┃ ┗━┫ ┏━ U ━┫ ┗━ D ┃ ┃ ┃ ┃ ┏━━━ E ↔︎ A ┃ ┗━ X ━┫ ┃ ┗━━━ F ↔︎ B R ━┫ ┃ ┏━━━ G ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J トーナメント表Rの組合せr_combinationをカウントしています。 # トーナメント表Rの組合せ数をカウントする r_combination += 1 1回戦2試合、準々決勝に進出する2チームを決定します。 # 準々決勝に進出する2チームを決める quaterfinals = table[f'{seq[0]}{seq[1]}'] quaterfinals += table[f'{seq[2]}{seq[3]}'] 1回戦を勝ち上がってきた2チームと、準々決勝から出場する6チームで、準決勝に進出する4チームを決定します。 # 準決勝に進出する4チームをリストに格納する semifinals = table[f'{quaterfinals[0]}{quaterfinals[1]}'] semifinals += table[f'{seq[4]}{seq[5]}'] semifinals += table[f'{seq[6]}{seq[7]}'] semifinals += table[f'{seq[8]}{seq[9]}'] 準決勝に進出した4チームから、決勝に進出する2チームを決定します。 # 決勝に進出する2チームをリストに格納する finals = table[f'{semifinals[0]}{semifinals[1]}'] finals += table[f'{semifinals[2]}{semifinals[3]}'] 決勝に進出した2チームから、優勝チームを決定します。そして、優勝回数を後で確認するため、優勝チームの優勝回数を +1 増やしています。 # 優勝チームを決定する win = int(table[f'{finals[0]}{finals[1]}']) # 優勝チームの優勝回数を +1 増やす wins[win] += 1 優勝チームとその時のトーナメント表を、'results.txt'に出力しています。 # 優勝チームとその時のトーナメント表を出力する print(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]}') fw.write(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]} [') for i, team in enumerate(seq): if i < ALL - 1: fw.write(f'{TEAMS[int(team)]}, ') else: fw.write(f'{TEAMS[int(team)]}]\n') トーナメント表Rと同様に、トーナメント表S用の辞書を作成しています。 # トーナメント表S用に辞書を作成する permutation = {} for seq in reversed(PERMUTATION): permutation[int(''.join(seq))] = ''.join(seq) トーナメント表Rと同様、トーナメント表Sの全ての順列が無くなるまで探索しています。 # トーナメント表S用に、全ての順列を探索する while permutation: _, seq = permutation.popitem() トーナメント表Rと同様に、全順列から同じ組合せを削除しています。先攻↔︎後攻が入れ替わった組合せは、トーナメント表Sの場合、全部で63通りあります。 # 除外する組合せは全部で63通り del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[7]}{seq[6]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[7]}{seq[6]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[0]}{seq[1]}{seq[2]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[3]}{seq[4]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[8]}{seq[9]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[9]}{seq[8]}{seq[6]}{seq[7]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[8]}{seq[9]}{seq[7]}{seq[6]}')] del permutation[int(f'{seq[4]}{seq[3]}{seq[5]}{seq[1]}{seq[0]}{seq[2]}{seq[9]}{seq[8]}{seq[7]}{seq[6]}')] 例えば、トーナメント表Sの1回戦、第1試合の先攻↔︎後攻が入れ替わった組合せは、同一トーナメントと見做します。 ┏━ A ↔︎ B ┏━┫ ┏━ W ━┫ ┗━ B ↔︎ A ┃ ┃ ┃ ┗━━━ C ┏━ U ━┫ ┃ ┃ ┏━ D ┃ ┃ ┏━┫ ┃ ┗━ X ━┫ ┗━ E ┃ ┃ S ━┫ ┗━━━ F ┃ ┃ ┏━━━ G ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J 1回戦、2試合、準々決勝、2試合の先攻↔︎後攻が全て入れ替わった組合せも、同一トーナメントと見做します。 ┏━ A ↔︎ B ┏━┫ ┏━ W ━┫ ┗━ B ↔︎ A ┃ ┃ ┃ ┗━━━ C ┏━ U ━┫ ┃ ┃ ┏━ D ↔︎ E ┃ ┃ ┏━┫ ┃ ┗━ X ━┫ ┗━ E ↔︎ D ┃ ┃ S ━┫ ┗━━━ F ┃ ┃ ┏━━━ G ↔︎ H ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ↔︎ G ┗━ V ━┫ ┃ ┏━━━ I ↔︎ J ┗━ Z ━┫ ┗━━━ J ↔︎ I Uの山の準決勝の先攻↔︎後攻が入れ替わった組合せも、同一トーナメントと見做します。 ┏━ A ↔︎ D ┏━┫ ┏━ W ━┫ ┗━ B ↔︎ E ┃ ┃ ┃ ┗━━━ C ↔︎ F ┏━ U ━┫ ┃ ┃ ┏━ D ↔︎ A ┃ ┃ ┏━┫ ┃ ┗━ X ━┫ ┗━ E ↔︎ B ┃ ┃ S ━┫ ┗━━━ F ↔︎ C ┃ ┃ ┏━━━ G ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J Vの山の準決勝の先攻↔︎後攻が入れ替わった組合せも、同一トーナメントと見做します。 ┏━ A ┏━┫ ┏━ W ━┫ ┗━ B ┃ ┃ ┃ ┗━━━ C ┏━ U ━┫ ┃ ┃ ┏━ D ┃ ┃ ┏━┫ ┃ ┗━ X ━┫ ┗━ E ┃ ┃ S ━┫ ┗━━━ F ┃ ┃ ┏━━━ G ↔︎ I ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ↔︎ J ┗━ V ━┫ ┃ ┏━━━ I ↔︎ G ┗━ Z ━┫ ┗━━━ J ↔︎ H しかし、Wのグループの1回戦の第1試合とXのグループの1回戦の第2試合の先攻↔︎後攻が入れ替わった組合せは、同一トーナメントと見做しません。なぜなら、このトーナメントでは優勝チームが変わってくるからです。 ┏━ A ↔︎ D ┏━┫ ┏━ W ━┫ ┗━ B ↔︎ E ┃ ┃ ┃ ┗━━━ C ┏━ U ━┫ ┃ ┃ ┏━ D ↔︎ A ┃ ┃ ┏━┫ ┃ ┗━ X ━┫ ┗━ E ↔︎ B ┃ ┃ S ━┫ ┗━━━ F ┃ ┃ ┏━━━ G ┃ ┏━ Y ━┫ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J トーナメント表Rの組合せs_combinationをカウントしています。 # トーナメント表Sの組合せ数をカウントする s_combination += 1 1回戦2試合、準々決勝に進出する2チームを決定します。 # 準々決勝に進出する2チームを決める quaterfinals = table[f'{seq[0]}{seq[1]}'] quaterfinals += table[f'{seq[3]}{seq[4]}'] 1回戦を勝ち上がってきた2チームと、準々決勝から出場する6チームで、準決勝に進出する4チームを決定します。 # 準決勝に進出する4チームをリストに格納する semifinals = table[f'{quaterfinals[0]}{seq[2]}'] semifinals += table[f'{quaterfinals[1]}{seq[5]}'] semifinals += table[f'{seq[6]}{seq[7]}'] semifinals += table[f'{seq[8]}{seq[9]}'] 準決勝からはトーナメント表Rと同じなので、説明を省略します。 優勝チームとその時のトーナメント表を、'results.txt'に出力しています。 # 優勝チームとその時のトーナメント表を出力する print(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]}') fw.write(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]} [') for i, team in enumerate(seq): if i < ALL - 1: fw.write(f'{TEAMS[int(team)]}, ') else: fw.write(f'{TEAMS[int(team)]}]\n') トーナメント表R、Sと同様に、トーナメント表T用の辞書を作成しています。 # トーナメント表T用に辞書を作成する permutation = {} for seq in reversed(PERMUTATION): permutation[int(''.join(seq))] = ''.join(seq) トーナメント表R、Sと同様、トーナメント表Tの全ての順列が無くなるまで探索しています。 # トーナメント表S用に、全ての順列を探索する while permutation: _, seq = permutation.popitem() トーナメント表R、Sと同様に、全順列から同じ組合せを削除しています。先攻↔︎後攻が入れ替わった組合せは、トーナメント表Tの場合、全部で31通りあります。 # 除外する組合せは全部で31通り del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}')] del permutation[int(f'{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}{seq[0]}{seq[1]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}{seq[0]}{seq[1]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}{seq[1]}{seq[0]}{seq[2]}{seq[3]}{seq[4]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[8]}{seq[9]}{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[5]}{seq[6]}{seq[7]}{seq[9]}{seq[8]}{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[8]}{seq[9]}{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}')] del permutation[int(f'{seq[6]}{seq[5]}{seq[7]}{seq[9]}{seq[8]}{seq[1]}{seq[0]}{seq[2]}{seq[4]}{seq[3]}')] 例えば、トーナメント表Tの1回戦、第1試合の先攻↔︎後攻が入れ替わった組合せは、同一トーナメントと見做します。 ┏━ A ↔︎ B ┏━┫ ┏━ W ━┫ ┗━ B ↔︎ A ┃ ┃ ┃ ┗━━━ C ┏━ U ━┫ ┃ ┃ ┏━━━ D ┃ ┗━ X ━┫ ┃ ┗━━━ E ┃ T ━┫ ┏━ F ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ G ┃ ┃ ┃ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J 1回戦、2試合、準々決勝、2試合の先攻↔︎後攻が全て入れ替わった組合せも、同一トーナメントと見做します。 ┏━ A ↔︎ B ┏━┫ ┏━ W ━┫ ┗━ B ↔︎ A ┃ ┃ ┃ ┗━━━ C ┏━ U ━┫ ┃ ┃ ┏━━━ D ↔︎ E ┃ ┗━ X ━┫ ┃ ┗━━━ E ↔︎ D ┃ T ━┫ ┏━ F ↔︎ G ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ G ↔︎ F ┃ ┃ ┃ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ↔︎ J ┗━ Z ━┫ ┗━━━ J ↔︎ I トーナメントTの決勝戦、Uの山とVの山の先攻↔︎後攻が入れ替わった組合せも、同一トーナメントと見做します。 ┏━ A ↔︎ F ┏━┫ ┏━ W ━┫ ┗━ B ↔︎ G ┃ ┃ ┃ ┗━━━ C ↔︎ H ┏━ U ━┫ ┃ ┃ ┏━━━ D ↔︎ I ┃ ┗━ X ━┫ ┃ ┗━━━ E ↔︎ J ┃ T ━┫ ┏━ F ↔︎ A ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ G ↔︎ B ┃ ┃ ┃ ┃ ┃ ┗━━━ H ↔︎ C ┗━ V ━┫ ┃ ┏━━━ I ↔︎ D ┗━ Z ━┫ ┗━━━ J ↔︎ E しかし、Wのグループの1回戦の1試合とXのグループの準決勝の先攻↔︎後攻が入れ替わった組合せは、同一トーナメントと見做しません。なぜなら、このトーナメントでは優勝チームが変わってくるからです。 ┏━ A ↔︎ D ┏━┫ ┏━ W ━┫ ┗━ B ↔︎ E ┃ ┃ ┃ ┗━━━ C ┏━ U ━┫ ┃ ┃ ┏━━━ D ↔︎ A ┃ ┗━ X ━┫ ┃ ┗━━━ E ↔︎ B ┃ T ━┫ ┏━ F ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ G ┃ ┃ ┃ ┃ ┃ ┗━━━ H ┗━ V ━┫ ┃ ┏━━━ I ┗━ Z ━┫ ┗━━━ J 今まで格納した組合せt_combinationに無かった組合せが出現したら、t_combinationのリストに追加します。 # トーナメント表Tの組合せ数をカウントする t_combination += 1 1回戦2試合、準々決勝に進出する2チームを決定します。 # 準々決勝に進出する2チームを決める quaterfinals = table[f'{seq[0]}{seq[1]}'] quaterfinals += table[f'{seq[5]}{seq[6]}'] 1回戦を勝ち上がってきた2チームと、準々決勝から出場する6チームで、準決勝に進出する4チームを決定します。 # 準決勝に進出する4チームをリストに格納する semifinals = table[f'{quaterfinals[0]}{seq[2]}'] semifinals += table[f'{seq[3]}{seq[4]}'] semifinals += table[f'{quaterfinals[1]}{seq[7]}'] semifinals += table[f'{seq[8]}{seq[9]}'] 準決勝からはトーナメント表R、Sと同じなので、説明を省略します。 優勝チームとその時のトーナメント表を、'results.txt'に出力しています。 # 優勝チームとその時のトーナメント表を出力する print(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]}') fw.write(f'case {r_combination + s_combination + t_combination} 優勝: {TEAMS[win]} [') for i, team in enumerate(seq): if i < ALL - 1: fw.write(f'{TEAMS[int(team)]}, ') else: fw.write(f'{TEAMS[int(team)]}]\n') 確認用です。r_combinationは、10チームのトーナメント表Rの組合せの総数を出力しています。 s_combinationは、10チームのトーナメント表Sの組合せの総数を出力しています。 t_combinationは、10チームのトーナメント表Tの組合せの総数を出力しています。 # 確認用、トーナメント表Rの組合せの総数を表示する print(f'トーナメント表Rの組合せ: {r_combination}') fw.write(f'トーナメント表Rの組合せ: {r_combination}\n') # 確認用、トーナメント表Sの組合せの総数を表示する print(f'トーナメント表Sの組合せ: {s_combination}') fw.write(f'トーナメント表Sの組合せ: {s_combination}\n') # 確認用、トーナメント表Tの組合せの総数を表示する print(f'トーナメント表Tの組合せ: {t_combination}') fw.write(f'トーナメント表Tの組合せ: {t_combination}\n') 最後に全10チームの優勝回数を出力しています。 # 全10チームが優勝した回数を表示する for i, team in enumerate(TEAMS): print(f'{team}: {wins[i]}') fw.write(f'{team}: {wins[i]}\n') 動作確認環境 • MacOS 12.2.1 • Python 3.8.9 スクリプトの実行結果 私の環境では、このスクリプトは約30秒で走り終わりました。環境によって、もう少し時間がかかるかもしれません。 実行結果は、下記の通りになりました。トーナメント表Rの組合せは、28350通り、トーナメント表Sの組合せは、56700通り、トーナメント表Tの組合せは、113400通りでした。 トーナメント表Rの組合せ: 28350 トーナメント表Sの組合せ: 56700 トーナメント表Tの組合せ: 113400 スイス: 78147 スウェーデン: 91108 イギリス: 12307 日本: 1639 カナダ: 1660 アメリカ: 357 中国: 12604 韓国: 628 デンマーク: 0 ROC: 0 10チームのトーナメントの組合せ総数は、28350+56700+113400=198450通りとなりました。9チームのトーナメントの組合せの総数は11340通りなので、単純に割り算すると、198450÷11340=17.5倍になります。もはや、10チームのトーナメントの組合せ総数を計算で導き出すのは困難になってきました。 10チームのトーナメント戦の考察 10チームの優勝回数を考察すると、以下のようなことが言えます。 総当たり対戦成績の結果、8勝1敗のスイスの優勝回数が、78147回に対し、7勝2敗のスウェーデンの優勝回数が、91108回で、スイスの優勝回数より12961回も上回っている。 5勝4敗で並んでいる、イギリスの優勝回数は12307回に対し、日本の優勝回数は1639回、カナダの優勝回数は1660回である。 4勝5敗で並んでいる、アメリカの優勝回数は357回、韓国の優勝回数は628回だけなのに対し、中国の優勝回数は12604回も優勝している。 2勝しかしていないデンマーク、1勝しかしていないROCは優勝できない。 8勝1敗のスイスが、7勝2敗のスウェーデンより優勝回数が、少ない理由について、調査が必要である。 仮説を立てると、他の8チームより、勝ち星の差が大きく、2強、6普通、2弱状態なのが、大きな理由かもしれない。2強チームのトーナメントにおいては、2強チームの直接対決が重要になってきそうだ。何故なら、2強チームが、決勝に進出する可能性が高く、決勝に進出すれば、必ず直接対決で、勝利したチームが優勝する。 5勝4敗で同じ勝ち星の、イギリスが、優勝回数で日本、カナダを大きく引き離している理由は、優勝候補のスウェーデンに勝利しているからである。 4勝5敗の中国が、イギリスの優勝回数を上回っているのも、優勝候補のスウェーデンと直接対決でイギリスに勝利しているのが大きな要因と言えそうだ。 8勝1敗のスイスの優勝確率は、78147÷198450=39.38%の確率で優勝する。 7勝2敗のスウェーデンの優勝確率は、91108÷198450=45.91%の確率で優勝する。 2強チームの優勝確率の合計は85.29%で、2強チームで8.5割以上を占めている。 5勝4敗のイギリスの優勝確率は、12307÷198450=6.20%、日本の優勝確率は、1639÷198450=0.83%、カナダの優勝確率は1660÷198450=0.84%で、日本とカナダの優勝確率は1%にも満たない。 4勝5敗のアメリカの優勝確率は、357÷198450=0.18%、韓国の優勝確率は、628÷198450=0.32%と1%にも満たないのに対し、中国の優勝確率は12604÷198450=6.35%と、イギリスの優勝確率より若干上回っている。 上記の考察結果から、敗戦即敗退のトーナメント方式で、優勝する秘訣は トーナメントで勝ち上がる秘訣は、苦手チームとは対戦する前に、苦手チームが別のチームと対戦して、敗退してもらうことが重要となってきそうだ。今回の2強チームのトーナメント表では、総当たり戦の勝ち星の低いスウェーデンが、直接対決でスイスに勝利しているので、結果優勝回数は、スウェーデンの方がスイスを上回っている。 少ない勝利数で優勝するためには、優勝候補チームに勝つことが重要である。なぜなら、優勝候補チームは準決勝、決勝まで勝ち進む確率が高く、下位チームより対戦する確率が高くなるからである。 もう少し掘り下げて、優勝した時のトーナメント表から優勝できる条件を分析する まず、スイスを見てみよう。スイスにとっての天敵は、スウェーデンである。優勝するためには、初戦でスウェーデン戦を回避しつつ、準決勝、決勝までに、スウェーデンが敗退しているのが条件である。 スイスが優勝するトーナメント表の例 ┏━ 中国 ┏━┫ ┏━ W ━┫ ┗━ ROC ┃ ┃ ┃ ┗━━━ アメリカ ┏━ U ━┫ ┃ ┃ ┏━━━ スウェーデン ┃ ┗━ X ━┫ ┃ ┗━━━ イギリス ┃ ━┫ ┏━ 韓国 ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ デンマーク ┃ ┃ ┃ ┃ ┃ ┗━━━ カナダ ┗━ V ━┫ ┃ ┏━━━ スイス ┗━ Z ━┫ ┗━━━ 日本 次に、スウェーデンが優勝するためには、スウェーデンにとっての天敵は、イギリスと中国である。優勝するためには、初戦でイギリスと中国戦を回避しつつ、準決勝、決勝までに、イギリスと中国が敗退しているのが条件である。 スウェーデンが優勝するトーナメント表の例 ┏━ 中国 ┏━┫ ┏━ W ━┫ ┗━ ROC ┃ ┃ ┃ ┗━━━ アメリカ ┏━ U ━┫ ┃ ┃ ┏━━━ スウェーデン ┃ ┗━ X ━┫ ┃ ┗━━━ 日本 ┃ ━┫ ┏━ 韓国 ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ デンマーク ┃ ┃ ┃ ┃ ┃ ┗━━━ スイス ┗━ V ━┫ ┃ ┏━━━ イギリス ┗━ Z ━┫ ┗━━━ カナダ イギリスが優勝するためには、イギリスがUの山の場合、スイスとスウェーデンがVの山で対戦し、初戦で中国と対戦せず、準決勝までに中国が敗退し、決勝でスウェーデンと対戦するのが条件である。 イギリスが優勝するトーナメント表の例 ┏━ 中国 ┏━┫ ┏━ W ━┫ ┗━ ROC ┃ ┃ ┃ ┗━━━ アメリカ ┏━ U ━┫ ┃ ┃ ┏━━━ イギリス ┃ ┗━ X ━┫ ┃ ┗━━━ 日本 ┃ ━┫ ┏━ 韓国 ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ デンマーク ┃ ┃ ┃ ┃ ┃ ┗━━━ スイス ┗━ V ━┫ ┃ ┏━━━ スウェーデン ┗━ Z ━┫ ┗━━━ カナダ 日本が優勝するためには、日本がVの山の場合、中国と韓国とイギリスとスイスとスウェーデンがUの山で対戦し、中国が1回戦で韓国に勝利し、準々決勝でイギリスに勝利し、準決勝でスウェーデンに勝利し、決勝で日本と中国が対戦するのが条件である。 日本が優勝するトーナメント表の例 ┏━ 中国 ┏━┫ ┏━ W ━┫ ┗━ 韓国 ┃ ┃ ┃ ┗━━━ イギリス ┏━ U ━┫ ┃ ┃ ┏━━━ スイス ┃ ┗━ X ━┫ ┃ ┗━━━ スウェーデン ┃ ━┫ ┏━ デンマーク ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ ROC ┃ ┃ ┃ ┃ ┃ ┗━━━ アメリカ ┗━ V ━┫ ┃ ┏━━━ 日本 ┗━ Z ━┫ ┗━━━ カナダ カナダが優勝するためには、カナダがVの山の場合、スイスとスウェーデンとイギリスがUの山で対戦し、Vの山の日本が準々決勝で敗退し、決勝でイギリスと対戦するのが条件である。 カナダが優勝するトーナメント表の例 ┏━ 中国 ┏━┫ ┏━ W ━┫ ┗━ ROC ┃ ┃ ┃ ┗━━━ イギリス ┏━ U ━┫ ┃ ┃ ┏━━━ スイス ┃ ┗━ X ━┫ ┃ ┗━━━ スウェーデン ┃ ━┫ ┏━ 韓国 ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ デンマーク ┃ ┃ ┃ ┃ ┃ ┗━━━ 日本 ┗━ V ━┫ ┃ ┏━━━ カナダ ┗━ Z ━┫ ┗━━━ アメリカ アメリカが優勝するためには、アメリカがVの山の場合、カナダと中国とイギリスとスイスとスウェーデンがUの山で対戦し、中国が1回戦でカナダに勝利し、準々決勝でイギリスに勝利し、準決勝でスウェーデンに勝利し、Vの山の日本が準々決勝で敗退し、決勝で中国と対戦するのが条件である。 アメリカが優勝するトーナメント表の例 ┏━ カナダ ┏━┫ ┏━ W ━┫ ┗━ 中国 ┃ ┃ ┃ ┗━━━ イギリス ┏━ U ━┫ ┃ ┃ ┏━━━ スイス ┃ ┗━ X ━┫ ┃ ┗━━━ スウェーデン ┃ ━┫ ┏━ デンマーク ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ ROC ┃ ┃ ┃ ┃ ┃ ┗━━━ アメリカ ┗━ V ━┫ ┃ ┏━━━ 日本 ┗━ Z ━┫ ┗━━━ 韓国 中国が優勝するためには、中国がUの山の場合、日本とスウェーデンとスイスがVの山で対戦し、デンマークとROCとの初戦の対戦を回避しつつ、デンマークとROCが準決勝までに敗退し、中国がUの山でイギリスとカナダに勝利し、決勝でスウェーデンと対戦するのが条件である。 中国が優勝するトーナメント表の例 ┏━ カナダ ┏━┫ ┏━ W ━┫ ┗━ 韓国 ┃ ┃ ┃ ┗━━━ アメリカ ┏━ U ━┫ ┃ ┃ ┏━━━ イギリス ┃ ┗━ X ━┫ ┃ ┗━━━ 中国 ┃ ━┫ ┏━ デンマーク ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ ROC ┃ ┃ ┃ ┃ ┃ ┗━━━ スイス ┗━ V ━┫ ┃ ┏━━━ スウェーデン ┗━ Z ━┫ ┗━━━ 日本 最後に、韓国が優勝するためには、韓国がUの山の場合、スイスとスウェーデンとイギリスがVの山で対戦し、Uの山のカナダが準々決勝で敗退し、Vの山のイギリスが準決勝でスウェーデンに勝利し、決勝でイギリスと対戦するのが条件である。 韓国が優勝するトーナメント表の例 ┏━ カナダ ┏━┫ ┏━ W ━┫ ┗━ デンマーク ┃ ┃ ┃ ┗━━━ 日本 ┏━ U ━┫ ┃ ┃ ┏━━━ 韓国 ┃ ┗━ X ━┫ ┃ ┗━━━ ROC ┃ ━┫ ┏━ アメリカ ┃ ┏━┫ ┃ ┏━ Y ━┫ ┗━ 中国 ┃ ┃ ┃ ┃ ┃ ┗━━━ イギリス ┗━ V ━┫ ┃ ┏━━━ スイス ┗━ Z ━┫ ┗━━━ スウェーデン 最後に 前回、カーリング女子・最終予選の総当たり対戦成績表から、トーナメント方式に置き換えた場合の、優勝するチームをPythonスクリプトで作成してみました。今回、2022年北京オリンピック・カーリング女子の出場チームが10チームになったことで、9チームの時のスクリプトを修正して10チームに対応してみましたが、1チーム増えるだけで、組合せがかなり増える結果となりました。もはやここまで来ると、スクリプト無しに計算だけで全ての組合せを計算するのは、私には不可能な領域に達しています。 また、当初、9チームの時のスクリプトをそのまま使用していたのですが、今まで出現したトーナメントの組合せを配列で持たせ、新たな組合せが出現したら、配列に追加するという方法を取っていたのですが、それを10チームのトーナメントで試すと、丸一日スクリプトを動かしても、スクリプトが最後まで走り切ることができませんでした。今回の工夫した点は、配列から辞書型に変更し、試したトーナメントと同じ組合せを辞書のキーの値で削除するという方法に変更すると、30秒であっという間にスクリプトが全て走り終わりました。 総当たり戦で、8勝1敗と好成績を収めたスイスが、意外にも7勝2敗のスウェーデンにトーナメントの優勝確率で、45.91-39.38=6.53%と水を開けられているのに驚きました。今回も、実際にスクリプトを動かしてみて、初めて気付かされることがたくさんありました。 最後まで、この記事を読んでいただき、ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Raspberry Pi Pico に CircuitPytnon を使い SSD1306 に文字を表示する

以下の記事の Raspberry Pi Pico + CircuitPython 版です。 まず Raspberry Pi Pico で CircuitPython が動く環境を作ります。公式ガイドは以下となります。 Raspberry Pi Pico 上の BOOTSEL とラベルがされたボタンを押しながら PC と USB ケーブルで接続します。 すると RPI-RP2 という名前でストレージが接続されるので以下からダウンロードした UF2 ファイルをダウンロードしてコピーします。 すると今度は CIRCUITPY という名前でストレージが接続されます。 エディタはなんでもかまいません。いずれのエディタを使った場合でも CIRCUITPY というストレージの下に code.py というファイルがあるためこれを編集します。CircuitPython では Raspberry Pi Pico 起動時に自動的にこのファイルを実行します。 Thonny 、Mu、あるいは VSCode あたりを使うと REPL と呼ばれる Python の対話モードのプロンプトが簡単に取れるので便利です。尚、プログラムの実行は code.py を保存すると自動的に実行されます。REPL は COM6 などのシリアルポートとして認識されるため TeraTerm や Putty などのソフトでも接続することができます。 VSCode なら Pico-Go という extention を使うことになると思います。CircuitPython という extention もありますが私の環境で試したかぎりではうまく動いてくれませんでした。 前述の 公式ガイド では Mu を前提としています。Thonny でも問題ないと思います。エディタの使い方に関してはそれぞれのドキュメントを参照してください。 Raspberry Pi Pico と SSD1306 の配線は以下のとおりです。Raspberry Pi Pico のピン配列は ここ や ここ などを参照してください。 Pico SSD1306 GP0 (1) SDA GP1 (2) SCL 3V3_EN (36) VCC GND (38 等) GND 続いてプログラムですが SSD1306 を使う場合はライブラリを使うと便利です。ライブラリをインストールするにはライブラリをダウンロードし CIRCUITPY の下の libs というフォルダにコピーします。公式ガイド では NeoPixel LEDs を例にライブラリの使い方を解説しています。 ライブラリを入手するには以下のページから adafruit-circuitpython-bundle-7.x-mpy をダウンロードします。 今回は SSD1306 を使うので zip ファイルを解凍し lib フォルダにある以下のフォルダとファイルを CIRCUITPY の下にある libs フォルダにコピーします。 adafruit_display_text フォルダ adafruit_displayio_ssd1306.mpy 続いて CIRCUITPY の下の code.py を編集します。単純に画面の真ん中に Hello World! と表示するには以下のような Python プログラムを書きます。 code.py import board import busio import displayio import terminalio from adafruit_display_text import label import adafruit_displayio_ssd1306 displayio.release_displays() SDA = board.GP0 SCL = board.GP1 i2c = busio.I2C(SCL, SDA) display_bus = displayio.I2CDisplay(i2c, device_address=0x3C) WIDTH = 128 HEIGHT = 64 display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT) splash = displayio.Group() display.show(splash) text = "Hello World!" text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=28, y=HEIGHT // 2 - 1 ) splash.append(text_area) while True: pass Mu ではファイルを保存すると code.py が自動で実行されます。Thonny または VSCode ではエディタからプログラムを実行します。USB ケーブルを抜いてから接続しても Raspberry Pi Pico 起動時に自動で code.py が実行されます。 実行結果は本エントリーのトップの写真のとおりとなるはずです。 Adafruit に SSD1306 のページ がありますが Raspberry Pi Pico は前提としていないようです。やや手直しが必要ですがもう少し複雑なサンプルプログラムは adafruit-circuitpython-bundle-7.x-mpy や ここ などから入手できます。 Pillow を使ったサンプルもありますが Raspberry Pi Pico の場合 CircuitPython を使うとプログラムやライブラリで使えるストレージ容量は 1MB となるためそのまま日本語の TrueType フォントなどは使えないようです。 参考: Hello Raspberry Pi
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

別のLambdaを同時に呼び出して実行する方法【備忘録】

背景 Lambdaを使って日付ごとにデータをスクレイピングすることがあった。 大量のデータであったが、繰り返し文で日付を変えながら行うプログラムとしていたため、非常に時間がかかった。 そこで、①実行指示Lambdaと②スクレイピングLambdaに分けてプログラムを作成し、①にて変数を入れ替えながら②に指示するような構成にすることで、Lambdaの同時実行が可能になったので、備忘録として記載する。 参考記事については複数層に分けて大量のLambda実行を可能としているが、今回はわかりやすさ優先で、(親)と(子)の2層構造でLambdaを同時実行してみる。 イメージ 親Lambda parent import json import io client = boto3.client('lambda') date_list = ['2022/01','2022/02','2022/03','2022/04'] category_list = ['setosa','versicolor','virginica','other'] def lambda_handler(event, context): # 子Lambda の呼び出し for i in range(len(date_list)): response = client.invoke( FunctionName='children',#Lambdaで記載している関数名を記載 InvocationType='Event', Payload=json.dumps({'DATE': date_list[i] ,'CATEGORY': category_list[i] }) ) 上記のように、親Lambda内で子Lambdaを呼び出している。for文でdate_listの数(4回)だけ呼び出しをするように指示している。 子Lambda children import json from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait def lambda_handler(event, context): date = str(event.get('DATE')) category = str(event.get('CATEGORY')) driver = headless_chrome() wait = WebDriverWait(driver, 30) driver.get("http://〇〇…") ・・・ 親Lambdaで呼び出された子Lambdaは、event.getで親Lambdaから渡された変数を読み込むことができる。 終わりに 上記は基本形の形であるが、参考記事のように複数層で呼び出しー呼び出され構成にすることで、並列処理チックな構成を組むことが可能。 大量データのスクレイピングだけではなく、大量データの集計・解析作業の高速化につながることを期待。 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

二項分布の正規分布による近似を Python で確かめる

本記事の目的 二項分布は $n$ が大きい場合に正規分布によって近似できます. これを Python で確かめるのが本記事の目的です. 二項分布の正規近似について少し具体的に述べます. まず,二項分布 $\mathrm{Bin}(n,p)$ に従う確率変数 $X$ を考えます. $n$ を大きくすると,近似的に $X$ は正規分布 $\mathrm{N}(np, np(1-p))$ に従うというものです. ※ $\mathrm{Bin}(n,p)$ に従う確率変数の平均は $np$, 分散は $np(1-p)$. これは中心極限定理の特殊な場合とみなせます(詳しくは https://hsugaku.com/18-20 がわかりやすかったです). 本当に二項分布が正規分布に近づくか確かめる 二項分布で $n$ を変えて分布のヒストグラムを描き,正規分布に近づくか確かめます. $n$ は変えますが,$p$ は0.5で固定しています. stats.binom の rvs() という関数を使うことで,二項分布からのサンプリングを行います. その結果を用いて,二項分布のヒストグラムを描画します. このヒストグラムを,正規分布 $\mathrm{N}(np, np(1-p))$ の確率密度関数と重ねて描画し,見比べます. 以下にコードを示します(Jupyter Lab 上で動かしました). まず必要なライブラリをインポートします. ライブラリのインポート import numpy as np import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns sns.set() from scipy import stats 次にプロット用のコードです. 二項分布 $\mathrm{Bin}(n,p)$ から 100000 回サンプリングを行い,その結果をヒストグラムで描画します. また,正規分布 $\mathrm{N}(np, np(1-p))$ の確率密度関数を描画して,比較します. これを各 $n$ について繰り返し,最後にまとめてプロットします. コードに関する説明 二項分布のヒストグラムは plt.hist() を使って描画します.このとき density=True を渡すことで度数の合計が1になるように正規化します.これにより,正規分布の確率密度関数と見比べることができます. 正規分布の確率密度関数を描画するためには横軸の値(正規分布に従う確率変数の実現値)を与える必要があります.これらの値として,$x \in [np-2.58np(1-p),~~np+2.58np(1-p)]$ を満たす $x$ を 0.001 の間隔で生成しました(np.arange() を使用).2.58という数字は正規分布の両側99%点からきています. fig = plt.figure(figsize=(20, 12), dpi=200) n_list = [1, 5, 10, 50, 100, 1000, 5000, 10000] p = 0.5 for i, n in enumerate(n_list): ax = fig.add_subplot(2, 4, i+1) plt.title(f'$n={n}$, $p={p}$') # 二項分布からサンプリング binom_vals = stats.binom.rvs(n=n, p=p, size=100000) # 二項分布の平均と分散 mu = n*p var = n*p*(1-p) # 二項分布のヒストグラムを描画 plt.hist(binom_vals, bins=30, label='binom', alpha=0.4, density=True) # 正規分布のpdfを描画 x = np.arange(mu-2.58*var**0.5, mu+2.58*var**0.5, 0.001) # 99%点まで描画する norm_vals = stats.norm.pdf(x, loc=mu, scale=var**0.5) # pdfの値 plt.plot(x, norm_vals, label='norm') plt.legend() # 余白を調整して保存 plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95) plt.savefig('binom_norm.png') 上のコードで保存される binom_norm.png は以下のような画像になりました. 青色が二項分布,オレンジ色が正規分布です. $n=1, 5, 10$ あたりでは正規分布になっている感じはありませんが,$n=50$ あたりからだいぶ正規分布に近づいているのがわかります. $n$が 1000 以上になると二項分布と正規分布のヒストグラムはほぼ一致しているのがわかります.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「新・明解Pythonで学ぶアルゴリズムとデータ構造」で勉強日記#22

【出典】「新・明解Pythonで学ぶアルゴリズムとデータ構造」 前回の記事はこちら 6-6 クイックソート 最も高速なソートの一つとして知られており、広く利用されています。 クイックソートはグループわけの基準である枢軸を境に以上以下のグループで分ける手法を取ります。 枢軸は任意です。 最初に配列を2つのグループに分割する手順を考えます。 任意の数字を枢軸とした際、双方向バブルソートと同じように左右それぞれから走査し、枢軸と比較して以上、以下のグループ分けをします。添字について、左端側をpl、右端側をprとします。 この時配列aについて ・枢軸以下のグループ:a[0], ・・・, a[pl - 1] ・枢軸以上のグループ:a[pr + 1],・・・, a[n - 1] というグループ分けができます。 また、pl > pr + 1 のときに限り ・枢軸と一致するグループ:a[pr + 1], ・・・, a[pl - 1] というグループができます。 list6-10 #配列の分割 from typing import MutableSequence def partition(a: MutableSequence) -> None: """配列を分割して表示""" n = len(a) pl = 0 #左カーソル pr = n - 1 #右カーソル x = a[n // 2] # 枢軸(中央の要素) while pl <= pr: #配列aを枢軸xで分割 while a[pl] < x: pl += 1 while a[pr] > x: pr -= 1 if pl <= pr: a[pl], a[pr] = a[pr], a[pl] pl += 1 pr -= 1 print(f'枢軸の値は{x}です。') print('枢軸以下のグループ') print(*a[0 : pl]) if pl > pr + 1: print('枢軸と一致するグループ') print(*a[pr + 1 : pl]) print('枢軸以上のグループ') print(*a[pr + 1 : n]) if __name__ == '__main__': print('配列を分割します。') num = int(input('要素数:')) x = [None] * num #要素数numの配列を生成 for i in range(num): x[i] = int(input(f'x[{i}]:')) partition(x) #配列xを分割して表示 クイックソート 配列の分割を発展させることで、クイックソートのアルゴリズムとなります。 left(先頭の要素)、right(末尾の要素)としたとき ・prが先頭より右側に位置する(left < pr)のであれば、左グループを分割。 ・plが末尾より左側に位置する(right > pl)のであれば、右グループを分割します。 list6-11 # クイックソート from typing import MutableSequence def qsort(a: MutableSequence, left: int, right: int) -> None: """a[left]~a[right]をクイックソート""" pl = left #左カーソル pr = right #右カーソル x = a[(left + right) // 2] #枢軸(中央の要素) while pl <= pr: while a[pl] < x: pl += 1 while a[pr] > x: pr -= 1 if pl <= pr: a[pl], a[pr] = a[pr], a[pl] pl += 1 pr -= 1 if left < pr: qsort(a, left, pr) if pl > right: qsort(a, pl, right) def quick_sort(a: MutableSequence) -> None: """クイックソート""" qsort(a, 0, len(a) - 1) if __name__ == '__main__': print('クイックソート') num = int(input('要素数:')) x = [None] * num #要素数numの配列を生成 for i in range(num): x[i] = int(input(f'x[{i}]:')) quick_sort(x) #配列xをクイックソート print('昇順にソートしました。') for i in range(num): print(f'x[{i}]={x[i]}') 一種の分割統治法であるため、再帰呼び出しを用いて簡潔に実現ができます。 また、クイックソートは安定ではありません。 コラム6-3 クイックソートにおける分割の過程の表示 list6C-3 def qsort(a: MutableSequence, left: int, right: int) -> None: """a[left]~a[right]をクイックソート(配列の分割過程を表示)""" pl = left #左カーソル pr = right #右カーソル x = a[(left + right) // 2] #枢軸(中央の要素) print(f'a[{left}]~a[{right}]:', *a[left : right + 1]) while pl <= pr: while a[pl] < x: pl += 1 while a[pr] > x: pr -= 1 if pl <= pr: a[pl], a[pr] = a[pr], a[pl] pl += 1 pr -= 1 if left < pr: qsort(a, left, pr) if pl > right: qsort(a, pl, right) # クイックソート from typing import MutableSequence def qsort(a: MutableSequence, left: int, right: int) -> None: """a[left]~a[right]をクイックソート""" pl = left #左カーソル pr = right #右カーソル x = a[(left + right) // 2] #枢軸(中央の要素) print(f'a[{left}]~a[{right}]:', *a[left : right + 1]) while pl <= pr: while a[pl] < x: pl += 1 while a[pr] > x: pr -= 1 if pl <= pr: a[pl], a[pr] = a[pr], a[pl] pl += 1 pr -= 1 if left < pr: qsort(a, left, pr) if pl > right: qsort(a, pl, right) def quick_sort(a: MutableSequence) -> None: """クイックソート""" qsort(a, 0, len(a) - 1) if __name__ == '__main__': print('クイックソート') num = int(input('要素数:')) x = [None] * num #要素数numの配列を生成 for i in range(num): x[i] = int(input(f'x[{i}]:')) quick_sort(x) #配列xをクイックソート print('昇順にソートしました。') for i in range(num): print(f'x[{i}]={x[i]}') 非再帰的クイックソート スタックを活用することで、非再帰的なプリグラムを作ることができます。 list6-12 #クイックソート(非再帰版) from stack import Stack #list4c-1 from typing import MutableSequence def qsort(a: MutableSequence, left: int, right: int) -> None: """a[left]~a[right]をクイックソート(非再帰版)""" range = Stack(right - left + 1) range.push((left, right)) while not range.is_empty(): pl, pr = left, right = range.pop() #左右のカーソルを取り出す x = a[(left + right) // 2] #枢軸()中央の要素 while pl <= pr: while a[pl] < x: pl += 1 while a[pr] > x: pr -= 1 if pl <= pr: a[pl], a[pr] = a[pr], a[pl] pl += 1 pr -= 1 if left < pr: range.push((left, pr)) #左グループのカーソルを保存 if pl < right: range.push((pl, right)) #右グループのカーソルを保存 枢軸の選択 枢軸の選択方法はクイックソートの実行効率に大きく影響を与えます。 偏った分割の繰り返しは高速なソートを期待できないため、値としての中央値を枢軸とするのが理想です。 時間計算量 クイックソートは要素数が小さい場合はそれほど高速ではありません。 そこで要素が小さい場合は単純挿入ソートに切り替え、枢軸については以下の考え方を用います。 ・分割すべき配列の先端要素/中央要素/末尾要素の3要素をソートして、さらに中央要素と末尾から2番目の要素を交換する。枢軸として末尾から2番目に要素の値a[right - 1]を採用するとともに、分割の対象をa[left + 1] ~a[right -2]に絞り込む。 list6-13 #クイックソート(第2版) from typing import MutableSequence def sort3(a: MutableSequence, idx1: int, idx2: int, idx3: int): """a[idx1], a[idx2], a[idx3]を昇順にソートして中央値の添字を返却""" if a[idx2] < a[idx1]: a[idx2], a[idx1] = a[idx1], a[idx2] if a[idx3] < a[idx2]: a[idx3], a[idx2] = a[idx2], a[idx3] if a[idx2] < a[idx1]: a[idx2], a[idx1] = a[idx1], a[idx2] return idx2 def insertion_sort(a: MutableSequence, left: int, right: int) -> None: """a[left]~a[right]を単純挿入ソート""" for i in range(left + 1, right + 1): j = i tmp = a[i] while j > 0 and a[j - 1] > tmp: a[j] = a[j - 1] j -= 1 a[j] = tmp def qsort(a: MutableSequence, left: int, right: int) -> None: """a[left]~a[right]をクイックソート""" if right - left < 9: #要素数が9未満であれば単純挿入ソートに切り替える insertion_sort(a, left, right) else: pl = left #左カーソル pr = right #右カーソル m = sort3(a, pl, (pl + pr) // 2, pr) x = a[m] a[m], a[pr - 1] = a[pr - 1], a[m] pl += 1 pr -= 2 while pl <= pr: while a[pl] < x: pl += 1 while a[pr] > x: pr -= 1 if pl <= pr: a[pl], a[pr] = a[pr], a[pl] pl += 1 pr -= 1 if left < pr: qsort(a, left, pr) if pl < right: qsort(a, pl, right) def quick_sort(a: MutableSequence) -> None: """クイックソート""" qsort(a, 0, len(a) - 1) if __name__ == '__main__': print('クイックソート(第2版)') num = int(input('要素数:')) x = [None] * num #要素数numの配列を生成 for i in range(num): x[i] = int(input(f'x[{i}]:')) quick_sort(x) #配列xをクイックソート print('昇順ソートしました。') for i in range(num): print(f'x[{i}]={x[i]}') コラム6-4 sorted関数によるソート pythonはソートを行うためのsorted関数を組み込み関数として提供します。この関数は、受け取った(任意の方の)イテラブルオブジェクトの要素をソートして、list型のリストとして返却します。そのため、ソートを行う関数というよりも「ソートを行った後の並びを新しいリストとして生成して返却する関数」です。 list6C-4 #sorted関数によるソート print('sorted関数によるソート') num = int(input('要素数:')) x = [None] * num #要素数numの配列を生成 for i in range(num): x[i] = int(input(f'x[{i}]:')) #配列xを昇順にソート x = sorted(x) print('昇順にソートしました。') for i in range(num): print(f'x[{i}]={x[i]}') #配列xを降順にソート x = sorted(x, reverse=True) print('降順にソートしました。') for i in range(num): print(f'x[{i}]={x[i]}') 6-7マージソート 配列を前半部と後半部の二つに分けてそれぞれをソートした下のをマージする作業を繰り返すことによってソートを行うアルゴリズムです。 最初に、ソート済みの配列をマージすることでマージの理解を深めましょう。 list6-14 #ソート済み配列のマージ from typing import Sequence, MutableSequence def merge_sorted_list(a: Sequence, b:Sequence, c:MutableSequence) -> None: """ソート済み配列aとbをマージしてcに格納""" pa, pb, pc = 0, 0, 0 #カーソル na, nb, nc = len(a), len(b), len(c) #要素数 while pa < na and pb < nb: #小さい方を格納 if a[pa] <= b[pb]: c[pc] = a[pa] pa += 1 else: c[pc] = b[pb] pb += 1 pc += 1 while pa < na: #aに残った要素をコピー c[pc] = a[pa] pa += 1 pc += 1 while pb < nb: #bに残った要素をコピー c[pc] = b[pb] pb += 1 pc += 1 if __name__ == '__main__': a = [2, 4, 6, 8, 11, 13] b = [1, 2, 3, 4, 9, 16, 21] c = [None] * (len(a) + len(b)) print('二つのソートずみ配列のマージ') merge_sorted_list(a, b, c) #配列aとbをマージしてcに格納 print('配列aとbをマージして配列cに格納しました。') print(f'配列a:{a}') print(f'配列b:{b}') print(f'配列c:{c}') マージソート ソート済み配列のマージを応用して、分割統治法によってソートを行うアルゴリズムがマージソートです。 list6-15 #マージソート from typing import MutableSequence def merge_sort(a: MutableSequence) -> None: def _merge_sort(a: MutableSequence, left: int, right: int) -> None: """a[left]~a[right]を再帰的にマージソート""" if left < right: center = (left + right) // 2 _merge_sort(a, left, center) #前半部をマージソート _merge_sort(a, center + 1, right) #後半部をマージソート p = j = 0 i = k = left while i <= center: buff[p] = a[i] p += 1 i += 1 while i <= right and j < p: if buff[j] <= a[i]: a[k] = buff[j] j += 1 else: a[k] = a[i] i += 1 k += 1 while j < p: a[k] = buff[j] k += 1 j += 1 n = len(a) buff = [None] * n _merge_sort(a, 0, n - 1) del buff if __name__ == '__main__': print('マージソート') num = int(input('要素数:')) x = [None] * num #要素数numの配列を生成 for i in range(num): x[i] = int(input(f'x[{i}]:')) merge_sort(x) #配列xをマージソート print('昇順にソートしました。') for i in range(num): print(f'x[{i}]={x[i]}') 今回は以上です。 ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pythonでプロットしてみる#3

前回はptsファイルを二次元でプロットしてみた 勉強ついでに三次元でのプロットもやってみようと思う! 20220228.pts 35.9528 397.0 188 39.2651 397.0 188 39.3750 521.0 188 40.6219 389.0 188 40.4791 516.0 188 47.4060 393.0 188 49.5154 394.0 188 48.1366 807.0 188 50.2460 420.0 188 51.4984 398.0 188 51.8555 407.0 188 52.3553 404.0 188 51.8390 786.0 188 53.6847 758.0 188 54.4373 752.0 188 55.0415 746.0 188 55.6677 738.0 188 56.4203 732.0 188 56.9037 726.0 188 57.6398 717.0 188 58.2605 712.0 188 58.8702 706.0 188 59.4965 700.0 188 60.1062 694.0 188 60.7324 689.0 188 61.4685 684.0 188 62.0892 679.0 188 62.5781 674.0 188 63.1989 668.0 188 64.0613 664.0 188 64.5612 658.0 188 65.1709 654.0 188 65.9180 649.0 188 66.5277 645.0 188 67.1375 641.0 188 67.7637 637.0 188 68.3734 633.0 188 68.9996 631.0 188 69.6094 627.0 188 70.3564 623.0 188 70.9662 620.0 188 71.4661 616.0 188 72.2021 613.0 188 72.7020 610.0 188 73.4326 607.0 188 74.1852 605.0 188 74.5422 602.0 188 75.2948 600.0 188 75.9045 597.0 188 76.5308 595.0 188 77.1405 591.0 188 77.7448 590.0 188 78.3710 588.0 188 78.8544 586.0 188 79.7333 584.0 188 80.3430 582.0 188 80.9528 579.0 188 81.4526 577.0 188 82.1832 577.0 188 82.6831 575.0 188 83.2928 573.0 188 83.9026 572.0 188 84.5288 571.0 188 85.3857 569.0 188 85.8856 568.0 188 86.4954 568.0 188 87.1051 567.0 188 87.6050 564.0 188 88.3411 564.0 188 88.9673 563.0 188 89.6979 562.0 188 90.3076 561.0 188 90.8075 561.0 188 91.2964 561.0 188 92.1698 560.0 188 92.6532 560.0 188 93.1366 559.0 188 94.0155 559.0 188 94.4989 557.0 188 95.1196 559.0 188 95.7294 558.0 188 96.4819 558.0 188 96.9653 557.0 188 97.7014 557.0 188 98.2013 557.0 188 98.9374 558.0 188 99.5416 558.0 188 100.0415 558.0 188 100.7776 558.0 188 101.2775 567.0 188 101.7609 570.0 188 102.8705 503.0 188 103.9966 433.0 188 105.1062 384.0 188 105.8423 363.0 188 106.7157 359.0 188 106.8256 360.0 188 107.9517 361.0 188 108.3087 361.0 188 109.1711 362.0 188 109.7919 363.0 188 109.9017 364.0 188 110.7642 365.0 188 111.2640 366.0 188 111.7474 367.0 188 112.8735 368.0 188 113.3569 368.0 188 113.9667 370.0 188 114.3402 372.0 188 115.2026 373.0 188 115.3125 374.0 188 116.0596 375.0 188 116.5430 376.0 188 117.1692 379.0 188 118.2788 380.0 188 118.5150 382.0 188 119.3719 384.0 188 119.9817 385.0 188 120.2344 386.0 188 120.8386 388.0 188 121.4484 391.0 188 122.3108 393.0 188 122.6678 395.0 188 123.1677 396.0 188 124.0302 399.0 188 124.5135 400.0 188 125.2496 402.0 188 125.4968 406.0 188 126.3593 407.0 188 126.7163 410.0 188 127.5732 413.0 188 127.9358 416.0 188 128.4357 419.0 188 129.1718 420.0 188 129.9023 424.0 188 130.5121 426.0 188 130.8856 430.0 188 131.6217 432.0 188 132.3578 436.0 188 132.8412 439.0 188 133.1982 442.0 188 134.0771 445.0 188 134.5605 449.0 188 134.9176 454.0 188 135.6537 457.0 188 136.1536 461.0 188 136.8896 464.0 188 137.2467 469.0 188 137.9828 473.0 188 138.7134 477.0 188 139.0924 482.0 188 139.9493 485.0 188 140.3119 491.0 188 140.9216 496.0 188 141.5259 501.0 188 141.9049 507.0 188 142.7618 512.0 188 143.2452 517.0 188 143.7341 523.0 188 144.4812 529.0 188 144.8438 535.0 188 145.7007 541.0 188 146.0577 547.0 188 146.7938 554.0 188 147.2937 562.0 188 147.9034 568.0 188 148.5132 575.0 188 149.1229 583.0 188 149.6228 591.0 188 150.1062 599.0 188 150.8423 608.0 188 151.3257 616.0 188 151.9354 625.0 188 152.5616 635.0 188 153.0450 645.0 188 153.6548 655.0 188 154.2645 665.0 188 154.8853 677.0 188 155.4950 688.0 188 155.9839 700.0 188 156.6046 713.0 188 157.2144 725.0 188 157.6978 740.0 188 159.7797 1557.0 188 160.3894 1574.0 188 161.0156 1589.0 188 161.4990 1626.0 188 162.7295 1682.0 188 163.3392 1710.0 188 163.9490 1741.0 188 164.5752 1770.0 188 165.1849 1803.0 188 166.1682 2694.0 188 167.1515 1672.0 188 167.6404 1663.0 188 168.7500 2163.0 188 169.3542 2211.0 188 169.8541 2268.0 188 170.5902 2321.0 188 171.0736 2623.0 188 171.6998 2630.0 188 172.3096 2641.0 188 172.9358 2623.0 188 173.5455 2616.0 188 174.1553 2618.0 188 174.7760 2733.0 188 175.3857 2868.0 188 175.8746 3035.0 188 176.4954 3010.0 188 177.1051 2988.0 188 177.7148 3008.0 188 178.3411 3006.0 188 182.2797 2022.0 188 188.9044 2561.0 188 189.5306 2566.0 188 191.3708 2558.0 188 192.3541 4697.0 188 192.9639 4684.0 188 193.5736 4693.0 188 194.1833 4727.0 188 200.8575 744.0 188 201.3409 743.0 188 201.9507 737.0 188 202.5604 737.0 188 203.1866 740.0 188 203.7964 738.0 188 205.4059 489.0 188 206.1530 482.0 188 206.6364 476.0 188 207.3724 470.0 188 208.1085 466.0 188 208.8556 462.0 188 209.4653 456.0 188 210.0751 451.0 188 210.5750 448.0 188 211.0583 446.0 188 211.7944 458.0 188 212.5305 450.0 188 213.2776 443.0 188 214.1400 419.0 188 214.4971 406.0 188 215.4968 400.0 188 215.9802 396.0 188 216.9635 372.0 188 217.8259 358.0 188 218.4521 344.0 188 219.1827 339.0 188 219.9188 330.0 188 221.0284 322.0 188 221.5283 313.0 188 221.7645 304.0 188 222.6215 293.0 188 223.6047 287.0 188 224.9835 280.0 188 225.3406 274.0 188 226.4502 268.0 188 226.4337 263.0 188 227.1863 260.0 188 227.6697 256.0 188 228.4058 252.0 188 229.1364 248.0 188 230.2625 246.0 188 230.6250 243.0 188 232.9816 240.0 188 233.5913 237.0 188 232.8387 235.0 188 234.8273 233.0 188 233.9374 230.0 188 234.2944 228.0 188 236.6675 226.0 188 236.6510 223.0 188 237.8870 221.0 188 238.4967 218.0 188 239.1229 217.0 188 239.2328 215.0 188 240.3424 213.0 188 240.9686 212.0 188 241.0730 211.0 188 242.1826 210.0 188 242.8088 209.0 188 242.5452 208.0 188 244.0283 207.0 188 244.6545 206.0 188 245.2643 205.0 188 245.8740 204.0 188 246.4948 203.0 188 247.1045 202.0 188 247.7142 201.0 188 247.9669 201.0 188 248.9502 199.0 188 249.5599 199.0 188 249.9335 199.0 188 250.7959 198.0 188 251.4056 197.0 188 252.0264 197.0 188 252.6361 197.0 188 253.2458 196.0 188 254.1248 196.0 188 254.4818 196.0 188 255.0916 196.0 188 255.7178 196.0 188 256.3275 195.0 188 256.9373 195.0 188 257.5580 195.0 188 258.1677 195.0 188 258.7939 195.0 188 259.4037 195.0 188 260.0134 195.0 188 260.6232 195.0 188 261.2494 195.0 188 261.2329 196.0 188 262.4634 196.0 188 263.0731 196.0 188 263.6993 197.0 188 264.3091 198.0 188 264.1718 198.0 188 265.5286 199.0 188 265.9021 200.0 188 266.7645 201.0 188 267.3743 202.0 188 267.9840 203.0 188 268.6047 204.0 188 269.2145 206.0 188 269.8242 207.0 188 269.5605 209.0 188 271.0602 210.0 188 271.6699 212.0 188 272.2797 215.0 188 272.8894 217.0 188 273.5156 220.0 188 274.1199 223.0 188 273.6090 227.0 188 274.5923 231.0 188 278.3881 1307.0 188 278.9978 1299.0 188 279.6075 1270.0 188 280.2173 1265.0 188 280.9479 1259.0 188 281.5576 1260.0 188 282.1674 1254.0 188 282.7771 1252.0 188 283.3868 1247.0 188 283.9966 1248.0 188 284.6063 1251.0 188 285.2325 1253.0 188 293.7964 1278.0 188 298.7018 1246.0 188 303.6072 1128.0 188 304.8431 1278.0 188 314.9011 1015.0 188 315.5109 1003.0 188 316.1371 987.0 188 317.3566 963.0 188 318.0927 949.0 188 318.7134 940.0 188 319.3231 930.0 188 319.9329 917.0 188 320.6689 909.0 188 321.2952 898.0 188 321.9049 888.0 188 322.5146 875.0 188 323.1244 866.0 188 323.8715 857.0 188 324.3549 851.0 188 324.9646 841.0 188 325.7007 832.0 188 326.2006 824.0 188 326.8103 814.0 188 327.5464 810.0 188 328.0298 801.0 188 328.7769 799.0 188 329.3866 787.0 188 329.9963 780.0 188 330.7324 774.0 188 331.2323 767.0 188 331.9684 761.0 188 332.5781 757.0 188 333.1824 711.0 188 333.9185 739.0 188 334.4183 741.0 188 335.0281 737.0 188 335.7642 731.0 188 336.3739 725.0 188 336.8573 718.0 188 337.6044 718.0 188 338.0933 710.0 188 338.8239 707.0 188 339.5599 701.0 188 339.9335 701.0 188 340.6696 695.0 188 341.4056 693.0 188 344.2456 385.0 188 344.9982 377.0 188 345.7343 373.0 188 346.0913 371.0 188 346.9482 370.0 188 347.7008 374.0 188 347.9370 374.0 188 348.5468 373.0 188 354.4684 267.0 188 ptsファイルの中身はこんな感じ このファイルをmain.pyと同じディレクトリにおく main.py f = open("./20220228.pts",'r') data = f.read() datas_list = data.split('\n') datas_float = [] for data_list in datas_list: datas_float.append(data_list.split(' ')) x_list = [] y_list = [] z_list = [] for i in range (len(datas_float)-1): for ii in range(3): if(ii % 3 == 1): x_list.append(float(datas_float[i][0])) elif(ii % 3 == 2): y_list.append(float(datas_float[i][1])) else: z_list.append(float(datas_float[i][2])) main.py import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure(figsize = (8, 8)) ax = fig.add_subplot(111, projection='3d') ax.set_title("pts 3D", size = 20) ax.set_xlabel("x", size = 14, color = "r") ax.set_ylabel("y", size = 14, color = "r") ax.set_zlabel("z", size = 14, color = "r") ax.set_xlim(0,max(x_list)) ax.set_ylim(0,max(y_list)) ax.set_zlim(0,max(z_list)) for i in range(len(z_list)): ax.scatter(x_list[i], y_list[i], z_list[i], s = 40, c = "blue") plt.show() fig.savefig('3d.jpg') 実際の点群情報 pythonで3dプロットした結果 結果 これもまた前回の二次元にプロットした時と同様で 3dプロットしたものが点群情報とは異なっていることが分かる 課題 ptsファイルの構成を色々調べる必要がある
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pythonでfirestoreライブラリがインポートできない...(VSCode)

原因 VSCodeのインタプリタ設定が誤っていました。 事象 launch.jsonおよびsettings.jsonの設定でパスは通っているはずなのに、「from firebase_admin import firestore」で下記エラーが発生・・・なぜ? 例外が発生しました: ImportError Failed to import the Cloud Firestore library for Python. Make sure to install the "google-cloud-firestore" module. ※コマンドラインからは実行可能だけど、VSCodeでデバッグ実行しようとするとエラー。VSCodeの設定がどこかおかしい! 対応 ①コマンドパレットを開いて「インタープリターを選択」 windowsの場合、Ctrl+Shift+P で開きます バージョンが違っていました↓(インストールしたPythonは3.10だった)。 ので、3.10を選択して解決。 反省 VSCodeインストール時に確認すればよかった。。 https://python.softmoco.com/devenv/how-to-setup-vs-code-for-python.php#2
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

QISkit ドイチ・ジョサのアルゴリズム

はじめに 参考文献2)では,2ビットのドイチ・ジョサのアルゴリズムが紹介されている.本報告では,アルゴリズムの定式化について説明するとともに,4ビットの場合(拡張は可能)についてプログラムを作成したので報告する. 2.問題設定 1)ドイチ・ジョサのアルゴリズムの定式化 2)2ビット,4ビットのドイチ・ジョサのアルゴリズムの作成 3)解析システム   RaspberryPi4+Python+QISkit 3. ドイチ・ジョサのアルゴリズム 参考文献1),2),3)他を参考にして纏めておく. 3.1目的 ビット列を入力として受け取り,0 または1のいずれかを返す以下のようなブール関数fがあるとき, f({x0,x1,x2,...})→0または1(ここで,xnは0または1) このブール関数の特性は,分布型か定値型かのどちらかである.定値型の場合は,任意の入力に対してすべて0またはすべて1を返しますが,分布型の場合は、半分の入力に対して0を返し、残りの半分の入力には1を返します.問題は,与えられた関数が分布型か定値型かを判断することである. ドイチ-ジョサ問題は、1ビットであるドイチ問題のnビットへの拡張である. 3.1 定式化 ドイチ-ジョサのアルゴリズムの一般的な回路を図1に示す.      図1 ドイチ-ジョサのアルゴリズムの一般的な回路  ステップ1,2,3での出力を,ψ1,ψ2,ψ3とする.  ステップ1出力はステップ0をH変換の公式を利用して変換すると下記となる.      ステップ2出力はステップ1出力にオラクルを加えると下記となる.      ステップ3出力はステップ2出力をアダマール変換し下記となる.      最後の式変形の参考に2ビットの場合の変形例を下記に示しておく.    3.2 計算例2ビット  3.1の計算例として2ビットの場合を下記に示しておく.    4. QISkitによるプログラム作成  2ビットのドイチ・ジョサのアルゴリズムは下記の通り. (1)ライブラリのインポート import numpy as np from qiskit import IBMQ, Aer from qiskit.providers.ibmq import least_busy from qiskit import QuantumCircuit, assemble, transpile from qiskit.visualization import plot_histogram (2)オラクル作成  与えられたb_strに従って制御not回路(cx)を構成. def dj_oracle(n, b_str): oracle_qc = QuantumCircuit(n+1) print(b_str) for qubit in range(len(b_str)): print("str=",b_str[qubit]) if b_str[n-1-qubit] == '1': oracle_qc.cx(qubit, n) print(oracle_qc.draw()) oracle_gate = oracle_qc.to_gate() oracle_gate.name = "Oracle" # To show when we display the circuit return oracle_gate (3)ドイチ・ジョサのアルゴリズムの実行 def dj_algorithm(oracle, n): dj_circuit = QuantumCircuit(n+1, n) # Set up the output qubit: dj_circuit.x(n) dj_circuit.h(n) # And set up the input register: for qubit in range(n): dj_circuit.h(qubit) # Let's append the oracle gate to our circuit: dj_circuit.append(oracle, range(n+1)) # Finally, perform the H-gates again: for qubit in range(n): dj_circuit.h(qubit) return dj_circuit (4)メイン部  nは変更可能 n = 2   オラクル設定 oracle_gate = dj_oracle(n, "10") dj_circuit = dj_algorithm(oracle_gate, n) print(dj_circuit.draw()) (5)シミュレーション実行 for i in range(n): dj_circuit.measure(i, i) aer_sim = Aer.get_backend('aer_simulator') transpiled_dj_circuit = transpile(dj_circuit, aer_sim) qobj = assemble(transpiled_dj_circuit) results = aer_sim.run(qobj).result() answer = results.get_counts() fig=plot_histogram(answer) fig.show()  図2に計算結果を示す.     図2 2ビットのドイチ・ジョサのアルゴリズム計算結果 [参考] コメントのない実行ファイル(4ビット)を添付する. # initialization import numpy as np from qiskit import IBMQ, Aer from qiskit.providers.ibmq import least_busy from qiskit import QuantumCircuit, assemble, transpile from qiskit.visualization import plot_histogram def dj_oracle(n, b_str): oracle_qc = QuantumCircuit(n+1) print(b_str) for qubit in range(len(b_str)): print("str=",b_str[qubit]) if b_str[n-1-qubit] == '1': oracle_qc.cx(qubit, n) print(oracle_qc.draw()) oracle_gate = oracle_qc.to_gate() oracle_gate.name = "Oracle" # To show when we display the circuit return oracle_gate def dj_algorithm(oracle, n): dj_circuit = QuantumCircuit(n+1, n) # Set up the output qubit: dj_circuit.x(n) dj_circuit.h(n) # And set up the input register: for qubit in range(n): dj_circuit.h(qubit) # Let's append the oracle gate to our circuit: dj_circuit.append(oracle, range(n+1)) # Finally, perform the H-gates again: for qubit in range(n): dj_circuit.h(qubit) return dj_circuit n = 4 oracle_gate = dj_oracle(n, "1010") dj_circuit = dj_algorithm(oracle_gate, n) print(dj_circuit.draw()) for i in range(n): dj_circuit.measure(i, i) aer_sim = Aer.get_backend('aer_simulator') transpiled_dj_circuit = transpile(dj_circuit, aer_sim) qobj = assemble(transpiled_dj_circuit) results = aer_sim.run(qobj).result() answer = results.get_counts() fig=plot_histogram(answer,figsize = (12,7)) fig.show() 計算結果を図3に示す.       図3 4ビットのドイチ・ジョサのアルゴリズム計算結果 5.おわりに  ドイチ・ジョサのアルゴリズムの定式化を行うとともに,2bit,4bitデータ対象としたアルゴリズムプログラムを作成した. 参考文献 (1)竹内繁樹:量子コンピュータ(BLUEBACKS) (2)中山茂:Python量子プログラミング入門(Gaia教育シリーズ8) (3)Qiskitを使った量子計算の学習:ドイチ-ジョサのアルゴリズム
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pythonでプロットしてみる#2

前回pythonでptsファイルの中身をプロットしてみた ちゃんと指定した点の形でプロットできたことを確認したが、、ここで問題発生! 実際に取得している点群とプロットした形が違うことが分かった 以下のコードで画像の保存が可能 main.py import math import matplotlib.pyplot as plt fig = plt.figure() for i in range(len(list_float_sorted)): for ii in range(1): plt.plot(float(list_float_sorted[i][ii]),float(list_float_sorted[i][ii+1]),marker='*') plt.xlim(0,math.ceil(float(max(x_list)))) plt.ylim(0,math.ceil(float(max(y_list)))) plt.title('Title',fontsize=15) plt.xlabel('X',fontsize=10) plt.ylabel('Y',fontsize=10) fig.savefig('plot.jpg') 保存したプロット画像 取得した点群情報 使用したアプリケーションはframe_grabberというもの プロットしたものが点群の一部にないことが分かる 課題 点群情報を保存したptsファイルが何を意味しているのかを調べる必要がある
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pythonでサーバーを立てて画像を表示する

はじめに 家のハムスターの様子を外でも見たいので、まずはサーバーを作って画像を表示できるようにしようと思います。 環境 windows10 python3.9.4 google chrome サーバーの起動 適当なフォルダにindex.htmlとserver.py、表示したい画像を用意します。 server.py import http.server import socketserver PORT = 8000 Handler = http.server.SimpleHTTPRequestHandler with socketserver.TCPServer(("", PORT), Handler) as httpd: print("serving at port", PORT) httpd.serve_forever() index.html <html> <meta charset="utf-8"> <body> <h1>ハムスター</h1> <img src="あなたのハムスターの画像のパス.jpg"title="kinkuma" width="400" height="auto"> </body> </html> コマンドプロンプトを開いて作ったフォルダのあるディレクトリまで移動し、以下を入力します。 $ python server.py 成功していればserving at port 8000と表示されます。 開いてみる http://localhost:8000/にアクセスします。 こんな感じで画像が表示されていると思います。 参考記事 pythonでローカルwebサーバを立ち上げる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む