|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
[Vari] Context 1: Bitmap
Volevo aprire una serie di topic con alcuni esercizi che possono essere interessanti.
L'idea sarebbe quella di proporre una soluzione efficiente, indipendentemente dal linguaggio. Ovvero concentrandosi sugli algoritmi piuttosto che sulla implementazione nel linguaggio X. Ovvio che poi soluzioni eleganti in ciascun linguaggio sono apprezzate. Sia data una bitmap 1000x1000x8bit di profondita', immaginatela a toni di grigio, e codificatela come meglio vi aggrada o come il linguaggio propone. Una matrice bidimensionale di byte e' considerata sufficiente, anche se non e' proprio una bitmap. Si vorrebbe invertire l'ordine dei bit di ciascun byte di colore, effettuando in pratica uno specchio di ciascun byte, nel modo piu' efficiente. Esempio 10001101 diventa 10110001, 00111101 diventa 10111100 e cosi' via. Non e' richiesta la lettura di file o tantomeno la lettura di file tipizzati (gif, jpg, etc.), introducente l'input come meglio aggrada (certo che se si leggesse da file sarebbe meglio).
__________________
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 : 17-07-2008 alle 17:34. Motivo: Testo un po' errato |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12093
|
mmm...
ma per invertire ogni byte di colore non si dovrebbe fare 255 - il valore del byte? ![]() perchè nel post di sopra rivolti il byte anzichè fare 255 - byte? ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
Quote:
Se c'e' 10010000 diventa 00001001 Alcuni che sono gia' di natura simmetrici restano cosi' come sono: 00011000 -> 00011000
__________________
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 : 17-07-2008 alle 17:35. |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12093
|
la soluzione + veloce in assoluto mi sa che è specificare l'endianess dei byte della matrice, ma non so se è possibile nei vari linguaggi...
altirmenti la prima che viene in mente è semplicemente prendere i bit ad uno ad uno e copiarli in un'altro byte in ordine inverso.
__________________
![]() |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Probabilmente non è il massimo dell'efficienza ma potrebbe avere un senso all'aumentare delle dimensioni della matrice (della bitmap) ?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12093
|
Quote:
![]() Chissà come fanno a i vari linguaggi a gestire l'endianess ora che ci penso ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
![]() Ti basta un array come cache
__________________
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 |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Perchè non ci ho pensato a fondo, sono in ufficio, ho letto il post e ho scritto la prima cosa che mi è saltata in mente dopo aver letto la risposta di TigerShark.
Inoltre non ho esperienze solide con queste cose. Inoltre stavo pensando in Java: le HashMap sono comode. Come faresti con un unico array?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12093
|
Quote:
tipo se hai il byte 000000001 scriverai nell'indice 1 dell'array il byte 10000000 ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Visto che hai solo 8 bit di valori, usi un array con 256 elementi
Qualcosa come il seguente (in C++) Codice:
typedef unsigned char uchar8; // o quel che è uchar8 b0 = 1, b1=2, b2=4, b3=8, b4=16, b5=32, b6=64, b7=128; uchar8 invert( uchar8 x ) { return ((x&b0)<<7) + ((x&b1) << 5) + ((x&b2) << 3) + ((x&b3) << 1) +((x&b4)>>1) + ((x&b5) >> 3) + ((x&b6) >> 5) + ((x&b7) >> 7); } void invertMatrix( uchar8** matrix, int rows, int cols ) { uchar8 inverted[256]; for ( int i=0 ; i< 256 ; ++i ) { inverted[i] = invert(i); } for ( int i=0 ; i<rows ; ++i ) { for ( int j=0 ; j<cols ; ++j ) { matrix[i][j] = inverted[ matrix[i][j] ]; } } }
__________________
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 |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Geniale, stavo provando a rifletterci e appunto a capire come mappare l'indice dell'array con il byte originale.
Molto meglio della soluzione con l'hashmap, grazie per la spiegazione ![]() OT: se la Bitmap fosse a profondità maggiore, diciamo 16 bit, come faresti? Non capisco bene questo: Quote:
Se hai tempo e puoi spiegarlo mi faresti un favore, sennò me lo guardo con calma stasera.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 18-07-2008 alle 09:23. |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12093
|
Quote:
Lo stesso fa con gli altri bit e infine somma il risultato ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Jul 2008
Città: Nel mio studio
Messaggi: 168
|
Forse per invertire è meglio fare a gruppi di bit invece che singoli
inverto prima i 4 bit destra - sinistra byte = (byte & 0x0F) << 4 | (byte & 0xF0) >> 4; poi con 2 maschere sposti 2 bit per ogni lato byte = (byte & 0x33) << 2 | (byte & 0xCC) >> 2; ed infine i singoli bit byte = (byte & 0x55) << 1 | (byte & 0xAA) >> 1; Con il codice assembler si potrebbe effettivamente valutare la soluzione migliore
__________________
Since Rocco Siffredi, the saying "pain in the ass" got a total new meaning |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
Dai vabbene.
Questo era il riscaldamento e ovviamente abbiamo trovato la soluzione ottima (ovviamente O(N) dove N e' il numero di pixel), e anche l'algoritmo corretto, ovvero usare un array. Direi che si puo' riassumere con Quando vangono utilizzati molti se non tutti i valori possibili di un range di dominio, allora e' bene usare un array, altrimenti una hastable. Ottimo anche l'algoritmo per trovare lo speculare di un byte, che con una manciata di istruzioni senza cicli e senza salti ottiene subito il risultato. Passiamo oltre.
__________________
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. |
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12093
|
Quote:
![]() Bene, avanti così! ![]() ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
scrivere il byte da destra verso sinistra mica funziona!?! Non ci vuole: byte XOR 0xFF??? Premetto che la soluzione con gli shift mi ha ingrippato parecchio.... ![]()
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
![]() Se i valori sono maggiori penso abbia senso utilizzare comunque una tabella piu' piccola e "cachare" a pezzi. Ad esempio usando qualcosa tipo Codice:
makeUint32( uchar8 x3, uchar8 x2, uchar8 x1, uchar8 x0 ) { return (x3<<24) + (x2<<16) + (x1<<8) + x0; } uchar8 byte(int n,uint32 x) { return (x & (0xff << (n*8))) >> (n*8); } /* ... prepara la tabella inverted come sopra ... */ uint32 invert32( uint32 x) { return makeUint32( inverted[byte(3,x)], inverted[byte(2,x)], inverted[byte(1,x)], inverted[byte(0,x)]); } ![]() Magari si puo' scrivere lo smistamento dei vari bit in modo piu' veloce (non e' una cosa di cui mi occupo abitualmente), ma l'idea e' comunque quella.
__________________
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 |
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12093
|
Quote:
![]() gugoxx intendeva che bisognava invertire il byte NON in senso colorimetrico (che si ottiene con 255 - byte), ma bisognava fare un mirror del byte attorno all'asse centrale... ad esempio 10000000 diventa 00000001, 01000000 diventa 00000010 e così via ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#20 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
È ancora valido questo contest? Posso postare la mia soluzione?
Ciao |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:19.