- 1. paizaプログラミング問題Rank C, D (Python)
- 2. 【Python3】【殿堂入りキャンペーン】村人の友好関係 (paizaランク S 相当):アルゴリズム付きの解説
- 3. 【paiza×Qiita】山折り谷折り(paizaランクA相当)を初学者がカスに解く【python3】
- 4. Workato:日付間より年数を計算する
- 5. 怖くないCloud Run
- 6. 【Python3】島探し (paizaランク S 相当):アルゴリズム付きの解説(幅優先探索(Breadth-First Search, BFS))
- 7. 【Python3】mod7占い (paizaランク S 相当):アルゴリズム付きの解説
- 8. Workato:PythonコネクタでSQLite3を利用する
- 9. Workato:Pythonコネクタで利用可能な全モジュールを取得する
- 10. Cloud FunctionsでGemini APIを呼び出してみた
- 11. BuildozerでAndroidアプリを作る 2024 WSL2
- 12. 情報の外在性。小さいコンピュータシミュレーションモデル
- 13. unittest pytestの一歩踏み込んだ使い方
- 14. 【Python】ModuleNotFoundErrorの原因は環境変数PYTHONPATHにあった…
- 15. 【Python3】ハノイの塔 (paizaランク A 相当):アルゴリズム付きの解説
- 16. 【Python3】Fizz Buzz (paizaランク C 相当):アルゴリズム付きの解説
- 17. 【Python3】文字列収集 (paizaランク S 相当)をやってみた
- 18. 【Python3】【殿堂入りキャンペーン】お菓子の詰め合わせ (paizaランク A 相当)をやってみた
- 19. 【Python3】じゃんけんの手の出し方 (paizaランク A 相当)をやってみた
- 20. 【Python3】山折り谷折り (paizaランク A 相当)をやってみた
paizaプログラミング問題Rank C, D (Python)
[paiza×Qiita記事投稿キャンペーン](https://paiza.jp/pages/campaign/paiza-qiita)に参加しました.
ここに書いたプログラムの関連リポジトリは,以下になります.https://github.com/tomtkg/Python-Sample/tree/main/paiza
ここでは,Rank C, D問題の解答と簡単な解説を公開します.
言語はPythonを選択しました.結果は以下のようになりました.# Rank C
## 残り物の量
https://paiza.jp/works/mondai/c_rank_skillcheck_archive/leftover“`python:leftover.py
m, p, q = map(int, input().split())
print(m * (100 – p) * (100 – q) / 1e4)
“`
入力文字列を数値`m`,`p`,`q`に分配し,数値演算します.
なるべく整数で計算して,一番最後で小数表記に直す除算を適用しています.パーセント表記は,安易に小
【Python3】【殿堂入りキャンペーン】村人の友好関係 (paizaランク S 相当):アルゴリズム付きの解説
https://paiza.jp/works/mondai/s_rank_skillcheck_archive/group_popularity
この問題では、村人の同好会グループの管理と人気度の計算を効率的に行う必要があります。Union-Findデータ構造を用いることで、友好関係を管理し、入退会ログに基づいて人気度を計算することができます。
### アルゴリズム設計
**概要:**
– 村人間の友好度データを受け取り、Union-Findを用いて管理します。
– 各村人が同好会に入退会するたびに、同好会の人気度を計算します。### 手順
1. **Union-Findクラスの定義**:
– `find`メソッドでルートを探し、パス圧縮を行う。
– `union`メソッドで2つの集合を結合する。2. **データの読み込み**:
– 村人の数 `N`、友好関係の数 `M`、ログの数 `Q` を読み取る。
– 友好関係のデータをリスト `all_edges` に格納し、友好度の降順でソートする。3. **最小全域木(MST)の構築**:
【paiza×Qiita】山折り谷折り(paizaランクA相当)を初学者がカスに解く【python3】
# はじめに
この記事は,[paiza×Qiita記事投稿キャンペーン「プログラミング問題をやってみて書いたコードを投稿しよう!」](https://paiza.jp/pages/campaign/paiza-qiita)の中の問題,山折り谷折り (paizaランク A 相当)の解答とそれについての自習の記事である.
この記事を書いている僕は,7月頭に就職してから初めてプログラムに触った人間である.プログラミングの経験は殆どない.大学の一般教養的な授業でCを触った程度である.物理の研究で簡単な解析計算,数値計算にはMathematicaを使っていた.pythonはシミュレーションアプリの中で動いているのを見てちょっと書き換えた程度だ.オブジェクト指向?型?インスタンス?みたいな語を最近知った程度.全く持っての素人が一ヶ月,社内でふらふらpythonの勉強をしたぐらいの実力だ.
キャンペーンに出題されるような問題は,プログラムに明るい人なら苦もなく解ける問題だろう.それをえっちらおっちら解くのがこの記事とキャンペーンの目指すところであろう.みんな鮮やかな解答が見たいというよりは,赤
Workato:日付間より年数を計算する
# はじめに
社員データや顧客データWorkatoで扱う際、誕生日や勤続年数、サービス継続年数、法人の事業年数など、何らかの経過年数などを取得したい場合があるかと思います。
年数の計算は閏年を考慮しなければならず、閏年とそうでない年では日数が異なるため、単純に時間や日数をもとに計算を行うことはできません。
Workatoにおいて年数の計算方法は様々ありますが、Pythonコネクタを利用すると、コードを書く必要はあるものの、シンプルに年数計算のための処理を用意することができます。また、Recipe Functionとして作成して共通処理化(モジュール化)することで、様々なレシピで共通して活用する(再利用性を高める)ことができます。
今回は、再利用性の観点から、Recipe Functionで年数計算処理の実装を進めていきます。
# レシピ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/960d5c84-07fe-4d0b-1f0d-6a640557d01e.png)
怖くないCloud Run
# はじめに
この記事ではGoogle Cloud Runの概要と基本的な使い方を紹介します。
Cloud Runの細かな説明は[公式ドキュメント](https://cloud.google.com/run/docs/overview/what-is-cloud-run?hl=ja)を読んでいただくこととして、ここではなるべくイメージをつかむための説明を心がけて行こうと思います。
この記事を通じて「簡単そうだな!」とか「Cloud Runなんて怖くない!」みたいな感想を持ってもらえたら嬉しいです。
📝免責事項
Cloud Runには無料利用枠が設定されていますが、その無料枠を超過すると料金が請求されます。
この記事で紹介するサンプルアプリは1~2回動かすくらいなら無料枠を超えない想定ですが、仮に料金が発生したとしても当方は責任を負いかねますのでご了承ください。
Cloud Runの料金については[公式の案内](https://cloud.google.com/run/pricing?hl=ja)をご確認ください。
【Python3】島探し (paizaランク S 相当):アルゴリズム付きの解説(幅優先探索(Breadth-First Search, BFS))
https://paiza.jp/works/mondai/s_rank_skillcheck_sample/search-island
島探し問題のアルゴリズムを設計し、Pythonプログラムを作成します。基本的には、幅優先探索(BFS)を使用して、島を数えます。
### アルゴリズム設計
**問題の概要:**
– 列の数が `M`、行の数が `N` の表があり、黒マス (`1`) の塊を「島」と呼ぶ。
– 島の数を計算して出力する。**入力:**
– 1行目に列の数 `M` と行の数 `N` がスペース区切りで与えられる。
– 次の `N` 行に、スペース区切りで `M` 個の数字(`0` または `1`)が与えられる。**出力:**
– 島の数を一行で出力する。### 擬似コード
**擬似コードのステップ:**1. **入力の読み取り**
– `M` と `N` を読み取る。
– 表(2次元リスト)を読み取る。2. **探索の準備**
– 幅優先探索(BFS)用の移動方向リスト `move` を準備する。
– 島の数をカウ
【Python3】mod7占い (paizaランク S 相当):アルゴリズム付きの解説
https://paiza.jp/works/mondai/s_rank_skillcheck_sample/mod7
まず、問題の要件を詳しく分析し、アルゴリズムを設計します。
### 要件分析
**問題の概要:**
– 与えられたカードの整数から、異なる3枚を選んでその和が7で割り切れる組み合わせの数を求める。**入力:**
– 最初の行にカードの枚数 `N` が与えられる。
– 次の `N` 行に各カードの整数が与えられる。**出力:**
– 和が7で割り切れる3つの異なるカードの組み合わせの数を一行で出力する。### アルゴリズム設計
1. **入力の読み取りと初期化**
– `N` を読み取る。
– カードの整数をリスト `a` に格納する。2. **カードの整数の分類**
– 各整数を7で割った余りを計算し、余りごとにカウントするリスト `a_mod` を作成する。`a_mod[i]` は余りが `i` である整数の個数を表す。3. **組み合わせの列挙**
– 余りが `(i, j, k)` で、その和が7で割り
Workato:PythonコネクタでSQLite3を利用する
# はじめに
WorkatoのPythonコネクタはsqliteのモジュールに対応しており、コード上でSQLite3データベースを利用することが可能です。
Workatoには [SQL Collection by Workato](https://docs.workato.com/features/collection.html)や[SQL Transformations](https://docs.workato.com/features/sql-transformations.html)があり、これらのコネクタ上でSQLを利用したデータ処理(加工・抽出)が可能ですので、通常においてはPythonコネクタでSQLite3を使う必要性は低いのですが、契約プランによる制限があり通常利用できない場合や、これらのコネクタで要件を満たさないデータ処理を行う際に有効です。
なお、WorkatoのPythonコネクタは nobody ユーザーとして実行されるため、任意のディレクトリへファイルを書き込むことが出来ません。( `/tmp` や `/var/tmp` への書き込みも制限されています
Workato:Pythonコネクタで利用可能な全モジュールを取得する
# はじめに
Workatoの標準コネクタで対応できない処理は、Ruby, Python, JavaScriptなどのコネクタを利用することで必要な処理を実装することができます。
各コネクタを利用する際の前提の1つとして、利用可能なモジュールはそのコネクタが提供するモジュールに限られることが挙げられます。言い方を変えると、ユーザーが任意でモジュールを追加することはできません。このため、各コネクタの言語でどのモジュールが利用できるかを知ることが、開発を進めるうえで重要になります。
ここでは、Pythonコネクタで利用可能な全モジュールの取得方法について、手順を記載します。WorkatoのPythonコネクタで利用可能なモジュールは、オフィシャルとして[こちら](https://docs.workato.com/connectors/python.html#supported-features)にまとめられていますが、非常にざっくりとしており全ての対応モジュールが書かれていません。以下の方法で対応しますと、全ての利用可能なモジュールを取得することが可能です。
# 手順
## 1
Cloud FunctionsでGemini APIを呼び出してみた
こんにちは。
業務において、HTTPリクエストをトリガーにGoogle Cloudのサーバレスクラウドコンピューティング「Cloud Functions」上のPythonファイルを実行し、Geminiにプロンプトを投げ、回答をレスポンスするということをおこないました。
備忘録として、実装を簡単にまとめてみようと思います。# Cloud Functionsの概要
Cloud Functionsとは、Google Cloudが提供するサーバレスのクラウドコンピューティングサービスのひとつです。
サーバレスとは、サーバーが必要ないという意味ではなく、サーバーの構築や保守などのメンテナンスが不要という意味です。
指定したイベントをトリガーにサーバーを意識することなく、クラウド上でプログラムを実行できる便利なサービスです。
トリガーとして指定できるものは多数ありますが(Pub/Sub・Cloud Firebaseなど)、今回は外部サービスからのHTTPリクエストをトリガーに指定します。
類似サービスとして、AWSの「Lambda」などがあります。# 実装
今回は下記のように実装をしました
BuildozerでAndroidアプリを作る 2024 WSL2
この記事はPython+GUIをKivyで作成し、BuildozerでAndroidアプリを作成する方法についての記事です。
これはずいぶん前からある方法なのですが、Buildozerが動作する環境がシビアでよく失敗します。
Windowsで仮想のLinuxであるWSL(Windows Subsystem for Linux)を動作させてビルドすると動作したのでお知らせします。### 1.WSLのUbuntuをインストール
Microsoft StoreでWSLをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884555/10c44d96-50d3-d770-daed-f0c87417e192.png)
インストールしたら、スタートアップメニューから実行できます。### 2.WSL2上で環境を作ろう
私のWindows10 PCのWSL 1の環境ではlibffiの実行中にエラーが出ました。
“`
.buildozer/android/platform
情報の外在性。小さいコンピュータシミュレーションモデル
情報の外在性。
人間は生まれたとき、何にも知らない状態で生まれてきて、成長をするごとに情報を得たり失ったりします。
このプログラムは誕生したばかりの人間が初めての情報を得る瞬間をシミュレーションしています。
これは、実存主義の情報版です。
なーんて、偉そうに書いてますが、やってることは、乱数で2つの内から一方を選んでselfという変数に代入しているだけです。pythonで書かれています。`./io.py`で実行して下さい。
拙作のtruerandモジュールを使います。https://qiita.com/fygar256/items/657719d5670f4534401f
“`io.py
#!/usr/bin/python3
import truerand
def main():
self=[]
print(f”information source is /dev/random”)
print(“self will get information”)
print(f”state of no information self={self}”)
unittest pytestの一歩踏み込んだ使い方
# pytestの一歩踏み込んだ使い方
pytestを使ってテストを書いて~
中の関数呼び出しは mock があるから~
と言われたけれど、
関数のテストするには、例外処理とか、例にない mockの書き方とか
検索しても assert x == y までの書き方までが多くて、
リファレンス的なものにたどり着けなかったので、まとめ# その関数がどの引数で呼ばれたか
“`python
from unittest import mock
mock_instance = mock.MagicMock(spec=MockModule)
mock_instance.method_name.assert_called_once_with(a, b, c)
“`# 何回呼ばれたか
“`python
from unittest import mock
mock_instance = mock.MagicMock(spec=MockModule)
mock_instance.method_name.call_count == 1
“`
# メソッドの中で呼んだメソッドで例外を起こしたい
【Python】ModuleNotFoundErrorの原因は環境変数PYTHONPATHにあった…
# エラー概要
以前まで使用していたpytestを実行したら、「`ModuleNotFoundError`」になって、失敗してしまった。> xxx.app.main import app E ModuleNotFoundError: No module named ‘xxx’
# 原因と解決方法
今回の原因は`PYTHONPATH`にありました。まずは以下のコマンドで確認。
“`
echo $PYTHONPATH
“`そして今回実施するプロジェクトのルートディレクトリがない場合は以下のように追加してあげます。
“`
export PYTHONPATH=”${PYTHONPATH}:/xxxx”
“`ディレクトリ構造は以下の通り。
使用したtestファイルでは、プロジェクトのルートディレクトリから別のディレクトリのモジュールをインポートして使用していたのですが、それが原因なのか。以前までできていたような気がするのだが…
よく仮想環境venvを使っているので、その切り替えや新規作成により、設定に影響があったのかも。
または、何がしか(IDEと
【Python3】ハノイの塔 (paizaランク A 相当):アルゴリズム付きの解説
https://paiza.jp/works/mondai/real_event/hanoi
**要求分析**
– 3つの杭(A、B、C)があり、杭Aには `n` 個の円盤が大きい順に積まれている。
– `n` 個の円盤を最短手順で杭Aから杭Cに移動させる。
– `t` 回の移動後の各杭の状態を出力する。**アルゴリズム**
1. 初期状態を設定し、各杭に円盤を配置。
2. 再帰的に円盤を移動する関数 `move_disks` を定義。
3. 移動後の各杭の状態を出力する。以下は実装例です。
“`python
def hanoi(n, t):
# 初期状態の設定
pegs = [list(range(n, 0, -1)), [], []]
moves = []# ハノイの塔の再帰的な移動関数
def move_disks(num_disks, from_peg, to_peg, aux_peg):
if num_disks == 0:
return
move_disks(n
【Python3】Fizz Buzz (paizaランク C 相当):アルゴリズム付きの解説
https://paiza.jp/works/mondai/c_rank_skillcheck_sample/fizz-buzz
以下の要件を満たす「Fizz Buzz」アルゴリズムを作成します。
**要求分析**
– 標準入力から整数 `N` を読み込む。
– 1から `N` までの整数を順に処理し、特定の条件に従って出力を変更する。**アルゴリズム**
1. `N` を標準入力から読み込む。
2. 1から `N` までの整数を順に処理する。
3. 各整数 `i` に対して以下を行う:
– `i` が3の倍数かつ5の倍数の場合、`”Fizz Buzz”` を出力。
– `i` が3の倍数の場合、`”Fizz”` を出力。
– `i` が5の倍数の場合、`”Buzz”` を出力。
– その他の場合、整数 `i` をそのまま出力。以下は実装例です。
“`python
# 標準入力から整数Nを読み込む
N = int(input().strip())# 1からNまでの整数を順に処理
for i in range(1, N + 1):
#
【Python3】文字列収集 (paizaランク S 相当)をやってみた
https://paiza.jp/works/mondai/real_event/word_collection
以下に、【問題】に対応するPythonソースコードを作成し、解説を行います。
“`python
# 入力の読み込み
import sys
input = sys.stdin.read# 入力データを一括で読み込む
data = input().split()# NとMを取得
N = int(data[0])
M = int(data[1])# N個の文字列とその価格を格納するリスト
strings = []
prices = []# N個の文字列と価格をリストに分割して格納
index = 2
for _ in range(N):
strings.append(data[index])
prices.append(int(data[index + 1]))
index += 2# M個のクエリを格納するリスト
queries = []
for _ in range(M):
queries.append(data[in
【Python3】【殿堂入りキャンペーン】お菓子の詰め合わせ (paizaランク A 相当)をやってみた
https://paiza.jp/works/mondai/a_rank_skillcheck_archive/school_hiking
“`python
# utf-8
def combinations(iterable, r):
# combinations()関数は、与えられたiterableからr個の要素を持つすべての組み合わせを生成するジェネレータです。
pool = tuple(iterable) # 入力のiterableをタプルに変換してpoolに格納します。
n = len(pool) # poolの長さ(要素の数)を取得します。
if r > n: # rがnより大きければ、組み合わせは存在しないので終了します。
return
indices = list(range(r)) # 組み合わせを表すインデックスのリストを作成します。
yield tuple(pool[i] for i in indices) # 最初の組み合わせを生成して返します。
while True:
【Python3】じゃんけんの手の出し方 (paizaランク A 相当)をやってみた
以下に、Pythonプログラムを解説します。
“`python
# じゃんけんの手の出し方
n, m = map(int, input().split()) # じゃんけんの回数 n と出す指の本数の合計 m を入力
s = input() # 相手のじゃんけんの手を表す文字列 s を入力# じゃんけんの手のカウントを初期化
enemy_g, enemy_c, enemy_p = 0, 0, 0
for v in s:
if v == “G”:
enemy_g += 1 # 相手がグーを出す回数をカウント
elif v == “C”:
enemy_c += 1 # 相手がチョキを出す回数をカウント
else:
enemy_p += 1 # 相手がパーを出す回数をカウントans = 0 # 勝つ回数の最大値を格納する変数
# 0 ≦ p ≦ m//5 の範囲で p(パーの回数)を全探索
for p in range(m // 5 + 1):
c = (m – p * 5) // 2
【Python3】山折り谷折り (paizaランク A 相当)をやってみた
https://paiza.jp/works/mondai/real_event/origami
“`python
# 山折り谷折り A
# utf-8”’
N 回折ったときの折り目は N-1 回折ったときの折り目から簡単に求めることができます。
1 回折ったときの折り目は “0”、2 回折ったときの折り目は “0” + “0” + “1” = “001”、3 回折ったときの折り目は “001” + “0” + “011” = “0010011” です。
N-1 回折ったときの折り目の文字列を S、S を逆順にし、0 と 1 を反転させた文字列を S’ とすると、N 回折ったときの折り目の文字列は S + “0” + S’ となります。N 回折ったときの折り目の数 2N-1 個の要素を持つ配列を用意します。
方針の通りに 1 回折ったときの折り目から順に N 回折ったときの折り目までを順に求めます。
”’# 入力値を取得
N = int(input())# 折り目の数 2^N – 1 を計算して配列のサイズを決定
size = 2 ** N – 1# 折り目