codewars kataではプログラミングと実用英語が同時に学べます。天才的サイトです。
githubアカウントがあれば30秒で始められます
興味が沸いたら今すぐここから始めよう
ちなみにpython以外でも多くの言語でチャレンジ出来ます
今日のコード
Q1 初めての辞書型 Pete, the baker[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[5kyu]
チックタックゲームってなんやねんと思ったらOXゲームの事らしい
盤面を渡されて結果を分類すればOK
-1:未完了
1:Xの勝ち
2:Oの勝ち
0:引き分け(it's a cat's gameっていうらしい)
難しそう・・・
例1
入力:盤面
[[0, 0, 1],
[0, 1, 2],
[2, 1, 0]]
※0:空欄 1:X 2:O
出力:結果
-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