Advertisement
Guest User

Untitled

a guest
Sep 24th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.74 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from copy import copy, deepcopy
  3.  
  4. rules = [
  5.     [u"1", u"амер", None,    None,    None,    None],
  6.     [u"2", None,    None,    u"беос", None,    u"фрил"],
  7.     [u"3", None,    u"черн", None,    None,    None],
  8.     [None, u"рус",  None,    u"фря",  None,    None],
  9.     [None, u"фран", u"оран", None,    None,    None],
  10.     [None, u"нем",  None,    None,    u"стек", None],
  11.     [None, None,    None,    None,    u"хабр", u"сис"],
  12.     [None, u"кит",  None,    None,    None,    u"мен"],
  13.     [None, None,    u"син",  None,    u"твит", None],
  14.     [None, None,    u"крас", u"вин",  None,    None],
  15.     [None, None,    None,    u"мак",  u"фейс", None],
  16.     ]
  17.    
  18. choices = [
  19.     (u"1", u"2", u"3", u"4", u"5"),
  20.     (u"амер", u"рус", u"фран", u"нем", u"кит"),
  21.     (u"черн", u"оран", u"син", u"крас", u"зел"),
  22.     (u"беос", u"фря", u"вин", u"лин", u"мак"),
  23.     (u"стек", u"хабр", u"твит", u"фейс", u"дигг"),
  24.     (u"фрил", u"сис", u"мен", u"марк", u"прог")
  25.     ]
  26.    
  27. def print_rules(rules):
  28.     if rules is None:
  29.         print "-------------"
  30.         return
  31.     for row in rules:
  32.         print u"".join(
  33.             (s.ljust(6) if not s[0] == "*" else "\x1b[1;37m%s\x1b[0m" % s[1:].ljust(6))
  34.             if s is not None else "----  " for s in row)
  35.     print u"\n"
  36.    
  37. def constr1(l):
  38.     for n in xrange(1, len(l) - 1):
  39.         if l[n][4] == u"дигг" and not ((
  40.                 l[n - 1][5] == u"марк" or l[n + 1][5] == u"марк"
  41.                 ) and (
  42.                 l[n - 1][2] == u"зел" or l[n + 1][2] == u"зел")):
  43.             return False
  44.     return True
  45.    
  46. def constr2(l):
  47.     for n in xrange(1, len(l)):
  48.         if l[n][2] == u"крас" and not (l[n - 1][3] == u"лин"):
  49.             return False
  50.     return True
  51.    
  52. def combine_lines(line1, line2):
  53.     res = []
  54.     for x1, x2 in zip(line1, line2):
  55.         if x1 is not None and x2 is not None and x1 != x2:
  56.             print "========= Violation ========="
  57.             print_rules([line1, line2])
  58.             return None
  59.         res.append(x1 or x2)
  60.     return res
  61.    
  62. blacklisted_lines = []
  63.  
  64. def link_rules(rules):
  65.     for row_id, row in zip(xrange(len(rules)), rules):
  66.         for cell_id, cell in zip(xrange(len(row)), row):
  67.             if cell is None: continue
  68.             for row_id_2, row_2 in zip(xrange(len(rules)), rules):
  69.                 if row_id == row_id_2: continue
  70.                 if row[cell_id] == row_2[cell_id]:
  71.                     new_row = combine_lines(row, row_2)
  72.                     if new_row is None:
  73.                         return None
  74.                     rules[row_id] = new_row
  75.                     del rules[row_id_2]
  76.                     return link_rules(rules)
  77.     return rules
  78.    
  79. def doit(rules_, choices):
  80.     global blacklisted_lines
  81.     cont = True
  82.     print u"**** DOIT *****"
  83.     print_rules(rules_)
  84.     raw_input()
  85.     while cont:
  86.         cont = False
  87.         for row_id, row in zip(xrange(len(rules_)), rules_):
  88.             for cell_id, cell in zip(xrange(len(row)), row):
  89.                 if cell is None:
  90.                     cont = True
  91.                     tried_choices = []
  92.                     for possible_cell_value in choices[cell_id]:
  93.                         rules = deepcopy(rules_)
  94.                         rules[row_id][cell_id] = "*" + possible_cell_value
  95.                         print u"-------- TRY... ---------"
  96.                         print_rules(rules)
  97.                         rules[row_id][cell_id] = possible_cell_value
  98.                         if rules[row_id] in blacklisted_lines:
  99.                             print "Ooops, row blacklisted: "
  100.                             print_rules([row])
  101.                             tried_choices.append(possible_cell_value)
  102.                             continue
  103.                         raw_input()
  104.                         row_backup = deepcopy(rules[row_id])
  105.                         rules = link_rules(rules)
  106.                         print u"/////// SIMPLIFIED /////////"
  107.                         print_rules(rules)
  108.                         raw_input()
  109.                         if rules is not None:
  110.                             c1, c2 = constr1(rules), constr2(rules)
  111.                             print "Constraints:", c1, c2
  112.                             if c1 and c2:
  113.                                 if rules is not None and len([i for i in reduce(
  114.                                     list.__add__, rules, []) if i is None]) == 0:
  115.                                     return rules
  116.                                 rules = doit(rules, choices)
  117.                                 if rules is not None and len([i for i in reduce(
  118.                                     list.__add__, rules, []) if i is None]) == 0:
  119.                                     return rules
  120.                             else:
  121.                                 tried_choices.append(possible_cell_value)
  122.                             continue
  123.                         print "Adding row to blacklist:"
  124.                         print_rules([row_backup])
  125.                         blacklisted_lines.append(row_backup)
  126.                         rules = rules_
  127.                         tried_choices.append(possible_cell_value)
  128.                     print_rules([choices[cell_id], tried_choices])
  129.                     if len(tried_choices) == len(choices[cell_id]):
  130.                         print "$$$$$$$$$$ IT'S A WRONG WAY $$$$$$$$$$"
  131.                         raw_input()
  132.                         return None
  133.     return None
  134.    
  135.  
  136. if __name__ == u"__main__":
  137.     rules = doit(rules, choices)
  138.     print "======= END! =========="
  139.     print_rules(rules)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement