codewars kataではプログラミングと実用英語が同時に学べます。天才的サイトです。
githubアカウントがあれば30秒で始められます
興味が沸いたら今すぐここから始めよう
ちなみにpython以外でも多くの言語でチャレンジ出来ます
今日のコード
課題がSudoku(数独)だったりサイトの名前がkata(型)だったり等級表記がkyu(級)だったりこのサイトは日本が好きみたい
ちなみにKumite(組手)とかいうサービスもあるみたいです
1.数独Did I Finish my Sudoku?[5kyu]
Q 入力の盤面において数独が終わったかどうか判定せよ
数独のルール置いときます
縦、横、3*3エリアにおいて1~9を並べるやつですね
###例1
入力:盤面
[[1, 3, 2, 5, 7, 9, 4, 6, 8]
,[4, 9, 8, 2, 6, 1, 3, 7, 5]
,[7, 5, 6, 3, 8, 4, 2, 1, 9]
,[6, 4, 3, 1, 5, 8, 7, 9, 2]
,[5, 2, 1, 7, 9, 3, 8, 4, 6]
,[9, 8, 7, 4, 2, 6, 5, 3, 1]
,[2, 1, 4, 9, 3, 5, 6, 8, 7]
,[3, 6, 5, 8, 1, 7, 9, 2, 4]
,[8, 7, 9, 6, 4, 2, 1, 5, 3]]
出力:'Finished!'
agvz
###例2
入力:盤面
[[1, 3, 2, 5, 7, 9, 4, 6, 8]
,[4, 9, 8, 2, 6, 1, 3, 7, 5]
,[7, 5, 6, 3, 8, 4, 2, 1, 9]
,[6, 4, 3, 1, 5, 8, 7, 9, 2]
,[5, 2, 1, 7, 9, 3, 8, 4, 6]
,[9, 8, 7, 4, 2, 6, 5, 3, 1]
,[2, 1, 4, 9, 3, 5, 6, 8, 7]
,[3, 6, 5, 8, 1, 7, 9, 2, 4]
,[8, 7, 9, 6, 4, 2, 1, 3, 5]]
#5 #3 #縦に見たとき5,3がそれぞれ足りない
出力:'Try again!'
My Answer
import numpy as np
def done_or_not(board):
sets = set([i for i in range(1,10)])
board = np.array(board)
if not [1 for j in range(9) if not set(board[j]) == sets or not set(board[:,j]) == sets] ==[]:
return 'Try again!'
if not [1 for i in range(9) if not set(board[i//3*3:i//3*3+3,i%3*3:(i%3*3)+3].flatten()) == sets ] ==[]:
return 'Try again!'
return 'Finished!'
sets = {1~9の集合}として
縦横列がこの集合になっているか
各エリアがこの集合になっているか
をそれぞれチェックしてる感じですね
Codewarsっぽいコードになってきた気がする…
可読性が低いのでいいのか悪いのか分からん
Best Answer
import numpy as np
def done_or_not(aboard): #board[i][j]
board = np.array(aboard)
rows = [board[i,:] for i in range(9)]
cols = [board[:,j] for j in range(9)]
sqrs = [board[i:i+3,j:j+3].flatten() for i in [0,3,6] for j in [0,3,6]]
for view in np.vstack((rows,cols,sqrs)):
if len(np.unique(view)) != 9:
return 'Try again!'
return 'Finished!'
これはなんていうか…めっちゃ見やすいですね
np.vstack()で縦横四角を2次元配列に並べて
np.unique()で何種類の要素があるかを見ているんですね
len(set())で同じことをしようとしてたことがあったけどこんな便利な機能があるとは
内包表記カコイイじゃなくてちゃんと端的で見やすいコードを書けるよう精進します。
あとがき
CSSとHTMLの勉強を始めました