12 Kasım 2009 Perşembe

Python'da Javascript Kodu Çalıştırmak

pyv8, google tarafından geliştirilen ve google chrome'da da kullanılan V8 javascript motoru için yazılmış bir çeşit wrapper. Bu sayede python programları içerisinde gömülü olarak javascript kodu çalıştırabiliyoruz. pyv8 V8 API sini kullanarak çalıştırdığı javascript kod parçacıklarının sonucu olarak dönen javascript nesneleri ile python nesneleri arasında bir köprü kurma görevini yerine getiriyor. Ayrıca python'da oluşturduğunuz bazı özel sınıfları javascript'e aktarıp orada kullanmanıza da olanak sağlayabiliyor.

>>> import PyV8
>>> ctxt = PyV8.JSContext()          # bir javascript ortamı oluşturduk
>>> ctxt.enter()                     
>>> ctxt.eval("1+2")                 # javascript kodunu string argümanıyla çalıştırıyoruz
3                                    # dönen cevap bir python integerı
>>> class Global(PyV8.JSClass):      # javascript ile uyumlu bir sınıf
...   def hello(self):               # bir javascript metodu
...     print "Hello World"          
...

>>> ctxt2 = PyV8.JSContext(Global()) # yeni javascript ortamımıza bu sınıfı dahil ettik
>>> ctxt2.enter()                    
>>> ctxt2.eval("hello()")            # artık bu sınıfın metoduna javascript içinde erişebiliriz
Hello World                          # dönen cevap bir python nesnesi

Kütüphane kurulumu ve çalışması için python haricinde programlara ihtiyaç duyduğu için kaynak dosyadan kurulumu bazı bağımlılıklar gerektiriyor. Bununla ilgili bir belge mevcut: http://code.google.com/p/pyv8/wiki/HowToBuild. Windows kullanıyorsanız çalıştırılabilir kurulum dosyaları ile tek adımda kurulabiliyor.

Javascript kodu yazarken kullandığımız onclick, XMLHttpRequest, window.open, document.url, DOM elementleri gibi özellikler javascriptin özellikleri değildirler ve bunlar javascript motorları tarafından sağlanmaz. Bu özellikleri tarayıcılar eklentiler ile sağlarlar. pyv8 ile bu değişkenleri kullanmaya çalıştığınız zaman tanımlı olmadıklarını belirten bir hata alırsınız.

08 Ekim 2008 Çarşamba

python tower of hanoi


tower of hanoi is a mathematicalpuzzle game. there are lots of python examples around. but i couldn't find out one with a good UI.

as honoi solving depends on a recrusive function, it was hard to run UI and solve hanoi at same time. pre-solving and running UI is seemed to be a solution but in big numbers of disks i would have to wait quite long time for solving. so i used python threading module and created one more thread for hanoi solver. it looks like this.


place x disk

place y disk
keeps going deeper...
wait for ui
y disk placed

place z disk
keeps going deeper...
wait for ui
zdisk placed

wait for ui
x disk placed


you need to have pygame installed to run code.

download hanoi.py



05 Temmuz 2008 Cumartesi

Python sudoku solver

An easy solver. It doesn't make brute-force . So it's able to solve only simple sudokus where at least one field has no doubt about matcing only one number at any time.  


#!/usr/bin/python
# -*- coding: cp1254 -*-


#sample board
board=[[0,4,0,0,2,0,0,0,8],
      [0,8,0,0,0,7,4,5,0],
      [1,0,5,3,0,0,7,0,0],
      [9,0,4,0,3,8,1,0,7],
      [0,0,0,0,0,0,0,0,0],
      [5,0,7,4,1,0,2,0,9],
      [0,0,8,0,0,1,9,0,6],
      [0,9,1,8,0,0,0,2,0],
      [3,0,0,0,4,0,0,7,0]]

def get_row_suitables(y):
   lst=range(1,10)
   for x in range(0,9):
       number=board[y][x]
       if number:lst.remove(number)
   return lst
def get_column_suitables(x):
   lst=range(1,10)
   for y in range(0,9):
       number=board[y][x]
       if number:lst.remove(number)
   return lst
def get_square_suitables(y,x):
   ystart=y-(y%3)
   xstart=x-(x%3)
   lst=range(1,10)
   for y in range(ystart,ystart+3):
       for x in range(xstart,xstart+3):
           number=board[y][x]
           if number:lst.remove(number)
   return lst
  
def get_mutuals(a,b,c):
   mutuals=[]
   for i in a:
       if b.count(i) and c.count(i): mutuals.append(i)
   return mutuals
def total_zeros():
   total=0
   for y in range(0,9):
       total+= board[y].count(0)
   return total
def print_board():
   for y in range(0,9):print board[y]

#main loop
while True:
   has_found_any=0
   for y in range(0,9):
       for x in range(0,9):
           if not board[y][x]:
               a=get_row_suitables(y)
               b=get_column_suitables(x)
               c=get_square_suitables(y,x)
               d=get_mutuals(a,b,c)
               if len(d)==1:
                   board[y][x]=d[0]
                   has_found_any=1
               elif len(d)==0:
                   print "Error! This sudoku is wrong."
                   break
               else:
                   pass
   if not total_zeros():
       print "Sudoku solved succesfully"
       print_board()
       break
   if not has_found_any:
       print "Sudoku isn't solved"
       break

sponsors