
    Ii8              	          S r SSKJr  SSSSSSS	S
S.rS\\   S\4S jrS\\   S\4S jrS\\   S\4S jr	S\\   S\4S jr
S\\   S\4S jrS\\   S\4S jrS\\   S\4S jrS\\   S\4S jrS\\   S\\\\\   \4      4S jrg)z[
Scoring logic for Tradeoff game.

Handles set detection and optimal scoring combinations.
    )combinations)ztradeoff-set-triple   r   )ztradeoff-set-mini-straight      )ztradeoff-set-group      )ztradeoff-set-double-triple   
   )ztradeoff-set-straightr      )ztradeoff-set-double-groupr
      )ztradeoff-set-all-groups   2   )ztradeoff-set-all-tripletsr   r   )triplemini_straightgroupdouble_triplestraightdouble_group
all_groupsall_tripletsdicereturnc                 h    [        U 5      S:H  =(       a    U S   U S   s=:H  =(       a    U S   :H  $ s  $ )z2Check if dice form a triple (3 of the same value).r   r         )lenr   s    <c:\Users\dbart\PlayPalace11\server\games\tradeoff\scoring.py	is_tripler      s4    t9>;d1ga;;DG;;;;    c                 T    [        U 5      S:w  a  g[        U 5      nU/ SQ/ SQ/ SQ4;   $ )z:Check if dice form a mini straight (4 consecutive values).r   F)r   r   r   r   )r   r   r   r   )r   r   r   r	   r   sortedr   sorted_dices     r   is_mini_straightr&      s+    
4yA~,K<|DDDr    c                 Z    [        U 5      S:H  =(       a    [        [        U 5      5      S:H  $ )z1Check if dice form a group (5 of the same value).r   r   )r   setr   s    r   is_groupr)   &   s"    t9>1c#d)n11r    c                     [        U 5      S:w  a  g0 nU  H  nUR                  US5      S-   X'   M     [        UR                  5       5      SS/:H  $ )z@Check if dice form a double triple (3 of 2 kinds, 6 dice total).r	   Fr   r   r   r   getr#   valuesr   countsds      r   is_double_tripler1   +   sR    
4yA~FJJq!$q(	  &--/"q!f,,r    c                 N    [        U 5      S:w  a  g[        U 5      nU/ SQ/ SQ4;   $ )z5Check if dice form a straight (5 consecutive values).r   F)r   r   r   r   r   )r   r   r   r   r	   r"   r$   s     r   is_straightr3   6   s)    
4yA~,K?O<<<r    c                     [        U 5      S:w  a  g0 nU  H  nUR                  US5      S-   X'   M     [        UR                  5       5      SS/:H  $ )z@Check if dice form a double group (5 of 2 kinds, 10 dice total).r
   Fr   r   r   r+   r.   s      r   is_double_groupr5   ?   sR    
4yBFJJq!$q(	  &--/"q!f,,r    c                     [        U 5      S:w  a  g0 nU  H  nUR                  US5      S-   X'   M     [        UR                  5       5      / SQ:H  $ )z=Check if dice form all groups (3 groups of 5, 15 dice total).r   Fr   r   )r   r   r   r+   r.   s      r   is_all_groupsr7   J   sN    
4yBFJJq!$q(	  &--/"i//r    c                     [        U 5      S:w  a  g0 nU  H  nUR                  US5      S-   X'   M     [        UR                  5       5      / SQ:H  $ )z;Check if dice form all triplets (5 triples, 15 dice total).r   Fr   r   )r   r   r   r   r   r+   r.   s      r   is_all_tripletsr9   U   sN    
4yBFJJq!$q(	  &--/"o55r    c                 ^  ^^^ U (       d  / $ [        U 5      S:X  a>  [        U 5      (       a  S[        U 5      S4/$ [        U 5      (       a  S[        U 5      S4/$ Sm/ mS[        [           S[        [
        [        [        [           [        4      S[        S	S
4UUU4S jjmT" U / S5        T$ )z
Find the best combination of non-overlapping sets from dice.

Returns list of (set_name, dice_used, points) tuples.
Uses exhaustive search for optimal solution.
r   r   r   r   r   	remainingcurrent_setscurrent_scorer   Nc                   >^  UT:  a  Um[        U5      m[        T 5      S:  a  g 0 nT  H  nUR                  US5      S-   X4'   M     [        T 5      S:  a  UR                  5        VVs/ s H  u  pVUS:  d  M  UPM     nnn[        U5      S:  ar  [	        US5       Hb  n[        T 5      n	/ n
U H7  n[        S5       H%  nU	R                  U5        U
R                  U5        M'     M9     USU
S4/-   nT" XUS-   5        Md     [        T 5      S:  a  S	 H  n[        [        XS-   5      5      n[        U 4S
 jU 5       5      (       d  M6  [        T 5      n	/ n
U H%  nU	R                  U5        U
R                  U5        M'     USU
S4/-   nT" XUS-   5        M     [        T 5      S:  a  UR                  5        VVs/ s H  u  pVUS:  d  M  UPM     nnn[        U5      S:  ar  [	        US5       Hb  n[        T 5      n	/ n
U H7  n[        S5       H%  nU	R                  U5        U
R                  U5        M'     M9     USU
S4/-   nT" XUS-   5        Md     [        T 5      S:  ax  UR                  5        Hd  u  nnUS:  d  M  [        T 5      n	/ n
[        S5       H%  nU	R                  U5        U
R                  U5        M'     USU
S4/-   nT" XUS-   5        Mf     [        T 5      S:  a  S H  n[        [        XS-   5      5      n[        U 4S jU 5       5      (       d  M6  [        T 5      n	/ n
U H%  nU	R                  U5        U
R                  U5        M'     USU
S4/-   nT" XUS-   5        M     UR                  5        Hd  u  nnUS:  d  M  [        T 5      n	/ n
[        S5       H%  nU	R                  U5        U
R                  U5        M'     USU
S4/-   nT" XUS-   5        Mf     g s  snnf s  snnf )Nr   r   r   r
   r   r   r   r   )r   r   c              3   ,   >#    U  H	  oT;   v   M     g 7fN .0vr;   s     r   	<genexpr>4find_best_scoring.<locals>.search.<locals>.<genexpr>        3s!I~s   r   r   r	   r   r   r   r   )r   r   r   c              3   ,   >#    U  H	  oT;   v   M     g 7fr@   rA   rB   s     r   rE   rF      rG   rH   r   r   r   )	listr   r,   itemsr   rangeremoveappendall)r;   r<   r=   r/   r0   rD   cvals_with_5combonew_remainingused_new_setsstartrunvals_with_3valcount
best_score	best_setssearchs   `                 r   r^   !find_best_scoring.<locals>.searchu   s   
 :%&J\*I y>A "$A

1a(1,FI  y>R)/B161KB;1$)+q9E$(OMD"!&qA)003 KKN "* #  ,b/I.JJH=MB4FG : y>Q5	233s333$(OMD %,,Q/A !  ,
D"/E.FFH=MB4FG   y>Q)/B161KB;1$)+q9E$(OMD"!&qA)003 KKN "* #  ,r/J.KKH=MB4FG : y>Q$lln
UA:$(OMD"1X%,,S1C( &  ,q/A.BBH=MA4EF - y>Q"5	233s333$(OMD %,,Q/A !  ,q/I.JJH=MA4EF # !,,.JCz $YqA!((-KK$ " (HdA+>*??}0AB )C C6 Cs   *O0:O0>O6O6)r   r7   rJ   r9   inttuplestr)r   r\   r]   r^   s    @@@r   find_best_scoringrc   `   s     	 4yB!4:r2334  #T$Z455 J24I]C9]C,0sDIs7J1K,L]C]`]C	]C ]C~ 4Qr    N)__doc__	itertoolsr   SET_DEFINITIONSrJ   r`   boolr   r&   r)   r1   r3   r5   r7   r9   ra   rb   rc   rA   r    r   <module>rh      s   # ,9):0959	<DI <$ <
E49 E E249 2 2
-49 - -=d3i =D =-$s) - -0S	 0d 06$s) 6 6uDI u$uS$s)S5H/I*J ur    