Python

 Computer >> コンピューター >  >> プログラミング >> Python
  1. 直方体を一刀で切断!切り分けられたキューブの数を求めるPythonプログラム

    問題概要 一辺の長さが a、b、c の単位立方体(キューブ)を組み合わせて、a×b×c の直方体を作ることを考えます。ただし、a、b、c はペアごとに互いに素、すなわち gcd(a, b) = gcd(b, c) = gcd(c, a) = 1 を満たすものとします。 この直方体を、下の図のように頂点 P・Q・R を通る平面でたった一刀で2つに切断します。このとき、断面によって「2つに切り分けられてしまう」単位立方体が何個あるかを求めるのがこの問題です。複数のテストケースが配列として与えられるので、それぞれのケースについて答えを計算して返します。 切断は、頂点 P、Q、R の3点を通る平面

  2. 【Python】超直方体の全セルGCD値の総和を求めるプログラムと効率的な解法

    問題の概要「超直方体(ハイパーレクタングル)」とは、長方形をk次元へ拡張した図形のことです。各次元の長さは n1, n2, n3, …, nm のように表され、超直方体を構成する各セルは座標 (p, q, r, …) で指定できます。そして、それぞれのセルには gcd(p, q, r, …)、つまりその座標値すべての最大公約数に等しい値が格納されています。ここでの制約は 1 ≤ p ≤ n1、1 ≤ q ≤ n2、… となっており、インデックスは1から始まります。この記事の目的は、すべてのセルの値 gcd(p, q, r, …) の総和を求め、その結果を 10^9 + 7 で割った余りとして返

  3. 賞品を隠せて参加者が見つけられない部屋の数を求めるPythonプログラム

    問題の概要あるゲーム番組では、2n個の部屋が円形に配置されています。そのうちの1つの部屋には賞品が隠されており、参加者はそれを見つけ出すことが課題となります。部屋には時計回りの順に 1, 2, 3, …, n, -n, -(n−1), …, -1 という番号が付けられています。各部屋にはドアがあり、そこから別の部屋へ移動できます。すべてのドアには印「x」が付けられていて、現在の部屋から距離 x 離れた位置にある部屋へ通じていることを意味します。x が正の値なら時計回りに x 番目の部屋へ、負の値なら反時計回りに |x| 番目の部屋へ開きます。私たちが求めたいのは、賞品が隠されていた場合に参加者

  4. Pythonで木構造から生成される特別な行列の行列式を求める方法

    n 個の頂点を持つ木を考えます。各頂点には 1 から n までの番号が付いており、根は頂点 1 です。さらに、各頂点には重み wi が割り当てられています。この木から n×n の行列 A を次のように作成します。A(x, y) = Wf(x, y)。ここで f(x, y) は頂点 x と y の最小共通祖先(LCA)を表します。この問題の目的は、行列 A の行列式を求めることです。木の辺の情報、各頂点の重み、頂点の総数が入力として与えられます。 たとえば、input_array = [[1, 2], [1, 3], [1, 4], [1, 5]]、weights = [1, 2, 3, 4,

  5. 指定した値より大きい最大値を持つ部分配列の個数を求めるPythonプログラム

    問題の概要 複数の整数が格納された配列があるとします。この配列から取り出せるすべての連続する部分配列(サブアレイ)を列挙し、それぞれの部分配列を「その中の最大要素」で置き換えます。さらに数値 k が与えられたとき、置き換え後の値が k より大きくなる部分配列が何個あるかを求めるのがこの問題です。 例えば、入力が input_array = [5, 6, 7, 8]、k = 7 の場合、出力は 4 になります。 例を使った解説 入力配列 [5, 6, 7, 8] から取り出せる連続する部分配列は、次の10個です。 {5}, {6}, {7}, {8}, {5, 6}, {6, 7}, {7,

  6. Pythonで文字列コマンドのゴールパーサー解釈を求めるプログラム

    ゴールパーサー(Goal Parser)とは ゴールパーサーは、与えられた文字列コマンドを特定のルールに従って解釈するプログラムです。コマンドは以下の要素で構成されます。 アルファベット「G」 開き括弧と閉じ括弧のペア「()」 「(al)」(これらが任意の順序で並びます) ゴールパーサーは、これらを次のように解釈します。 「G」→ 文字列「G」 「()」→ 文字列「o」 「(al)」→ 文字列「al」 そして、解釈された文字列は元の出現順序のまま連結されます。つまり、文字列コマンドが与えられたとき、そのゴールパーサーによる解釈結果を求めるのがこの問題の目的です。 例えば、入力が com

  7. Pythonで一貫性のある文字列の個数をカウントするプログラム

    この記事では、Pythonを使って「一貫性のある(consistent)文字列」の個数を数えるアルゴリズムを解説します。 問題の定義 すべて異なる文字で構成された文字列 s と、複数の文字列を含む配列 words が与えられます。words 内の文字列が「一貫性がある」とみなされるのは、その文字列に含まれるすべての文字が s の中にも現れる場合です。このとき、words の中に一貫性のある文字列がいくつ存在するかを求めます。 入力例 s = px words = [ad, xp, pppx, xpp, apxpa] この場合の出力は 3 になります。「p」と「x」だけで構成されている文字列

  8. Pythonでトーナメント戦の総試合数を求めるプログラムの書き方

    ある数 n が与えられ、トーナメントには n チームが参加しているとします。このトーナメントには以下のようなルールがあります。チーム数が偶数の場合:各チームは別のチームと対戦し、合計 n/2 試合が行われます。勝った n/2 チームが次のラウンドに進みます。チーム数が奇数の場合:1チームが抽選により不戦勝(シード)となり、残りのチーム同士で対戦します。このとき合計 (n−1)/2 試合が行われ、(n−1)/2 + 1 チームが次のラウンドへ進みます。このルールのもとで、優勝者が決まるまでに行われる試合の総数を求めるのが本問題です。例:n = 10 の場合入力が n = 10 のとき、出力は 9

  9. Pythonで電話番号を整形(リフォーマット)するプログラムの実装方法

    ここでは、数字・スペース・ハイフン(-)で構成された電話番号の文字列を受け取り、決められたルールに従って読みやすい形式へ整形するプログラムをPythonで実装します。整形のルール文字列に含まれるすべてのスペースとハイフンを除去する残った数字を左から順に3桁ずつのブロックにグループ化し、残りが4桁以下になったら終了する最後に残った数字は、その桁数に応じて次のようにグループ化する2桁の場合:長さ2のブロック1つ3桁の場合:長さ3のブロック1つ4桁の場合:長さ2のブロック2つ(例:12-34)こうして作られた各ブロックはハイフンで連結され、最終的な電話番号となります。入出力の例たとえば、入力が s

  10. Pythonで文字列の前半と後半が「似ている」かどうかを判定するプログラム

    長さが偶数である文字列 s が与えられたとします。この文字列を同じ長さの前半と後半に分割し、前半を a、後半を b と呼びます。2つの文字列が「似ている(alike)」とは、大文字・小文字を問わず、含まれる母音(a, e, i, o, u)の数が一致していることを指します。この条件をもとに、a と b が似ているかどうかを判定するのが本記事の目的です。問題の例たとえば入力が s = talent の場合、出力は True になります。これは、文字列を分割すると前半が tal、後半が ent となり、どちらも母音が1つ・子音が2つで構成されているためです。解決のアプローチこの問題は、次の手順で解

  11. Pythonでトラックに積載できる最大ユニット数を求めるプログラム(貪欲法による解法)

    問題の概要2次元配列 boxTypes が与えられます。各要素 boxTypes[i] は [i番目の種類の箱の個数, 1箱あたりのユニット数] の形式で表されます。さらに、トラックに積める箱の最大数を示す値 k も与えられます。箱の総数が k を超えない範囲であれば、どの箱を選んでトラックに積んでも構いません。この条件のもとで、トラックに積載できるユニットの合計の最大値を求めましょう。入力例boxTypes = [[2,4],[3,3],[4,2]]、k = 6 の場合、出力は 19 になります。箱の内訳は以下の通りです。種類1の箱:2個(それぞれ4ユニット入り)種類2の箱:3個(それぞれ3

  12. Pythonでn日目までの銀行預金合計額を求めるプログラム

    問題の概要最初の日(月曜日)に銀行へ1ルピーを預けるとします。翌日の火曜日から日曜日にかけては、前の日より1ルピーずつ多く預けます。さらに、その後の毎週月曜日には、前の月曜日より1ルピー多く預けるものとします。整数 n が与えられたとき、n 日目の終わりの時点で銀行にいくらのお金が貯まっているかを求めるのがこの問題です。具体例たとえば入力が n = 17 の場合、出力は 75 になります。その内訳は以下の通りです。1週目:月曜日に1ルピー、火曜日に2ルピー……と順に増やしていき、日曜日には7ルピーを預けます。2週目:月曜日に2ルピー、火曜日に3ルピー……と続き、日曜日には8ルピーを預けます。3

  13. PythonでXORエンコードされた配列から元の配列を復元するプログラム

    問題の概要 非負の整数n個からなる隠し配列 arr があるとします。この配列は、長さ n-1 の別の配列 enc にエンコードされており、その規則は次の通りです。 enc[i] = arr[i] XOR arr[i+1] ここで、エンコード済みの enc 配列と、元の配列の最初の要素を表す整数 first が与えられたとき、元の配列全体を復元することが目標となります。 例えば、入力が enc = [8,3,2,7]、first = 4 の場合、出力は [4, 12, 15, 13, 10] になります。 解法のポイント:XORの性質 この問題は、XOR演算の以下の性質を利用すると簡単に解けま

  14. Pythonで長方形から作れる最大の正方形の個数を求めるプログラム

    長さと幅のペアで構成される配列 rect があるとします。rect[i] は [len_i, wid_i] という2つの要素を持ち、それぞれ i 番目の長方形の長さと幅を表しています。k <= len_i かつ k <= wid_i を満たす場合、i 番目の長方形を切り取って一辺が k の正方形を作ることができます。例えば、[4,6] という長方形であれば、切り出せる正方形の一辺は最大で 4 です。ここで、与えられたすべての長方形の中から作れる最大の正方形の一辺の長さを maxLen とします。このとき、一辺が maxLen の正方形を作れる長方形の個数を求めるのがこの問題です。問

  15. Pythonで最高地点の標高を求めるアルゴリズム:累積和の考え方と実装例

    ロードトリップに出かけたバイク乗りを想像してみてください。旅路にはn個の地点があり、それぞれ標高が異なります。バイク乗りは標高0の地点0から旅をスタートします。ここで、n個の要素を持つ配列gainが与えられ、gain[i]は地点iと地点i+1の間の標高の変化量(正の値なら上り、負の値なら下り)を表すものとします。このとき、旅路全体で最も高い地点の標高を求めるのが今回の課題です。 たとえば、入力がgain = [-4, 2, 6, 1, -6]だった場合、出力は5になります。これは、各時点の標高が[0, -4, -2, 4, 5, -1]と推移し、その中で最大値が5であるためです。 解き方のアプ

  16. Pythonで隠れた数字(?)を置き換えて最も遅い有効な時刻を求めるプログラム

    問題の概要 文字列 s が「hh:mm」形式の時刻を表しているとします。ただし、一部の桁は隠されていて「?」で表されています。ここでは24時間制を扱い、有効な時刻は「00:00」〜「23:59」の範囲とします。隠された桁を適切な数字に置き換えることで得られる、最も遅い(最新の)有効な時刻を求めるのがこの問題の目的です。 たとえば入力が s = 1?:?5 の場合、出力は 13:55 となります。このアルゴリズムでは、時刻の上限となるテンプレート「23:59」をあらかじめ用意し、必要に応じて調整しながら、入力の各桁を先頭から順に処理していきます。すでに数字が指定されている桁はそのまま残し、「?

  17. Pythonで桁和ごとにボールを仕分けし、最も多くのボールが入る箱の数を求める方法

    問題概要 あるボール工場では、lからrまで(両端を含む)の番号が付いたn個のボールを生産しており、1番から無限大まで番号の付いた箱が無限に用意されています。各ボールは、そのボール番号の各桁の合計(桁和)と同じ番号の箱に入れるというルールがあります。 例えば、ボール番号123であれば、1 + 2 + 3 = 6 となるため、6番の箱に入ります。このとき、2つの値lとrが与えられた場合、最も多くのボールが入っている箱のボール数を求めるのがこの問題の目的です。 具体例で確認する 入力が l = 15、r = 25 の場合を考えてみましょう。各ボールは次のように振り分けられます。 ボール15 →

  18. Pythonでリスト内の一意な要素だけの合計を求めるプログラム

    重複する要素と一意な(一度しか現れない)要素が混在する配列 nums が与えられたとき、その中に存在する一意な要素のみの合計を求める問題を考えてみましょう。例えば、入力が nums = [5,2,1,5,3,1,3,8] の場合、出力は 10 になります。これは、一度しか現れない要素が 2 と 8 のみであり、その合計が 10 だからです。解決のアプローチこの問題は、以下の手順で解くことができます。各要素の出現回数を記録した辞書(カウンター)を作成する合計を格納する変数 ans を 0 で初期化する配列 nums の各値 v について、出現回数がちょうど 1 回であれば ans に加算する最後

  19. Pythonで配列が「ソート済み+回転」状態かどうかを判定するプログラム

    問題の概要nums という配列が与えられたとき、その配列が「もともと非減少順(昇順)にソートされていたものを、何度か(0回でも可)回転させた結果」になっているかどうかを判定します。配列には重複した要素が含まれている場合もあります。たとえば、入力が nums = [12,15,2,5,6,9] の場合、出力は True になります。これは、ソート済みの配列 [2,5,6,9,12,15] を右に2回転させると [12,15,2,5,6,9] になるためです。解決のアプローチこの問題は、次の手順で解くことができます。変数 j を 0 に初期化します。j が「配列の長さ − 1」未満であり、かつ n

  20. Pythonでバイナリ文字列を交互文字列にするために必要な最小の変更回数を求めるプログラム

    問題の概要 バイナリ文字列 s が与えられます。1回の操作につき1つのビットを反転(0を1に、または1を0に)できるものとします。隣り合う2文字が同じにならない文字列は「交互文字列」と呼ばれます。このとき、s を交互文字列に変換するために必要な最小の操作回数を求めるのが本記事のテーマです。 たとえば、入力が s = 11100011 の場合、答えは 3 になります。位置 1、4、7 のビットを反転すると 10101010 となり、すべての隣接文字が異なる交互文字列が完成するためです。 解法のアプローチ 交互文字列は必ず次の2パターンのどちらかに一致します。 パターンA: 偶数番目が 1、奇

Total 8994 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:280/450  20-コンピューター/Page Goto:1 274 275 276 277 278 279 280 281 282 283 284 285 286