Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
846
Help us understand the problem. What is going on with this article?
@KoyanagiHitoshi

AtCoderの問題を分類しました

はじめに

AtCoder の問題を Python で解いています。問題の復習と自分の技術力を分析するために、問題を解いて得られた知見をメモとして残しています。周りの方から「知見を共有して欲しい」「公開することでコードレビューされて、技術力がより高まるよ」などの意見を頂いたため、本記事を執筆する運びとなりました。

本記事について

本記事について説明します。

構成

本記事では 分類観点 を定義し、分類観点ごとに問題を分類しています。各分類観点では、サンプルコード入力 / 実行結果)と 解答例 を記載しています。サンプルコード(入力 / 実行結果)と 解答例 は下記の通りです。

項目 項目内容
サンプルコード 問題から得られた知見と検証によって得られた知見を整理したコード
入力 サンプルコードの入力例
実行結果 サンプルコードの実行結果
解答例 AtCoder で AC になったコード
解答例(TLE) AtCoder で TLE になったコード

分類観点の定義

分類観点の定義は下記の通りです。1つの問題から複数の観点で分類できる問題は、複数の観点に分類します。

観点 観点内容
第1章 入出力処理観点 入出力処理を知っていれば解ける問題
第2章 演算観点 演算を知っていれば解ける問題
第3章 制御構文観点 制御構文を知っていれば解ける問題
第4章 組み込み型観点 組み込み型を知っていれば解ける問題
第5章 組み込み関数観点 組み込み関数を知っていれば解ける問題
第6章 モジュール観点 モジュールを知っていれば解ける問題
第7章 データ構造観点 データ構造を知っていれば解ける問題
第8章 アルゴリズム観点 アルゴリズムを知っていれば解ける問題
第9章 計算量観点 計算量を工夫すれば解ける問題
第10章 数学観点 数学的知見を知っていれば解ける問題
第11章 カテゴリ観点 カテゴリ特有の解き方を知っていれば解ける問題
- 参考 -

分類する問題の範囲

分類する問題の範囲は下記の通りです。ABC-C問題 と ARC-A問題 は一部の問題が同じです。同じ問題の場合、ABC-C問題 として分類します。

  • ABC-A問題(ABC001 - ABC199)
  • ABC-B問題(ABC001 - ABC199)
  • ABC-C問題(ABC001 - ABC173)
  • ARC-A問題(ARC001 - ARC103)
  • AtCoder Problems における Difficulty 0 - 800 の問題

分類する対象の問題

本記事では、上記分類範囲で示したすべての問題が記載されているわけではありません。私が上記分類観点で知見が得られた問題のみを記載しています。

バージョン / 言語

サンプルコードは Python の下記バージョンで動作することを確認しています。

Python 3.8.2

解答例は AtCoder の下記言語で AC になることを確認しています。

Python (3.8.2)

コーディングスタイル

本記事のサンプルコードは pycodestyle の下記バージョンでコーディングスタイルを確認しています。

pycodestyle 2.7.0

コード

本記事のコードは下記のリポジトリで公開しています。

最後に

サービスを提供している AtCoder株式会社 と、交流している 競技プログラマ の方々に感謝を致します。

編集履歴

1.0版:2019年02月26日(火)

  • 初版公開

1.1版:2019年03月03日(日)

1.1版 編集内容
  • 本記事に「変更管理」項目(本項目)を追加(変更管理をするため)
  • divmod追加(平方根の整数部と小数部の算出、組み込み関数)
  • string.ascii_lowercase追加(文字の集合)
  • 問題追加(ABC-D問題114, 115, 118, 119)
  • 記載修正(ABC063 B - Varied⇒ABC063 A - Restricted)
  • スペル修正(入力処理、Raw⇒Row)
  • スペル修正(利用規約、AtCode⇒AtCoder)
  • スペル修正(約数、Prime⇒Divisor)
  • 「記事の更新方針」項目に「AGC-A問題の追加」を追加(AGCコンテスト対策として)

1.2版:2019年03月10日(日)

1.2版 編集内容
  • 本章を「変更管理」から「編集履歴」に変更
  • 「実装観点」を「文法観点」「データ型観点」「データ構造観点」に再編し、分類
  • 「入力処理」の入力部分を「入力例」として外出し
  • 「カテゴリ観点」を新規作成
  • 「処理観点」の一部項目を「カテゴリ観点」に移動
  • 正規表現を処理観点に移動
  • サンプルコードの不要な空行を削除
  • 一部の参考サイトを削除(参考にしていないため)
  • レート情報を削除(参考にしていないため)
  • 「複素数」の項目を削除(利用していないため)
  • 記載修正(divmod、enumerate⇒divmod)

1.3版:2019年03月17日(日)

1.3版 編集内容
  • 章と節に番号を振り分け
  • 「はじめに」と「分類する対象の問題」を修正
  • ABC-A問題を再振り分け

1.4版:2019年03月24日(日)

1.4版 編集内容
  • ABC-A問題を再振り分け
  • ABC-B問題を再振り分け

1.5版:2019年03月31日(日)

1.5版 編集内容
  • ABC-B問題を再振り分け
  • 細かい文章の修正

1.6版:2019年08月25日(日)

1.6版 編集内容
  • ABC123~ABC129の問題分類を追加
  • はてなブログへのリンクを削除(はてなブログを削除したため)
  • 問題リンクのスペルミスを修正 (ryunosukeheavenさんコメント指摘)
  • 問題リンクのスペルミスを修正 (hykwさん編集リクエスト)
  • 問題リンクのスペルミスを修正 (tyamagu2さん編集リクエスト)
  • 「ABC024 A - 動物園」の解答例を修正(aboruさんコメント指摘)
  • その他のスペルミスと文言を修正
  • 一部問題の分類を修正

2.0版:2020年03月13日(金)

2.0版 編集内容
  • ABC-A130 ~ ABC-A158 の問題分類を追加
  • ABC-B130 ~ ABC-B158 の問題分類を追加
  • ABC-C130 ~ ABC-C158 の問題分類を追加
  • 「記事の構成」を「構成」に変更
  • 「実行環境」を「バージョン / 言語」に変更
  • 「本記事の対象者」を削除
  • 「コーディング規約」から「コーディング方針」に変更
  • 「コーディング方針」の内容を変更
  • 「記事の更新方針」を「更新方針」に変更
  • 「文法観点」を「入出力観点」「演算観点」「制御フロー観点」に分解
  • 「データ型」から「組み込み型」に変更
  • 「基本処理観点」を「組み込み関数観点」に変更
  • 「応用処理観点」を削除
  • 「実装観点」から「モジュール観点」に変更
  • 「用語」を削除
  • 「参考」を更新
  • 「組み込み型」「組み込み関数」など Python ドキュメントへのリンクを追加
  • 「四捨五入」を削除(情報が誤っていたため)
  • 「bisect」のサンプルコードを修正(コメント内容が誤っていたため)
  • 「小数点切り上げ除算」の一部サンプルコードを削除(演算が誤っていたため)

3.0版:2021年05月02日(日)

3.0版 編集内容
  • ABC-A159 ~ ABC-A199 の問題分類を追加
  • ABC-B159 ~ ABC-B199 の問題分類を追加
  • ABC-C159 ~ ABC-C173 の問題分類を追加
  • AtCoder Problems における Difficulty 0 - 800 の問題分類を追加
  • 言語アップデート対応(Python3 (3.4.3)のコードを削除し、Python (3.8.2)を記載)
  • サンプルコードを pycodestyle でコーディングスタイル変更
  • 解答例を提出結果にリンク(記事更新ができなくしまったため)
  • 「Python関連ページ」と「競技プログラミング関連ページ」を削除(記事更新ができなくしまったため)

第1章 入出力処理観点

1.1 出力

  • print():objects を sep で区切りながらテキストストリーム file に表示し、最後に end を表示する
  • 入力と出力

整数(int)

整数を出力する

サンプルコード
print(10)
実行結果
10

整数を変数に格納して出力する

サンプルコード
x = 20
print(x)
実行結果
20

浮動小数点数(float)

浮動小数点数を出力する

サンプルコード
print(2.9)
実行結果
2.9

浮動小数を変数に格納して出力する

サンプルコード
x = 3.5
print(x)
実行結果
3.5

文字列(str)

文字列を出力する

サンプルコード
print("Hello World!")
実行結果
Hello World!

文字列を変数に格納して出力する

サンプルコード
x = "Hello World!"
print(x)
実行結果
Hello World!

文字列の変数のインデックスを指定して文字を出力する

サンプルコード
x = "Hello World!"
print(x[0])
print(x[11])
実行結果
H
!

リスト(list)

1次元リストを出力する

サンプルコード
x = [1, 2, 3, 4, 5]
print(x)
実行結果
[1, 2, 3, 4, 5]

1次元リストの各要素を出力する

サンプルコード
x = [1, 2, 3, 4, 5]
for i in x:
    print(i)
実行結果
1
2
3
4
5

1次元リストのインデックス指定して各要素を出力する

サンプルコード
x = [1, 2, 3, 4, 5]
for i in range(len(x)):
    print(x[i])
実行結果
1
2
3
4
5

1次元リストをアンパックで出力する

サンプルコード
x = [1, 2, 3, 4, 5]
print(*x)
実行結果
1 2 3 4 5

2次元リストを出力する

サンプルコード
x = [[1, 2, 3], [4, 5, 6]]
print(x)
実行結果
[[1, 2, 3], [4, 5, 6]]

