Track
/
Clojure
Clojure
/
Esercizi
/
Giochi di carte
Giochi di carte

Giochi di carte

Esercizio di apprendimento

Introduzione

In Clojure, le liste sono collezioni, proprio come le liste in altri linguaggi. Analogamente ad altri linguaggi della famiglia Lisp, Clojure usa le parentesi per esprimere le liste.

Le liste in Clojure possono essere create in due modi: la funzione list può creare una lista, oppure puoi usare quote su una lista letterale.

Le liste sono speciali perché Clojure le tratta come chiamate. Si aspetta che la chiamata inizi con un operatore, che di solito è una funzione. Gli elementi rimanenti della lista sono considerati operandi, cioè diventano gli argomenti della funzione.

Il trattamento speciale che Clojure riserva alle liste è il motivo per cui non possiamo creare direttamente una lista letterale. Usare quote su una lista, o la sua forma abbreviata ', indica che la lista non deve essere valutata.

A differenza di alcuni linguaggi moderni, le liste in Clojure sono eterogenee, il che significa che possono contenere al loro interno elementi di tipi diversi, ad esempio '(2 "a" "b" 3). A differenza di altri Lisp, una lista vuota in Clojure è truthy e non equivale a nil o false.

Istruzioni

Elyse non vede l'ora di giocare un po' a poker (e ad altri giochi di carte) durante il suo prossimo viaggio a Las Vegas. Da grande fan del «self-tracking», vuole mettere insieme alcune piccole funzioni che la aiutino nelle attività di monitoraggio, e ha chiesto il tuo aiuto per ragionarci sopra.

1. Monitorare i round di poker

Elyse è particolarmente appassionata di poker e vuole tenere traccia di quanti round gioca, e di quali round si tratta. Ogni round ha il suo numero, ed ogni tavolo mostra il numero del round in corso. Elyse sceglie un tavolo e si siede per giocare il suo primo round. Ha in programma di giocare tre round.

Implementa una funzione rounds che prende il numero del round corrente e restituisce un unico list con quel round e i due successivi in arrivo:

(rounds 27)
;;=> (27 28 29)

2. Tenere tutti i round nello stesso posto

Elyse ha giocato qualche round al primo tavolo, poi si è presa una pausa e ha giocato altri round a un secondo tavolo... ma è finita con un array diverso per ogni tavolo! Vuole unire i due array, così può tenere traccia di tutti i round di poker nello stesso posto.

Implementa una funzione concat-rounds che prende due array e restituisce un unico list composto da tutti i round del primo array, seguiti da tutti i round del secondo array:

(concat-rounds '(27 28 29) '(35 36))
;;=> (27 28 29 35 36)

3. Trovare i round precedenti

Parlando di alcuni dei round di poker precedenti, un altro giocatore fa notare quanto due di essi si siano svolti in modo simile. Elyse non è sicura di aver giocato quei round o no.

Implementa una funzione contains-round? che prende due argomenti, un array dei round giocati e un numero di round. La funzione restituirà true se il round è nell'array dei round giocati, false in caso contrario:

(contains-round? '(27 28 29 35 36) 29)
;;=> true

(contains-round? '(27 28 29 35 36) 30)
;;=> false

4. Calcolare la media dei valori delle carte

Elyse vuole provare un nuovo gioco chiamato Black Joe. È simile al Black Jack, dove l'obiettivo è che le carte in mano sommino a un valore prestabilito, ma in Black Joe l'obiettivo è che la media dei valori delle carte sia 7. La media si trova sommando tutti i valori delle carte e poi dividendo quella somma per il numero di carte in mano.

Implementa una funzione card-average che restituirà il valore medio di una mano di Black Joe.

(card-average '(5 6 7))
;;=> 6.0

5. Medie alternative

In Black Joe la velocità è importante. Elyse proverà a trovare un modo più veloce per calcolare la media.

Ha pensato a due modi per ottenere un numero simile alla media:

  • Calcolare la media del primo e dell'ultimo numero in mano.
  • Usare la mediana (la carta centrale) della mano.

Implementa la funzione approx-average?, dato hand, un array contenente i valori delle carte in mano.

Restituisci true se una or entrambe delle strategie sopra citate danno come risultato un numero uguale alla media effettiva.

Nota: La lunghezza di tutte le mani è dispari, per rendere più facile trovare la mediana.

(approx-average? '(1 2 3))
;;=> true

(approx-average? '(2 3 4 8 8))
;;=> true

(approx-average? '(1 2 3 5 9))
;;=> false

6. Altre tecniche di media

Incuriosita dai risultati del suo esperimento sulle medie, Elyse si chiede se calcolare la media delle carte nelle posizioni pari rispetto alla media delle carte nelle posizioni dispari darebbe gli stessi risultati. È il momento di un'altra funzione di prova!

Implementa una funzione average-even-odd? che restituisce un valore booleano che indica se la media delle carte agli indici pari è uguale alla media delle carte agli indici dispari.

(average-even-odd? '(1 2 3))
;;=> true

(average-even-odd? '(1 2 3 4))
;;=> false

7. Regole del round bonus

Ogni undicesima mano di Black Joe è una mano bonus con una regola bonus: se l'ultima carta che peschi è un Jack, ne raddoppi il valore.

Implementa una funzione maybe-double-last che prende una mano e controlla se l'ultima carta è un Jack (11). Se l'ultima carta è un Jack (11), raddoppia il suo valore prima di restituire la mano.

(maybe-double-last '(5 9 11))
;;=> '(5 9 22)

(maybe-double-last '(5 9 10))
;;=> '(5 9 10)
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Clojure Exercism

Vuoi iniziare Giochi di carte?

Iscriviti a Exercism per imparare e padroneggiare Clojure con 12 concetti105 esercizi e il mentoring di persone reali, tutto gratis.