UNO P65649


Statement
 

pdf   zip

html

Heu jugat mai a l’UNO? És un joc de cartes, les regles del qual presentem a continuació molt simplificades. Llegiu-les encara que ja hi hagueu jugat. Quatre jugadors, anomenats A, B, C i D, juguen per torns cíclicament, un rera l’altre (amb algunes excepcions explicades més avall). Inicialment es reparteixen 7 cartes a A, 7 cartes a B, etc. Les cartes tenen un color i un símbol. El color és un d’entre quatre: B, G, R o Y (les inicials de blue, green, red i yellow, respectivament). El símbol pot ser, de menys a més valor, o un nombre entre 0 i 9, o una marca de canvi de sentit, o de pèrdua de torn, o de robar dues cartes. Diem que dues cartes lliguen entre si quan coincideixen en el color o/i en el símbol.

Després de repartir les primeres 28 cartes, la següent carta es posa sobre la taula. Aquesta carta només serveix per començar a jugar i, si el seu símbol no és un nombre, s’ignora l’efecte que produiria (veieu més avall). Després, per torns, i començant amb A, el jugador a qui li toqui jugar tira una carta que lligui amb l’última carta tirada sobre la taula, i la posa a sobre. Si en pot tirar més d’una, ha de triar aquella amb més valor. En cas d’empat, la que tingui el color més gran alfabèticament. Si no en pot tirar cap, ha de robar una carta. Si aquesta carta lliga, la tira, i altrament passa. La partida acaba quan algun jugador es queda sense cartes.

Les cartes amb símbols especials tenen els efectes següents:

  • Una carta de canvi de sentit inverteix el sentit del joc. Per exemple, si B tira aquesta carta (i encara no s’havia canviat mai de sentit), després jugarà A, després D, etc.
  • Una carta de pèrdua de torn fa que se salti el jugador a qui li tocava jugar. Per exemple, si C tira aquesta carta, després jugarà A. El sentit del joc no canvia.
  • Una carta de robar dues cartes fa que el següent jugador a qui tocava jugar robi dues cartes, i també que perdi el torn. El sentit del joc no canvia.

Simuleu una partida sencera d’UNO. Per generar les cartes, useu la funció pseudo-aleatòria definida per s′ = (97 * s + 20) % 32749. Per exemple, començant amb llavor 3, obtenim la seqüència (97 * 3 + 20) % 32749 = 311, (97 * 311 + 20) % 32749 = 30187, …Així, usem el 311 per decidir el color de la primera carta: 311 % 4 = 3, que es correspon a l’últim color (Y). I usem el 30187 per decidir el símbol: 30187 % 13 = 1, que es correspon a l’1. Els valors 10, 11 i 12 es corresponen a les cartes de canvi de sentit, pèrdua de torn, i de robar dues cartes, respectivament. Cada vegada que calgui generar una carta, ja sigui a l’inici de la partida, o perquè un jugador ha de robar, cal invocar dues vegades la funció pseudo-aleatòria.

Entrada

L’entrada consisteix en la llavor inicial: un nombre entre 0 i 32748.

Sortida

Simuleu una partida seguint el format dels exemples. Suposeu que la partida acabarà.

