v1
This commit is contained in:
commit
1527e1a0aa
1 changed files with 117 additions and 0 deletions
117
guessthenumber.py
Normal file
117
guessthenumber.py
Normal file
|
@ -0,0 +1,117 @@
|
|||
# guess the numer
|
||||
|
||||
|
||||
class Configuration:
|
||||
length: int = 100
|
||||
|
||||
def __init__(self, length=None):
|
||||
try:
|
||||
self.length = int(length)
|
||||
except ValueError:
|
||||
pass
|
||||
self.array = [None]*length
|
||||
|
||||
def copy(self) -> 'Self':
|
||||
new = Configuration(length=self.length)
|
||||
new.array = self.array.copy()
|
||||
return new
|
||||
|
||||
def get_points(self) -> list:
|
||||
players = self.current_players()
|
||||
for p in range(players):
|
||||
assert p in self.array
|
||||
# assert max(self.array) == players-1
|
||||
points = [0]*players
|
||||
lastplayer = None
|
||||
points_between = 0
|
||||
for v in self.array:
|
||||
if v is None:
|
||||
points_between += 1
|
||||
continue
|
||||
points[v] += 1
|
||||
if lastplayer is not None:
|
||||
points_between /= 2
|
||||
points[lastplayer] += points_between
|
||||
points[v] += points_between
|
||||
points_between = 0
|
||||
lastplayer = v
|
||||
points[lastplayer] += points_between
|
||||
return points
|
||||
|
||||
def choose(self,
|
||||
place,
|
||||
player=None,
|
||||
) -> None:
|
||||
if player is None:
|
||||
player = self.current_players()
|
||||
assert self.array[place] is None
|
||||
assert player not in self.array
|
||||
self.array[place] = player
|
||||
|
||||
def current_players(self) -> int:
|
||||
try:
|
||||
return max([v for v in self.array if v is not None]) + 1
|
||||
except ValueError:
|
||||
return 0
|
||||
|
||||
def optimize(self, players):
|
||||
p = self.current_players()
|
||||
if p == players:
|
||||
return self
|
||||
else:
|
||||
maxpoint = -1
|
||||
bestpos = None
|
||||
for i in range(self.length):
|
||||
new = self.copy()
|
||||
try:
|
||||
new.choose(place=i)
|
||||
except AssertionError:
|
||||
del new
|
||||
continue
|
||||
cur_fav = new.optimize(players)
|
||||
cur_points = cur_fav.get_points()[p]
|
||||
if maxpoint < cur_points:
|
||||
maxpoint = cur_points
|
||||
bestpos = i
|
||||
final_config = cur_fav
|
||||
self.choose(place=bestpos)
|
||||
return final_config
|
||||
|
||||
def rep_underline(self):
|
||||
rep = []
|
||||
for v in self.array:
|
||||
if v is None:
|
||||
rep.append('_')
|
||||
else:
|
||||
rep.append(str(v))
|
||||
return rep
|
||||
def __str__(self):
|
||||
return ' '.join(self.rep_underline())
|
||||
def summary(self) -> str:
|
||||
ret = str(self)
|
||||
points = self.get_points()
|
||||
for p in range(self.current_players()):
|
||||
point = points[p]
|
||||
if point.is_integer():
|
||||
point = int(point)
|
||||
ret += f'\n Player: {p}'
|
||||
ret += f'\n Points: {point}'
|
||||
ret += f'\n Position: {self.array.index(p)}\n'
|
||||
return ret
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
try:
|
||||
N = int(sys.argv[1])
|
||||
except IndexError:
|
||||
N = 3
|
||||
try:
|
||||
length = int(sys.argv[2])
|
||||
except IndexError:
|
||||
length = 10
|
||||
|
||||
c = Configuration(length=length)
|
||||
# c.choose(10)
|
||||
f=c.optimize(N)
|
||||
print(f.summary())
|
Loading…
Add table
Reference in a new issue