#x86-16 Assembly, <del>56</del> <del>41</del> 39 bytes **Binary:** 00000000: b103 33ed ac8b fe51 f2ae 7503 45eb f983 ..3....Q..u.E... 00000010: fd03 7504 80c2 4d43 03dd 59e2 e592 7502 ..u...MC..Y...u. 00000020: 040a 3c64 7201 43 ..<dr.C **Unassembled:** B1 03 MOV CL, 3 ; set up loop counter for 3 digits DIGIT_LOOP: 33 ED XOR BP, BP ; clear digit match counter AC LODSB ; next digit char into AL 8B FE MOV DI, SI ; start search at next char 51 PUSH CX ; save outer digit loop counter MATCH_LOOP: F2/ AE REPNZ SCASB ; search until digit in AL is found 75 03 JNZ CHECK_FOUR ; is end of search? 45 INC BP ; if not, a match was found, increment count EB F9 JMP MATCH_LOOP ; continue looping CHECK_FOUR: 83 FD 03 CMP BP, 3 ; is four of a kind? 75 04 JNE SCORE_DIGIT ; if not, add number of matches to 1UP's 80 C2 4D ADD DL, 77 ; add 77 to coin count 43 INC BX ; +1 1UP extra for four-of-a-kind SCORE_DIGIT: 03 DD ADD BX, BP ; Add number of matches to total, set ZF if 0 59 POP CX ; restore outer digit loop position E2 E5 LOOP DIGIT_LOOP ; keep looping 92 XCHG DX, AX ; coin count to AX for shorter compare 75 02 JNZ FINAL_SCORE ; if 1UPs are 0, calculate score 04 0A ADD AL, 10 ; consolation prize of 10 FINAL_SCORE: 3C 64 CMP AL, 100 ; is coin score over 100? 72 01 JB DONE ; if not, no extra 1UP 43 INC BX ; otherwise, increment 1UP DONE: Input starting coin count in `DX`, `SI` pointing to start of "icon" bytes (which can be `'1'`-`'5'`, or any byte value). Output the number of 1UP's in `BX`. **Explanation:** The input of four bytes is iterated and compared to the remaining bytes to the right, counting the number of matches. The scores for each type of match are awarded and add up to the total. Since a four-of-a-kind is also three-of-a-kind and also a one-pair, the value of each score type can be decomposed as follows: - 3 matches = 4 1UP's + 77 coins - 2 matches = 2 1UP's - 1 match = 1 1UP Example: `[2, 2, 2, 2]` (four-of-a-kind) = 7 1UP's + 77 coins 2 [2, 2, 2] = 3 matches = 4 1UP's + 77 coins 2 [2, 2] = 2 matches = 2 1UP's 2 [2] = 1 match = 1 1UP Example: `[2, 5, 2, 2]` (three-of-a-kind) = 3 1UP's 2 [5, 2, 2] = 2 matches = 2 1UP's 5 [2, 2] = 0 matches 2 [2] = 1 match = 1 1UP Example: `[4, 5, 5, 4]` (two pair) = 2 1UP's 4 [5, 5, 4] = 1 match = 1 1UP 5 [5, 4] = 1 match = 1 1UP 5 [4] = 0 matches Example: `[2, 3, 4, 3]` (one pair) = 1 1UP 2 [3, 4, 3] = 0 matches 3 [4, 3] = 1 match = 1 1UP 4 [3] = 0 matches If number of earned 1UP's is 0 at the end, 10 coins are awarded. If total coins are greater than 100, an additional 1UP is awarded. Here is a test program for PC DOS that includes extra routines to handle the integer value I/O: [![enter image description here][1]][1] Download and test [LUCKY.COM][2] for DOS. [1]: https://i.sstatic.net/0XZfJ.png [2]: https://stage.stonedrop.com/ppcg/LUCKY.COM