-
Pythonで特定の文字列を構築する最小コストを求めるプログラム
長さ n の文字列「str」を構築することを考えてみましょう。この文字列を構築するには、次の2種類の操作を使用できます。 コスト a で、str の末尾に1文字追加する。 コスト r で、str の末尾に部分文字列 sub_str を追加する。 私たちの課題は、文字列 str を構築するときにかかる最小コストを計算することです。 たとえば、入力が a = 5、r = 4、str = tpoint の場合、出力は 29 になります。 文字列 tpoint を構築する際の各ステップのコストは以下のとおりです。 str = t; 新しい文字を追加したため、コストは5。 str = tp; 新し
-
matplotlibで入力画像を読み込み、NumPy配列として出力する方法
Pythonのmatplotlibライブラリを使うと、画像ファイルを読み込んでその内容をNumPy配列として取得・表示できます。この記事では、入力画像を読み込み、ピクセルデータを配列としてコンソールに出力するとともに、図として画面に表示するまでの一連の手順をわかりやすく解説します。 処理の手順 plt.rcParams を使って図のサイズを設定し、figure.autolayout でサブプロット周辺の余白を自動調整します。 plt.imread() メソッドを使って、ファイルから画像を読み込みNumPy配列として取得します。 取得した画像のNumPy配列を print() で出力します。
-
Matplotlibでマウスクリック時にポイントの座標を表示する方法
Matplotlibでは、マウスクリックイベントを活用することで、グラフ上の任意のポイントをクリックした際にその座標(x値・y値)を取得して表示できます。本記事では、button_press_eventイベントとmpl_connect()メソッドを組み合わせた具体的な実装方法を、コード例とともにわかりやすく解説します。 実装手順 図のサイズを設定し、サブプロット間および周囲のパディング(余白)を調整します。 新しい図を作成するか、既存の図をアクティブにします。 関数mouse_eventをイベントbutton_press_eventにバインド(接続)します。 NumPyを使用してxとyのデー
-
Pythonで欠損値を含む順列から元の順列の候補番号の合計を求めるプログラム
問題の概要 整数 n が与えられたとき、1 から n までの正の整数を使って作れるすべての順列(並べ替え)を考えます。これらの順列は辞書順に並べられ、先頭から 1、2、…、n! という番号が割り当てられます。その中から一つの順列が「特別な順列」として選ばれますが、この順列のいくつかの値は忘れられており、該当する位置は 0 に置き換えられています。 ここでの課題は、0 の部分を埋めることで元の特別な順列と一致する可能性があるすべての順列を洗い出し、それらの番号を合計することです。計算結果は大きな数になる可能性があるため、10^9 + 7 で割った余りとして返します。 たとえば、入力が input
-
Python Matplotlibのインタラクティブなプロットでマウスクリック位置の(x, y)座標を取得する方法
Matplotlibで作成したインタラクティブなグラフ上で、マウスでクリックした位置の (x, y) 座標を取得したい場面はよくあります。本記事では、イベントハンドラを使ってマウス操作の座標をリアルタイムに取得・表示する方法を解説します。実装の手順図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。新しいfigureを作成、または既存のfigureをアクティブ化します。イベントハンドラ関数 mouse_event() を、button_press_event(ボタン押下イベント)に接続(バインド)します。NumPyを使って x および y のデータポイントを作成します
-
Matplotlib入門:plt.subplots()とplt.figure()の違いをわかりやすく解説
plt.figure()とplt.subplots()の基本的な違い plt.figure() は、新しい図(Figure)を作成するか、すでに存在する図をアクティブにして返すメソッドです。 一方、plt.subplots() は、図(Figure)とサブプロット(Axes)のセットを一度にまとめて作成できる便利なメソッドです。 それでは、実際のコード例を見ながら、plt.subplots() と plt.figure() の違いを具体的に理解していきましょう。 確認手順 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。 plt.figure() メソッドを使
-
Matplotlibで等高線を使ったアニメーションを作成する方法
Matplotlibでは、FuncAnimationを活用することで、等高線プロットを簡単にアニメーション化できます。時間とともに変化するデータを視覚的に表現したい場合に非常に便利な手法です。ここでは、具体的な手順とサンプルコードを交えて解説します。 実装手順 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。 等高線プロットに使用するデータを作成します。 図(Figure)とサブプロット(Axes)のセットを生成します。 animate() 関数を繰り返し呼び出してアニメーションを生成します。この関数内で、各フレームごとに等高線のデータポイントを更新します。 最
-
Matplotlibの極座標プロットで曲線を描く方法をわかりやすく解説
Matplotlibの極座標プロットでは、通常の直交座標とは異なり、角度と半径を使ってデータを表現します。この記事では、極座標プロット上に放射状の直線と滑らかな曲線を描画する方法を、具体的なコード例とともに解説します。実装の手順図のサイズを設定し、rcParamsを使ってサブプロット間および周囲の余白(パディング)を自動調整します。新しい図を作成するか、既存の図をアクティブにします。サブプロット構成の一部として、図にax(軸オブジェクト)を追加します。このとき、projection=polarを指定して極座標モードにします。複数の角度(0度・90度・360度)に対して、color=greenと
-
Pythonで部分文字列を辞書順に連結した文字列のk番目の文字を効率的に求める方法
文字列 input_str が与えられたとします。この文字列から作れるすべての部分文字列を求め、それらを辞書順(lexicographical order)に並べたうえで一つずつ連結し、新しい文字列を作成します。さらに整数 k も与えられるため、連結後の文字列におけるインデックス k の位置にある文字を返すことが課題です。例えば、input_str = pqrs、k = 6 という入力の場合、出力は「p」になります。入力文字列から得られる部分文字列を辞書順に並べると、p, pq, pqr, pqrs, q, qr, qrs, r, rs, s となります。これらをすべて連結すると「ppqpqr
-
Pythonで文字列とその接尾辞の類似度の合計を求めるプログラム
問題の概要 文字列 input_str が与えられたとします。まず、この文字列からすべての接尾辞(サフィックス)を求めます。たとえば、文字列が「abcd」であれば、接尾辞は「abcd」「bcd」「cd」「d」の4つです。 次に、元の文字列と各接尾辞との「類似度」を、両者の最長共通接頭辞(先頭から何文字一致しているか)の長さとして定義します。そして、元の文字列とすべての接尾辞との類似度の合計を求めて返すのが、このプログラムの目的です。 入力例と計算過程 たとえば、入力が input_str = tpotp の場合、出力は 7 になります。 文字列「tpotp」の接尾辞は、「tpotp」「pot
-
Pythonで数値ペアの集合から式の最大値を求めるアルゴリズムと実装例
問題の概要 同じ要素数 N を持つ2つの配列 nums1 と nums2 が与えられているとします。ここで、1 から N までの整数からなる集合 S を考えます。S の空でない部分集合 {i1, i2, ..., ik} を選んだとき、次の式の値を最大化するのがこの問題の目的です。 (nums1[i1] + nums1[i2] + ... + nums1[ik])2 + (nums2[i1] + nums2[i2] + ... + nums2[ik])2 具体例 たとえば、入力が nums1 = [-1, 6]、nums2 = [5, 4] の場合、出力は 106 になります。これは次の3通
-
【Python】部分文字列が別の文字列と完全一致、または1文字だけ異なる開始インデックスを見つけるプログラム
問題の概要 2つの文字列が与えられたとします。1つ目の文字列は2つ目よりも長く、1つ目の文字列から切り出した部分文字列が、2つ目の文字列と完全に一致する、もしくはちょうど1文字だけ異なるかどうかを調べます。そして、条件を満たす部分文字列が始まる位置(インデックス)をすべて返すのが目的です。 たとえば、入力が string1 = tpoint、string2 = pi の場合、出力は「1 2」になります。 これは、1つ目の文字列のインデックス1と2から始まる長さ2の部分文字列「po」「oi」が、それぞれ「pi」と比べてちょうど1文字だけ異なっているためです。 解法の考え方:Zアルゴリズム この
-
Pythonで二色に塗り分けた正多角形の頂点から同色の二等辺三角形を数えるプログラム
問題の概要 n 個の頂点を持つ正多角形を考えます。この多角形は長さ n の 2 進数文字列で表され、各頂点には時計回りの順に青(0)または赤(1)のいずれかの色が割り当てられています。ここで求めるのは、正多角形の頂点だけを頂点とし、かつ 3 つの頂点がすべて同じ色で構成されている二等辺三角形の個数です。 たとえば polygon = 111010 が入力された場合、条件を満たすのは三角形 ACE と AFE の 2 つなので、出力は 2 になります。 解法のアプローチ この問題は「作れる二等辺三角形の総数」から「同色で構成されていない二等辺三角形の数」を差し引くという発想で、線形時間 O(
-
Pythonで全部分字列の和集合から指定した位置の部分文字列を求めるプログラム
問題の概要n個の文字列 str1、str2、str3、…、strn が与えられているとします。ここで、substri は stri が持つすべての部分文字列を格納する集合であり、すべての substr 集合の和集合を substr_union と定義します。このとき、q 個のクエリが与えられ、各クエリに対して substr_union の q 番目の要素を求めます。substr_union は辞書順にソートされており、インデックスは 1 から始まるものとします。具体例たとえば、文字列のリストが [pqr, pqt]、クエリが [4, 7, 9] の場合、出力は [pqt, qt, t] になり
-
Pythonで式の結果の最大出現頻度の期待値を求めるプログラム
問題の概要 M個の異なる式があり、それぞれの答えは1からNまでの範囲(両端を含む)に収まるとします。ここで、1からNまでの各iについての出現頻度を f(i) としたとき、x = max(f(i)) の期待値 E(x) を求めるのがこの問題です。 具体例で理解する たとえば入力が M = 3、N = 3 の場合、答えは 2.2 になります。3つの式が取りうるすべての出力列と、それぞれの場合の最大出現頻度を表にまとめると、次のようになります。 出力列最大頻度 1113 1122 1132 1222 1231 1331 2223 2232 2332 3333 全10通りのうち、最大頻度が1に
-
Pythonで文字列内の回文ボーダー(回文境界)を検出するプログラム
問題の概要ある文字列 str が与えられているとします。文字列における「ボーダー(境界)」とは、その文字列の真の接頭辞かつ接尾辞となっている部分文字列のことを指します。たとえば、「ab」は文字列「ababab」のボーダーです。さらに、このボーダー自体が回文である場合、それを「回文ボーダー」と呼びます。ここで、与えられた文字列 str に含まれる回文ボーダーの個数を f(str) と定義します。求めたいのは、str のすべての空でない部分文字列 str_k に対する f(str_k) の総和です。この合計値は非常に大きくなる可能性があるため、109 + 7 で剰余を取って計算します。具体例入力が
-
Pythonでリストから準優勝のスコアを求めるプログラム
複数の参加者のスコアがリスト形式で与えられたとき、その中から「準優勝」、つまり2番目に大きいスコアを見つける方法を解説します。 たとえば scores = [5, 8, 2, 6, 8, 5, 8, 7] という入力の場合、最高得点は8なので、準優勝のスコアは7となり、出力は 7 になります。 アルゴリズムの考え方 この問題は、以下の手順で解くことができます。 優勝スコアを表す winner と、準優勝スコアを表す runner_up を、ともに -99999 など十分に小さい値で初期化します。 スコアリストの各要素 i について、次の処理を繰り返します。 i が winner より大き
-
Pythonでネストされたリストから2番目に低い点数の生徒の名前をすべて表示する方法
ネストされたリストに各生徒の名前と点数が格納されている場合を考えてみましょう。この中から、2番目に低い点数を持つ生徒の名前をすべて表示したいという要件があります。もし2番目に低い点数を持つ生徒が複数人いる場合は、それらをアルファベット順に並べ替えて、1行に1つずつ名前を出力します。 例えば、入力が以下のようなリストだったとします。 students = [[Amal,37],[Bimal,37],[Tarun,36],[Akash,41],[Himadri,39]] この場合、出力は Amal と Bimal になります。最も低い点数は Tarun の36点であり、2番目に低い点数は37
-
【Python】スワップと反転操作後の配列における部分配列の合計の期待値を求める方法
問題概要 サイズが n の配列 A と、2つの値 p および q が与えられているとします。この配列 A に対して、次の2種類の操作を実行できます。 操作1(スワップ): l < r を満たす2つのインデックス (l, r) をランダムに選び、A[l] と A[r] の値を入れ替える。 操作2(反転): l < r を満たす2つのインデックス (l, r) をランダムに選び、インデックス l から r までの部分配列を反転させる。 まず操作1を p 回、続けて操作2を q 回実行します。その後、l < r を満たす2つのインデックス l と r をランダムに選択し、S =
-
スコアの辞書から各学生の平均点を求めるPythonプログラム
学生の点数が辞書形式で与えられているとします。キーには学生の名前、値には数値のリスト(各教科の点数)が格納されています。このとき、各学生の平均点を求める必要があります。 例えば、入力が scores = {Amal: [25, 36, 47, 45], Bimal: [85, 74, 69, 47], Tarun: [65, 35, 87, 14], Akash: [74, 12, 36, 75]} のような場合、出力は [38.25, 68.75, 50.25, 49.25] となります。つまり、38.25 が Amal の平均点、68.75 が Bimal の平均点、という具合です。 解決