2次元リストの各行を出力する

サンプルコード
x = [[1, 2, 3], [4, 5, 6]]
for rows in x:
    print(rows)
実行結果
[1, 2, 3]
[4, 5, 6]

2次元リストの各要素を出力する

サンプルコード
x = [[1, 2, 3], [4, 5, 6]]
for rows in x:
    for columns in rows:
        print(columns)
実行結果
1
2
3
4
5
6

2次元リストの各要素をインデックス指定して出力する

サンプルコード
x = [[1, 2, 3], [4, 5, 6]]
for i in range(len(x)):
    for j in range(len(x[i])):
        print(x[i][j])
実行結果
1
2
3
4
5
6

2次元リストの各行をアンパックで出力する

サンプルコード
x = [[1, 2, 3], [4, 5, 6]]
print(*x)
実行結果
[1, 2, 3] [4, 5, 6]

タプル(tuple)

サンプルコード
x = 1, 2, 3
print(x)
実行結果
(1, 2, 3)

区切り文字の指定

  • print():キーワード引数 sep を指定する

指定がないと 半角スペース で区切る

サンプルコード
x = 1
y = 2
z = 3
print(x, y, z)
実行結果
1 2 3

改行 を指定する

サンプルコード
x = 1
y = 2
z = 3
print(x, y, z, sep="\n")
実行結果
1
2
3

カンマ を指定する

サンプルコード
x = 1
y = 2
z = 3
print(x, y, z, sep=",")
実行結果
1,2,3

区切り文字なし を指定する

サンプルコード
x = 1
y = 2
z = 3
print(x, y, z, sep="")
実行結果
123

末尾文字の指定

  • print():キーワード引数 end を指定する

指定がないと 改行する

サンプルコード
print("x")
print("y")
実行結果
x
y

末尾文字なし を指定する

サンプルコード
print("x", end="")
print("y")
実行結果
xy

1.2 入力

  • input():入力から1行を読み込み、文字列に変換して(末尾の改行を除いて)返す
  • map():function の結果を返しながら、全ての要素に適用する iterator を返す
  • str.split():文字列を区切った単語のリストで返す
  • リスト内包表記

1行 / 1列

整数を変数に格納する

入力
2
サンプルコード
x = int(input())
print(x)
実行結果
2

文字列を1つの変数に格納する

入力
Hello world!
サンプルコード
x = input()
print(x)
実行結果
Hello world!

文字列を複数の変数に格納する

入力
123
サンプルコード
x, y, z = input()
print(x, y, z)
実行結果
1 2 3
入力
abc
サンプルコード
x, y, z = input()
print(x, y, z)
実行結果
a b c

アンパックを使って変数に格納する

入力
12345
サンプルコード
a, *b = input()
print(b)
実行結果
['2', '3', '4', '5']
入力
12345
サンプルコード
*a, b = input()
print(a)
実行結果
['1', '2', '3', '4']
入力
12345
サンプルコード
a, *b, c = input()
print(b)
実行結果
['2', '3', '4']
入力
12345
サンプルコード
*a, b, c = input()
print(a)
実行結果
['1', '2', '3']
入力
12345
サンプルコード
a, b, *c = input()
print(c)
実行結果
['3', '4', '5']

1行 / 複数列

整数を複数の変数に格納する

入力
1 2
サンプルコード
x, y = map(int, input().split())
print(x)
print(y)
実行結果
1
2

文字列を複数の変数に格納する

入力
Hello world!
サンプルコード
x, y = input().split()
print(x)
print(y)
実行結果
Hello
world!

整数をリストに格納する

入力
1 2 3 4 5
サンプルコード
x = list(map(int, input().split()))
print(x)
実行結果
[1, 2, 3, 4, 5]
入力
1 2 3 4 5
サンプルコード
x = [int(i) for i in input().split()]
print(x)
実行結果
[1, 2, 3, 4, 5]

文字列をリストに格納する

入力
Hello world !
サンプルコード
x = list(input().split())
print(x)
実行結果
['Hello', 'world', '!']
入力
Hello world !
サンプルコード
x = [i for i in input().split()]
print(x)
実行結果
['Hello', 'world', '!']

複数行 / 1列

整数を複数の変数に格納する

入力
1
2
サンプルコード
x = int(input())
y = int(input())
print(x, y)
実行結果
1 2
入力
1
2
サンプルコード
x, y = [int(input()) for i in range(2)]
print(x, y)
実行結果
1 2

整数をリストに格納する

入力
1
2
3
4
5
サンプルコード
x = [int(input()) for i in range(5)]
print(x)
実行結果
[1, 2, 3, 4, 5]

文字列をリストに格納する

入力
a
b
c
d
e
サンプルコード
x = [input() for i in range(5)]
print(x)
実行結果
['a', 'b', 'c', 'd', 'e']

入力行数(Row=5)が指定され、整数をリストに格納する

入力
5
0
1
2
3
4
サンプルコード
rows = int(input())
x = [int(input()) for i in range(rows)]
print(x)
実行結果
[0, 1, 2, 3, 4]

入力行数(Row=5)が指定され、文字列をリストに格納する

入力
5
a
b
c
d
e
サンプルコード
rows = int(input())
x = [input() for i in range(rows)]
print(x)
実行結果
['a', 'b', 'c', 'd', 'e']

複数行 / 複数列

整数を2次元リストに格納する(入力時に行数が指定されない)

入力
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
サンプルコード
x = [list(map(int, input().split())) for i in range(3)]
print(x)
実行結果
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]

複数のリストに格納する(入力時に行数(rows)を指定する)

入力
3
0 a
1 b
2 c
サンプルコード
rows = int(input())
number = []
alphabet = []
for i in range(rows):
    n, a = input().split()
    number.append(int(n))
    alphabet.append(a)
print(number)
print(alphabet)
実行結果
[0, 1, 2]
['a', 'b', 'c']

整数を2次元リストに格納する(入力時に行数(rows)を指定する)

入力
3
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
サンプルコード
rows = int(input())
x = [list(map(int, input().split())) for i in range(rows)]
print(x)
実行結果
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
入力
3
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
サンプルコード
rows = int(input())
x = [[int(j) for j in input().split()] for i in range(rows)]
print(x)
実行結果
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
入力
3
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
サンプルコード
rows = int(input())
x = []
for i in range(rows):
    x.append(list(map(int, input().split())))
print(x)
実行結果
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]

整数を1次元リストに格納する

入力
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
サンプルコード
x = []
for i in range(3):
    x += list(map(int, input().split()))
print(x)
実行結果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

それぞれの変数に格納する

入力
1 2
3 4
サンプルコード
a, b = map(int, input().split())
c, d = map(int, input().split())
print(a, b, c, d)
実行結果
1 2 3 4

区切り文字の指定

第2章 演算観点

2.1 算術演算

演算子 記述例 意味
+ a + b 加算
- a - b 減算
* a * b 乗算
** a ** b べき乗 / べき根
/ a / b 除算
// a // b 小数点切り捨て除算
% a % b 剰余

加算

サンプルコード
print(1+2)
実行結果
3
サンプルコード
x = 2+3
print(x)
実行結果
5
サンプルコード
x = 3
y = 4
print(x+y)
実行結果
7

減算

サンプルコード
print(2-1)
実行結果
1
サンプルコード
x = 4-2
print(x)
実行結果
2
サンプルコード
x = 3
y = 6
print(x-y)
実行結果
-3

乗算

サンプルコード
print(3*2)
実行結果
6
サンプルコード
x = 4*3
print(x)
実行結果
12
サンプルコード
x = 5
y = 6
print(x*y)
実行結果
30

階乗

サンプルコード
import math
print(math.factorial(5))
実行結果
120

べき乗

サンプルコード
print(2**3)
実行結果
8
サンプルコード
print(10**9+7)
実行結果
1000000007
サンプルコード
x = 3**2
print(x)
実行結果
9
サンプルコード
x = 4
y = 2
print(x**y)
実行結果
16

べき根

サンプルコード
print(9**0.5)
実行結果
3.0
サンプルコード
print(9**.5)
実行結果
3.0
サンプルコード
print(9**(1/2))
実行結果
3.0
サンプルコード
print(8**(1/3))
実行結果
2.0
サンプルコード
x = 16**.5
print(x)
実行結果
4.0
サンプルコード
x = 16
y = .5
print(x**y)
実行結果
4.0

除算

サンプルコード
print(6/3)
実行結果
2.0
サンプルコード
print(7/3)
実行結果
2.3333333333333335
サンプルコード
x = 9/3
print(x)
実行結果
3.0
サンプルコード
x = 12
y = 3
print(x/y)
実行結果
4.0

小数点切り捨て除算

サンプルコード
print(5//3)
実行結果
1
サンプルコード
print(6//3)
実行結果
2
サンプルコード
print(7//3)
実行結果
2

小数点切り上げ除算

  • math.ceil():引数以上の最小の整数を返す
サンプルコード
import math
print(math.ceil(1.1))
実行結果
2
サンプルコード
import math
print(math.ceil(7/3))
実行結果
3

剰余

サンプルコード
print(6 % 3)
実行結果
0
サンプルコード
print(7 % 3)
実行結果
1
サンプルコード
print(8 % 3)
実行結果
2

10*n+7

2.2 代入文

サンプルコード
x, y = 1, 2
print(x, y)
x, y = y, x
print(x, y)
実行結果
1 2
2 1

2.3 累算代入文

演算子 記述例 等式
+= a += b a = a + b
-= a -= b a = a - b
*= a *= b a = a * b
**= a **= b a = a ** b
/= a /= b a = a / b
//= a //= b a = a // b
%= a %= b a = a % b

2.4 論理演算

演算子 記述例 意味
and a and b a も b も真であれば真
or a or b a または b が真であれば真
not not a a が偽であれば真
サンプルコード
print(True and True)
実行結果
True
サンプルコード
print(True and False)
実行結果
False
サンプルコード
print(False and False)
実行結果
False
サンプルコード
print(True or True)
実行結果
True
サンプルコード
print(True or False)
実行結果
True
サンプルコード
print(False or False)
実行結果
False
サンプルコード
print(not True)
実行結果
False
サンプルコード
print(not False)
実行結果
True

2.5 比較演算

演算子 記述例 意味
== a == b a が b と等しい
!= a != b a が b と等しくない
> a > b a が b より大きい
>= a >= b a が b 以上
< a < b a が b より小さい
<= a <= b a が b 以下
サンプルコード
print(10 == 10)
実行結果
True
サンプルコード
print(10 == 20)
実行結果
False
サンプルコード
print(10 != 20)
実行結果
True
サンプルコード
print(10 != 10)
実行結果
False
サンプルコード
print(20 > 10)
実行結果
True
サンプルコード
print(10 > 20)
実行結果
False
サンプルコード
print(10 >= 10)
実行結果
True
サンプルコード
print(10 >= 11)
実行結果
False
サンプルコード
print(10 < 20)
実行結果
True
サンプルコード
print(20 < 10)
実行結果
False
サンプルコード
print(10 <= 10)
実行結果
True
サンプルコード
print(10 <= 9)
実行結果
False

2.6 所属検査演算

演算子 記述例 意味
in a in b a が b に含まれる
not in a not in b a が b に含まれない
サンプルコード
print("a" in "abc")
実行結果
True
サンプルコード
print("z" not in "abc")
実行結果
True
サンプルコード
print("a" in ["a", "b", "c"])
実行結果
True
サンプルコード
print("z" not in ["a", "b", "c"])
実行結果
True
サンプルコード
print(1 in [1, 2, 3])
実行結果
True
サンプルコード
print(9 not in [1, 2, 3])
実行結果
True

2.7 ブール演算

bool関数でFalseになる条件

種類 演算子
数値 0 または 0.0
文字列 空文字列
コンテナ 空要素
論理値 False
特殊 None
演算式 not True

ブール値を数値に変換

サンプルコード
print(int(True))
実行結果
1
サンプルコード
print(int(False))
実行結果
0
サンプルコード
print(-(3 > 2))
実行結果
-1
サンプルコード
print(-(3 < 2))
実行結果
0
サンプルコード
print(True+0)
実行結果
1
サンプルコード
print(False+0)
実行結果
0

2.8 ビット演算

演算子 記述例 意味
& a & b a と b のビット単位の AND を与える
^ a ^ b a と b のビット単位の XOR(排他的OR)を与える
| a | b a と b のビット単位の OR を与える
~ ~a a(整数)のビット単位反転を与える
演算 結果
bin(0b1010 & 0b0110) 0b10
bin(0b1010 ^ 0b0110) 0b1100
bin(0b1010 | 0b0110) 0b1110
サンプルコード
print(bin(0b1010 & 0b0110))
print(bin(0b1010 ^ 0b0110))
print(bin(0b1010 | 0b0110))
実行結果
0b10
0b1100
0b1110

ビット単位反転(bitwise invert):aのビット単位反転は-(a+1)として定義されている

サンプルコード
print(~2)
実行結果
-3
サンプルコード
print(~-4)
実行結果
3

2.9 シフト演算

演算子 記述例 意味
<< a << b a を左に b ビットシフト
>> a >> b a を右に b ビットシフト

左にビットシフト

演算 結果 10進数
bin(1) 0b1 1
bin(1 << 1) 0b10 2
bin(1 << 2) 0b100 4
bin(1 << 3) 0b1000 8
bin(1 << 4) 0b10000 16
サンプルコード
print(1)
print(1 << 1)
print(1 << 2)
print(1 << 3)
print(1 << 4)
print(bin(1))
print(bin(1 << 1))
print(bin(1 << 2))
print(bin(1 << 3))
print(bin(1 << 4))
実行結果
1
2
4
8
16
0b1
0b10
0b100
0b1000
0b10000

右にビットシフト

演算 結果 10進数
bin(10) 0b1010 10
bin(10 >> 1) 0b101 5
bin(10 >> 2) 0b10 2
bin(10 >> 3) 0b1 1
bin(10 >> 4) 0b0 0
サンプルコード
print(10)
print(10 >> 1)
print(10 >> 2)
print(10 >> 3)
print(10 >> 4)
print(bin(10))
print(bin(10 >> 1))
print(bin(10 >> 2))
print(bin(10 >> 3))
print(bin(10 >> 4))
実行結果
10
5
2
1
0
0b1010
0b101
0b10
0b1
0b0

第3章 制御構文観点

3.1 条件式

if/elif/else

サンプルコード
x = 1
print("x is 1" if x == 1 else "x is 2" if x == 2 else "other")
実行結果
x is 1
サンプルコード
x = "a"
print("x is a" if x == "a" else "x is b" if x == "b" else "other")
実行結果
x is a
サンプルコード
x, y = "a", 1
print("a", y) if x == "a" else print("b", y) if x == "b" else print("other")
実行結果
a 1

if/in

サンプルコード
x = "abc"
print("True" if "ab" in x else "False")
実行結果
True
サンプルコード
x = ["a", "b", "c"]
print("True" if "a" in x else "False")
実行結果
True
サンプルコード
x = [1, 2, 3]
print("True" if 1 in x else "False")
実行結果
True

複数の条件式

サンプルコード
x = 1
y = 1
z = 1
print("True" if x == y == z else "False")
実行結果
True
サンプルコード
a = 1
b = 2
c = 3
d = 4
print("True" if a < b < c < d else "False")
実行結果
True

3.2 繰り返し文

for

サンプルコード
for i in range(5):
    print(i)
実行結果
0
1
2
3
4
サンプルコード
for i in range(2, 5):
    print(i)
実行結果
2
3
4
サンプルコード
for i in range(2, 5, 2):
    print(i)
実行結果
2
4
サンプルコード
x = ["a", "b", "c"]
for i in x:
    print(i)
実行結果
a
b
c
サンプルコード
X = ["a", "b", "c"]
Y = [1, 2, 3]
for x, y in zip(X, Y):
    print(x, y)
実行結果
a 1
b 2
c 3

for/else

サンプルコード
x = False
for i in range(5):
    if x:
        print("True")
        break
else:
    print("False")
実行結果
False

while

サンプルコード
i = 0
while i < 5:
    print(i)
    i += 1
実行結果
0
1
2
3
4

第4章 組み込み型観点

4.1 int

サンプルコード
print(int(2.9))
実行結果
2
サンプルコード
x = 3.1
print(int(x))
実行結果
3

4.2 float

サンプルコード
print(float(1))
実行結果
1.0
サンプルコード
print(5e10)
実行結果
50000000000.0
サンプルコード
print(1.1e-3)
実行結果
0.0011

整数判定

  • float.is_integer():浮動小数点数が整数値ならTrueを、そうでなければFalseを返す
サンプルコード
x = 1.0
print(x.is_integer())
実行結果
True
サンプルコード
x = 1.1
print(x.is_integer())
実行結果
False

有効桁数

4.3 str

サンプルコード
print(str(1))
実行結果
1

文字列の連結

サンプルコード
print("foo"+"bar")
実行結果
foobar
サンプルコード
x = "Fizz"
y = "Buzz"
print(x+y)
実行結果
FizzBuzz

文字列の繰り返し

サンプルコード
print("HelloWorld!"*2)
実行結果
HelloWorld!HelloWorld!
サンプルコード
x = "1"
print(x*5)
実行結果
11111

文字列の参照

サンプルコード
x = "abc"
print(x[0], x[1], x[2])
実行結果
a b c
サンプルコード
x = "abc"
print(x[-1], x[-2], x[-3])
実行結果
c b a

文字列の比較

サンプルコード
x = "Hello"
y = "Hello"
print("True" if x == y else "False")
実行結果
True
サンプルコード
x = "Hello"
y = "Good"
print("True" if x == y else "False")
実行結果
False
サンプルコード
x = "a"
y = "b"
print("x < y" if x < y else "x > y")
実行結果
x < y
サンプルコード
x = "b"
y = "a"
print("x < y" if x < y else "x > y")
実行結果
x > y

文字列の逆順

サンプルコード
x = "Hello World!"
print(x[::-1])
実行結果
!dlroW olleH

文字列の出現回数

サンプルコード
x = "abbccc"
print(x.count("c"))
実行結果
3
サンプルコード
x = "abbccc"
print(x.count("d"))
実行結果
0
サンプルコード
x = "123435"
print(x.count("3"))
実行結果
2

文字列の置換

サンプルコード
x = "abcabcabc"
print(x.replace("b", "p"))
実行結果
apcapcapc
サンプルコード
x = "abcabcabc"
print(x.replace("b", "p", 2))
実行結果
apcapcabc

文字列のスライス

サンプルコード
x = "abcde"
print(x[1:4])
実行結果
bcd
サンプルコード
x = "abcde"
print(x[1:4:2])
実行結果
bd
サンプルコード
x = "abcde"
print(x[:3])
実行結果
abc
サンプルコード
x = "abcde"
print(x[3:])
実行結果
de
サンプルコード
x = "abcde"
print(x[:-1])
実行結果
abcd
サンプルコード
x = "abcde"
print(x[-1:])
実行結果
e
サンプルコード
x = "abcde"
print(x[::2])
実行結果
ace
サンプルコード
x = "abcde"
print(x[1::2])
実行結果
bd
サンプルコード
x = "abcde"
print(x[:-1:2])
実行結果
ac
サンプルコード
x = "abcde"
print(x[::-1])
実行結果
edcba
サンプルコード
x = "abcde"
print(x[::-2])
実行結果
eca

文字列の探索

  • str.index():文字列の探索
サンプルコード
x = "abcabc"
print(x.index("c"))
実行結果
2
サンプルコード
x = "abcabc"
print(x.index("bc"))
実行結果
1
サンプルコード
x = "abcabc"
print(x.index("z"))
実行結果
ValueError: substring not found

文字列のユニーク化

サンプルコード
x = "abcabc"
print(set(x))
実行結果
{'a', 'c', 'b'}

文字列のコピー

サンプルコード
x = "Hello World!"
y = x[:5]
print(y)
実行結果
Hello
サンプルコード
x = "Hello World!"
y = x[:-1]
print(y)
実行結果
Hello World

文字列の判定

  • str.isdecimal():文字列中の全ての文字が十進数字で、かつ 1 文字以上あるならTrueを、そうでなければFalseを返す
  • str.isdigit():文字列中の全ての文字が数字で、かつ 1 文字以上あるならTrueを、そうでなければFalseを返す
  • str.isnumeric():文字列中の全ての文字が数を表す文字で、かつ 1 文字以上あるならTrueを、そうでなければFalseを返す
  • str.isalpha():文字列中の全ての文字が英字で、かつ 1 文字以上あるならTrueを、そうでなければFalseを返す
  • str.isalnum():文字列中の全ての文字が英数字で、かつ 1 文字以上あるならTrueを、そうでなければFalseを返す
サンプルコード
x = "1234567890"
print(x.isdecimal())
実行結果
True
サンプルコード
x = "10"
print(x.isdigit())
実行結果
True
サンプルコード
x = "一二三四五六七八九〇壱億参阡萬"
print(x.isnumeric())
実行結果
True
サンプルコード
x = "abcあいうアイウ漢字"
print(x.isalpha())
実行結果
True
サンプルコード
x = "abc100"
print(x.isalnum())
実行結果
True

文字列の検索

サンプルコード
x = "abcabcabc"
print(x.find("b"))
実行結果
1
サンプルコード
x = "abcabcabc"
print(x.find("b", 3, 9))
実行結果
4
サンプルコード
x = "abcabcabc"
print(x.find("z"))
実行結果
-1
サンプルコード
x = "abcabcabc"
print(x.rfind("b"))
実行結果
7
サンプルコード
x = "abcabcabc"
print(x.rfind("b", 0, 6))
実行結果
4
サンプルコード
x = "abcabcabc"
print(x.rfind("z"))
実行結果
-1

大文字小文字変換

  • str.upper():すべての文字列を大文字に変換する
  • str.lower():すべての文字列を小文字に変換する
  • str.capitalize():文字列の先頭文字を大文字に変換する
  • str.title():各単語の先頭文字を大文字に変換する
サンプルコード
x = "this is a pen."
print(x.upper())
実行結果
THIS IS A PEN.
サンプルコード
x = "THIS IS A PEN."
print(x.lower())
実行結果
this is a pen.
サンプルコード
x = "this is a pen."
print(x.capitalize())
実行結果
This is a pen.
サンプルコード
x = "this is a pen."
print(x.title())
実行結果
This Is A Pen.

大文字小文字判定

サンプルコード
x = "ABC"
print(x.isupper())
実行結果
True
サンプルコード
x = "abc"
print(x.islower())
実行結果
True

文字列の変換

サンプルコード
x = "this is a pen."
print(x.translate(str.maketrans({"t": "T", " ": None, ".": "!"})))
実行結果
Thisisapen!
サンプルコード
x = "bcad"
print(x.translate(str.maketrans("abcd", "1234")))
実行結果
2314

文字列のエンコード/デコード

  • str.encode():文字列のエンコードされたバージョンをバイト列オブジェクトとして返す
  • bytes.decode():与えられたバイト列からデコードされた文字列を返す
サンプルコード
x = "abcd"
print(x.encode())
print(bytes(i+1 for i in x.encode()).decode())
実行結果
b'abcd'
bcde

4.4 list

要素の参照

サンプルコード
x = ["a", "b", "c"]
print(x[0], x[1], x[2])
実行結果
a b c
サンプルコード
x = ["a", "b", "c"]
print(x[-1], x[-2], x[-3])
実行結果
c b a

要素の追加

サンプルコード
x = ["a", "b", "c"]
x.append("d")
print(x)
実行結果
['a', 'b', 'c', 'd']
サンプルコード
x = [0, 1, 2]
x.append(3)
print(x)
実行結果
[0, 1, 2, 3]
サンプルコード
x = ["a", "b", "c"]
x.append(["d", "e"])
print(x)
実行結果
['a', 'b', 'c', ['d', 'e']]

要素の拡張

サンプルコード
x = ["a", "b", "c"]
x.extend(["d", "e"])
print(x)
実行結果
['a', 'b', 'c', 'd', 'e']

要素の挿入

サンプルコード
x = ["a", "b", "c"]
x.insert(1, "z")
print(x)
実行結果
['a', 'z', 'b', 'c']
サンプルコード
x = ["a", "b", "c"]
x.insert(1, ["x", "y"])
print(x)
実行結果
['a', ['x', 'y'], 'b', 'c']

要素の探索

サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
print(x.index("c"))
実行結果
2
サンプルコード
x = ["a", "b", "c", "d", "c", "c"]
print(x.index("c"))
実行結果
2
サンプルコード
x = [1, 2, 3, 4, 5]
print(x.index(3))
実行結果
2
サンプルコード
x = ["a", "b", "c", "d", "c", "c"]
print(x.index("z"))
実行結果
ValueError: 'z' is not in list

要素の取り出し

サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
print(x.pop(1))
print(x)
実行結果
b
['a', 'c', 'd', 'e', 'f']
サンプルコード
x = [1, 2, 3, 4, 5]
print(x.pop(3))
print(x)
実行結果
4
[1, 2, 3, 5]
サンプルコード
x = [1, 2, 3, 4, 5]
print(x.pop())
print(x)
実行結果
5
[1, 2, 3, 4]
サンプルコード
x = []
print(x.pop())
実行結果
IndexError: pop from empty list

要素の取り除き

サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
x.remove("d")
print(x)
実行結果
['a', 'b', 'c', 'e', 'f']
サンプルコード
x = ["a", "a", "b", "b", "c", "c"]
x.remove("b")
print(x)
実行結果
['a', 'a', 'b', 'c', 'c']

要素の削除

サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
del x[1]
print(x)
実行結果
['a', 'c', 'd', 'e', 'f']
サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
del x[2:4]
print(x)
実行結果
['a', 'b', 'e', 'f']
サンプルコード
x = ["a", "b", "c", "d", "e", "f"]
del x[:]
print(x)
実行結果
[]

要素の出現回数

サンプルコード
x = ["a", "b", "b", "c", "c", "c"]
print(x.count("c"))
実行結果
3
サンプルコード
x = ["a", "b", "b", "c", "c", "c"]
print(x.count("d"))
実行結果
0
サンプルコード
x = [1, 2, 3, 4, 3, 5]
print(x.count(3))
実行結果
2

要素の結合

サンプルコード
x = ["a", "b", "c", "d", "e"]
print(" ".join(x))
実行結果
a b c d e
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(",".join(x))
実行結果
a,b,c,d,e
サンプルコード
x = ["a", "b", "c", "d", "e"]
print("".join(x))
実行結果
abcde

要素のユニーク化

サンプルコード
x = [1, 2, 3, 2, 1, 3]
print(list(set(x)))
実行結果
[1, 2, 3]
サンプルコード
x = ["b", "a", "c", "a", "b"]
print(list(set(x)))
実行結果
['b', 'c', 'a']
サンプルコード
x = [[1, 0], [0, 0], [1, 1], [1, 0], [0, 1], [0, 0]]
print(list(map(list, set(map(tuple, x)))))
実行結果
[[1, 0], [0, 1], [1, 1], [0, 0]]

スライス

サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[1:4])
実行結果
['b', 'c', 'd']
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[1:4:2])
実行結果
['b', 'd']
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[:3])
実行結果
['a', 'b', 'c']
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[3:])
実行結果
['d', 'e']
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[:-1])
実行結果
['a', 'b', 'c', 'd']
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[-1:])
実行結果
['e']
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[::2])
実行結果
['a', 'c', 'e']
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[1::2])
実行結果
['b', 'd']
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[:-1:2])
実行結果
['a', 'c']
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[::-1])
実行結果
['e', 'd', 'c', 'b', 'a']
サンプルコード
x = ["a", "b", "c", "d", "e"]
print(x[::-2])
実行結果
['e', 'c', 'a']

