Advertisement
max2201111

divny vystup jinak OK

Jul 1st, 2025
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.08 KB | Science | 0 0
  1. import chess
  2. import math
  3. import time
  4. from copy import deepcopy
  5.  
  6. def knight_moves():
  7.     return [(2, 1), (1, 2), (-1, 2), (-2, 1),
  8.             (-2, -1), (-1, -2), (1, -2), (2, -1)]
  9.  
  10. def rook_moves():
  11.     return [(i, 0) for i in range(-7, 8) if i != 0] + [(0, i) for i in range(-7, 8) if i != 0]
  12.  
  13. def bishop_moves():
  14.     return [(i, i) for i in range(-7, 8) if i != 0] + [(i, -i) for i in range(-7, 8) if i != 0]
  15.  
  16. def queen_moves():
  17.     return rook_moves() + bishop_moves()
  18.  
  19. def amazon_moves():
  20.     return queen_moves() + knight_moves()
  21.  
  22. def cyril_moves():
  23.     return rook_moves() + knight_moves()
  24.  
  25. def eve_moves():
  26.     return bishop_moves() + knight_moves()
  27.  
  28. def generate_moves(board, piece, row, col):
  29.     size = 8
  30.     moves = []
  31.     directions = []
  32.     if piece == 'A':
  33.         directions = amazon_moves()
  34.     elif piece == 'C':
  35.         directions = cyril_moves()
  36.     elif piece == 'E':
  37.         directions = eve_moves()
  38.     for dx, dy in directions:
  39.         x, y = row + dx, col + dy
  40.         if 0 <= x < size and 0 <= y < size and board[x][y] == '.':
  41.             moves.append((x, y))
  42.     return moves
  43.  
  44. def board_to_fen(board):
  45.     fen = []
  46.     for row in board:
  47.         empty = 0
  48.         fen_row = ""
  49.         for cell in row:
  50.             if cell == '.':
  51.                 empty += 1
  52.             else:
  53.                 if empty > 0:
  54.                     fen_row += str(empty)
  55.                     empty = 0
  56.                 fen_row += cell
  57.         if empty > 0:
  58.             fen_row += str(empty)
  59.         fen.append(fen_row)
  60.     return "/".join(fen) + " w - - 0 1"
  61.  
  62. def create_successors(index, state, all_states, seen_fens):
  63.     board = state['board']
  64.     new_states = []
  65.     new_outputs = []  # sem si připravíme řetězce pro výpis na jednom řádku
  66.  
  67.     for i in range(8):
  68.         for j in range(8):
  69.             piece = board[i][j]
  70.             if piece in ['A', 'C', 'E']:
  71.                 moves = generate_moves(board, piece, i, j)
  72.                 for x, y in moves:
  73.                     new_board = deepcopy(board)
  74.                     new_board[x][y] = piece
  75.                     new_board[i][j] = '.'
  76.                     fen = board_to_fen(new_board)
  77.                     if fen not in seen_fens:
  78.                         seen_fens.add(fen)
  79.                         new_state = {
  80.                             'radek': len(all_states),
  81.                             'N': [],
  82.                             'P': [index],
  83.                             'FEN': fen,
  84.                             'board': new_board,
  85.                             'to_mate': None,
  86.                             'to_end': None
  87.                         }
  88.                         all_states.append(new_state)
  89.                         new_states.append(new_state['radek'])
  90.                         new_outputs.append(f"{new_state['radek']}({state['radek']})")
  91.                     else:
  92.                         for s in all_states:
  93.                             if s['FEN'] == fen:
  94.                                 if index not in s['P']:
  95.                                     s['P'].append(index)
  96.                                 new_states.append(s['radek'])
  97.  
  98.     # Výpis na jediném řádku
  99.     if new_outputs:
  100.         max_radek = max(new_states)
  101.         print(f"\rdepth={state['radek']} max={max_radek} : {' '.join(new_outputs)}", end='', flush=True)
  102.  
  103.     return new_states
  104.  
  105. def create_initial_board():
  106.     board = [['.' for _ in range(8)] for _ in range(8)]
  107.     board[0][0] = 'A'
  108.    # board[7][7] = 'C'
  109.    # board[3][3] = 'E'
  110.     board[4][4] = 'K'  # White king
  111.     board[0][7] = 'k'  # Black king
  112.     return board
  113.  
  114. def main():
  115.     board = create_initial_board()
  116.     start_fen = board_to_fen(board)
  117.     L = []
  118.     seen_fens = set()
  119.     seen_fens.add(start_fen)
  120.     L.append({
  121.         'radek': 0,
  122.         'N': [],
  123.         'P': [],
  124.         'FEN': start_fen,
  125.         'board': board,
  126.         'to_mate': None,
  127.         'to_end': None
  128.     })
  129.  
  130.     print(f"Start FEN: {start_fen}")
  131.     print("Generuji následníky...")
  132.     i = 0
  133.     while i < len(L):
  134.         L[i]['N'] = create_successors(i, L[i], L, seen_fens)
  135.         i += 1
  136.     print(f"Vygenerováno {len(L)} stavů.")
  137.  
  138.     print("Hledám koncové stavy...")
  139.     for state in L:
  140.         fen = state['FEN']
  141.         try:
  142.             board = chess.Board(fen)
  143.             if board.is_checkmate():
  144.                 state['to_mate'] = 0
  145.                 state['to_end'] = 0
  146.             elif board.is_stalemate() or board.is_insufficient_material() or board.is_seventyfive_moves():
  147.                 state['to_mate'] = math.inf
  148.                 state['to_end'] = 0
  149.         except Exception as e:
  150.             print(f"Neplatný FEN: {fen} -> {e}")
  151.             state['to_mate'] = 0
  152.             state['to_end'] = 0
  153.  
  154.     print("Propaguji hodnoty...")
  155.     start_time = time.time()
  156.     round_num = 0
  157.     while any(s['to_end'] is None for s in L):
  158.         round_num += 1
  159.         changed = False
  160.         for state in L:
  161.             if state['to_end'] is None:
  162.                 preds_mate = [L[p]['to_mate'] for p in state['P'] if L[p]['to_mate'] is not None]
  163.                 preds_end = [L[p]['to_end'] for p in state['P'] if L[p]['to_end'] is not None]
  164.                 if preds_mate:
  165.                     new_val = 1 + min(preds_mate)
  166.                     if state['to_mate'] != new_val:
  167.                         state['to_mate'] = new_val
  168.                         changed = True
  169.                 if preds_end:
  170.                     new_val = 1 + min(preds_end)
  171.                     if state['to_end'] != new_val:
  172.                         state['to_end'] = new_val
  173.                         changed = True
  174.         elapsed = int(time.time() - start_time)
  175.         hh, rem = divmod(elapsed, 3600)
  176.         mm, ss = divmod(rem, 60)
  177.         print(f"Průchod {round_num}: čas {hh:02d}h{mm:02d}m{ss:02d}s, změněno: {changed}")
  178.         if not changed:
  179.             break
  180.  
  181.     print("\n--- Výstup ---")
  182.     if len(L) > 22:
  183.         print(f"L[22] = {L[22]}")
  184.     else:
  185.         print(f"List L má {len(L)} stavů. Poslední stav:\n{L[-1]}")
  186.  
  187. if __name__ == "__main__":
  188.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement