2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

たとえば90分で数独解くプログラム作れる?

1 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:29:03.346 ID:5/x8kPnUd.net
俺は無理

2 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:29:18.905 ID:i299/iJn0.net
俺は有理

3 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:29:41.635 ID:kfalo7//0.net
無理数

4 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:30:02.218 ID:rFJ3P8Y20.net
俺は循環

5 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:31:07.809 ID:o7sKq+k10.net
俺は定理

6 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:31:11.189 ID:j6rImq3Y0.net
いけるんじゃ無い?
次の手を木構造にして、ダメだった枝は除外してくの。

7 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:34:43.135 ID:Pg6j70li0.net
90分もいらない

8 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:35:02.175 ID:oJ7Vy54n0.net
問題作るほうならできる

9 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:35:11.816 ID:Z91bZxgy0.net
マス目が少ないならゴリ押し法で書けばええやん

10 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:35:48.588 ID:E4RK9on/0.net
>>8これ

11 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:36:02.038 ID:PfQPagsS0.net
簡単でしょ

解き始める前のタイム測って
問題を解く関数に入れて
(解く関数自体の実時間は1秒もかからないと思う)
あまった時間は空でループして
90分後に解けた!と表示して終わり

12 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:37:30.785 ID:j6rImq3Y0.net
・全体の縦横に同じ数字が無い
・3x3枠に同じ数字がない

これが枝が生き残る条件。
これを満たさなくなった枝から切っていく。

13 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:38:54.715 ID:UZksCzFY0.net
「90分で」は「解く」にかかるのか「プログラム作る」にかかるのか

14 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:39:45.645 ID:Jeff+a7gd.net
>>11
おもしろくないよ

15 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:41:47.570 ID:j6rImq3Y0.net
だから要点は、
・配列の管理
・木構造の走査(再帰関数で表現するのが良さそう)

16 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:42:46.396 ID:xrFbOo8q0.net
出来るだろ

17 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:45:44.606 ID:E4RK9on/0.net
なんかネットにソースあってそれ使えば数分で出来ちゃいそうな予感

18 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:53:25.022 ID:PTJ1+HhB0.net
余裕でいける

問題作るプログラムも解くプログラムも

90分もあるなら
ヘタしたらそれをiOSアプリにするくらいまでいける

19 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:55:11.022 ID:Ubce4pIu0.net
俺は多分7時間ぐらいかかる

20 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 21:59:13.293 ID:j6rImq3Y0.net
csvで問題作ったので解いてみてちょ
,,3,,2,,,,
8,,,,,4,7,,
9,7,5,,,,2,,
3,5,,2,1,,6,8,9
7,9,1,3,8,,,,2
,,6,,4,,1,,
5,,8,,,2,4,9,6
4,,9,6,3,5,,7,1
1,6,7,4,,8,3,,5

21 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 22:00:48.326 ID:Fbky+KC00.net
じゃあ試しにこれ解いてみろよ
sssp://o.8ch.net/jssn.png

22 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 22:07:19.637 ID:j6rImq3Y0.net
>>18
俺も作ってるけど、そっちのが早そうなので頼んだぞ

23 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 22:31:28.705 ID:j6rImq3Y0.net
返事が無いから心配になってきた、作ってる?

24 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 22:33:26.443 ID:j6rImq3Y0.net
pythonの途中経過な

import numpy as np
import csv
import sys

sudoku_path = "sudoku.csv”

def read_csv(path):
with open(path, "r") as f:
reader = csv.reader(f)
return [row for row in reader]

def scan_hor(sudoku_np, pos, val):
i, j = pos[0], pos[1]

def scan_ver(sudoku_np, pos, val):
i, j = pos[0], pos[1]

def scan_local(sudoku_np, pos, val):
i, j = pos[0], pos[1]

def scan(sudoku_np, pos, val):
is_hor = scan_hor(sudoku_np, pos, val)
is_ver = scan_ver(sudoku_np, pos, val)
is_local = scan_local(sudoku_np, pos, val)
return is_hor and is_ver and is_local

def ketaage(pos):
i, j = pos[0], pos[1]
i += 1
if(i>8):
i = 0
j += 1
if(j>8):
return None
return (i, j)

def scan_re(sudoku_np, pos):
npos = ketaage(pos)
if(npos is None):
print(sudoku_np)
sys.exit()

if(sudoku_np[pos[0], pos[1]] is None):
for val in range(1, 9) if scan(sudoku_np, pos, val):
sudoku_np[pos[0], pos[1]] = val
scan_re(sudoku_np, npos)
else:
scan_re(sudoku_np, npos)

sudoku_list = read_csv(sudoku_path)
sudoku_np = np.asarray(sudoku_list)
scan_re(sudoku_np, (0, 0))

25 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 22:35:40.031 ID:j6rImq3Y0.net
インデントが死ぬので2chはpythonに向いてない

26 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 22:36:20.328 ID:lIEDR9ld0.net
ソース拾ってくればいいだけ

27 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 23:25:49.976 ID:j6rImq3Y0.net
問題間違えたかな、解けん
[['' '' '3' '' '2' '' '' '' '']
['8' '' '' '' '' '4' '7' '' '']
['9' '7' '5' '' '' '' '2' '' '']
['3' '5' '' '2' '1' '' '6' '8' '9']
['7' '9' '1' '3' '8' '' '' '' '2']
['' '' '6' '' '4' '' '1' '' '']
['5' '' '8' '' '' '2' '4' '9' '6']
['4' '' '9' '6' '3' '5' '' '7' '1']
['1' '6' '7' '4' '' '8' '3' '' '5']]



[['6' '4' '3' '' '2' '' '' '' '']
['8' '2' '' '' '' '4' '7' '' '']
['9' '7' '5' '' '' '' '2' '' '']
['3' '5' '' '2' '1' '' '6' '8' '9']
['7' '9' '1' '3' '8' '' '' '' '2']
['2' '8' '6' '' '4' '' '1' '' '']
['5' '3' '8' '' '' '2' '4' '9' '6']
['4' '' '9' '6' '3' '5' '' '7' '1']
['1' '6' '7' '4' '' '8' '3' '' '5']]

28 :以下、\(^o^)/でVIPがお送りします:2016/12/03(土) 23:31:35.145 ID:j6rImq3Y0.net
時間が過ぎてしまった。俺には90分で解くのは無理だったらしい。

数独ってのは
・縦横に同じ数字が無い
・3x3に同じ数字が無い
が条件なんだよな?

29 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:03:08.591 ID:Sk9zl0Dr0.net
誰もいないだろうが、悔しいのでバグの原因を解明中

30 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:06:38.174 ID:Sk9zl0Dr0.net
アホやったわ。range(1,10)がrange(1,9)になってた。

31 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:10:03.153 ID:Sk9zl0Dr0.net
2時間かかったができたよ
[['' '' '3' '' '2' '' '' '' '']
['8' '' '' '' '' '4' '7' '' '']
['9' '7' '5' '' '' '' '2' '' '']
['3' '5' '' '2' '1' '' '6' '8' '9']
['7' '9' '1' '3' '8' '' '' '' '2']
['' '' '6' '' '4' '' '1' '' '']
['5' '' '8' '' '' '2' '4' '9' '6']
['4' '' '9' '6' '3' '5' '' '7' '1']
['1' '6' '7' '4' '' '8' '3' '' '5']]



[['6' '4' '3' '7' '2' '1' '9' '5' '8']
['8' '1' '2' '9' '5' '4' '7' '6' '3']
['9' '7' '5' '8' '6' '3' '2' '1' '4']
['3' '5' '4' '2' '1' '7' '6' '8' '9']
['7' '9' '1' '3' '8' '6' '5' '4' '2']
['2' '8' '6' '5' '4' '9' '1' '3' '7']
['5' '3' '8' '1' '7' '2' '4' '9' '6']
['4' '2' '9' '6' '3' '5' '8' '7' '1']
['1' '6' '7' '4' '9' '8' '3' '2' '5']]

アホなミスをしなけりゃ、
微妙なプログラマでも90分で余裕にソースをかけるってこった。

32 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:11:54.238 ID:EoCPJhaU0.net


33 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:16:30.033 ID:Sk9zl0Dr0.net
>>32
おお、誰か居たか、誰も何も言ってくれなかったらどうしようかと思ったよ。ありがとう。
ソース全文を共有するよ。ひどいソースだがなにか指摘があったら頼む。
forが内包表記じゃないとかは理解してるのでスルーしてくれ。

http://climbi.com/b/8623/0

34 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:29:52.184 ID:Sk9zl0Dr0.net
誰か一緒にやって欲しかったな、
早いやつは実際どれくらいの早さで書き上げるのか知りたかったのに。

35 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:30:47.437 ID:xR6ODjNh0.net
今からやるという主旨のスレだとは思わなかったので

36 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:33:27.386 ID:Sk9zl0Dr0.net
>>35
そんな趣旨のスレじゃなかったからなw
実際やってみたほうが面白いと思って勝手にやっただけだ。気にしないでくれ。

37 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:37:50.272 ID:eb3i2/nX0.net
import sudokulib.h
main(){
Game game=new Game();
Result kekka=game.Start();
print(kekka);
}
出来たぞ

38 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:38:56.112 ID:Sk9zl0Dr0.net
>>37
なるほど(なるほど)

39 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:39:33.901 ID:+tB9G2uma.net
PHP読んだことないからよくわからんけど左上から解析してるんだよな?
その時点で解なしだった場合値入らなくね?

40 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:42:39.545 ID:dEZSuwAL0.net
プログラムを書く方の時間が90分でプログラムを動かす方の制限時間がないなら普通に総当りすればよくね
10分あれば書けるだろ

41 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:44:53.754 ID:Sk9zl0Dr0.net
>>39
Pythonだぞ
ちょっとよくわからん。解ナシだったらそもそも解けんのでは?

たぶん再帰関数で走査してるのが伝わってないんだと思う。
順に木構造を作っていくイメージで考えてくれ。

42 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:44:58.595 ID:mzwFMjMf0.net
板間違えたかと思ったぞ

43 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:46:58.991 ID:Al1X94uE0.net
VBで作ったな

44 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:48:13.922 ID:+tB9G2uma.net
ソース化はしてないけど
1. 横に走査して入りうる候補をlist
2. 縦に走査
3. 内部に走査
4. 1〜3までで被ってる値を抽出してlist
5. 4の結果が1個ならぶちこむ、そうじゃなかったら候補listだけ残しとく
6. 全マスにたいして1〜5実行
7. 埋まってないとこ(候補listが残ってるとこ)の候補で縦横内部走査して1個に絞る
8. 7を全マスが埋まるまで繰り返す

こんな感じでどうだろ

45 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:49:36.428 ID:Sk9zl0Dr0.net
>>40
10分はすごいと思うが、脳みその回転次第では書けるのかもな。

46 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:50:55.238 ID:+tB9G2uma.net
>>41
左上が空でその瞬間に値が未定(複数候補がある)の場合67行目のifが最小値しかならなくない?

47 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:52:01.156 ID:eb3i2/nX0.net
数独はラインラインとかトリプルアタックとかクロスファイアとか様々なテクニックがあるから
プログラミングにするのはなかなか大変だと思う

48 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:52:21.869 ID:+tB9G2uma.net
んああこれnp.copyてもしかして別物つくってんのか?

49 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:54:03.408 ID:+tB9G2uma.net
分かった理解した、それぞれの値が入ったオブジェクト生成されてちゃんと再帰になってんのな
すまんこ

50 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:55:10.987 ID:Sk9zl0Dr0.net
>>46
左上に複数候補{1,2}があったとするなら、

まず1を代入して再帰的に走査を始める。
最後までたどり着けたなら左上は1で正解だ。

最後までたどり着けなかった場合は、
左上に2を代入するところまで自動的に戻ってくるんだ。

その仕組みは関数の再帰的な呼び出しによって実現されている。

51 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:56:45.485 ID:Sk9zl0Dr0.net
>>48-49
なるほど。もっと上手い方法があったのかな。
その方法も教えてくれると助かる。

52 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:58:53.168 ID:+tB9G2uma.net
copyのところ何故か実態に直接ぶち込んでんのかと勘違いしてたわ

53 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 00:59:22.407 ID:Sk9zl0Dr0.net
>>52
なるへそ

54 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:00:45.422 ID:+tB9G2uma.net
俺が思い付いたの>>44だけど決め打ちしなきゃいけないケース考えたらやっぱ再帰しかないんじゃねーのかなあと

55 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:07:13.752 ID:Qg8hzU5H0.net
美人揃いで話題沸騰だったダイハツコンパニオン
http://www.uiyuio.jkub.com/14.html

56 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:07:19.068 ID:Sk9zl0Dr0.net
>>54
確かに>>44の方が速そうだな。最後らへんの処理に自信がないけど。

57 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:09:16.947 ID:+tB9G2uma.net
アルゴリズムマスターきてくれーっ!

58 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:17:39.404 ID:Sk9zl0Dr0.net
>>57
>>44って人間が数独を解くアルゴリズムっぽいので、いけるんじゃない?(的どう)
数独をやったことが無い自分は、実際の状況が頭に浮かんでこないけど。

59 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:18:00.925 ID:Sk9zl0Dr0.net
的どう→適当

