2009-07-19

Python програмын хэл

Python их таалагдлаа. Python нь функсионел ч, обьект хандлагат ч аль альнаар нь хэрэглэгдэж болдог. “Мад шалгах” (“Check the Check” problem) бодлогыг бодсон кодоо толилуулья:

import sys

#шатрын хөлгийг оруул
fin = open(sys.argv[1], "r") #аргумент дээр зааж өгсөн файлыг унш
lineList = fin.readlines()
fin.close()

#үндсэн код
i = 0
count = 1
matrix = []

for line in lineList:
  if line == '\n': #хоосон мөр байвал
     checkBlack = check(matrix,x,y,0) #хар ноён мадлагдсан эсэх
     checkWhite = check(matrix,x1,y1,1) #цагаан ноён мадлагдсан эсэх
     if checkWhite == True and checkBlack == True:
         print("Тоглоом# " + str(count) + ": Хоёр ноён мадлагдсан.");
     elif checkWhite == True and checkBlack == False:
         print("Тоглоом# " + str(count) + ": Цагаан ноён мадлагдсан.");
     elif checkWhite == False and checkBlack == True:
         print("Тоглоом# " + str(count) + ": Хар ноён мадлагдсан.");
     else: print("Тоглоом# " + str(count) + ": Аль нь мадлагдаагүй.");
     i = 0
     count = count+1
     matrix = []
  else: #хоосон мөр биш бол матрикст нэм
     matrix.append(line)
     if str.find(line, 'k') != -1: #хар ноён байвал байршлыг тогтоо
         x = i
         y = str.find(line, 'k')
     if str.find(line, 'K') != -1: #цагаан ноён байвал байршлыг тогтоо
         x1 = i
         y1 = str.find(line, 'K')
     i = i + 1
Дээрх кодонд check гээд нэг функц байна. Үүрэг нь ноёны мадлагдсан эсэх. Код нь:
toys = ['p','n','b','r','q','k','P','N','B','R','Q','K']

def contains(toys, item):
    i = 0
    while i < 12:
        if toys[i] == item: return True
        i = i+1
    return False

