ゼロから始めるcodewars kata

codewars kataではプログラミングと実用英語が同時に学べます。天才的サイトです。
githubアカウントがあれば30秒で始められます
興味が沸いたら今すぐ[ここから始めよう](https://www.codewars.com/)

ちなみにpython以外でも多くの言語でチャレンジ出来ます
# 今日のコード

## Q1 初めての辞書型 [Pete, the baker](https://www.codewars.com/kata/525c65e51bf619685c000059/discuss/python)[5kyu]
ケーキが何個作れるかの関数
`def cakes(recipe, available):`を作れ

###例1
##### 入力：レシピと材料
cakes({flour: 500, sugar: 200, eggs: 1}, {flour: 1200, sugar: 1200, eggs: 5, milk: 200})
##### 出力：作れる数
 2

###例2
##### 入力：レシピと材料
{apples: 3, flour: 300, sugar: 150, milk: 100, oil: 100}, {sugar: 500, flour: 2000, milk: 2000})
##### 出力：作れる数
0

### MyAnswer

```
    list = []
    for key,value in recipe.items():
        if key in available:
            list.append(available[key]//value)
        else:
            list.append(0)
    return min(list)
```
初めての辞書型でggったらitems()で内容取れるらしいのでforで取ってきて
各材料(key)において　材料//レシピ　をlistに保存
なお材料がなかったら　0　保存
listの最小値を変える

素直なコード

### BestAnswers

```
def cakes(recipe, available):
  return min(available.get(k, 0)/recipe[k] for k in recipe)
```
`for k in dict`でkeyを取得出来るみたいです
dict.get(k, 0)でvalueを取得、もしkeyがない場合は第二引数を取得

`min(available.get(k, 0) // v for k,v in recipe.items())`でもほぼ同じ
dict.getを使わないと
`return min([available[i]//recipe[i] if i in available else 0 for i in recipe])`とifを内包してもOK

## Q2 OXゲーム　[Tic-Tac-Toe Checker](https://www.codewars.com/kata/tic-tac-toe-checker)[5kyu]
チックタックゲームってなんやねんと思ったらOXゲームの事らしい
盤面を渡されて結果を分類すればＯＫ
-1:未完了
1:Xの勝ち
2:Ｏの勝ち
0:引き分け（it's a cat's gameっていうらしい）
難しそう・・・

###例1
##### 入力：盤面
[[0, 0, 1],
 [0, 1, 2],
 [2, 1, 0]]
※0:空欄　1:Ｘ　2:Ｏ
##### 出力：結果
-1


### MyAnswer

```
def ox(board):
    lines = []
    for i in range(3):
        lines.append(board[i])
        lines.append([board[j][i] for j in range(3)])
    lines.append([board[0][0],board[1][1],board[2][2]])
    lines.append([board[0][2],board[1][1],board[2][0]])

    yetfin = 0
    for k in range(8):
        if lines[k] == [1,1,1] or lines[k] == [2,2,2]:
            return lines[k][0] 

        if set(lines[k]) == {0,1} or set(lines[k]) == {0,2} :
            yetfin = 1
            
    if yetfin:
        return -1
    else:
        return 0
```
linesに縦横ナナメ8列それぞれの数値を保存してからそれが以下のどれなのか探すプログラムです
勝ち：[111][222]
未完了：{0,1}{0,2}
引き分け：それ以外

### BestAnswers

```
def ox2(board):
  for i in range(0,3):
    if board[i][0] == board[i][1] == board[i][2] != 0:
      return board[i][0]
    elif board[0][i] == board[1][i] == board[2][i] != 0:
      return board[0][i]
      
  if board[0][0] == board[1][1] == board[2][2] != 0:
    return board[0][0]
  elif board[0][2] == board[1][1] == board[2][0] != 0:
    return board[0][0]

  elif 0 not in board[0] and 0 not in board[1] and 0 not in board[2]:
    return 0
  else:
    return -1
```
やってることは勝ち判定まではlinesを作ってない以外はほぼ同じ
（メモリ的に助かるのでこっちのが賢い）
だけど引き分け判定でこっちは0を探しているだけですね・・・
つまり
XXO
OOX
XO_
のような0のある積みゲーで挙動が変わってきて

```
board = [[1,1,2],
          [2,2,1], 
          [1,2,0]]
print('MyAnswer:',ox(board))
print('BestPractice:',ox2(board))
```

```
MyAnswer: 0
BestPractice: -1
```
となります。

あれ？と思って問題文をよく見たら
>-1 if the board is not yet finished (there are empty spots),

つまりemptyが1つでもあったら未完了なので後者がBestPracticeが正しいみたいですね


#あとがき
土曜はごろごろ昼過ぎ前家を出る気もしないので何も食べれずハラペコ



自分用テンプレ
# 今日のコード

## Q

###例1
##### 入力：

##### 出力：

###例2
##### 入力：
##### 出力：


### MyAnswer

```

```

### BestAnswers

```

```