Advertisement
sztosz

CORN, WOLF, DUCK

Oct 21st, 2016
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.64 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*-coding: utf8-*-
  3.  
  4. # constants
  5. R = '-->'
  6. L = '<--'
  7. CORN = 'corn'
  8. DUCK = 'duck'
  9. WOLF = 'wolf'
  10. BOAT = 'boat'
  11. ALL = [CORN, WOLF, DUCK]
  12.  
  13.  
  14. # move duck from bank if conditions are met
  15. def force_move_duck(bank):
  16.     if DUCK in bank and CORN in bank:
  17.         return True
  18.     if DUCK in bank and WOLF in bank:
  19.         return True
  20.  
  21.  
  22. # just pretty print all from both river banks
  23. def print_banks(left_bank, right_bank, direction):
  24.     l = '({})'.format(', '.join(left_bank))
  25.     r = '({})'.format(', '.join(right_bank))
  26.     print('{:>30s} {} {:s}'.format(l, direction, r))
  27.  
  28.  
  29. # move to right_bank
  30. def to_right_bank(left_bank, right_bank):
  31.     if force_move_duck(left_bank) and len(left_bank) == 3:
  32.         left_bank.remove(DUCK)
  33.         right_bank.append(DUCK)
  34.     else:
  35.         boat = left_bank.pop(0)
  36.         right_bank.append(boat)
  37.  
  38.     print_banks(left_bank, right_bank, R)
  39.     return left_bank, right_bank
  40.  
  41.  
  42. # move to left_bank
  43. def to_left_bank(left_bank, right_bank):
  44.     if force_move_duck(right_bank):
  45.         right_bank.remove(DUCK)
  46.         left_bank.append(DUCK)
  47.  
  48.     print_banks(left_bank, right_bank, L)
  49.     return left_bank, right_bank
  50.  
  51.  
  52. def loop():
  53.     # Initial status
  54.     left_bank = ALL
  55.     right_bank = []
  56.     print_banks(left_bank, right_bank, '~~~')
  57.  
  58.     # main loop
  59.     while True:
  60.         left_bank, right_bank = to_right_bank(left_bank, right_bank)
  61.  
  62.         # we break the loop if ALL are in right_bank
  63.         if len(set(ALL) - set(right_bank)) == 0:
  64.             break
  65.         left_bank, right_bank = to_left_bank(left_bank, right_bank)
  66.  
  67.  
  68. if __name__ == '__main__':
  69.     loop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement