fork download
  1. from math import factorial
  2. T = factorial(52) // factorial(4)**13
  3.  
  4. idx2card = "23456789TJQKA"
  5. card2idx = {c:i for i,c in enumerate(idx2card)}
  6.  
  7. def deal2vec(cards):
  8. return [card2idx[c] for c in cards if c in card2idx]
  9. def vec2deal(vec):
  10. return "".join(idx2card[i] for i in vec)
  11.  
  12. def encode(vec):
  13. a = [4] * 13
  14. cards = sum(a)
  15. n = T
  16. k = 0
  17. for idx in vec:
  18. k += sum(a[:idx]) * n // cards
  19. n = a[idx] * n // cards
  20. a[idx] -= 1
  21. cards -= 1
  22. return k
  23.  
  24. def decode(k):
  25. vec = []
  26. a = [4] * 13
  27. cards = sum(a)
  28. n = T
  29. while cards > 0:
  30. i = cards * k // n
  31. accum = 0
  32. for idx in range(len(a)):
  33. if i < accum + a[idx]:
  34. k -= accum * n // cards
  35. n = a[idx] * n // cards
  36. a[idx] -= 1
  37. vec.append(idx)
  38. break
  39. accum += a[idx]
  40. cards -= 1
  41. return vec
  42.  
  43. for deal in [ "54A236J87726Q33969AAAQJK7T9292Q36KJ57T8TKJ448Q8T55K4"
  44. , "92TAJ9KA8J7353364Q67JQJTK9A947QK7882TK25836462A5T45Q"
  45. , "T87JK457855QJ432QKAA2KQ7T62TA86985349AK364Q997J3T6J2"
  46. , "A829J6K6Q274J4563AQ48K7AT576Q539J33QT782T4989KKAT52J"
  47. , "349272TKQ36A9TQKK8JQQ295T89665JJ485A377KA78J6424T53A"
  48. , "5Q462TJ33498ATK3J8K589727JQ6Q3T4766J789AK24T9AQ5A5K2"
  49. , "6J98QKJTQ5753AT93T429KJTK59327367Q6J88478A54462AKQA2"
  50. ]:
  51. round_trip = vec2deal(decode(encode(deal2vec(deal))))
  52. print(deal + ": " + ("OK" if deal == round_trip else "**FAIL**"))
Success #stdin #stdout 0.02s 47976KB
stdin
Standard input is empty
stdout
54A236J87726Q33969AAAQJK7T9292Q36KJ57T8TKJ448Q8T55K4: OK
92TAJ9KA8J7353364Q67JQJTK9A947QK7882TK25836462A5T45Q: OK
T87JK457855QJ432QKAA2KQ7T62TA86985349AK364Q997J3T6J2: OK
A829J6K6Q274J4563AQ48K7AT576Q539J33QT782T4989KKAT52J: OK
349272TKQ36A9TQKK8JQQ295T89665JJ485A377KA78J6424T53A: OK
5Q462TJ33498ATK3J8K589727JQ6Q3T4766J789AK24T9AQ5A5K2: OK
6J98QKJTQ5753AT93T429KJTK59327367Q6J88478A54462AKQA2: OK