When I was a child I used to play a variation of Snap to stake soccer trading cards.
"Game" is an overstatement because the only role of the players is to secretly prepare their starting piles. As the game starts there are no choices other than just perform the game algorithm.
Rules
There is no maximum number of players and they all start with a fixed number of cards.
Players in turn play the top card of their piles on a common pile (initially empty).
If the current player has no cards, the common pile bottom card will be played.
When a player happens to play an equal card to that on top of the common pile:
- This player will take the common pile and append it face-down to his own pile. (Players' piles are face-down but the common pile is face-up, so the pair of equal cards should end up at the bottom)
- Anyone with no cards is out of the game.
- This player has to resume the game replenish the common pile with their top card as usual.
The game ends in one of three scenarios:
- one player has all the cards (they win)
- all the cards are in the common pile, the next player rotates it but doesn't form a pair (the common pile can't be taken)
- one previous state of the game reoccurs (the game gets stuck in a loop)
Step by step game examples
1) Initial configuration: "abba abca" p1 p2 common pile 1 abba abca 2 bba abca a 3 bba bca aa 4 TAKES 5 bba bcaaa 6 bba caaa b 7 ba caaa bb 8 TAKES 9 babb caaa 10 abb caaa b 11 abb aaa bc 12 bb aaa bca 13 bb aa bcaa 14 TAKES 15 bb aabcaa 16 bb abcaa a 17 b abcaa ab 18 b bcaa aba 19 bcaa abab 20 caa ababb 21 OUT TAKES 22 caaababb ============ p2 wins ============ 2) Initial configuration: "abba acab" p1 p2 common pile 1 abba acab 2 bba acab a 3 bba cab aa 4 TAKES 5 bba cabaa 6 bba abaa c 7 ba abaa cb 8 ba baa cba 9 a baa cbab 10 a aa cbabb 11 TAKES 12 a aacbabb 13 a acbabb a 14 acbabb aa 15 TAKES 16 aa acbabb 17 a acbabb a 18 a cbabb aa 19 TAKES 20 a cbabbaa 21 a babbaa c 22 babbaa ca 23 abbaa cab 24 abbaa abc 25 bbaa abca 26 bbaa bcaa 27 TAKES 28 bcaa bbaa 29 caa bbaa b 30 caa baa bb 31 TAKES 32 caa baabb 33 caa aabb b 34 aa aabb bc 35 aa abb bca 36 a abb bcaa 37 TAKES 38 abcaa abb 39 bcaa abb a 40 bcaa bb aa 41 TAKES 42 bcaa bbaa 43 bcaa baa b 44 caa baa bb 45 TAKES 46 caabb baa 47 aabb baa c 48 aabb aa cb 49 abb aa cba 50 abb a cbaa 51 TAKES 52 abb acbaa 53 abb cbaa a 54 bb cbaa aa 55 TAKES 56 bbaa cbaa 57 baa cbaa b 58 baa baa bc 59 aa baa bcb 60 aa aa bcbb 61 TAKES 62 aa aabcbb 63 aa abcbb a 64 a abcbb aa 65 TAKES 66 aaa abcbb 67 aa abcbb a 68 aa bcbb aa 69 TAKES 70 aa bcbbaa 71 aa cbbaa b 72 a cbbaa ba 73 a bbaa bac 74 bbaa baca 75 baa bacab 76 baa acabb 77 TAKES 78 acabb baa 79 cabb baa a 80 cabb aa ab 81 abb aa abc 82 abb a abca 83 bb a abcaa 84 TAKES 85 bbabcaa a 86 babcaa a b 87 babcaa ba 88 abcaa bab 89 abcaa abb 90 TAKES 91 abcaa abb 92 abcaa bb a 93 bcaa bb aa 94 TAKES 95 bcaaaa bb 96 caaaa bb b 97 caaaa b bb 98 TAKES 99 caaaa bbb 100 caaaa bb b 101 aaaa bb bc 102 aaaa b bcb 103 aaa b bcba 104 aaa bcbab 105 aa bcbaba 106 aa cbabab 107 a cbababa 108 a bababac 109 bababaca 110 ababacab // common pile can't be taken ============ p1, p2 in game ============ 3) Initial configuration: "bdad acbc abba" p1 p2 p3 common pile 1 bdad acbc abba 2 dad acbc abba b 3 dad cbc abba ba 4 dad cbc bba baa 5 TAKES 6 dad cbc bbabaa 7 dad cbc babaa b 8 ad cbc babaa bd 9 ad bc babaa bdc 10 ad bc abaa bdcb 11 d bc abaa bdcba 12 d c abaa bdcbab 13 d c baa bdcbaba 14 c baa bdcbabad 15 baa bdcbabadc 16 aa bdcbabadcb 17 aa dcbabadcbb 18 TAKES OUT 19 dcbabadcbb aa 20 cbabadcbb aa d 21 cbabadcbb a da 22 babadcbb a dac 23 babadcbb daca 24 abadcbb dacab 25 abadcbb acabd 26 badcbb acabda 27 badcbb cabdaa 28 TAKES 29 badcbb cabdaa 30 badcbb abdaa c 31 adcbb abdaa cb 32 adcbb bdaa cba 33 dcbb bdaa cbaa 34 TAKES 35 dcbbcbaa bdaa 36 cbbcbaa bdaa d 37 cbbcbaa daa db 38 bbcbaa daa dbc 39 bbcbaa aa dbcd 40 bcbaa aa dbcdb 41 bcbaa a dbcdba 42 cbaa a dbcdbab 43 cbaa dbcdbaba 44 baa dbcdbabac 45 baa bcdbabacd 46 aa bcdbabacdb 47 aa cdbabacdbb 48 TAKES 49 aa cdbabacdbb 50 aa dbabacdbb c 51 a dbabacdbb ca 52 a babacdbb cad 53 babacdbb cada 54 abacdbb cadab 55 abacdbb adabc 56 bacdbb adabca 57 bacdbb dabcaa 58 TAKES 59 dabcaa bacdbb 60 abcaa bacdbb d 61 abcaa acdbb db 62 bcaa acdbb dba 63 bcaa cdbb dbaa 64 TAKES 65 bcaa cdbbdbaa 66 bcaa dbbdbaa c 67 caa dbbdbaa cb 68 caa bbdbaa cbd 69 aa bbdbaa cbdc 70 aa bdbaa cbdcb 71 a bdbaa cbdcba 72 a dbaa cbdcbab 73 dbaa cbdcbaba 74 baa cbdcbabad 75 baa bdcbabadc 76 aa bdcbabadcb 77 aa dcbabadcbb 78 TAKES 79 dcbabadcbb aa // loop (line 19) ============ p1, p3 in game ============ N.B. game states are inviduated by piles configuration and current player. As you can see in example 2) lines 28, 42 are not the same game state.
Input
A list of players' piles (top to bottom) as:
- an array of strings
["code", "golf", "fold"], or - a matrix of positive integers
[[1,2,3,4],[5,2,6,7],[7,2,6,3]]
Players order is implied by piles order.
Output
A number indicating the player who wins or a list of numbers for the players who reach the end of the game.
You decide whether players are 0 or 1 indexed.
- This is code-golf.
I/O Examples (1-indexed players):
"abca abba" -> 1 "abba abca" -> 2 "abba acab" -> 1 2 "bdad acbc abba" -> 1 3 "fizz buzz" -> 2 "robinhooda ndlittlejo hnwalkingt hroughthef orestlaugh ingbackand forthatwha ttheothero nehastosay" -> 9