HW2 req - Come gestire il numero di lettere in gioco (dim_hand vs. num_letters)

MRinaudo (3660 points)
18 40 50
asked Oct 24, 2020 in HW2 obbligatorio by MRinaudo (3,660 points)
closed Oct 30, 2020 by MRinaudo

Buonasera a tutti,

attualmente mi trovo "bloccato" in questa parte dell'esercizio, ossia con l'esempio dato nell'homework riesco ad arrivare alla lista [21, 12, 32, 12], che sarebbe la lista senza le penalizzazioni, ma non sto riuscendo ad implementare un algoritmo che mi permetta di togliere i punti di penalizzazione a ciascuno giocatore.

Se avete qualche suggerimento da darmi, vi sarei grato smiley

Saluti,

Michelangelo

UPDATE 1

Grazie a tutti per l'aiuto ! laugh

Direi che il mio problema principale e trovare un modo semplice di decrementare il numero di lettere di ogni giocatore durante l'intera partitia.

Diciamo di avere un singolo ciclo che itera sulle parole di ogni giocatore, e delle condizioni annidate che si 'attivano' appena sono True, in base al valore corrente di num_letters.

Quale secondo voi è il modo migliore di tenere traccia del numero di lettere di ogni giocatore, dopo ogni mano giocata ?

Dovrei creare una funzione ausiliare, delle variabili annidate che corrispondo al numero di lettere di ogni giocatore dopo ogni mano o qualcos'altro di totalmente diverso ?

Grazie mille!

UPDATE 2

Grazie ancora a tutti per le risposte fornite!

Credo di essere arrivato ad una implementazione più meno giusta ma non riesco ancora ad ottenere le liste corrette perché ad ogni test ottengo uno o due giocatori che hanno risultati sbagliati.

Per intenderci, se prendo test_200_4_eng come esempio, il mio algoritmo crea, tramite una funzione ausiliare, una lista con tutte le parole di tutti i giocatori, in ordine di giocata/mano:

['flew', 'burr', 'zuni', 'tugs', 'pus', 'cup', 'buss', 'hats', 'gce', 'sess', 'rids', 'shat', 'bead', 'keep', 'wen', 'soon', 'msc', 'knox', 'bad', 'yule', 'zed', 'kph', 'omne', 'pawl', 'pull', 'bate', 'boar', 'poe', 'anon', 'ryas', 'imps', 'cups', 'eigg', 'aida', 'back', 'kcal', 'shot', 'reus', 'rase', 'bobs', 'clod', 'gala', 'pure', 'gush', 'flow', 'nit', 'slog', 'soap', 'dfc', 'inde'].

Utilizzo un'altra funzione ausiliare che prende una parola e mi dà il suo punteggio.

Poi, utilizzo un ciclo che itera su ogni parola e verifico se questa stessa parola si trova nella lista del giocatore 1, 2, 3 o 4.

Se la parola si trova nella lista del giocatore, verifico se num_letters è maggiore di 0.

Se la condizione è vera, allora incremento il punteggio del giocatore.

Altrimenti, incremento comunque il punteggio del giocatore ma decremento anche il numero di lettere del giocatore.

Alla fine, per ogni giocatore decremento il numero di lettere rimanenti al punteggio, 3 volte per ogni lettera.

La funzione per questo test mi dà [85, 89, 71, 72] mentre il risultato apettato dev'essere [88, 89, 71, 72].

Sapete dirmi dove sbaglio o darmi qualche consiglio ?

UPDATE 3

Sono riuscito a svolgere l'esercizio con un punteggio accettabile.

Grazie a tutti per i consigli!

568 views
closed with note: Sono riuscito a svolgere l'esercizio con un punteggio accettabile.  Grazie a tutti per i consigli!

11 Answers

Best answer
SimoneModiga (3370 points)
6 18 34
answered Oct 27, 2020 by SimoneModiga (3,370 points)
selected Oct 30, 2020 by MRinaudo
Forse potrebbe essere un problema che ho dovuto affrontare anche io, se fai caso anche nell'esempio della traccia c'è un punto cruciale in cui num_letters è 3 ma la parola giocata è 5, e dunque bisogna portare num_letters a 0, ma nel contempo levare anche 2 carte al giocatore poichè +3-5= -2.

Dunque forse è per questo che ti sballa dei risultati prova a fare dei controlli.
Romitoskj (8920 points)
4 8 40
answered Oct 24, 2020 by Romitoskj (8,920 points)
Prova a tenere traccia delle lettere che ogni giocatore ha in mano lungo tutta la partita ed una volta conclusa, prima di ritornare i punteggi, decrementa il punteggio di ognuno in base alle lettere che gli sono rimaste in mano (una lettera -3 punti).
GiovanniChiara (830 points)
4 8 14
commented Oct 25, 2020 by GiovanniChiara (830 points)
Come si fa a tenere traccia delle lettere di ogni giocatore lungo tutta la partita? Grazie.
Romitoskj (8920 points)
4 8 40
commented Oct 25, 2020 by Romitoskj (8,920 points)
Basta dichiarare una lista all'inizio della funzione dove ogni elemento equivale al numero di lettere che ha in mano un giocatore (ovviamente sarà uguale a dim_hand inizialmente). Successivamente quando viene giocata una parola bisogna decrementare il numero di lettere del giocatore ha in mano e incrementarlo quando pesca nuove lettere. Una volta finita la partita nella lista avrai  il numero di parole rimaste ad ogni giocare e ti basterà levare punti ai giocatori di conseguenza.
Loriv3 (7970 points)
10 20 84
answered Oct 24, 2020 by Loriv3 (7,970 points)

Ho trovato molto facile contare queste variabili ogni volta che davo il punteggio ad una lettera. Se nel mazzo avevo ancora carte toglievo unità a loro sennò le toglievo alla mano del giocatore

Ad esempio:


Funzione calcolo punteggio

se lettere > 0

lettere -= 1

oppure

manogoicatore -=1

f
f.cavallo (1690 points)
0 2 8
commented Oct 26, 2020 by f.cavallo (1,690 points)
Quindi questa operazione la fai su tutte le lettere praticamente, o ti ho capito male io?
E
Eduard (2150 points)
6 12 15
answered Oct 24, 2020 by Eduard (2,150 points)
Stai già ad un buonissimo punto.

Cosa deve ritornare la funzione? C'è scritto nel testo, una lista di interi.

Quindi ti serve solo un semplice calcolo che devi fare per arrivare alla lista "finale", pensaci.

Ogni lettere che rimane in mano ad ogni giocatore devi togliere 3 punti. Per esempio se le lettere in mano ad un giocatore sono 2 allora devi sottrarre 6 al punteggio del giocatore, e se le lettere in mano ad un giocatore è 0 allora 0 per 3 fa 0, semplice, no?

Ora prova tu con i consiglio che ti ho dato. Buona fortuna!
alessiodellasanta (11830 points)
8 13 34
answered Oct 25, 2020 by alessiodellasanta (11,830 points)
Prima di fare il return dei punteggi, sottrai il numero delle parole rimaste moltiplicato per tre, per ogni giocatore.

Se per esempio g1 vince, gli verranno sottratti 0 punti X 3, ossia 0, quindi il codice funziona indipendentemente da chi è il vincitore
GiovanniChiara (830 points)
4 8 14
answered Oct 25, 2020 by GiovanniChiara (830 points)
Ho lo stesso problema. Con quattro cicli for, uno per lista di giocatore, è possibile capire quante lettere sono rimaste in tutto alla fine, ma non per singolo giocatore. Non riesco a venirne a capo.
giordano_sannino (13650 points)
7 16 81
answered Oct 25, 2020 by giordano_sannino (13,650 points)
Tieni conto delle carte in mano, le moltiplichi per 3 e sottrai ai punteggi
g
giacomo_venturini (6680 points)
2 5 39
answered Oct 25, 2020 by giacomo_venturini (6,680 points)
Il gioco si svolge a turni, ogni turno comprende le parole giocate in un determinato indice delle 4 liste date in input alla funzione, scorrendo quindi le 4 liste in questo modo è possibile ricostruire i movimenti delle parole tra la mano di ogni giocatore e le lettere disponibili.

Edit: non è detto che l'ultimo turno abbi 4 parole giocate, quindi occhio!
e
er nutella (410 points)
0 0 3
answered Oct 25, 2020 by er nutella (410 points)
Secondo me si dovresti tener in conto il numero di tessere ad ogni mano, però forse non serve la classica giocata di tessere e pescata come la faresti nel gioco, guarda quando è possibile levare direttamente le carte dal mazzo visto che se butti 5 tessere e ne peschi 5 alla fine dei conti sempre 5 ne mancano dal mazzo soltanto e la tua mano rimane intatta... Occhio che non si può fare sempre questo passaggio
GiovanniChiara (830 points)
4 8 14
answered Oct 26, 2020 by GiovanniChiara (830 points)
Ciao, tu hai risolto? Posso chiederti come?