LoginSignup
3

More than 3 years have passed since last update.

ゼロから始めるcodewars kata

Last updated at Posted at 2019-11-30

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


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
3