LoginSignup
2
9

More than 3 years have passed since last update.

「自作Python100本ノック」4日目(16本〜20本目)

Last updated at Posted at 2018-05-10

「自作Python100本ノック」4日目です。

「自作Python100本ノック」とは何ぞや?
どの程度のレベル感なのか?
どのように進めて行くのか?
など詳しくはこちらに整理してありますのでまずはそちらを確認するようお願いします。
それでは始めていきます!

Q16: 標準ライブラリを使ってsin60°を求める

まあ、ライブラり知ってないと解けないですよね。(こういう時に調べるという練習)
   

q16.py
from math import sin,pi
print(sin(pi/4)) #piは180°を表す

[出典]Pythonのお勉強 問題集

Q17: 16進数ダンプ(逆バージョンも)

16進数ダンプとは、メモリーやファイルの内容などを16進数の形で目に見えるように書き出す(表示する)ことを言います。(通信用語の基礎知識より)
今回は、その16進数ダンプと、その逆の作業をライブラリを用いて実行してください。
   

q17.py
import binascii
#文字列 -> 16進数
binascii.hexlify(b'Hello') 

#16進数 -> 文字列
binascii.unhexlify('48656c6c6f')

[出典]Pythonのお勉強 問題集

Q18: パスワードを自動生成する

問題:英字(大文字小文字含める)と数字を組み合わせた、8文字のパスワードを自動で生成せよ。
   

q18.py
#英字(小文字&大文字):string.ascii_letters
#数字:string.digits
#記号:string.punctuation

import string
import random

a = ''.join([random.choice(string.ascii_letters + string.digits) for i in range(8)]) #リストの中の文字を連結出来る
print(a)

[参考]Pythonのお勉強 問題集

Q19: ランダムな数字のリストを生成せよ

問題:表示する数字の個数、#数字の範囲(最小と最大)を指定し、その中でランダムな数字を生成
   

q19.py
def randlist(size,lower,upper):
    list = []
    for i in range(size):
        list.append(random.randint(lower,upper))
    print(list)

randlist(10,30,90)

[出典]cozeのページ Python練習問題

20: 簡単ポーカー

問題:
5枚のカードが配られます。
それぞれのカードには、1以上13以下のいずれかの整数が書かれています。
カードに書かれている整数の組み合わせによって役が決まります。

配られた5枚のカードが、以下のいずれの役に該当するかを調べてください。複数の役に該当する場合は、以下で先に記述した方の役に該当するものとします。

条件:
FULL HOUSE
ある数をちょうど3つと、別の数をちょうど2つ含む。
FOUR CARD
ある数をちょうど4つ含む
THREE CARD
ある数をちょうど3つ含む。
TWO PAIR
ある数をちょうど2つと、別の数をちょうど2つ含む。
ONE PAIR
ある数をちょうど2つ含む。

もっとスマートな解き方も多くあるので是非出典から確認してみてください。
   

q20.py
def check_hand(a,b,c,d,e):
    list_hands = [a,b,c,d,e]
    dict_hands = {0 : "NO PAIR", 1 : "ONE PAIR", 2 : "TWO PAIR", 3 : "THREE CARD", 4 : "FOUR CARD", 5 : "FULL HOUSE"}
    results = []

    for i in list_hands:#カードXを選ぶ
        count_i = list_hands.count(i)#手札の中にあるカードXの個数をカウント

        left_hands = [n for n in list_hands  if n  != i] #Xの数字を除いた残りの手札
        for j in left_hands:#X以外の数字のカードからカードYを選ぶ
            count_j = list_hands.count(j)#手札の中にあるカードYの個数をカウント
            if count_i == 2 and count_j < 2:
                results.append(1)
            elif count_i == 2 and count_j == 2:
                results.append(2)
            elif count_i == 3 and count_j == 1:
                results.append(3)
            elif count_i == 4 and count_j == 1 :
                results.append(4)
            elif count_i == 3 and count_j == 2 :
                results.append(5)
            else:
                results.append(0)
    result = max(results)
    return dict_hands[result]

check_hand(10,8,11,11,4) 

[出典] data9824さん

感想

昨日言った通り今回は、ライブラリを使った問題を多く解いてみました。
ライブラリなんて全部覚えられないので、その場その場で「あ。こんな便利なライブラリがあるんだと」自分で調べて発見し、実際に使うという実践的な能力を自分もつけたいなと思っております。

ところで、その日新たに解いた問題よりも、Qiitaでアウトプットする問題の方が多くなってきており、最初の頃にあった問題のストックがなくなってきていることがかなり不安になってきています。

ってか本当に100本目までネタが持つのかな・・・(ここにきて不安になってきた)

見ての通り初心者なので、何か修正、アドバイス、感想等あればなんでも良いのでコメントもらえると助かります。よろしくお願いします。

それでは!

5日目

2
9
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
9