Public test cases
  • Input

    3
    

    Output

    el jugador A rep (Y, 1), (R, 5), (B, 3), (G, 5), (G, 0), (G, 4), (R, 8)
    el jugador B rep (B, 3), (Y, 9), (R, 4), (Y, 3), (R, 8), (G, 2), (G, canvi)
    el jugador C rep (B, torn), (R, dues), (Y, torn), (G, 5), (R, 4), (R, torn), (R, 1)
    el jugador D rep (B, 2), (B, 4), (G, 8), (R, dues), (R, 1), (G, 2), (B, 9)
    la carta a la taula es (B, 6)
    el jugador A juga (B, 3)
    el jugador B juga (Y, 3)
    el jugador C juga (Y, torn)
    el jugador A juga (Y, 1)
    el jugador B juga (Y, 9)
    el jugador C roba (R, 5)
    el jugador C passa
    el jugador D juga (B, 9)
    el jugador A roba (Y, 3)
    el jugador A passa
    el jugador B juga (B, 3)
    el jugador C juga (B, torn)
    el jugador A roba (B, 2)
    el jugador A juga (B, 2)
    el jugador B juga (G, 2)
    el jugador C juga (G, 5)
    el jugador D juga (G, 8)
    el jugador A juga (R, 8)
    el jugador B juga (R, 8)
    el jugador C juga (R, dues)
    el jugador D roba (R, 8)
    el jugador D roba (G, 8)
    el jugador A juga (R, 5)
    el jugador B juga (R, 4)
    el jugador C juga (R, torn)
    el jugador A roba (R, 2)
    el jugador A juga (R, 2)
    el jugador B roba (R, 3)
    el jugador B juga (R, 3)
    el jugador C juga (R, 5)
    el jugador D juga (R, dues)
    el jugador A roba (B, 0)
    el jugador A roba (Y, torn)
    el jugador B roba (B, 4)
    el jugador B passa
    el jugador C juga (R, 4)
    el jugador D juga (R, 8)
    el jugador A roba (R, 8)
    el jugador A juga (R, 8)
    el jugador B roba (G, 8)
    el jugador B juga (G, 8)
    el jugador C roba (G, 0)
    el jugador C juga (G, 0)
    el jugador D juga (G, 8)
    el jugador A juga (G, 5)
    el jugador B juga (G, canvi)
    el jugador A juga (G, 4)
    el jugador D juga (B, 4)
    el jugador C roba (B, 5)
    el jugador C juga (B, 5)
    el jugador B juga (B, 4)
    
  • Input

    3000
    

    Output

    el jugador A rep (B, 0), (G, 3), (B, 0), (Y, 0), (R, 6), (G, 8), (G, 3)
    el jugador B rep (B, 9), (Y, 6), (R, 7), (B, dues), (B, dues), (Y, 5), (G, 5)
    el jugador C rep (B, 7), (B, 1), (G, 2), (Y, 2), (B, 6), (G, dues), (G, 0)
    el jugador D rep (B, 0), (G, 5), (Y, 2), (B, canvi), (G, 5), (G, 3), (B, 2)
    la carta a la taula es (R, canvi)
    el jugador A juga (R, 6)
    el jugador B juga (R, 7)
    el jugador C juga (B, 7)
    el jugador D juga (B, canvi)
    el jugador C juga (B, 6)
    el jugador B juga (B, dues)
    el jugador A roba (G, 7)
    el jugador A roba (G, dues)
    el jugador D juga (B, 2)
    el jugador C juga (Y, 2)
    el jugador B juga (Y, 6)
    el jugador A juga (Y, 0)
    el jugador D juga (Y, 2)
    el jugador C juga (G, 2)
    el jugador B juga (G, 5)
    el jugador A juga (G, dues)
    el jugador D roba (B, 3)
    el jugador D roba (R, 0)
    el jugador C juga (G, dues)
    el jugador B roba (R, 7)
    el jugador B roba (Y, 1)
    el jugador A juga (G, 8)
    el jugador D juga (G, 5)
    el jugador C juga (G, 0)
    el jugador B roba (G, 7)
    el jugador B juga (G, 7)
    el jugador A juga (G, 7)
    el jugador D juga (G, 5)
    el jugador C roba (Y, 1)
    el jugador C passa
    el jugador B juga (Y, 5)
    el jugador A roba (B, 8)
    el jugador A passa
    el jugador D roba (R, 8)
    el jugador D passa
    el jugador C juga (Y, 1)
    el jugador B juga (Y, 1)
    el jugador A roba (R, dues)
    el jugador A passa
    el jugador D roba (G, torn)
    el jugador D passa
    el jugador C juga (B, 1)
    
  • Information
    Author
    Salvador Roura
    Language
    Catalan
    Official solutions
    C++
    User solutions
    C++ Python