「自作Python100本ノック」4日目（16本〜20本目）

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

「自作Python100本ノック」とは何ぞや？
どの程度のレベル感なのか？
どのように進めて行くのか？
など詳しくは[こちら](https://qiita.com/ahpjop/items/373f807d68044cda1c9b#%E8%87%AA%E4%BD%9Cpython100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF1%E6%9C%AC5%E6%9C%AC%E7%9B%AE)に整理してありますのでまずはそちらを確認するようお願いします。
それでは始めていきます！

##Q16: 標準ライブラリを使ってsin60°を求める
まあ、ライブラり知ってないと解けないですよね。（こういう時に調べるという練習）
　　　

```q16.py
from math import sin,pi
print(sin(pi/4)) #piは180°を表す
```
[出典][Pythonのお勉強　問題集](http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8#p12)

##Q17: 16進数ダンプ(逆バージョンも)
16進数ダンプとは、メモリーやファイルの内容などを16進数の形で目に見えるように書き出す（表示する）ことを言います。([通信用語の基礎知識より](http://www.wdic.org/w/TECH/16%E9%80%B2%E3%83%80%E3%83%B3%E3%83%97))
今回は、その16進数ダンプと、その逆の作業をライブラリを用いて実行してください。
　　　

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

#16進数 -> 文字列
binascii.unhexlify('48656c6c6f')
```
[出典][Pythonのお勉強　問題集](http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8#p12)

##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のお勉強　問題集](http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8#p12)

##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練習問題](http://coze.s201.xrea.com/python/prac.html)

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

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

条件:
*FULL HOUSE*
ある数をちょうど3つと、別の数をちょうど2つ含む。 
*FOUR CARD*
ある数をちょうど４つ含む
*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さん](https://yukicoder.me/problems/no/227)

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

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

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

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

それでは！

→ [5日目](https://qiita.com/ahpjop/items/0dffbfbae7609329c5ca)