diff options
| author | Jean-Pierre Appel <jeanpierre.appel01@gmail.com> | 2023-10-23 01:34:33 -0400 |
|---|---|---|
| committer | Jean-Pierre Appel <jeanpierre.appel01@gmail.com> | 2023-10-23 01:34:33 -0400 |
| commit | 424be4138123e7d8e2e9fef36c71e1638d4e6b2a (patch) | |
| tree | bc7339af6966ff78fd3ee7fbfe05c4e7974bb256 /server/old | |
| parent | 7815a927374db87393d104d095b5de8dfd3a3488 (diff) | |
testing wsgi post
Diffstat (limited to 'server/old')
| -rw-r--r-- | server/old/fast_P_nim.py | 41 | ||||
| -rw-r--r-- | server/old/human_game.py | 115 |
2 files changed, 156 insertions, 0 deletions
diff --git a/server/old/fast_P_nim.py b/server/old/fast_P_nim.py new file mode 100644 index 0000000..adafca1 --- /dev/null +++ b/server/old/fast_P_nim.py @@ -0,0 +1,41 @@ +hashStuff = {0: 0, 1: 1, 2: 1, 3: 1, 4: 2, 5: 2} + +def MEX(S): + i = 0 + while True: + if i not in S: + return i + i += 1 + +def P(n): + if n in hashStuff: + return hashStuff[n] + res = Prec(n) + hashStuff[n] = res + return res + +def Prec(n): + S = set() + # Works only for n >= 5 + S.add(P(n-2)) + S.add(P(n-3)) + S.add(P(n-4)) + for i in range(2,n-5+1): + S.add(nimAdd(P(i),P(n-3-i))) + return MEX(S) + +def nimAdd(x, y): + return x ^ y + +# P(7) +# for i in range(1,1000): +# print(f"Path, n={i} (oeis={i-1}): {P(i)}") + +# Pgames = set() +# for i in range(20000): +# if hashStuff[i] == 0: +# Pgames.add(i) + +# for i in range(200): +# print(i, P(1000*i)) + diff --git a/server/old/human_game.py b/server/old/human_game.py new file mode 100644 index 0000000..dbf1f61 --- /dev/null +++ b/server/old/human_game.py @@ -0,0 +1,115 @@ +from fast_P_nim import P + +def safe_int_parse(s): + try: + return int(s) + except ValueError: + return -1 + +n = int(input("Path size to play on> ")) + +nimb = P(n) + +human_turn = -1 # placeholder +if nimb > 0: + human_turn = False + print("I'll play first!") +else: + human_turn = True + print("You can play first!") + +game_state = [True for _ in range(n)] + +def display_game(): + for i in range(n): + if game_state[i]: + print(f'{i+1:02d}', end="") + else: + print(f' ', end="") + if i + 1 != n: + print('-', end="") + print() + +def valid_move(i): + if i >= n or i < 0: + return False + if game_state[i]: + if i > 0: + if i < n-1: + return game_state[i-1] or game_state[i+1] + else: + return game_state[i-1] + else: + if i < n-1: + return game_state[i+1] + else: + return True + +def make_move(i): + gs = game_state.copy() + gs[i] = False + if i > 0: + gs[i-1] = not gs[i-1] + if i < n-1: + gs[i+1] = not gs[i+1] + return gs + +def get_nimber(gs): + nimber_so_far = 0 + path_size = 0 + for i in range(n): + if gs[i]: + path_size += 1 + else: + if path_size == 1 and n != 1: + path_size = 0 + nimber_so_far = nimber_so_far ^ P(path_size) + path_size = 0 + if path_size == 1 and n != 1: + path_size = 0 + nimber_so_far = nimber_so_far ^ P(path_size) + return nimber_so_far + +def i_have_won(): + for i in range(n): + if valid_move(i): + return False + return True + +def find_move(): + game_state_orig = game_state.copy() + for i in range(n): + if valid_move(i): + gs = make_move(i) + if get_nimber(gs) == 0: + return i + raise Exception("I have been beat!") + +# game_state = make_move(2-1) +# game_state = make_move(6-1) +# game_state = make_move(6-1) +# display_game() +# print(get_nimber(game_state)) +# raise Exception() + +while True: + display_game() + if human_turn: + if i_have_won(): + print("You're out of moves. I win!") + break + human_turn = False + i = -1 # placeholder + while True: + i = safe_int_parse(input("Make your move> ")) - 1 + if valid_move(i): + break + print("Hey! That's not allowed!") + display_game() + game_state = make_move(i) + else: + human_turn = True + i = find_move() + print(f"Hmm... I'll toggle {i + 1}") + game_state = make_move(i) + |
