第162回【Python】1つの血液型を占う、1人の占い結果、占い

現在取り組んでいるのは、paiza ラーニング問題集「B ランクレベルアップメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 162 回目です。

お世話になっている動物病院の先生が、球取りをする猫はやんちゃになる、膝の上でゆっくりした時間を過ごす猫はおっとりになる、とおっしゃっていました。まさかそんな、と思っていましたが、ルナちゃんもレオくんも凄くやんちゃです。大好きな遊びはねずみのおもちゃを追いかけて遊ぶこと。

それでは、今日も頑張ってみようと思います。

1つの血液型を占う (paizaランク C 相当)

1行目で血液型が1つ与えられます。
m 行の血液型と占い結果の組が与えられるので、血液型をキー、占い結果を値として、連想配列(辞書)に保存してください。
その後、1行目で与えられた血液型に対応する占い結果を表示してください。

T
m
A_1 B_1
A_2 B_2
...
A_i B_i
...
A_m B_m

期待する出力

A_i をキー、B_i を値として保存し、A_i と T が同じ場合、B_i を表示してください。
最後は改行し、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ m ≦ 4
・A_i の値は、"A", “B", “AB", “O"のいずれかであり、同じ血液型が複数入力されることはない
・1 ≦ (文字列 B_i の長さ) ≦ 100
・T の値は、"A", “B", “AB", “O"のいずれか


入力例

A
4
A Good
B VeryGood
O Yavai
AB VeryYavai

出力例

Good

VeryYavai ってどんな占いだよ!

Python
T = input()
n = int(input())
fortune_telling = {}

for _ in range(n):
    blood,fortune = input().split()
    fortune_telling[blood] = fortune

print(fortune_telling[T])
VBA
Sub fortune_telling_3()

    s = Cells(1, 1)
    N = Cells(2, 1)
    
    Dim fortune_telling As Object
    Set fortune_telling = CreateObject("Scripting.Dictionary")
    
    For i = 1 To N
        temp = Split(Cells(i + 2, 1), " ")
        fortune_telling.Add temp(0), temp(1)
    Next
    
    Debug.Print fortune_telling(s)
    
End Sub

1人の占い結果 (paizaランク C 相当)

次のような占いプログラムを作成してください。

最初に「ユーザー」 U が1つ与えられます。
続いて n 人の「ユーザー」と「ユーザーに対応する血液型」が与えられます。
続いて m 種類の「血液型」と「血液型に対応する占い結果」が与えられます。

与えられたユーザー U に対応する占い結果を表示してください。

入力例の1つ目は、ユーザーの血液型についてのラッキーカラーの占いです。

入力例の2つ目は、ユーザーの星座についてのラッキーパーソンの占いになっています。
「血液型」として「星座」などのさまざまな文字列を利用できるようにすることで、他の占いにも対応する必要があることに注意してください。

U
n
(ユーザー_1) (ユーザー_1の血液型)
(ユーザー_2) (ユーザー_2の血液型)
(ユーザー_3) (ユーザー_3の血液型)
...
(ユーザー_i) (ユーザー_iの血液型)
...
(ユーザー_n) (ユーザー_nの血液型)
m
(血液型_1) (血液型_1の占い結果)
(血液型_2) (血液型_2の占い結果)
(血液型_3) (血液型_3の占い結果)
...
(血液型_j) (血液型_jの占い結果)
..
(血液型_m) (血液型_mの占い結果)

期待する出力

ユーザーUの血液型に対応する占い結果を出力してください。
最後は改行し、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・Uは、半角英数字からなる1から20文字までの文字列
・1 ≦ n ≦100
・1 ≦ m ≦100
・(ユーザー_i)は、半角英数字からなる1から20文字までの文字列
・(血液型_j)は、半角英数字からなる1から20文字までの文字列
・(血液型_jの占い結果)は、半角英数字からなる1から20文字までの文字列
・(ユーザー_iの血液型)と等しい、(血液型_j)が必ず存在
・i ≠kのとき、(ユーザー_i)と(ユーザー_k)は異なる文字列
・j ≠kのとき、(血液型_j)と(血液型_k)は異なる文字列


入力例

Rio
5
Kyoko shishiza
Rio futagoza
Tsubame otomeza
KurodaSensei yagiza
NekoSensei mizugameza
5
shishiza the_first_person
yagiza the_second_person
otomeza the_first_cat
mizugameza the_first_dog
futagoza NekoSensei

出力例

NekoSensei

二つの連想配列を組み合わせる。よくあるパターン。

Python
U = input()

n = int(input())
users = {}
for _ in range(n):
    user = input().split()
    users[user[0]] = user[1]

m = int(input())
fortune_telling = {}
for _ in range(m):
    fortune = input().split()
    fortune_telling[fortune[0]] = fortune[1]

print(fortune_telling[users[U]])
VBA
Sub fortune_telling_4()

    U = Cells(1, 1)
    N = Cells(2, 1)
    
    Dim users As Object
    Set users = CreateObject("Scripting.Dictionary")
    
    For i = 1 To N
        temp = Split(Cells(i + 2, 1), " ")
        users.Add temp(0), temp(1)
    Next
    
    m = Cells(N + 3, 1)
    
    Dim fortune_telling As Object
    Set fortune_telling = CreateObject("Scripting.Dictionary")
    
    For i = 1 To m
        temp = Split(Cells(i + N + 3, 1), " ")
        fortune_telling.Add temp(0), temp(1)
    Next
    
    Debug.Print fortune_telling(users(U))
    
End Sub

占い (paizaランク C 相当)

次のような占いプログラムを作成してください。

「ユーザー」と「ユーザーに対応する血液型」、「血液型」と「血液型に対応する占い結果」が与えられます。

それぞれのユーザーに対応する占い結果を表示してください。

入力例の1つ目は、ユーザーの血液型についてのラッキーカラーの占いです。

入力例の2つ目は、ユーザーの星座についてのラッキーパーソンの占いになっています。
「血液型」として「星座」などのさまざまな文字列を利用できるようにすることで、他の占いにも対応する必要があることに注意してください。

n
(ユーザー_1) (ユーザー_1の血液型)
(ユーザー_2) (ユーザー_2の血液型)
(ユーザー_3) (ユーザー_3の血液型)
...
(ユーザー_i) (ユーザー_iの血液型)
...
(ユーザー_n) (ユーザー_nの血液型)
m
(血液型_1) (血液型_1の占い結果)
(血液型_2) (血液型_2の占い結果)
(血液型_3) (血液型_3の占い結果)
...
(血液型_j) (血液型_jの占い結果)
..
(血液型_m) (血液型_mの占い結果)

期待する出力

1から n までの各ユーザーについて順に、ユーザーとその占い結果を半角スペース区切りで出力してください。
最後は改行し、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ n ≦100
・1 ≦ m ≦100
・(ユーザー_i)は、半角英数字からなる1から20文字までの文字列
・(血液型_j)は、半角英数字からなる1から20文字までの文字列
・(血液型_jの占い結果)は、半角英数字からなる1から20文字までの文字列
・(ユーザー_iの血液型)と等しい、(血液型_j)が必ず存在
・i ≠kのとき、(ユーザー_i)と(ユーザー_k)は異なる文字列
・j ≠kのとき、(血液型_j)と(血液型_k)は異なる文字列


入力例

3
AAA aaa111
BBB bbb222
CCC ccc333
5
aaa111 zzz
bbb222 yyy
ccc333 xxx
ddd444 www
eee555 vvv

出力例

AAA zzz
BBB yyy
CCC xxx

最後はリストに上がった全員の占い結果を出力する。

Python
n = int(input())

users = {}
for _ in range(n):
    user = input().split()
    users[user[0]] = user[1]

m = int(input())

fortunes = {}
for _ in range(m):
    fortune = input().split()
    fortunes[fortune[0]] = fortune[1]

for k,v in users.items():
    print(k,fortunes[v])
VBA
Sub fortune_telling_9()

    N = Cells(1, 1)
    
    Dim users As Object
    Set users = CreateObject("Scripting.Dictionary")
    
    For i = 1 To N
        temp = Split(Cells(i + 1, 1), " ")
        users.Add temp(0), temp(1)
    Next

    m = Cells(N + 2, 1)
    
    Dim fortunes As Object
    Set fortunes = CreateObject("Scripting.Dictionary")
    
    For i = 1 To m
        temp = Split(Cells(i + N + 2, 1), " ")
        fortunes.Add temp(0), temp(1)
    Next
    
    For Each user In users
        Debug.Print user & " " & fortunes(users(user))
    Next
    
End Sub

最後に

ランダム性を持たせれば、何か一つのアプリができそうな感じです。と考えると、コードって結構単純で簡単なところからスタートできるんだなぁって思いませんか? もちろん、アプリにするためには、もっと複雑で面倒な手順が山ほどあり、実際はそれが一番難しいんですけれど。

とうとう、「B ランクレベルアップメニュー」も終わりました。このまま「A ランクレベルアップメニュー」に挑戦するか、定番アルゴリズムの習得に挑戦するかは悩むところ。

引き続き、よろしくお願いいたします!

Python学習,Python,paiza

Posted by LeoSaki