リスト内包表記

サンプルコード
x = [i for i in range(10)]
print(x)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
サンプルコード
x = [i for i in range(10) if i % 2 == 0]
print(x)
実行結果
[0, 2, 4, 6, 8]
サンプルコード
x = [i//2 for i in range(10) if i % 2 == 0]
print(x)
実行結果
[0, 1, 2, 3, 4]
サンプルコード
x = [2, 4, 6, 8, 10]
x = [i//2 for i in x]
print(x)
実行結果
[1, 2, 3, 4, 5]
サンプルコード
x = [1*i + 10*j + 100*k for k in range(2) for j in range(3) for i in range(4)]
print(x)
実行結果
[0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23, 100, 101, 102, 103, 110, 111, 112, 113, 120, 121, 122, 123]

要素のソート

サンプルコード
x = [[0, 1], [1, 1], [1, 0], [0, 0]]
x.sort(key=lambda x: (x[0], x[1]))
for i in x:
    print(i)
実行結果
[0, 0]
[0, 1]
[1, 0]
[1, 1]
サンプルコード
x = [[0, 1], [1, 1], [1, 0], [0, 0]]
x.sort(key=lambda x: (x[0], -x[1]))
for i in x:
    print(i)
実行結果
[0, 1]
[0, 0]
[1, 1]
[1, 0]
サンプルコード
x = [[0, 1], [1, 1], [1, 0], [0, 0]]
x.sort(key=lambda x: (-x[0], -x[1]))
for i in x:
    print(i)
実行結果
[1, 1]
[1, 0]
[0, 1]
[0, 0]
サンプルコード
x = [[0, 1], [1, 1], [1, 0], [0, 0]]
x.sort(key=lambda x: (x[0], x[1]), reverse=True)
for i in x:
    print(i)
実行結果
[1, 1]
[1, 0]
[0, 1]
[0, 0]

4.5 tuple

要素の参照

サンプルコード
x = ("Hello", "World", 1)
print(x)
print(x[0])
実行結果
('Hello', 'World', 1)
Hello

4.6 dict

要素の参照

サンプルコード
x = {"a": 1, "b": 2, "c": 3}
print(x["a"])
実行結果
1
サンプルコード
x = dict(a=1, b=2, c=3)
print(x["a"])
実行結果
1

要素の集計

サンプルコード
keys = ["a", "b", "c", "b", "a", "b"]
dictionary = {}
for key in keys:
    if key in dictionary:
        dictionary[key] += 1
    else:
        dictionary[key] = 1
print(dictionary)
実行結果
{'a': 2, 'b': 3, 'c': 1}

4.7 set

  • 集合型
  • set:オブジェクトの順序なしコレクション

A \cup B
サンプルコード
print({"a", "b", "c"} | {"c", "d", "e"})
実行結果
{'a', 'b', 'd', 'e', 'c'}

A - B
サンプルコード
print({"a", "b", "c"} - {"c", "d", "e"})
実行結果
{'a', 'b'}

A \cap B
サンプルコード
print({"a", "b", "c"} & {"c", "d", "e"})
実行結果
{'c'}

対称差

A ⊕ B
サンプルコード
print({"a", "b", "c"} ^ {"c", "d", "e"})
実行結果
{'a', 'b', 'e', 'd'}

部分集合

A \subseteq B
サンプルコード
print({"a", "b"} <= {"a", "b", "c"})
実行結果
True
サンプルコード
print({"a", "z"} <= {"a", "b", "c"})
実行結果
False

文字の集合

サンプルコード
import string
x = string.ascii_lowercase
print(x)
実行結果
abcdefghijklmnopqrstuvwxyz
サンプルコード
x = sorted(map(chr, range(97, 123)))
print(x)
実行結果
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
サンプルコード
x = sorted(map(chr, range(65, 91)))
print(x)
実行結果
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

4.8 range

サンプルコード
r = range(2, 10)
print(r)
実行結果
range(2, 10)
サンプルコード
r = range(2, 10)
print(r[:3])
実行結果
range(2, 5)
サンプルコード
r = range(2, 10)
print(set(r[:3]))
実行結果
{2, 3, 4}
サンプルコード
r = range(2, 10)
print(r[3:])
実行結果
range(5, 10)
サンプルコード
r = range(2, 10)
print(set(r[3:]))
実行結果
{5, 6, 7, 8, 9}
サンプルコード
r = range(2, 10)
print(r[-3:])
実行結果
range(7, 10)
サンプルコード
r = range(2, 10)
print(set(r[-3:]))
実行結果
{8, 9, 7}
サンプルコード
r = range(2, 10)
print(r[:-3])
実行結果
range(2, 7)
サンプルコード
r = range(2, 10)
print(set(r[:-3]))
実行結果
{2, 3, 4, 5, 6}

第5章 組み込み関数観点

5.1 abs

  • abs():絶対値を返す
サンプルコード
x = -1
print(abs(x))
実行結果
1

5.2 all

  • all():iterable の全ての要素が真ならば(もしくは iterable が空ならば)True、そうでない場合はFalseを返す
サンプルコード
print(all([True, True]))
実行結果
True
サンプルコード
print(all([True, False]))
実行結果
False
サンプルコード
print(all([False, False]))
実行結果
False

5.3 any

  • any():iterable のいずれかの要素が真ならばTrue、空ならFalseを返す
サンプルコード
print(any([True, True]))
実行結果
True
サンプルコード
print(any([True, False]))
実行結果
True
サンプルコード
print(any([False, False]))
実行結果
False

5.4 bin/oct/hex

  • bin():整数を先頭に0bが付いた2進文字列に変換する
  • oct():整数を先頭に0oが付いた8進文字列に変換する
  • hex():整数を先頭に0xが付いた16進文字列に変換する

2進数⇒10進数

サンプルコード
print(int("10", 2))
実行結果
2

8進数⇒10進数

サンプルコード
print(int("10", 8))
実行結果
8

16進数⇒10進数

サンプルコード
print(int("10", 16))
実行結果
16

10進数⇒2進数

サンプルコード
print(bin(2))
実行結果
0b10

10進数⇒8進数

サンプルコード
print(oct(8))
実行結果
0o10

10進数⇒16進数

サンプルコード
print(hex(16))
実行結果
0x10

2進数表示

サンプルコード
print(0b10)
実行結果
2

8進数表示

サンプルコード
print(0o10)
実行結果
8

16進数表示

サンプルコード
print(0x10)
実行結果
16

5.5 divmod

  • divmod():複素数でない2つの数を引数として取り、除算を行ったときの商と剰余からなる対を返す
サンプルコード
a, b = divmod(5, 2)
print(a, b)
実行結果
2 1

5.6 enumerate

  • enumerate():カウントと iterable 上の iteration によって得られた値を含むタプルを返す
サンプルコード
x = ["a", "b", "c"]
for number, alphabet in enumerate(x):
    print(number, alphabet)
実行結果
0 a
1 b
2 c

5.7 eval

サンプルコード
print(eval("1+2"))
実行結果
3

5.8 len

  • len():オブジェクトの長さ(要素の数)を返す
サンプルコード
print(len("aiueo"))
実行結果
5
サンプルコード
print(max(["abc", "d", "ef", "ghij"], key=len))
実行結果
ghij
サンプルコード
print(min(["abc", "d", "ef", "ghij"], key=len))
実行結果
d

5.9 map

  • map():function の結果を返しながら、全ての要素に適用する iterator を返す
入力
1 2
サンプルコード
x, y = map(float, input().split())
print(x, y)
実行結果
1.0 2.0
入力
-1 -2
サンプルコード
x, y = map(abs, map(int, input().split()))
print(x, y)
実行結果
1 2
サンプルコード
x = [[1, 6, 8], [3, 5, 7], [2, 4, 9]]
a, b, c = map(max, zip(*x))
print(a, b, c)
実行結果
3 6 9
サンプルコード
x = list(map(str, range(1, 5)))
print(x)
実行結果
['1', '2', '3', '4']

5.10 max

  • max():iterable の中で最大の要素、または2つ以上の引数の中で最大のものを返す
サンプルコード
print(max(1, 2))
実行結果
2
サンプルコード
print(max(2, 1, 3))
実行結果
3
サンプルコード
print(max([2, 1, 3]))
実行結果
3
サンプルコード
print(max(["b", "a", "c", "d"]))
実行結果
d
サンプルコード
print(max(["ab", "aa", "ca", "bd"]))
実行結果
ca
サンプルコード
print(max(["a", "bcde", "fg", "hij"], key=len))
実行結果
bcde

5.11 min

  • min():iterable の中で最小の要素、または2つ以上の引数の中で最小のものを返す
サンプルコード
print(min(1, 2))
実行結果
1
サンプルコード
print(min(2, 1, 3))
実行結果
1
サンプルコード
print(min([2, 1, 3]))
実行結果
1
サンプルコード
print(min(["b", "a", "c", "d"]))
実行結果
a
サンプルコード
print(min(["ab", "aa", "ca", "bd"]))
実行結果
aa
サンプルコード
print(min(["a", "bcde", "fg", "hij"], key=len))
実行結果
a

5.12 ord/chr

  • ord():1 文字の Unicode 文字を表す文字列に対し、その文字の Unicode コードポイントを表す整数を返す
  • chr():Unicode コードポイントが整数である文字を表す文字列を返す
サンプルコード
print([chr(i) for i in range(97, 97+26)])
実行結果
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
サンプルコード
print([chr(i) for i in range(ord("a"),ord("z")+1)])
実行結果
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
サンプルコード
x = "abc"
[print(chr(i), end=" ") for i in range(ord("a"), ord("z")+1) if chr(i) in x]
実行結果
a b c

5.13 pow

  • pow():べき乗を返す
サンプルコード
print(pow(3, 2))
実行結果
9
サンプルコード
print(pow(3, 1000, 10**9+7))
実行結果
56888193

5.14 sorted

  • sorted():iterable の要素を並べ替えた新たなリストを返す

昇順

サンプルコード
x = [2, 1, 3]
print(sorted(x))
実行結果
[1, 2, 3]

降順

サンプルコード
x = [2, 1, 3]
print(sorted(x)[::-1])
実行結果
[3, 2, 1]

5.15 split

サンプルコード
x = "Hello,World"
print(*x.split(","))
実行結果
Hello World

5.16 strip/rstrip/lstrip

  • strip()
サンプルコード
x = "01230"
print(x.strip("0"))
print(x.rstrip("0"))
print(x.lstrip("0"))
実行結果
123
0123
1230

5.17 sum

  • sum():合計を返す
サンプルコード
x = [1, 2, 3]
print(sum(x))
実行結果
6

数字和

サンプルコード
x = 1234
print(sum(map(int, str(x))))
実行結果
10
サンプルコード
x = "1234"
print(sum(map(int, x)))
実行結果
10

5.18 zip

  • zip():それぞれの iterable から要素を集めた iterator を作り、タプルを返す
サンプルコード
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(x)
print(list(map(list, zip(*x))))
実行結果
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

第6章 モジュール観点

6.1 bisect

bisect_left / bisect_right

サンプルコード
print(bisect.bisect_left(x, 5))
# 2
"""
x = [1, 3, 5, 7, 9]
     1  2  3  4  5
        ^
"""

print(bisect.bisect_right(x, 5))
# 3
"""
x = [1, 3, 5, 7, 9]
     1  2  3  4  5
           ^
"""

print(bisect.bisect_left(x, 6))
# 3
"""
x = [1, 3, 5, 7, 9]
     1  2  3  4  5
           ^
"""

print(bisect.bisect_right(x, 6))
# 3
"""
x = [1, 3, 5, 7, 9]
     1  2  3  4  5
           ^
"""

x = [1, 1, 1, 3, 3, 3, 5, 5, 5]

print(bisect.bisect_left(x, 3))
# 3
"""
x = [1, 1, 1, 3, 3, 3, 5, 5, 5]
     1  2  3  4  5  6  7  8  9
           ^
"""

print(bisect.bisect_right(x, 3))
# 6
"""
x = [1, 1, 1, 3, 3, 3, 5, 5, 5]
     1  2  3  4  5  6  7  8  9
                    ^
"""

print(bisect.bisect_right(x, 4))
# 6
"""
x = [1, 1, 1, 3, 3, 3, 5, 5, 5]
     1  2  3  4  5  6  7  8  9
                    ^
"""

print(bisect.bisect_right(x, 4))
# 6
"""
x = [1, 1, 1, 3, 3, 3, 5, 5, 5]
     1  2  3  4  5  6  7  8  9
                    ^
"""

6.2 calendar

  • calendar:一般的なカレンダーに関する関数群

isleap

サンプルコード
import calendar
print(calendar.isleap(2020))
実行結果
True

leapdays

サンプルコード
import calendar
print(calendar.leapdays(2020, 2025))
実行結果
2

6.3 collections

Counter

サンプルコード
import collections
x = ["a", "a", "a", "a", "b", "c", "c"]
c = collections.Counter(x)
print(c)
# Counter({'a': 4, 'c': 2, 'b': 1})

print(type(c))
# <class 'collections.Counter'>

print(issubclass(type(c), dict))
# True

print(c.keys())
# dict_keys(['a', 'b', 'c'])

print(c.values())
# dict_values([4, 1, 2])

print(c.items())
# dict_items([('a', 4), ('b', 1), ('c', 2)])

print(c.most_common())
# [('a', 4), ('c', 2), ('b', 1)]

print(c.most_common()[0])
# ('a', 4)

print(c.most_common()[-1])
# ('b', 1)

print(c.most_common()[0][0])
# a

print(c.most_common()[0][1])
# 4

print(c.most_common()[::-1])
# [('b', 1), ('c', 2), ('a', 4)]

print(c.most_common(2))
# [('a', 4), ('c', 2)]

values, counts = zip(*c.most_common())
print(values)
# ('a', 'c', 'b')

print(counts)
# (4, 2, 1)

print(c["a"])
# 4

print(c["b"])
# 1

print(c["c"])
# 2

print(c["d"])
# 0

deque

サンプルコード
import collections
queue = collections.deque(["a", "b", "c"])
queue.append("d")
print(queue)
queue.popleft()
print(queue)
実行結果
deque(['a', 'b', 'c', 'd'])
deque(['b', 'c', 'd'])

defaultdict

サンプルコード
import collections
x = [("a", 1), ("b", 1), ("a", 2), ("c", 2)]
d = collections.defaultdict(list)
for key, value in x:
    d[key].append(value)
print(d)
実行結果
defaultdict(<class 'list'>, {'a': [1, 2], 'b': [1], 'c': [2]})

6.4 datetime

サンプルコード
サンプルコード
実行結果
実行結果

6.5 decimal

サンプルコード
サンプルコード
実行結果
実行結果

6.7 fractions

gcd

サンプルコード
サンプルコード
実行結果
実行結果

6.6 functools

  • functools:高階関数と呼び出し可能オブジェクトの操作

reduce

サンプル
from functools import reduce
from operator import add
from operator import sub
from operator import mul
x = [20, 1, 2, 3, 4, 5]
print(reduce(add, x))
# 35(=20+1+2+3+4+5)
print(reduce(sub, x))
# 5(=20-1-2-3-4-5)
print(reduce(mul, x))
# 2300(=20*1*2*3*4*5)

# Lambda式に変換が可能
print(reduce(lambda a, b: a+b, x))  # 35
print(reduce(lambda a, b: a-b, x))  # 5
print(reduce(lambda a, b: a*b, x))  # 2400

6.8 heapq

  • heapq:ヒープキューアルゴリズム

heappush / heappop

サンプルコード
import heapq
hq = [2, -20, 5, 0, -1, 100, 27]
heapq.heappush(hq, -30)
print(hq)
heapq.heappop(hq)
print(hq)
実行結果
[-30, 2, 5, -20, -1, 100, 27, 0]
[2, -20, 5, 0, -1, 100, 27]

nlargest / nsmallest

サンプルコード
import heapq
hq = [2, -20, 5, 0, -1, 100, 27]
print(heapq.nlargest(3, hq))
print(heapq.nsmallest(3, hq))
実行結果
[100, 27, 5]
[-20, -1, 0]

heapreplace

サンプルコード
サンプルコード
実行結果
実行結果

6.9 itertools

  • itertools:効率的なループ実行のための iterator 生成関数

accumulate

サンプルコード
サンプルコード
実行結果
実行結果

combinations

_4 C _2 = \frac{_4 P _2}{2!} = 6通り
サンプル
from itertools import combinations
x = ["a", "b", "c", "d"]
print(list(combinations(x, 2)))
print(len(list(combinations(x, 2))))
実行結果
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
6
サンプルコード
from itertools import combinations
for a, b, c in combinations("MARCH", 3):
    print(a, b, c)
実行結果
M A R
M A C
M A H
M R C
M R H
M C H
A R C
A R H
A C H
R C H

combinations_with_replacement

サンプルコード
from itertools import combinations_with_replacement
x = ["a", "b", "c", "d"]
print(list(combinations_with_replacement(x, 3)))
実行結果
[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'a', 'd'), ('a', 'b', 'b'), ('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'c'), ('a', 'c', 'd'), ('a', 'd', 'd'), ('b', 'b', 'b'), ('b', 'b', 'c'), ('b', 'b', 'd'), ('b', 'c', 'c'), ('b', 'c', 'd'), ('b', 'd', 'd'), ('c', 'c', 'c'), ('c', 'c', 'd'), ('c', 'd', 'd'), ('d', 'd', 'd')]
サンプルコード
from itertools import combinations_with_replacement
x = ["a", "b", "c", "d"]
print(len(list(combinations_with_replacement(x, 3))))
実行結果
20

groupby

サンプルコード
サンプルコード
実行結果
実行結果

permutations

4! = 4 × 3 × 2 × 1 = 24通り
サンプルコード
from itertools import permutations
x = ["a", "b", "c", "d", "e"]
print(list(permutations(x)))
print(len(list(permutations(x))))
実行結果
[('a', 'b', 'c', 'd'), ('a', 'b', 'd', 'c'), ('a', 'c', 'b', 'd'), ('a', 'c', 'd', 'b'), ('a', 'd', 'b', 'c'), ('a', 'd', 'c', 'b'), ('b', 'a', 'c', 'd'), ('b', 'a', 'd', 'c'), ('b', 'c', 'a', 'd'), ('b', 'c', 'd', 'a'), ('b', 'd', 'a', 'c'), ('b', 'd', 'c', 'a'), ('c', 'a', 'b', 'd'), ('c', 'a', 'd', 'b'), ('c', 'b', 'a', 'd'), ('c', 'b', 'd', 'a'), ('c', 'd', 'a', 'b'), ('c', 'd', 'b', 'a'), ('d', 'a', 'b', 'c'), ('d', 'a', 'c', 'b'), ('d', 'b', 'a', 'c'), ('d', 'b', 'c', 'a'), ('d', 'c', 'a', 'b'), ('d', 'c', 'b', 'a')]
24
_4 P _2 = 4 \times 3 = 12通り
サンプルコード
from itertools import permutations
x = ["a", "b", "c"]
print(list(permutations(x, 2)))
print(len(list(permutations(x, 2))))
実行結果
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]
12

product

サンプルコード
サンプルコード
実行結果
実行結果

6.10 math

  • math:数学関数

cos

サンプルコード
サンプルコード
実行結果
実行結果

factorial

サンプルコード
サンプルコード
実行結果
実行結果

floor

サンプルコード
import math
print(math.floor(5/3))
実行結果
1
サンプルコード
import math
print(math.floor(6/3))
実行結果
2

gcd

サンプルコード
サンプルコード
実行結果
実行結果

log

サンプルコード
サンプルコード
実行結果
実行結果

pi

サンプルコード
サンプルコード
実行結果
実行結果

radians

サンプルコード
サンプルコード
実行結果
実行結果

sqrt

サンプルコード
import math
print(math.sqrt(4))
実行結果
2.0

6.11 numpy

argsort

サンプルコード
サンプルコード
実行結果
実行結果

array

サンプルコード
サンプルコード
実行結果
実行結果

norm

サンプルコード
サンプルコード
実行結果
実行結果

6.12 re

  • re:正規表現操作(Regular Expression operations)

findall

  • re.findall():string 中の pattern による重複しないマッチを文字列のリストとして返す
サンプルコード
サンプルコード
実行結果
実行結果

fullmatch

サンプルコード
サンプルコード
実行結果
実行結果

match

サンプルコード
サンプルコード
実行結果
実行結果

search

サンプルコード
サンプルコード
実行結果
実行結果

split

  • re.split():string を pattern で分割し、リストを返す
サンプルコード
サンプルコード
実行結果
実行結果

sub

  • re.sub():string を重複しない pattern を置換した文字列を返す
サンプルコード
サンプルコード
実行結果
実行結果

第7章 データ構造観点

7.1 スタック

  • スタック:Stack
サンプルコード
stack = [3, 4, 5]
stack.append(6)
print(stack)
stack.pop()
print(stack)
実行結果
[3, 4, 5, 6]
[3, 4, 5]
サンプルコード
stack = ["a", "b", "c"]
stack.pop()
print(stack)
stack.append("d")
print(stack)
実行結果
['a', 'b']
['a', 'b', 'd']
サンプルコード
import queue
q = queue.LifoQueue()
x = [3, 4, 5]
for l in x:
    q.put(l)
while not q.empty():
    print(q.get())
実行結果
5
4
3

7.2 キュー

  • キュー:Queue
サンプルコード
queue = [3, 4, 5]
queue.append(6)
print(queue)
queue.pop(0)
print(queue)
実行結果
[3, 4, 5, 6]
[4, 5, 6]
サンプルコード
queue = ["a", "b", "c"]
queue.pop(0)
print(queue)
queue.append("d")
print(queue)
実行結果
['b', 'c']
['b', 'c', 'd']
サンプルコード
from collections import deque
queue = deque(["a", "b", "c"])
queue.append("d")
print(queue)
queue.popleft()
print(queue)
実行結果
deque(['a', 'b', 'c', 'd'])
deque(['b', 'c', 'd'])
サンプルコード
import queue
q = queue.Queue()
x = [3, 4, 5]
for l in x:
    q.put(l)
while not q.empty():
    print(q.get())
実行結果
3
4
5

第8章 アルゴリズム観点

8.1 探索

全探索

深さ優先探索(DFS)

  • DFS:Depth First Search

再帰関数を利用

サンプルコード
サンプルコード
実行結果
実行結果

スタックを利用

サンプルコード
サンプルコード
実行結果
実行結果

幅優先探索(BFS)

  • BFS:Breadth First Search
サンプルコード
サンプルコード
実行結果
実行結果

ビット探索

サンプルコード
N = 3
for bit in range(1 << N):
    bit_string = [0]*N
    for digit in range(N):
        if (bit >> digit) & 1:
            bit_string[digit] = 1
        else:
            bit_string[digit] = 0
    print(bit_string)
実行結果
[0, 0, 0]
[1, 0, 0]
[0, 1, 0]
[1, 1, 0]
[0, 0, 1]
[1, 0, 1]
[0, 1, 1]
[1, 1, 1]
サンプルコード
N = 3
for bit in range(1 << N):
    print(bit, end=":{")
    for number in range(N):
        if bit & (1 << number):
            print(number, end=",")
    print("}")
実行結果
0:{}
1:{0,}
2:{1,}
3:{0,1,}
4:{2,}
5:{0,2,}
6:{1,2,}
7:{0,1,2,}

二分探索

順列探索

8.2 シミュレーション

8.3 貪欲法

貪欲法(Greedy Algorithm)

8.4 動的計画法(DP)

  • DP:Dynamic Programming

動的計画法 - Wikipedia

  • フィボナッチ数列
サンプルコード(再帰関数)
def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fib(n-1)+fib(n-2)


N = int(input())
print(fib(N))
サンプルコード(DP)
n = int(input())
dp = [0]*(n+1)
dp[0] = 0
dp[1] = 1
for i in range(2, n+1):
    dp[i] = dp[i-1]+dp[i-2]
print(dp[n])

UnionFind

しゃくとり法

グラフ

最大フロー

エラトステネスのふるい

ワーシャル・フロイド法

クラスカル法/プリム法

第9章 計算量観点

加算

乗算(桁数)

剰余

ソート

つるかめ算

最大公約数(GCD)

いもす法

累積和

  • 累積和:Cumulative sum
サンプルコード
x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in range(1, len(x)):
    x[i] += x[i-1]
print(x)
実行結果
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55]

全探索

二分探索

中央値の算出

指数

処理中の剰余算

方程式

部分数列の総和

Queue

桁数

第10章 数学観点

和差

最大最小

数列

トリボナッチ数 - Wikipedia

L_0 = 0, L_1 = 0, L_2 = 1
L_{n} = L_{n-1} + L_{n-2} + L_{n-3}
サンプルコード
サンプルコード
実行結果
実行結果

リュカ数 - Wikipedia

  • 初項(最初のリュカ数)を 2、次の項を 1 と定義し、それ以降の項は前の2つの項の和になっている数列
L_0 = 2, L_1 = 1
L_{n+2} = L_n + L_{n+1}
サンプルコード
サンプルコード
実行結果
実行結果

傾き

数直線

円と長方形

座標

面積

体積

倍数

最小公倍数(LCM)

  • LCM:Least Common Multiple
サンプルコード
from functools import reduce
from math import gcd
def lcm(x, y): return x*y//gcd(x, y)
def lcmm(n): return reduce(lcm, n)


x = [15, 25, 30]
print(lcmm(x))
実行結果
150

約数

  • 約数:Divisor
サンプルコード
N = 100
divisor = [i for i in range(1, N+1) if N % i == 0]
print(divisor)
実行結果
[1, 2, 4, 5, 10, 20, 25, 50, 100]

ユークリッドの互除法

  • 2つの自然数の最大公約数を求める手法

ユークリッドの互除法 - Wikipedia

サンプルコード
a, b = 12, 8
x, y = max(a, b), min(a, b)
while y != 0:
    x, y = y, x % y
print(x)
実行結果
4

最大公約数(GCD)

  • GCD:Greatest Common Divisor
サンプルコード
from functools import reduce
from math import gcd
x = [15, 25, 30]
print(reduce(gcd, x))
実行結果
5

素数

  • 素数:Prime number
サンプルコード
N = 101
print("Prime" if all([N % i for i in range(2, int(N**.5)+1)]) else "Not prime")
実行結果
Prime
サンプルコード
N = 102
print("Prime" if all([N % i for i in range(2, int(N**.5)+1)]) else "Not prime")
実行結果
Not prime

素因数分解

  • 素因数分解:Factoring
サンプルコード
for num in range(2, 10):
    i = num
    Factoring = []
    flag = True
    while flag:
        for j in range(2, num+1):
            if i % j == 0:
                i = i/j
                if i == 1:
                    flag = False
                Factoring.append(j)
                break
    if len(Factoring) == 1:
        print(num, "is a prime")
    else:
        print(num, Factoring)
実行結果
2 is a prime
3 is a prime
4 [2, 2]
5 is a prime
6 [2, 3]
7 is a prime
8 [2, 2, 2]
9 [3, 3]

約数の個数

ある整数 $ x $ が素因数分解によって $ x= p^n × q^m × ... (p,q,...は素数) $ と表される時、 $ x $ の約数の個数は $ (n+1) × (m+1) × ... $ となる。

順列

  • 順列:permutation
_4 P _2 = 4 \times 3 = 12通り
サンプルコード
from itertools import permutations
x = ["a", "b", "c", "d"]
print(list(permutations(x, 2)))
実行結果
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]
サンプルコード
from itertools import permutations
x = ["a", "b", "c", "d"]
print(len(list(permutations(x, 2))))
実行結果
12
サンプルコード
from itertools import permutations
x = ["a", "b", "c", "d"]
print(list(permutations(x, 2)))
実行結果
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]
サンプルコード
from itertools import permutations
x = ["a", "b", "c", "d"]
print(len(list(permutations(x, 2))))
実行結果
12