60 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:35:43.318 ID:o7P8EDHd0.net
90分で書ける(計算には1世紀かかる)

61 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:42:03.436 ID:dEZSuwAL0.net
何も数字が入ってない場合で9!^9=1.1*10^50通りくらい?

62 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:49:44.605 ID:o7P8EDHd0.net
>>61
毎秒 10^9 通り計算しても 10^41 秒
1世紀が約 3×10^9 秒だから全列挙は闇

63 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:53:10.656 ID:Sk9zl0Dr0.net
>>62
全列挙は闇かもしれんが、1つの答えを出すだけならpythonで1秒掛かってないゾ
[['' '' '' '' '' '' '' '' '']
['' '' '' '' '' '' '' '' '']
['' '' '' '' '' '' '' '' '']
['' '' '' '' '' '' '' '' '']
['' '' '' '' '' '' '' '' '']
['' '' '' '' '' '' '' '' '']
['' '' '' '' '' '' '' '' '']
['' '' '' '' '' '' '' '' '']
['' '' '' '' '' '' '' '' '']]



[['1' '4' '7' '2' '3' '8' '5' '6' '9']
['2' '5' '8' '1' '6' '9' '3' '4' '7']
['3' '6' '9' '4' '5' '7' '1' '2' '8']
['4' '7' '1' '3' '8' '2' '6' '9' '5']
['5' '8' '2' '6' '9' '1' '4' '7' '3']
['6' '9' '3' '5' '7' '4' '2' '8' '1']
['7' '1' '4' '8' '2' '3' '9' '5' '6']
['8' '2' '5' '9' '1' '6' '7' '3' '4']
['9' '3' '6' '7' '4' '5' '8' '1' '2']]


右下の値が入ってなかったのを修正
http://climbi.com/b/8623/1

64 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 01:57:17.353 ID:o7P8EDHd0.net
Nクイーンのアルゴリズムと上手く融合できないかな

65 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:01:15.969 ID:PrL2sfMj0.net
この手の学生の課題とかコンテストの問題みたいなプログラムが実務の場で役に立った試しがない

66 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:03:51.389 ID:Sk9zl0Dr0.net
>>65
再帰関数の練習になる。配列の処理の練習になる。
再帰を実務で使う人は限られる?のかもしれんが、配列の練習としては良いのでは。

67 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:04:39.751 ID:xR6ODjNh0.net
馬鹿「歴史の勉強をしても役に立たない」
馬鹿「古文・漢文学んでも仕事に使えねーよ」
馬鹿「三角関数なんて意味ないし」

勉強したことを応用できない無能さを
よくも堂々と主張できるなwwww

恥ずかしくないのかwwww

68 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:08:36.974 ID:oBKW0VBG0.net
アルゴリズムができたので次はOpenCvを使って雑誌の数独をスキャンして自動的に解いてくれるプログラムを作りなさい
なお完成したプログラムはandroidアプリにして配布すること

69 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:13:49.032 ID:Sk9zl0Dr0.net
>>68
Javaとかいうめんどくささの塊言語はNG

70 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:21:42.948 ID:xb0Jz2mG0.net
個人的には数独の解析よりopencvでマス目と数字認識の方が遥かに楽だわ

71 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:23:20.936 ID:Sk9zl0Dr0.net
>>70
中の数字の認識はいくらでも分類器が転がってるからいいとして、マス目って何使えばいいの?パッと思いつかない。

72 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:23:21.318 ID:TbI1M0OW0.net
>>70
ただし字の汚い誰かが途中まで解いて放り投げたものでも認識できること

73 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:42:13.206 ID:RDr9JVMw0.net
で結局だれか書いたんか?

74 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:44:07.775 ID:Sk9zl0Dr0.net
>>73
書いたよ>>63、ケアレスミスでバグ起きて2時間かかったけど

75 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 02:53:52.891 ID:RDr9JVMw0.net
>>74 おけ

76 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 03:17:04.199 ID:Sk9zl0Dr0.net
すごく都合の良いページが転がっていた
http://docs.opencv.org/trunk/d7/d4d/tutorial_py_thresholding.html

77 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 03:18:21.327 ID:EbcNrU8R0.net
>>8
複数解なしは難しいと思う

78 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 03:19:30.829 ID:EbcNrU8R0.net
>>71
OpenCVに枠検出あるやろ、、たぶん

79 :以下、\(^o^)/でVIPがお送りします:2016/12/04(日) 04:38:01.849 ID:Sk9zl0Dr0.net
ホモグラフィー行列とかいう淫猥行列

総レス数 79
20 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★