def check(matrix,x,y,n): # n=1: цагаан, n=0: хар

    if n==0: index = 6
    else: index = 0

    p = toys[index+0]
    n = toys[index+1]
    b = toys[index+2]
    r = toys[index+3]
    q = toys[index+4]
    k = toys[index+5]

    # бэрсийн хөл дээр шалгах
    if x+2 <= 7:
        if y-1 >= 0 and matrix[x+2][y-1] == n: return True
        if y+1 <= 7 and matrix[x+2][y+1] == n: return True
    if x+1 <= 7:
        if y-2 >= 0 and matrix[x+1][y-2] == n: return True
        if y+2 <= 7 and matrix[x+1][y+2] == n: return True

    # хүү болон ноёны хөл дээр эсэхийг шалгах - диагонал
    if x-1 >= 0 and y+1 <= 7 and (matrix[x-1][y+1] == p or matrix[x-1][y+1] == k): return True;
    if x-1 >= 0 and y-1 >= 0 and (matrix[x-1][y-1] == p or matrix[x-1][y-1] == k): return True;
    if x+1 <= 7 and y+1 <= 7 and (matrix[x+1][y+1] == k): return True;
    if x+1 <= 7 and y-1 >= 0 and (matrix[x+1][y-1] == k): return True;

    # ноёны хөл дээр эсэхийг шалгах
    if x+1 <= 7 and matrix[x+1][y] == k: return True;
    if y+1 <= 7 and matrix[x][y+1] == k: return True;
    if x-1 >= 0 and matrix[x-1][y] == k: return True;
    if y-1 >= 0 and matrix[x][y-1] == k: return True;

    # тэрэг эсвэл бэрсийн хөл дээр эсэхийг шалгах
    toys[index+4] = '*'; # бэрсийг массиваас арилгах
    toys[index+3] = '*'; # тэргийг массиваас арилгах

    i = y+1
    while i <= 7:
        if contains(toys, matrix[x][i]) == True: break;
        elif matrix[x][i] == r or matrix[x][i] == q: return True;
        i = i+1

    i = y-1
    while i >= 0:
        if contains(toys, matrix[x][i]) == True: break;
        elif matrix[x][i] == r or matrix[x][i] == q: return True;
        i = i-1

    i = x+1
    while i <= 7:
        if contains(toys, matrix[i][y]) == True: break;
        elif matrix[i][y] == r or matrix[i][y] == q: return True;
        i = i+1

    i = x-1
    while i <= 7:
        if contains(toys, matrix[i][y]) == True: break;
        elif matrix[i][y] == r or matrix[i][y] == q: return True;
        i = i-1

    toys[index+3] = r; # тэргийг массивт буцааж нэм
    # бэрс болон тэмээний хөл дээр эсэхийг шалгах
    toys[index+2] = '*'; # тэмээг массиваас арилгах

    i = x+1
    j = y+1
    while i <= 7 and j <= 7:
        if contains(toys, matrix[i][j]) == True: break;
        elif matrix[i][j] == b or matrix[i][j] == q: return True;
        i = i+1
        j = j+1

    i = x-1
    j = y-1
    while i >= 0 and j >= 0:
        if contains(toys, matrix[i][j]) == True: break;
        elif matrix[i][j] == b or matrix[i][j] == q: return True;
        i = i-1
        j = j-1

    i = x-1
    j = y+1
    while i >= 0 and j <= 7:
        if contains(toys, matrix[i][j]) == True: break;
        elif matrix[i][j] == b or matrix[i][j] == q: return True;
        i = i-1
        j = j+1

    i = x+1
    j = y-1
    while i <= 7 and j >= 0:
        if contains(toys, matrix[i][j]) == True: break;
        elif matrix[i][j] == b or matrix[i][j] == q: return True;
        i = i+1
        j = j-1

    toys[index+2] = b; # тэмээг массивт буцааж нэм
    toys[index+4] = q; # бэрсийг массивт буцааж нэм
    return False

Програмын ажиллах горим

Дээрх програм нь текст маягаар бичигдсэн шатрын хөлгийг аргументээр авна. Жишээ нь хөлөг доорх маягаар өгөгдсөн байхад:
..k.....
ppp.pppp
........
.R...B..
........
........
PPPPPPPP
K.......

rnbqkbnr
pppppppp
........
........
........
........
PPPPPPPP
RNBQKBNR

rnbqk.nr
ppp..ppp
....p...
...p....
.bPP....
.....N..
PP..PPPP
RNBQKB.R

........
........
........
........
........
........
........
........

гаралт нь доорх шиг байна:
Тоглоом #1: Хар ноён мадлагдсан.
Тоглоом #2: Аль нь мадлагдаагүй.
Тоглоом #3: Цагаан ноён мадлагдсан.

Кодыг ажиллуулах

Дээрх эх кодыг ажиллуулахдаа Linux дээр Python суулгагдсан бол:
$ python ./check.py "input.txt"
гээд л ажиллуулчихна. Харин Windows дээр бол эхлээд binary executable файл үүсгэх хэрэгтэй:
>>> import py_compile
>>> py_compile.compile("check.py")
Ингэснээр check.py файлын байгаа хавтаст check.pyc гэсэн executable файл үүсэх болно. Дараа нь Windows cmd prompt дээрээ:
check.pyc input.txt
гээд ажиллуулчихна.

Сайн уу, дэлхий

Сайн байцгаана уу? Энэ бол энэ блогийн маань printf("Hello, World!"); бичлэг маань. Тэгээд одоо бичээд байна даа. :D Уул нь энэхүү блогоо "Хаалган хот" нэрээр Wordpress дээр хөтөлж байснаа Blogspot-д дассанаас болснуу энд бичмээр санагдлаа.