|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
[Tutti] Contest: Esercizio per le vacanze
Ecco un bell'esercizio per le vacanze.
Semplice e veloce, quando si trova il modo... Come al solito, lasciamo tempo per pensare agli altri, nel caso in cui la soluzione ci fulminasse in fretta. Sia dato una array di numeri interi, di lunghezza indefinita. Si vuole ottenere come risultato un array di pari lunghezza, con ciascuna cella valorizzata tale per cui essa sia il prodotto di tutte le celle dell'array originale, tranne la propria cella corrispondente. Es: Codice:
Array Originale: 1 5 6 3 4 Array risultate di 5 elementi. Nella prima cella si vorrebbe avere il prodotto dei valori 5*6*3*4 Nella seconda cella invece 1*6*3*4 (il secondo, ovvero il 5, corrispondente alla nostra posizione, non si vuole) Nella terza cella invece 1*5*3*4 etc. Array risultato = 360 72 60 120 90 (Sempre se non ho fatto i soliti errori manuali) Ma c'e' un problema. Non siamo sul nostro processore preferito. Siamo sull'utlimissimo e innovativo processore progettato da Z80Fan, cdimauro, cionci e tutti gli altri. Nella foga di pensare agli indirizzamenti, ai registri, ai bus e al resto, si sono dimenticati di focalizzarsi sulla ALU. E in questa prima versione di processore si sono dimenticati semplicemente della DIVISIONE. La divisione non la possiamo utilizzare mai. Ne' all'inizio, ne durante, ne alla fine ne in alcun minimo step, perche' eseguendo la divisione del nostro linguaggio preferito viene sollevata un'eccezione macchina. Qui l'array originale Codice:
2 1 3 1 2 2 3 3 4 3 3 1 1 4 4 4 2 2 4 4 4 2 2 4 2 3 1 1 3 3 2 1 3 4 3 4 2 1 4 1 3 1 4 4 1 2 1 2 4 1 2 4 Sono bassi perche' gia' cosi' i risultati sono valori parecchio grandi, e infatti occorre restituire un array di elementi almeno a 64bit per poter ospitare correttamente tutti i risultati. Inoltre il nostro responsabile e' uno schiavista da piantagione. Si richiede che il risultato sia geenrato mediante un algoritmo di complessita' O(N) Ma per iniziare ciascuno provi a buttare giu' la soluzione come riesce... Bene, niente divisioni (mai) e buon lavoro (e buone vacanze, io domani saro' a galleggiare sul mar Rosso)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 26-06-2010 alle 11:18. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 314
|
Quote:
Ci penserò meglio quando sarò ispirato
__________________
Athlon64 x2 5600 - AsRock ALiveNF5eSata2+ - kingston 2GB ddr2 800 - GeForce 8800gts 320MB |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Fare la divisione usando altre funzioni non è un problema. L'o(n) invece sembra più impegnativo come requisito. Per ora ho ancora due cicli. Uno per il totale e l'altro in cui divido.
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Anche a me viene in mente così... Ultima modifica di cionci : 26-06-2010 alle 12:52. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non posso postare per non rovinare il gioco, comunque l'idea che avevo è corretta ed è O(N): si va avanti e poi si torna indietro
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Oddio non capisco.. Ho un bug che mi fa sclerare. Se metto l'array da cinque elementi, uguale al tuo, ho i risultati uguali. Se metto quello lungo, ottengo tutti zeri
EDIT: dimenticato di dire che l'ho scritto in java. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 314
|
Quote:
è O(N) sia per quanto riguarda la complessita computazionale sia per la quantità di memoria occupata
__________________
Athlon64 x2 5600 - AsRock ALiveNF5eSata2+ - kingston 2GB ddr2 800 - GeForce 8800gts 320MB |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12939
|
Forse ho trovato la soluzione anche io, tra un po' implemento il codice e vediamo cosa esce con l'array grande
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Sei probabilmente in overflow perche' stai usando interi a 32bit.
Ne servono almeno 64bit Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Se ho copiato bene il vettore di partenza:
|
||
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Certo che sono proprio malato...
Codice:
const int v[] = {2, 1, 3, 1, 2, 2, 3, 3, 4, 3,
3, 1, 1, 4, 4, 4, 2, 2, 4, 4,
4, 2, 2, 4, 2, 3, 1, 1, 3, 3,
2, 1, 3, 4, 3, 4, 2, 1, 4, 1,
3, 1, 4, 4, 1, 2, 1, 2, 4, 1, 2, 4};
const int size = sizeof(v) >> (ffs(sizeof(int)) - 1);
const int last = size - 1;
long long prod[size];
long long res[size];
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
La divisione non serve
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Fatto, ma non mi riesce di non andare in overflow in C
E' che non mi basta la voglia di creare un progetto x64 per espandere gli unsigned long. Cmq m'è venuto lungo una decina di righe, 2N come esecuzione e N come memoria (se consideriamo che il risultato lo scrivo nell'input). |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Un tipo a 64 bit ce l'ha sicuramente il tuo compilatore
Su gcc a 32 bit ad esempio c'è long long... |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12939
|
Fatto, adesso devo fare un programma che controlli i risultati con quelli di cionci
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12939
|
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Occhio che l'algoritmo deve funzionare anche con il test di prova
E anche con array tipo 4 233 1313131 233 14 4443 (Overflow a parte)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
It's magic (cit.) Comunque ora funziona, mi vengono i tuoi stessi risultati. Cmq non ho fatto controllando le frazioni, io l'ho risolto in 2N con un doppio accumulatore... così dovrebbe funzionare con qualsiasi numero fornito in input. In fondo questo problema, quando si rimuove la divisione, diventa una classica Reduction, che dà tanti grattacapi nelle architetture parallele |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:28.




















