Advertisement
jgtrosh

Tetris drought proba

Jun 17th, 2023 (edited)
865
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.99 KB | Gaming | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. from sys import stdout
  4. from random import randint, choice
  5. from statistics import median
  6.  
  7. def next_1roll(last_piece):
  8.     index = randint(0, len(tet)-1)
  9.     return tet[index]
  10.  
  11. def next_reroll(last_piece):
  12.     index = randint(0, len(tet)-1)
  13.     next_piece = tet[index]
  14.     if next_piece == last_piece:
  15.         index = randint(0,len(tet)-1)
  16.         next_piece = tet[index]
  17.     return next_piece
  18.  
  19. # https://github.com/babeheim/tetristools/blob/master/R/rtetris.R
  20. tet = ["T", "J", "Z", "O", "S", "L", "I"]
  21. rev = dict((tet[n], n) for n in range(len(tet)))
  22. orientationID = [2, 7, 8, 10, 11, 14, 18] # numeric address for each piece
  23. def next_nes(last_piece):
  24.     lastID = orientationID[rev[last_piece]]
  25.     index = randint(0, len(tet))
  26.     if index > 0:
  27.         next_piece = tet[index-1]
  28.     if index == 0 or next_piece == last_piece:
  29.         index = randint(0,len(tet))
  30.         index += lastID # introduces small biases
  31.         index %= len(tet)
  32.         next_piece = tet[index]
  33.     return next_piece
  34.  
  35. num = 1000000
  36. print(f"probas de sélection sur {num} tirs")
  37.  
  38. print("1roll")
  39. hist = dict((p, 0) for p in tet)
  40. p = choice(tet)
  41. for i in range(num):
  42.     if i % 10000 == 0:
  43.         print(f"{100*i//num}%", end="\r")
  44.     p = next_1roll(p)
  45.     hist[p] += 1
  46. for k in hist:
  47.     print(f"{k}: {100*hist[k]/num}%")
  48. print("reroll")
  49. hist = dict((p, 0) for p in tet)
  50. p = choice(tet)
  51. for i in range(num):
  52.     if i % 10000 == 0:
  53.         print(f"{100*i//num}%", end="\r")
  54.     p = next_reroll(p)
  55.     hist[p] += 1
  56. for k in hist:
  57.     print(f"{k}: {100*hist[k]/num}%")
  58. print("nes")
  59. hist = dict((p, 0) for p in tet)
  60. p = choice(tet)
  61. for i in range(num):
  62.     if i % 10000 == 0:
  63.         print(f"{100*i//num}%", end="\r")
  64.     p = next_nes(p)
  65.     hist[p] += 1
  66. for k in hist:
  67.     print(f"{k}: {100*hist[k]/num}%")
  68. print()
  69.  
  70. nbparties = 3000
  71. centiles = [0,25,50,75,90,95,99]
  72. def droughtsim(f):
  73.     print("I-piece max drought length centiles")
  74.     print("pieces", end=" ")
  75.     for centile in centiles:
  76.         print(f"{100-centile:3}%≥", end="")
  77.     print()
  78.     for nbpieces in [100, 300, 500, 700, 900]:
  79.         print(f"{nbpieces:6}", end="  ")
  80.         longestdroughts = []
  81.         for _ in range(nbparties):
  82.             longestdrought = 0
  83.             p = choice(tet)
  84.             curdrought = 0 if p == "I" else 1
  85.             for i in range(nbpieces):
  86.                 p = f(p)
  87.                 if p == "I":
  88.                     curdrought = 0
  89.                 else:
  90.                     curdrought += 1
  91.                     if curdrought > longestdrought:
  92.                         longestdrought = curdrought
  93.             longestdroughts.append(longestdrought)
  94.         longestdroughts.sort()
  95.         for centile in centiles:
  96.             print(f"{longestdroughts[nbparties*centile//100]:4}", end=" ")
  97.         print()
  98.     print()
  99.  
  100. print("1roll  ", end="")
  101. droughtsim(next_1roll)
  102. print("reroll ", end="")
  103. droughtsim(next_reroll)
  104. print("nes    ", end="")
  105. droughtsim(next_nes)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement