Send commitlog mailing list submissions to
commitlog@lists.openmoko.org
To subscribe or unsubscribe via the World Wide Web, visit
http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
[EMAIL PROTECTED]
You can reach the person managing the list at
[EMAIL PROTECTED]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:
1. Openmoko's OpenEmbedded repository. This is used to build the
Openmoko distribution: Changes to 'org.openmoko.asu.dev'
([EMAIL PROTECTED])
2. Openmoko's OpenEmbedded repository. This is used to build the
Openmoko distribution: Changes to 'org.openmoko.dev'
([EMAIL PROTECTED])
3. r4519 - developers/erin_yueh/pythonEFL-sudoku/src
([EMAIL PROTECTED])
4. r4520 - in developers/erin_yueh/pythonEFL-sudoku: data
data/image data/puzzle src/sudoku ([EMAIL PROTECTED])
--- Begin Message ---
conf/distro/include/sane-srcrevs.inc | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
New commits:
commit 7074dd2dd3401a7e13b6ea4b1f8b0a5546ec5719
Author: Julian_chu <[EMAIL PROTECTED]>
Date: Wed Jul 9 20:48:19 2008 +0800
[assassin] Bump up the reversion of assassin to 193
--- End Message ---
--- Begin Message ---
conf/distro/include/preferred-om-2008-versions.inc | 9 +-
conf/distro/openmoko.conf | 23 +-
.../glib-2.0-2.16.4/configure-libtool.patch | 34 +
packages/glib-2.0/glib-2.0_2.16.4.bb | 11 +
.../gtk+/gtk+-2.12.11/cellrenderer-cairo.patch | 32 +
packages/gtk+/gtk+-2.12.11/combo-arrow-size.patch | 67 +
packages/gtk+/gtk+-2.12.11/disable-print.patch | 26 +
packages/gtk+/gtk+-2.12.11/entry-cairo.patch | 103 +
packages/gtk+/gtk+-2.12.11/hardcoded_libtool.patch | 29 +
packages/gtk+/gtk+-2.12.11/menu-deactivate.patch | 51 +
packages/gtk+/gtk+-2.12.11/no-demos.patch | 10 +
packages/gtk+/gtk+-2.12.11/pangoxft2.10.6.diff | 2456 ++++++++++++++++++++
packages/gtk+/gtk+-2.12.11/range-no-redraw.patch | 127 +
packages/gtk+/gtk+-2.12.11/run-iconcache.patch | 19 +
.../gtk+/gtk+-2.12.11/scrolled-placement.patch | 22 +
packages/gtk+/gtk+-2.12.11/toggle-font.diff | 100 +
packages/gtk+/gtk+_2.12.11.bb | 48 +
17 files changed, 3140 insertions(+), 27 deletions(-)
New commits:
commit 1d2ffa9abf4464c9ae0d31ee1ca697aaaeb7a81c
Author: Graeme Gregory <[EMAIL PROTECTED]>
Date: Wed Jul 9 14:50:20 2008 +0100
[openmoko] remove all ${MACHINE_CLASS} settings, they are no longer
wanted. Also switch back to standard gtk+ moko theme no longers uses the
bitmaps.
commit 688e844b11f2fcca83fcefda8da82981057b30c2
Author: Graeme Gregory <[EMAIL PROTECTED]>
Date: Wed Jul 9 13:37:24 2008 +0100
[pref-versions] update the gtk+ version used to the latest.
commit a64fb4177283b7ed2bf13248b4d604d3831dc23b
Author: Graeme Gregory <[EMAIL PROTECTED]>
Date: Wed Jul 9 13:35:43 2008 +0100
[glib-2.0] add the latest version of glib
commit 2e387044089a51717756d56728b49a815f651783
Author: Graeme Gregory <[EMAIL PROTECTED]>
Date: Wed Jul 9 13:35:09 2008 +0100
[gtk+] add the latest version of gtk+
--- End Message ---
--- Begin Message ---
Author: erin_yueh
Date: 2008-07-09 18:13:51 +0200 (Wed, 09 Jul 2008)
New Revision: 4519
Modified:
developers/erin_yueh/pythonEFL-sudoku/src/sudoku_ui.py
Log:
add undo, redo functions, all functions are workable (Erin Yueh)
Modified: developers/erin_yueh/pythonEFL-sudoku/src/sudoku_ui.py
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/src/sudoku_ui.py 2008-07-09
07:33:06 UTC (rev 4518)
+++ developers/erin_yueh/pythonEFL-sudoku/src/sudoku_ui.py 2008-07-09
16:13:51 UTC (rev 4519)
@@ -4,7 +4,7 @@
import ecore
import edje
import random
-import etk
+#import etk
WINDOW_WIDTH = 455
WINDOW_HEIGHT = 640
@@ -16,9 +16,9 @@
def checkRow(row,value):
isOK = True
puzzle = ee.data["puzzle"]
- print 'checkRow',row,value
+ #print 'checkRow',row,value
for j in xrange(9):
- print puzzle[row][j]
+ #print puzzle[row][j]
if(value == puzzle[row][j]):
isOK = False
return isOK
@@ -26,9 +26,9 @@
def checkColumn(column,value):
isOK = True
puzzle = ee.data["puzzle"]
- print 'checkColumn',column,value
+ #print 'checkColumn',column,value
for i in xrange(9):
- print puzzle[i][column]
+ #print puzzle[i][column]
if(value == puzzle[i][column]):
isOK = False
return isOK
@@ -36,11 +36,11 @@
def checkGroup(group,value):
isOK = True
puzzle = ee.data["puzzle"]
- print 'checkGroup',group,value
+ #print 'checkGroup',group,value
(group,r,c) = GROUP_ROWCOL[str(group)]
for i in xrange (r,r+3):
for j in xrange(c,c+3):
- print puzzle[i][j]
+ #print puzzle[i][j]
if(value == puzzle[i][j]):
isOK = False
return isOK
@@ -59,14 +59,13 @@
def analyze(button,value):
isOK = True
- puzzle = ee.data["puzzle"]
- # button40 2
+ #puzzle = ee.data["puzzle"]
addr = button[6:]
print addr, value
i = int(addr) / 9
j = int(addr) % 9
g = (i/3)*3 + (j/3)
- print i,j,g
+ print i,j,g,addr,value
if(checkRow(i,value) == False or checkColumn(j,value) == False or
checkGroup(g,value) == False):
return False
@@ -75,27 +74,33 @@
def number_key_cb(zoom_in, emission, source):
print 'number_key_cb emission,source:',emission,source
- if(source == 'clear'):
- puzzle_clone = ee.data["puzzle_clone"]
- puzzle = ee.data["puzzle"]
- for i in xrange (9):
- for j in xrange(9):
- value = puzzle_clone[i][j]
-
- print 'i,j,value,puzzle[i][j]',i,j,value,puzzle[i][j]
- puzzle[i][j] = value
- addr = j + i *9
- text_data = "button" + str(addr)
- text = ee.data[text_data]
- text.data["value"] = value
- text.text_set(str(value))
- if(value>0):
- text.color_set(10,10,10,200)
- elif(value==0):
- text.color_set(0,255,255,255)
+ if(source == 'clear' or source == 'create'):
+ # init undo redo action track
ee.data["undo_counter"] = 0
+ ee.data["redo_counter"] = 0
ee.data["undo_track"] = []
- print 'clear all data!!'
+ ee.data["redo_track"] = []
+ ee.data["clicking"] = None
+ if(source == 'clear'):
+ puzzle_clone = ee.data["puzzle_clone"]
+ puzzle = ee.data["puzzle"]
+ for i in xrange (9):
+ for j in xrange(9):
+ value = puzzle_clone[i][j]
+ #print
'i,j,value,puzzle[i][j]',i,j,value,puzzle_clone[i][j]
+ puzzle[i][j] = value
+ addr = j + i *9
+ text_data = "button" + str(addr)
+ text = ee.data[text_data]
+ text.text_set(str(value))
+ if(value>0):
+ text.color_set(10,10,10,200)
+ elif(value==0):
+ text.color_set(0,255,255,255)
+ print 'clear all data!!'
+ elif(source == 'create'):
+ print 'create new puzzle'
+ createNewPuzzle()
elif(source =='undo'):
print 'undo'
if(ee.data["undo_counter"] == 0):
@@ -103,8 +108,10 @@
print ee.data["undo_counter"], ee.data["undo_track"]
undo_counter = ee.data["undo_counter"]
(addr,value) = ee.data["undo_track"][undo_counter-1]
- ee.data["undo_track"].pop()
-
+ redo = ee.data["undo_track"].pop()
+ ee.data["redo_track"].append(redo)
+ redo_counter = ee.data["redo_counter"]
+ ee.data["redo_counter"] = redo_counter+1
i = int(addr) / 9
j = int(addr) % 9
original_value = ee.data["puzzle_clone"][i][j]
@@ -113,31 +120,47 @@
text.text_set(str(original_value))
text.color_set(100,255,0,255)
ee.data["puzzle"][i][j] = original_value
- text.data["value"] = original_value
+ #text.data["value"] = original_value
if(undo_counter>0):
ee.data["undo_counter"] = undo_counter-1
elif(source == 'redo'):
print 'redo'
- print ee.data["undo_counter"], ee.data["undo_track"]
+ if(ee.data["redo_counter"] == 0):
+ return
+ print ee.data["redo_counter"], ee.data["redo_track"]
+ redo_counter = ee.data["redo_counter"]
+ (addr,value) = ee.data["redo_track"][redo_counter-1]
+ undo = ee.data["redo_track"].pop()
+ ee.data["undo_track"].append(undo)
+ undo_counter = ee.data["undo_counter"]
+ ee.data["undo_counter"] = undo_counter+1
+
+ i = int(addr) / 9
+ j = int(addr) % 9
+ text = ee.data["button"+str(addr)]
+ print i,j,value,text
+ text.text_set(str(value))
+ text.color_set(255,255,0,255)
+ ee.data["puzzle"][i][j] = int(value)
+ #text.data["value"] = int(value)
+ if(redo_counter>0):
+ ee.data["redo_counter"] = redo_counter-1
+
elif(source == 'solve'):
print 'is solved?!'
if(solve() == False):
print 'NO'
else:
print 'YES'
- elif(source == 'create'):
- print 'create'
- createNewPuzzle()
- ee.data["undo_counter"] = 0
- ee.data["undo_track"] = []
+
else:
# fill in key number
if(ee.data["clicking"]):
text = ee.data[ee.data["clicking"]]
text.text_set(source)
- text.data["value"] = int(source)
button = ee.data["clicking"]
- addr = button[6:]
+ #addr = button[6:]
+ addr = ee.data["clicking"][6:]
i = int(addr) / 9
j = int(addr) % 9
print i,j,addr
@@ -153,10 +176,9 @@
undo_counter = ee.data["undo_counter"]
ee.data["undo_counter"] = undo_counter +1
step = (int(addr),int(source))
- track = ee.data["undo_track"]
- track.append(step)
- print 'counter:',ee.data["undo_counter"]
- print 'track:',track
+ ee.data["undo_track"].append(step)
+ #print 'undo_counter:',ee.data["undo_counter"]
+ #print 'undo_track:',ee.data["undo_track"]
return True
def puzzle_key_cb(zoom_in, emission, source):
@@ -191,7 +213,7 @@
def createNewPuzzle():
puzzle = get_puzzle()
- print 'puzzle',puzzle
+ print 'new puzzle',puzzle
for i in xrange(9):
for j in xrange(9):
ee.data["puzzle"][i][j] = puzzle[i][j]
@@ -200,7 +222,6 @@
addr = j + i *9
text_data = "button" + str(addr)
text = ee.data[text_data]
- text.data["value"] = value
text.text_set(str(value))
if(value>0):
text.color_set(10,10,10,200)
@@ -219,7 +240,7 @@
ee.title_set('sudoku')
ee.size_min_set(WINDOW_WIDTH,WINDOW_HEIGHT)
canvas = ee.evas
-
+
# create a background
bg = edje.Edje(canvas, file="/usr/share/sudoku/sudoku.edj",
group="pythonEFL-sudoku/background")
bg.pos = (0, 0)
@@ -227,7 +248,7 @@
bg.show()
ee.data["bg"] = bg
- # create puzzle and icons
+ # create number keyboard and action icons
area = edje.Edje(canvas, file="/usr/share/sudoku/sudoku.edj",
group="pythonEFL-sudoku/panel")
area.signal_callback_add("mouse,clicked,*", "*", number_key_cb)
area.pos = (0, 0)
@@ -235,27 +256,30 @@
area.show()
area.data["area"] = area
- # create puzzle and icons
+ # create puzzle board
board = edje.Edje(canvas, file="/usr/share/sudoku/sudoku.edj",
group="pythonEFL-sudoku/board")
board.signal_callback_add("mouse,clicked,*", "*", puzzle_key_cb)
board.pos = (0, 0)
board.show()
-
+
+ # retrieve one puzzle data
puzzle = get_puzzle()
- print 'puzzle',puzzle
puzzle_clone = []
for i in xrange(9):
row = []
for j in xrange(9):
row.append(puzzle[i][j])
puzzle_clone.append(row)
- print 'puzzle_clone', puzzle_clone
-
+ print 'puzzle',puzzle, puzzle_clone
ee.data["puzzle"] = puzzle
ee.data["puzzle_clone"] = puzzle_clone
-
+ ee.data["clicking"] = None
+
+ # init redo undo track
ee.data["undo_counter"] = 0
+ ee.data["redo_counter"] = 0
ee.data["undo_track"] = []
+ ee.data["redo_track"] = []
element_w = 455 / 9
element_h = 455 / 9
@@ -264,23 +288,17 @@
for j in xrange(9):
x = 15 + (element_w * (i))
y = 15 + (element_h * (j))
-
value = puzzle[j][i]
-
- display = str(value)
addr = j *9 + i
- print 'row,column,value,addr: ',i,j,value,addr
- text = canvas.Text(text=display, font=("sans serif", 16),
color=(0,255,255,255))
- #print i,j,x,y
+ #print 'row,column,value,addr: ',i,j,value,addr
+ text = canvas.Text(text=str(value), font=("sans serif", 16),
color=(0,255,255,255))
if(value>0):
+ text.data["fixed"] = True
text.color_set(10,10,10,200)
+ else:
+ text.data["fixed"] = False
text.pos_set(x,y)
text.show()
- text.data["value"] = value
- if(value>0):
- text.data["fixed"] = True
- else:
- text.data["fixed"] = False
text_data = "button" + str(addr)
ee.data[text_data] = text
--- End Message ---
--- Begin Message ---
Author: erin_yueh
Date: 2008-07-09 18:45:19 +0200 (Wed, 09 Jul 2008)
New Revision: 4520
Added:
developers/erin_yueh/pythonEFL-sudoku/data/image/dummy.png
developers/erin_yueh/pythonEFL-sudoku/data/pythonEFL-sudoku.desktop
developers/erin_yueh/pythonEFL-sudoku/src/sudoku/generator.py
Removed:
developers/erin_yueh/pythonEFL-sudoku/data/puzzle/solver.py
developers/erin_yueh/pythonEFL-sudoku/data/puzzle/sudoku.py
Log:
update sudoku.desktop and add generotor, solver script (Erin Yueh)
Added: developers/erin_yueh/pythonEFL-sudoku/data/image/dummy.png
===================================================================
(Binary files differ)
Property changes on: developers/erin_yueh/pythonEFL-sudoku/data/image/dummy.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Deleted: developers/erin_yueh/pythonEFL-sudoku/data/puzzle/solver.py
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/data/puzzle/solver.py 2008-07-09
16:13:51 UTC (rev 4519)
+++ developers/erin_yueh/pythonEFL-sudoku/data/puzzle/solver.py 2008-07-09
16:45:19 UTC (rev 4520)
@@ -1,252 +0,0 @@
-#!/usr/bin/python
-
-import sys
-
-class SudokuSolver:
- def __init__(self):
- self.puzzle = None
-
- self.row = [False] * 90
- self.col = [False] * 90
- self.grp = [False] * 90
-
- self.steps = []
- for i in xrange(9):
- self.steps.append([])
-
- self.scores = [-1] * 81
-
- self.tries = []
- for i in xrange(81):
- self.tries.append([])
-
- self.relatives = []
- for r in xrange(9):
- for c in xrange(9):
- tmp = []
- for x in xrange(9):
- if x != c:
- tmp.append(r * 9 + x)
- for y in xrange(9):
- if y != r:
- tmp.append(y * 9 + c)
- gr = (r / 3) * 3
- gc = (c / 3) * 3
- for y in xrange(gr, gr + 3):
- for x in xrange(gc, gc + 3):
- if y != r and x != c:
- tmp.append(y * 9 + x)
-
- self.relatives.append(tmp)
-
- def _verify(self):
- print "verify"
- for r in xrange(9):
- for c in xrange(9):
- s = self.scores[r * 9 + c]
- if s == -1:
- continue
-
- tmp = []
- for n in xrange(1, 10):
- if not (self.row[r * 10 + n] or self.col[c * 10 + n] or
self.grp[((r / 3) * 3 + (c / 3)) * 10 + n]):
- tmp.append(n)
-
- if len(tmp) - 1 != s:
- print "(%d, %d) has score %d, instead of %d" % (r, c,
len(tmp) - 1, s)
- return False
-
-
- old = self.tries[r * 9 + c][:]
- old.sort()
- if old != tmp:
- print "(%d, %d) has tries", tmp, "instead of", old
-
- try:
- self.steps[s].index(r * 9 + c)
- except:
- print "(%d, %d) @ %d is not a step" % (r, c, s)
- return False
-
- return True
-
- def _try(self, pos, n):
- positions = []
- for p in self.relatives[pos]:
- if self.scores[p] >= 0 and n in self.tries[p]:
- if len(self.tries[p]) == 1:
- return False
-
- positions.append(p)
-
- r = pos / 9
- c = pos % 9
- self.row[r * 10 + n] = True
- self.col[c * 10 + n] = True
- self.grp[((r / 3) * 3 + (c / 3)) * 10 + n] = True
-
- self.puzzle[r][c] = n
-
- for p in positions:
- self.tries[p].remove(n)
- s = self.scores[p]
- self.scores[p] -= 1
- self.steps[s - 1][:0] = [p]
- self.steps[s].remove(p)
-
- return True
-
- def _undo(self, pos, n):
- r = pos / 9
- c = pos % 9
- self.row[r * 10 + n] = False
- self.col[c * 10 + n] = False
- self.grp[((r / 3) * 3 + (c / 3)) * 10 + n] = False
-
- self.puzzle[r][c] = 0
-
- for p in self.relatives[pos]:
- old_score = self.scores[p]
- if old_score == -1:
- continue
-
- if n not in self.tries[p]:
- y = p / 9
- x = p % 9
- if not (self.row[y * 10 + n] or self.col[x * 10 + n] or
self.grp[((y / 3) * 3 + (x / 3)) * 10 + n]):
- self.tries[p][:0] = [n]
- self.scores[p] += 1
- self.steps[old_score + 1][:0] = [p]
- self.steps[old_score].remove(p)
-
- def _solve(self):
- pos = 81
- for score in xrange(9):
- if self.steps[score]:
- pos = self.steps[score].pop()
- break
- if pos >= 81:
- return True
-
- self.scores[pos] = -1
-
- for n in self.tries[pos]:
- if self._try(pos, n):
- if self._solve():
- return True
- self._undo(pos, n)
-
- self.scores[pos] = score
- self.steps[score].append(pos)
-
- return False
-
- def _analyze(self):
- for i in xrange(90):
- self.row[i] = False
- self.col[i] = False
- self.grp[i] = False
-
- for r in xrange(9):
- for c in xrange(9):
- pos = r * 9 + c
- v = self.puzzle[r][c]
- if v:
- if self.row[r * 10 + v] or self.col[c * 10 + v] or
self.grp[((r / 3) * 3 + (c / 3)) * 10 + v]:
- return False
-
- self.row[r * 10 + v] = True
- self.col[c * 10 + v] = True
- self.grp[((r / 3) * 3 + (c / 3)) * 10 + v] = True
-
- self.scores[pos] = -1
-
- for i in xrange(9):
- self.steps[i] = []
-
- for r in xrange(9):
- for c in xrange(9):
- pos = r * 9 + c
- v = self.puzzle[r][c]
- if not v:
- tries = []
- for n in xrange(1, 10):
- if not (self.row[r * 10 + n] or self.col[c * 10 + n]
or self.grp[((r / 3) * 3 + (c / 3)) * 10 + n]):
- tries.append(n)
-
- if not tries:
- return False
-
- score = len(tries) - 1
-
- self.tries[pos] = tries
- self.scores[pos] = score
- self.steps[score].append(pos)
-
- while (self.steps[0]):
- pos = self.steps[0].pop()
- r = pos / 9
- c = pos % 9
-
- v = self.tries[pos].pop()
-
- self.row[r * 10 + v] = True
- self.col[c * 10 + v] = True
- self.grp[((r / 3) * 3 + (c / 3)) * 10 + v] = True
- self.puzzle[r][c] = v
-
- self.scores[pos] = -1
-
- for p in self.relatives[pos]:
- s = self.scores[p]
- if s > 0 and v in self.tries[p]:
- self.tries[p].remove(v)
- self.scores[p] -= 1
- self.steps[s - 1][:0] = [p]
- self.steps[s].remove(p)
-
- return True
-
- def solve(self, puzzle):
- self.puzzle = puzzle
-
- if not self._analyze():
- return False
-
- return self._solve()
-
-def parse_file():
- lines = sys.stdin.readlines()
-
- puzzles = []
- for l in lines:
- if (len(l) != 82):
- print "xxx"
- continue
-
- p = []
- for i in xrange(9):
- t = []
- for j in xrange(9):
- t.append(int(l[i * 9 + j]))
- p.append(t)
- puzzles.append(p)
-
- return puzzles
-
-def main():
- solver = SudokuSolver()
- puzzles = parse_file()
-
- for p in puzzles:
- if (solver.solve(p)):
- pass
- for i in xrange(9):
- print p[i]
- print
- else:
- print "no solution"
-
-
-if __name__ == "__main__":
- main()
Deleted: developers/erin_yueh/pythonEFL-sudoku/data/puzzle/sudoku.py
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/data/puzzle/sudoku.py 2008-07-09
16:13:51 UTC (rev 4519)
+++ developers/erin_yueh/pythonEFL-sudoku/data/puzzle/sudoku.py 2008-07-09
16:45:19 UTC (rev 4520)
@@ -1,252 +0,0 @@
-#!/usr/bin/python
-
-import sys
-
-class SudokuSolver:
- def __init__(self):
- self.puzzle = None
-
- self.row = [False] * 90
- self.col = [False] * 90
- self.grp = [False] * 90
-
- self.steps = []
- for i in xrange(9):
- self.steps.append([])
-
- self.scores = [-1] * 81
-
- self.tries = []
- for i in xrange(81):
- self.tries.append([])
-
- self.relatives = []
- for r in xrange(9):
- for c in xrange(9):
- tmp = []
- for x in xrange(9):
- if x != c:
- tmp.append(r * 9 + x)
- for y in xrange(9):
- if y != r:
- tmp.append(y * 9 + c)
- gr = (r / 3) * 3
- gc = (c / 3) * 3
- for y in xrange(gr, gr + 3):
- for x in xrange(gc, gc + 3):
- if y != r and x != c:
- tmp.append(y * 9 + x)
-
- self.relatives.append(tmp)
-
- def _verify(self):
- print "verify"
- for r in xrange(9):
- for c in xrange(9):
- s = self.scores[r * 9 + c]
- if s == -1:
- continue
-
- tmp = []
- for n in xrange(1, 10):
- if not (self.row[r * 10 + n] or self.col[c * 10 + n] or
self.grp[((r / 3) * 3 + (c / 3)) * 10 + n]):
- tmp.append(n)
-
- if len(tmp) - 1 != s:
- print "(%d, %d) has score %d, instead of %d" % (r, c,
len(tmp) - 1, s)
- return False
-
-
- old = self.tries[r * 9 + c][:]
- old.sort()
- if old != tmp:
- print "(%d, %d) has tries", tmp, "instead of", old
-
- try:
- self.steps[s].index(r * 9 + c)
- except:
- print "(%d, %d) @ %d is not a step" % (r, c, s)
- return False
-
- return True
-
- def _try(self, pos, n):
- positions = []
- for p in self.relatives[pos]:
- if self.scores[p] >= 0 and n in self.tries[p]:
- if len(self.tries[p]) == 1:
- return False
-
- positions.append(p)
-
- r = pos / 9
- c = pos % 9
- self.row[r * 10 + n] = True
- self.col[c * 10 + n] = True
- self.grp[((r / 3) * 3 + (c / 3)) * 10 + n] = True
-
- self.puzzle[r][c] = n
-
- for p in positions:
- self.tries[p].remove(n)
- s = self.scores[p]
- self.scores[p] -= 1
- self.steps[s - 1][:0] = [p]
- self.steps[s].remove(p)
-
- return True
-
- def _undo(self, pos, n):
- r = pos / 9
- c = pos % 9
- self.row[r * 10 + n] = False
- self.col[c * 10 + n] = False
- self.grp[((r / 3) * 3 + (c / 3)) * 10 + n] = False
-
- self.puzzle[r][c] = 0
-
- for p in self.relatives[pos]:
- old_score = self.scores[p]
- if old_score == -1:
- continue
-
- if n not in self.tries[p]:
- y = p / 9
- x = p % 9
- if not (self.row[y * 10 + n] or self.col[x * 10 + n] or
self.grp[((y / 3) * 3 + (x / 3)) * 10 + n]):
- self.tries[p][:0] = [n]
- self.scores[p] += 1
- self.steps[old_score + 1][:0] = [p]
- self.steps[old_score].remove(p)
-
- def _solve(self):
- pos = 81
- for score in xrange(9):
- if self.steps[score]:
- pos = self.steps[score].pop()
- break
- if pos >= 81:
- return True
-
- self.scores[pos] = -1
-
- for n in self.tries[pos]:
- if self._try(pos, n):
- if self._solve():
- return True
- self._undo(pos, n)
-
- self.scores[pos] = score
- self.steps[score].append(pos)
-
- return False
-
- def _analyze(self):
- for i in xrange(90):
- self.row[i] = False
- self.col[i] = False
- self.grp[i] = False
-
- for r in xrange(9):
- for c in xrange(9):
- pos = r * 9 + c
- v = self.puzzle[r][c]
- if v:
- if self.row[r * 10 + v] or self.col[c * 10 + v] or
self.grp[((r / 3) * 3 + (c / 3)) * 10 + v]:
- return False
-
- self.row[r * 10 + v] = True
- self.col[c * 10 + v] = True
- self.grp[((r / 3) * 3 + (c / 3)) * 10 + v] = True
-
- self.scores[pos] = -1
-
- for i in xrange(9):
- self.steps[i] = []
-
- for r in xrange(9):
- for c in xrange(9):
- pos = r * 9 + c
- v = self.puzzle[r][c]
- if not v:
- tries = []
- for n in xrange(1, 10):
- if not (self.row[r * 10 + n] or self.col[c * 10 + n]
or self.grp[((r / 3) * 3 + (c / 3)) * 10 + n]):
- tries.append(n)
-
- if not tries:
- return False
-
- score = len(tries) - 1
-
- self.tries[pos] = tries
- self.scores[pos] = score
- self.steps[score].append(pos)
-
- while (self.steps[0]):
- pos = self.steps[0].pop()
- r = pos / 9
- c = pos % 9
-
- v = self.tries[pos].pop()
-
- self.row[r * 10 + v] = True
- self.col[c * 10 + v] = True
- self.grp[((r / 3) * 3 + (c / 3)) * 10 + v] = True
- self.puzzle[r][c] = v
-
- self.scores[pos] = -1
-
- for p in self.relatives[pos]:
- s = self.scores[p]
- if s > 0 and v in self.tries[p]:
- self.tries[p].remove(v)
- self.scores[p] -= 1
- self.steps[s - 1][:0] = [p]
- self.steps[s].remove(p)
-
- return True
-
- def solve(self, puzzle):
- self.puzzle = puzzle
-
- if not self._analyze():
- return False
-
- return self._solve()
-
-def parse_file():
- lines = sys.stdin.readlines()
-
- puzzles = []
- for l in lines:
- if (len(l) != 82):
- print "xxx"
- continue
-
- p = []
- for i in xrange(9):
- t = []
- for j in xrange(9):
- t.append(int(l[i * 9 + j]))
- p.append(t)
- puzzles.append(p)
-
- return puzzles
-
-def main():
- solver = SudokuSolver()
- puzzles = parse_file()
-
- for p in puzzles:
- if (solver.solve(p)):
- pass
- for i in xrange(9):
- print p[i]
- print
- else:
- print "no solution"
-
-
-if __name__ == "__main__":
- main()
Added: developers/erin_yueh/pythonEFL-sudoku/data/pythonEFL-sudoku.desktop
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/data/pythonEFL-sudoku.desktop
(rev 0)
+++ developers/erin_yueh/pythonEFL-sudoku/data/pythonEFL-sudoku.desktop
2008-07-09 16:45:19 UTC (rev 4520)
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=pythonEFL-sudoku
+TryExec=sudoku_ui.py
+GenericName=pythonEFL-sudoku
+Comment=Sudoku game
+StartupNotify=false
+Exec=sudoku_ui.py
+Icon=pythonEFL-sudoku
+Terminal=false
+Type=Application
+Categories=Games;
Added: developers/erin_yueh/pythonEFL-sudoku/src/sudoku/generator.py
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/src/sudoku/generator.py
(rev 0)
+++ developers/erin_yueh/pythonEFL-sudoku/src/sudoku/generator.py
2008-07-09 16:45:19 UTC (rev 4520)
@@ -0,0 +1,199 @@
+#!/usr/bin/python
+
+import ecore.evas
+import ecore
+import math
+import random
+
+def generateDummyGroup(ee,number):
+ group = ee.data['group_list']
+ (g,start_row,start_line) = group[str(number)]
+ items = [1,2,3,4,5,6,7,8,9]
+ random.shuffle(items)
+ for i in range (start_row, start_row+3):
+ for j in range(start_line, start_line+3):
+ key = (i,j)
+ obj = ee.data[key]
+ obj.color_set(0,255,0,255)
+ value = items.pop()
+ obj.text_set(str(value))
+ obj.data['value'] = value
+ return True
+
+def checkGroupRule(ee,number):
+ group = ee.data['group_list']
+ (g,start_row,start_line) = group[str(number)]
+ used_items = [0]
+
+ for i in range (start_row,start_row+3):
+ for j in range(start_line,start_line+3):
+ key = (i,j)
+ obj = ee.data[key]
+ value = int(obj.data['value'])
+ if(value>0):
+ used_items.append(value)
+ #print 'check group:',number,'used_items =',used_items
+ return used_items
+
+def checkRowRule(ee,number):
+ used_items = [0]
+ for i in range(1,10):
+ key = (number,i) # row
+ obj = ee.data[key]
+ value = int(obj.data['value'])
+ if(value>0):
+ used_items.append(value)
+ #print 'check row:', number, 'used_items = ',used_items
+ return used_items
+
+def checkLineRule(ee,number):
+ used_items = [0]
+ for i in range(1,10):
+ key = (i,number) # line
+ obj = ee.data[key]
+ value = int(obj.data['value'])
+ if(value>0):
+ used_items.append(value)
+ #print 'check line:', number, 'used_items = ',used_items
+ return used_items
+
+def CheckAndMergeUsed(group_used,row_used,line_used):
+ items = [1,2,3,4,5,6,7,8,9]
+ for k in range(len(group_used)):
+ if(group_used[k] in items):
+ items.remove(group_used[k])
+ for i in range(len(row_used)):
+ if(row_used[i] in items):
+ items.remove(row_used[i])
+ for j in range(len(line_used)):
+ if(line_used[j] in items):
+ items.remove(line_used[j])
+
+ if(len(items)==0):
+ return False
+ else:
+ return True
+
+def fillinByGroup(ee,number):
+ group = ee.data['group_list']
+ (g,start_row,start_line) = group[str(number)]
+ items = [1,2,3,4,5,6,7,8,9]
+ random.shuffle(items)
+
+ group_used = checkGroupRule(ee,number)
+ needed = len(items) - len(group_used) + 1
+ bingo = 0
+
+ for i in range (start_row,start_row+3):
+ for j in range(start_line,start_line+3):
+ key = (i,j)
+ obj = ee.data[key]
+ value = int(obj.data['value'])
+ if(value==0):
+ group_used = checkGroupRule(ee,number)
+ row_used = checkRowRule(ee,i)
+ line_used = checkLineRule(ee,j)
+
if(CheckAndMergeUsed(group_used,row_used,line_used) == False):
+ return 1
+ for v in range(len(items)):
+ ball = items[v]
+ if(ball not in group_used and
+ ball not in row_used and ball
not in line_used):
+ obj.data['value'] = ball
+ obj.text_set(str(ball))
+ obj.color_set(255,0,0,255)
+ bingo+=1
+ break
+ if(bingo==needed):
+ return 0
+ else:
+ return 1
+
+def refreshByGroup(ee,number):
+ group = ee.data['group_list']
+ (g,start_row,start_line) = group[str(number)]
+
+ for i in range (start_row,start_row+3):
+ for j in range(start_line,start_line+3):
+ key = (i,j)
+ obj = ee.data[key]
+ obj.text_set('0')
+ obj.data['value'] = 0
+
+ return True
+
+
+def main():
+ ee = ecore.evas.SoftwareX11(w=360, h=360)
+ canvas = ee.evas
+ group = {
+ '1': (1,1,1), '2':(2,1,4), '3':(3,1,7),
+ '4': (4,4,1), '5':(5,4,4), '6':(6,4,7),
+ '7': (7,7,1), '8':(8,7,4), '9':(9,7,7),
+ }
+
+ ee.data['group_list'] = group
+
+ # create a black backgound
+ bg = canvas.Rectangle(color=(0, 0, 0, 255))
+ bg.size = canvas.size
+ bg.show()
+
+ element_w = 360 / 9
+ element_h = 360 / 9
+
+ # put all elements to Text objects
+ for i in range (1,10):
+ for j in range(1,10):
+ x = 5 + (element_w * (i-1))
+ y = 5 + (element_h * (j-1))
+ value = 0
+ display = str(value)
+ text = canvas.Text(text=display, font=("sans serif",
12), color=(0,255,255,255))
+ text.pos_set(x,y)
+ text.data['row'] = j
+ text.data['line'] = i
+ text.data['value'] = value
+ text.show()
+ addr = (text.data['row'],text.data['line'])
+ ee.data[addr] = text
+ text.text_set(str(addr))
+
+ dummy_group = (9,5,1)
+ #not_dummy_group = (2,8,7,4,6,1,5,9,3)
+ not_dummy_group = (2,8,3,4,6,7)
+ flag = False
+ times = 0
+ counter = 0
+ curr_time = ecore.time_get()
+ print 'start to run:', times, curr_time
+ while(flag == False):
+ counter = 1
+ # generate three dummy group
+ for i in range(len(dummy_group)):
+ #print 'generateDummyGroup', dummy_group[i]
+ generateDummyGroup(ee,dummy_group[i])
+ # clean up other groups
+ for j in range(len(not_dummy_group)):
+ #print 'refreshByGroup', not_dummy_group[j]
+ refreshByGroup(ee,not_dummy_group[j])
+ # fill in by group
+ for k in range(len(not_dummy_group)):
+ #print 'fillinByGroup', not_dummy_group[k]
+ counter = fillinByGroup(ee,not_dummy_group[k])
+ if(counter==1):
+ break
+ if(counter ==1):
+ flag = False
+ elif(counter ==0):
+ flag = True
+ times += 1
+
+ print 'times = ', times, 'running time = ',(ecore.time_get() -
curr_time)
+
+ ee.show()
+ ecore.animator_frametime_set(1.0 / 10.0)
+ ecore.main_loop_begin()
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
--- End Message ---
_______________________________________________
commitlog mailing list
commitlog@lists.openmoko.org
http://lists.openmoko.org/mailman/listinfo/commitlog