組み合わせ

  • 組み合わせ:combination
_4 C _2 = \frac{_4 P _2}{2!} = 6通り
サンプル
from itertools import combinations
x = ["a", "b", "c", "d"]

print(list(combinations(x, 2)))
# [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]

print(len(list(combinations(x, 2))))
# 6

経路

\frac{(width+height -2)!}{(width-1)!(height -1)!}

色塗り

重複組み合わせ

サンプルコード
from itertools import combinations_with_replacement
x = ["a", "b", "c", "d"]
print(list(combinations_with_replacement(x, 3)))
実行結果
[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'a', 'd'), ('a', 'b', 'b'), ('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'c'), ('a', 'c', 'd'), ('a', 'd', 'd'), ('b', 'b', 'b'), ('b', 'b', 'c'), ('b', 'b', 'd'), ('b', 'c', 'c'), ('b', 'c', 'd'), ('b', 'd', 'd'), ('c', 'c', 'c'), ('c', 'c', 'd'), ('c', 'd', 'd'), ('d', 'd', 'd')]
サンプルコード
from itertools import combinations_with_replacement
x = ["a", "b", "c", "d"]
print(len(list(combinations_with_replacement(x, 3))))
実行結果
20

直積

サンプルコード
from itertools import product
A = ["a", "b", "c"]
X = ["x", "y", "z"]
for p in product(A, X):
    print(p)
実行結果
('a', 'x')
('a', 'y')
('a', 'z')
('b', 'x')
('b', 'y')
('b', 'z')
('c', 'x')
('c', 'y')
('c', 'z')
サンプルコード
from itertools import product
A = ["a", "b", "c"]
X = ["x", "y", "z"]
for a, x in product(A, X):
    print(a, x)
実行結果
a x
a y
a z
b x
b y
b z
c x
c y
c z
サンプルコード
from itertools import product
for p in product("357", repeat=3):
    print("".join(p))
実行結果
333
335
337
353
355
357
373
375
377
533
535
537
553
555
557
573
575
577
733
735
737
753
755
757
773
775
777

確率

期待値

数列の和

f(x) = \sum_{1}^n x = \frac{n(n + 1)}{2}
サンプルコード
n = 10
print(n*(n+1)//2)
実行結果
55
サンプルコード
n = 10
print(sum(range(n+1)))
実行結果
55

連立方程式の解

2x+3y+4z=10 (0≦x<20, 0≦y<30, 0≦z<40)
サンプルコード
equation = [(x, y, z) for z in range(40) for y in range(30)
            for x in range(20) if 2*x+3*y+4*z == 10]
print(equation)
equation = list(map(list, set(equation)))
print(equation)
print(len(equation))
実行結果
[(5, 0, 0), (2, 2, 0), (3, 0, 1), (0, 2, 1), (1, 0, 2)]
[[2, 2, 0], [3, 0, 1], [0, 2, 1], [5, 0, 0], [1, 0, 2]]
5
  • 解に条件がある場合
2x+3y+4z=10 (0≦x<20, 0≦y<30, 0≦z<40, x+y+z=4)
サンプルコード
equation = [(x, y, z) for z in range(40) for y in range(30)
            for x in range(20) if 2*x+3*y+4*z == 10 and x+y+z == 4]
print(equation)
equation = list(map(list, set(equation)))
print(equation)
print(len(equation))
実行結果
[(2, 2, 0), (3, 0, 1)]
[[3, 0, 1], [2, 2, 0]]
2

連立方程式の解の個数

2x+3y+4z=10 (0≦x<20, 0≦y<30, 0≦z<40)
サンプルコード
print([2*x + 3*y + 4*z for z in range(40)
       for y in range(30) for x in range(20)].count(10))
実行結果
5
サンプルコード
print(len([1 for x in range(20) for y in range(30)
           for z in range(40) if 2*x+3*y+4*z == 10]))
実行結果
5
x+y+z=S (0≦x, y, z<k≦2500)(0≦S<3K)
サンプルコード
s = 7000
k = 2500
print(len([1 for y in range(k) for x in range(k) if 0 <= s-x-y <= k]))
実行結果
124750
サンプルコード
s = 7000
k = 2500
print([1 for y in range(k) for x in range(k) if 0 <= s-x-y <= k].count(1))
実行結果
124750

平方根の整数部と小数部の算出

y = x^{1/2} (a:整数部, b:小数部)
サンプルコード
# 平方値
print(2**.5)
# 整数部分の値
print(int(2**.5))
# 小数部分の値
y = 2**.5
x = y-int(y)
print(x)
実行結果
1.4142135623730951
1
0.41421356237309515
サンプルコード
a, b = divmod(5, 2)
print(a)
print(b)
実行結果
2
1

相加相乗平均

\frac{a+b}{2} ≧ \sqrt{ab}

二乗和と和の二乗

距離

ユークリッド距離

distance(\boldsymbol{x},\boldsymbol{y}) = \sqrt{\sum_{i=1}^n(x_i - y_i)^2}
\sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}

マンハッタン距離

distance(\boldsymbol{x},\boldsymbol{y}) = \sum_{i=1}^n|x_i - y_i|
|x_1 - x_2| + |y_1 - y_2|

ヘロンの公式

S = \sqrt{s(s-a)(s-b)(s-c)} \\
s = \frac{a+b+c}{2}

ヘロンの公式 - Wikipedia

コラッツ予想

f(n) = \left\{
\begin{array}{ll}
n / 2 & (if\;\;n=0) \\
3n + 1 & (if\;\;n=1)
\end{array}
\right.

コラッツの問題 - Wikipedia

必要十分条件

P \rightarrow Q

三角関数

余弦定理

逆関数

行列

行集計

\begin{pmatrix}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{pmatrix}
\begin{pmatrix}
1 \\
1 \\
1 \\
\end{pmatrix}
=
\begin{pmatrix}
6 \\
15 \\
24 \\
\end{pmatrix}
サンプルコード
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print([sum(row) for row in matrix])
実行結果
[6, 15, 24]

列集計

\begin{pmatrix}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{pmatrix}^T
\begin{pmatrix}
1 \\
1 \\
1 \\
\end{pmatrix}
=
\begin{pmatrix}
12 \\
15 \\
18 \\
\end{pmatrix}
サンプルコード
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print([sum(row) for row in zip(*matrix)])
実行結果
[12, 15, 18]

転置行列

A =
\begin{pmatrix}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{pmatrix}
A^T =
\begin{pmatrix}
1 & 4 & 7 \\
2 & 5 & 8 \\
3 & 6 & 9 \\
\end{pmatrix}
サンプルコード
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for row in zip(*matrix):
    print(row)
実行結果
(1, 4, 7)
(2, 5, 8)
(3, 6, 9)

行列の回転

A =
\begin{pmatrix}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{pmatrix}
A^{行列の回転} =
\begin{pmatrix}
3 & 6 & 9 \\
2 & 5 & 8 \\
1 & 4 & 7 \\
\end{pmatrix}

行列式

第11章 カテゴリ観点

桁数

進数

文字列

ソート

アナグラム

グリッド

辞書順

再帰

時間

日付

時計

コイン

オセロ

カード

トランプ

宝くじ

ビンゴ

サイコロ

ゾロ目

偶数奇数

N値判定

  • 2値判定(Zero/NotZero判定)
f(x) = \left\{
\begin{array}{ll}
Zero & (x=0) \\
Not Zero & (x\neq0)
\end{array}
\right.
サンプルコード
x = int(input())
print(["Not Zero", "Zero"][x == 0])
x 0 1
x==0 True False
["Not Zero","Zero"][x==0] Zero Not Zero
f(x) = \left\{
\begin{array}{ll}
Even & (x\;\;mod\;\;2\;\;=\;\;0) \\
Odd & (x\;\;mod\;\;2\;\;=\;\;1)
\end{array}
\right.
サンプルコード
x = int(input())
print(["Even", "Odd"][x % 2])
x 1 2
x%2 1 0
["Even","Odd"][x%2] Odd Even
f(x,y) = \left\{
\begin{array}{ll}
Even & (x y\;\;mod\;\;2\;\;=\;\;0) \\
Odd & (x y\;\;mod\;\;2\;\;=\;\;1)
\end{array}
\right.
サンプルコード
x, y = map(int, input().split())
print(["Even", "Odd"][x*y % 2])
x*y 1 2
x*y%2 1 0
["Even","Odd"][x*y%2] Odd Even
  • 2値判定(奇数/偶数判定、入力複数)
f(\boldsymbol{x}) = \left\{
\begin{array}{ll}
Even & (if\;\;x_{i}\;\;mod\;\;2\;\;=\;\;0) \\
Odd & (otherwise)
\end{array}
\right.
サンプルコード
x = [2, 4, 6, 8]
print("Even" if all([i % 2 == 0 for i in x]) else "Odd")
実行結果
Even
サンプルコード
x = [2, 4, 6, 9]
print("Even" if all([i % 2 == 0 for i in x]) else "Odd")
実行結果
Odd
  • 3値判定(正の数/0/負の数判定)
f(x) = \left\{
\begin{array}{ll}
Positive & (x > 0) \\
0 & (x = 0) \\
Negative& (x < 0)
\end{array}
\right.
サンプルコード
x = int(input())
print(["0", "Positive", "Negative"][x > 0 or -(x < 0)])
x -1 0 1
x>0 False False True
x<0 True False Flase
-(x<0) -1 0 0
x>0 or -(x<0) -1 0 True
["0","Positive","Negative"][x>0 or -(x<0)] Negative 0 Positive

Lambda式

サンプルコード
サンプルコード
実行結果
実行結果

参考

本記事は下記を参考にしました。

ドキュメント

書籍

AtCoder関連サービス

AtCoder関連情報

Pythonコーディング規約

Markdown記法

846
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
846
Help us understand the problem. What is going on with this article?