Mavzu: Crossword generator ishlab chiqish


Crossword generator ishlab chiqish jarayoni


Download 0.52 Mb.
bet4/5
Sana16.06.2023
Hajmi0.52 Mb.
#1502642
1   2   3   4   5
Crossword generator ishlab chiqish jarayoni.

  1. Leksik analizator.



  • ACROSS = "across"

  • DOWN = "down"


  • def __init__(self, i, j, direction, length):

  • """Boshlanish nuqtasi, yo'nalishi va uzunligi bilan yangi o'zgaruvchi yaratilishi."""

  • self.i = i

  • self.j = j

  • self.direction = direction

  • self.length = length

  • self.cells = []

  • for k in range(self.length):

  • self.cells.append(

  • (

  • self.i + (k if self.direction == Variable.DOWN else 0),

  • self.j + (k if self.direction == Variable.ACROSS else 0),

  • )

  • )


  • def __hash__(self):

  • return hash((self.i, self.j, self.direction, self.length))


  • def __eq__(self, other):

  • return (

  • (self.i == other.i)

  • and (self.j == other.j)

  • and (self.direction == other.direction)

  • and (self.length == other.length)

  • )


  • def __str__(self):

  • return f"({self.i}, {self.j}) {self.direction} : {self.length}"


  • def __repr__(self):

  • direction = repr(self.direction)

  • return f"Variable({self.i}, {self.j}, {direction}, {self.length})"


  • class Crossword:

  • def __init__(self, structure_file, words_file):


  • # Krossvordning tuzilishini aniqlanilishi

  • with open(structure_file) as f:

  • contents = f.read().splitlines()

  • self.height = len(contents)

  • self.width = max(len(line) for line in contents)


  • self.structure = []

  • for i in range(self.height):

  • row = []

  • for j in range(self.width):

  • if j >= len(contents[i]):

  • row.append(False)

  • elif contents[i][j] == "_":

  • row.append(True)

  • else:

  • row.append(False)

  • self.structure.append(row)


  • # Lug'atlar ro'yxatini saqlash

  • with open(words_file) as f:

  • self.words = set(f.read().upper().splitlines())


  • # O'zgaruvchilar to'plamini aniqlash

  • self.variables = set()

  • for i in range(self.height):

  • for j in range(self.width):


  • # Vertikal so'zlar

  • starts_word = self.structure[i][j] and (

  • i == 0 or not self.structure[i - 1][j]

  • )

  • if starts_word:

  • length = 1

  • for k in range(i + 1, self.height):

  • if self.structure[k][j]:

  • length += 1

  • else:

  • break

  • if length > 1:

  • self.variables.add(

  • Variable(i=i, j=j, direction=Variable.DOWN, length=length)

  • )


  • # Gorizontal so'zlar

  • starts_word = self.structure[i][j] and (

  • j == 0 or not self.structure[i][j - 1]

  • )

  • if starts_word:

  • length = 1

  • for k in range(j + 1, self.width):

  • if self.structure[i][k]:

  • length += 1

  • else:

  • break

  • if length > 1:

  • self.variables.add(

  • Variable(i=i, j=j, direction=Variable.ACROSS, length=length)

  • )


  • #Har bir so'z uchun bir-biriga mos kelishini hisoblash

  • # Har qanday v1, v2 o'zgaruvchilar juftligi uchun ularning bir-biriga mos kelishi quyidagilardan iborat:

  • # Agar ikkita o'zgaruvchi bir-biriga mos kelmasa, Yo'q; yoki

  • # (i, j), bu erda v1 ning i belgisi v2 ning j-belgisiga mos keladi

  • self.overlaps = dict()

  • for v1 in self.variables:

  • for v2 in self.variables:

  • if v1 == v2:

  • continue

  • cells1 = v1.cells

  • cells2 = v2.cells

  • intersection = set(cells1).intersection(cells2)

  • if not intersection:

  • self.overlaps[v1, v2] = None

  • else:

  • intersection = intersection.pop()

  • self.overlaps[v1, v2] = (

  • cells1.index(intersection),

  • cells2.index(intersection),

  • )


  • def neighbors(self, var):


  • return set(v for v in self.variables if v != var and self.overlaps[v, var])





      1. Download 0.52 Mb.

        Do'stlaringiz bilan baham:
  • 1   2   3   4   5




    Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
    ma'muriyatiga murojaat qiling