|
|
|
![]() |
|
Strumenti |
![]() |
#41 | ||
Senior Member
Iscritto dal: Dec 2007
Città: brianza
Messaggi: 717
|
Quote:
![]() comunque il titolo è :"Affrontare l'Informatica" autori : Daniela Cappelletti Sandra Frigiolini Luigi Giacchetti editore: Loescher Ahh la fretta... ![]() Quote:
Codice:
Lettura completata in 120.084256519 millisecondi.Caricata una matrice 200x200. Inizio la ricerca... completata in 103166.230345 millisecondi. Risultato: posizione (94, 59) larghezza 56 somma 3185 Script terminated. Codice:
Inizio la ricerca... completata in 5039.79835426 millisecondi.Risultato: posizione (94, 59) larghezza 56 somma 3185 Script terminated. Codice:
Inizio la ricerca... completata in 4981.60464528 millisecondi.Risultato: posizione (94, 59) larghezza 56 somma 3185 Script terminated.
__________________
AMD Ryzen 9700X MSI RX 480 Gaming X 8G ASRock B850 Pro-A Windows 11 Pro RAM DDR5 16GBx2 TEAMGROUP T-Create Expert 6000 MHz CL30 SSD Crucial T500 4TB case Corsair Carbide 200R |
||
![]() |
![]() |
![]() |
#42 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
![]() ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#43 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Lo metto subito a scaricare, anche se so che la maggior parte della colpa non è di Python, ma di questa anticaglia da cui vi scrivo.
![]() Comunque visto che è interessante e poco invasivo, da quel che vedo, lo provo e poi rilancio il programma. ![]() ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#44 |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Bene. Mi ci sono messo un pò, e ora dichiaro a tutti voi il vostro PWNAGE!
![]() matrix loading, su matrix2.txt (200x200) funzionante richiede....... 3 millisecondi! Chi ci riesce con phyton gli do la bambolina ![]() Tuttavia c'ha solo un minimo problema, legge le cifre al contrario. Quando avrò tempo vedrò di fixarlo... |
![]() |
![]() |
![]() |
#45 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
È davvero pazzesco, su questo stesso PC di prima mi ha ridotto il tempo di esecuzione da 35 minuti a 4 minuti!
![]() E dal momento che a grigor il tempo viene già così di 5 secondi, voglio provare una modifica che evita un pochino di cicli inutili. Se poi ho tempo lo traduco anche in C e vedo fin dove lo posso spingere. ![]() Quote:
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 18-08-2008 alle 09:56. |
|
![]() |
![]() |
![]() |
#46 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Aggiornamento: ho spremuto ancora un po' il codice, da 4 minuti sono sceso a poco più di 2 minuti sulla mia macchina:
Codice:
Lettura completata in 1204.76541679 millisecondi. Caricata una matrice 200x200. Inizio la ricerca... completata in 128279.977036 millisecondi. Risultato: posizione (94, 60) larghezza 56 somma 3185 Psyco è davvero forte. ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#47 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12814
|
Ci siamo finalmente, sono stato un po' tardo, ma per il 1° punto sembra che tutto finalmente vada per il verso giusto.
Ecco il codice (ho escluso la parte del caricamento da file) in C#: Codice:
static int findSub(int[,] mat) { int p = 0; int next_i = 0; int next_j = 0; int max_i = 0; int max_j = 0; int max = 0; for (int i = 0; i < dim - 1; i++) { for (int j = 0; j < dim - 1; j++) { if (mat[i, j] == 0) { next_i = i; next_j = j; p = 1; for (int k = p - 1; k >= 0 && k <= dim && i < dim - 1 && j < dim - 1; k--) { if (mat[i - k, j + 1] == 0 && mat[i + 1, j - k] == 0) { if (k == 0 && mat[i + 1, j + 1] == 0) { i++; j++; k = ++p; } } else break; } i = next_i; j = next_j; if (p > max) { max = p; max_i = next_i; max_j = next_j; } } } } Console.WriteLine("Max dimension found: " + max + " at index (" + max_i + ", " + max_j + ")"); // viewMatrix(mat, max_i, max_j, max); return max; } Codice:
Matrix dimensions: 1000 Max dimension found: 10 at index (110,257) Elapsed: 26,7577ms |
![]() |
![]() |
![]() |
#48 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Giuro che questa è l'ultima versione del primo punto che posto. Tempo impiegato circa 1/3 della precedente
![]() Codice:
require 'tools' def min(a,b,c) a < b ? a < c ? a : c : b < c ? b : c end def contest5a(matrix) best = best_row = best_col = 0 c = r = matrix.size - 1 while c >= 0 do matrix[r][c] = matrix[r][c] == 0 ? 1 : 0 c -= 1 end c = r = matrix.size-1 while r >= 0 do matrix[r][c] = matrix[r][c] == 0 ? 1 : 0 r -= 1 end c = r = matrix.size - 2 while r >= 0 do while c >= 0 do matrix[r][c] = matrix[r][c] == 0 ? 1 + min(matrix[r+1][c], matrix[r][c+1], matrix[r+1][c+1]) : 0 if matrix[r][c] > best best, best_row, best_col = matrix[r][c], r, c end c -= 1 end c = matrix.size - 2 r -= 1 end return "best:#{best} row:#{best_row} col:#{best_col}" end test_function :contest5a, 'Matrix1.txt' Codice:
mirco@Macintosh:Contest5> ruby contest-a.rb carico la matrice... fatto (1.064655 secondi) trovo la sottomatrice... fatto (0.611063 secondi) best:10 row:110 col:257 |
![]() |
![]() |
![]() |
#49 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Codice:
require 'tools.rb' start = Time.now() matrix = fast_load_matrix() puts "Carico la matrice.... ok. (" + (Time.now - start).to_s + " secondi)" Codice:
mirco@Macintosh:Contest5> ruby prova.rb Carico la matrice.... ok. (0.000311 secondi) ![]() |
|
![]() |
![]() |
![]() |
#50 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Ah ma lui intendeva il solo caricamento! Pensavo la ricerca, LOL.
![]() E comunque quello non è Python... ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#51 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
|
![]() |
![]() |
![]() |
#52 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Solo un dubbio: sbaglio o modifichi la matrice? (è ammessa la modifica?)
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#53 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Penso di si. Al massimo si può allocare una matrice di appoggio su cui scrivere. La memoria richiesta raddoppia e le prestazioni ridursi di pochissimo per via di qualche cache miss in più.
Ultima modifica di VICIUS : 18-08-2008 alle 01:13. |
![]() |
![]() |
![]() |
#54 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Portata in C anche la soluzione al secondo punto:
Codice:
Lettura completata in 380 millisecondi. Inizio la ricerca... Ricerca completata in 21.42000 secondi. Sottomatrice quadrata di somma massima: -> index: 12094 -> side: 56 -> sum: 3185 Devo stampare il sottoquadrato (94; 60)-(150; 116). [...] Per comodità allego un file .zip con le soluzioni, postarle qui occuperebbe troppo spazio. ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 18-08-2008 alle 09:52. |
![]() |
![]() |
![]() |
#55 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Bravo Vicius!
__________________
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) |
|
![]() |
![]() |
![]() |
#56 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
![]() Codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #include <time.h> #define BUFFER_SIZE 4096 typedef enum tagStati { S_ERROR = -1, S0, S1, S2 } Stati; int GetArraySize(const char *szFileName) { int array_size; FILE *fp; char buffer[BUFFER_SIZE + 1]; int numread; int k; char c; fp = fopen(szFileName, "rb"); if ( fp == NULL ) { printf("Errore nell'apertura del file %s\n", szFileName); return S_ERROR; } numread = fread(buffer, 1, BUFFER_SIZE, fp); if (numread == 0) { fclose(fp); printf("Errore 4 nella lettura del file %s\n", szFileName); return S_ERROR; } *(buffer + numread + 1) = '\0'; k = 0; c = *(buffer + k); array_size = 0; while ( c != '\n' ) { if ( c >= '0' && c <= '9' ) { array_size = array_size * 10 + c - '0'; } c = *(buffer + k++); } fclose(fp); return array_size; } Stati DFA(const char *szFileName, int **a, int array_size) { Stati stato = S0; FILE *fp; unsigned char buffer[BUFFER_SIZE + 1]; int numblocks; int numread; char c; int k, x; int riga, colonna; int num; int segno; fp = fopen(szFileName, "rb"); if ( fp == NULL ) { printf("Errore nell'apertura del file %s\n", szFileName); return S_ERROR; } if ( fseek(fp, 0, SEEK_END) ) return 0; numblocks = ftell(fp)/BUFFER_SIZE; if ( numblocks == 0 ) { numblocks = 1; } else { if ( ftell(fp) % BUFFER_SIZE != 0 ) numblocks++; } fseek(fp, 0, SEEK_SET); numread = fread(buffer, 1, BUFFER_SIZE, fp); if (numread == 0) { fclose(fp); printf("Errore 1 nella lettura del file %s\n", szFileName); return S_ERROR; } k = 0; c = *(buffer + k++); while ( c != '\n' ) { if (c == '\0') { printf("Errore 2 nella lettura del file.\n"); fclose(fp); return S_ERROR; } c = *(buffer + k++); } riga = colonna = 0; num = 0; x = 0; while ( x < numblocks ) { c = *(buffer + k++); switch ( stato ) { case S0: segno = 1; if ( c >= '0' && c <= '9' ) { num = c - '0'; stato = S1; } else if ( c == '-' ) { num = 0; stato = S2; } else if ( c == '\r' ) { } else if ( c == '\n' ) { colonna = 0; riga++; if (riga >= array_size) return stato; } else { printf("Automa: Stato S0 errore sul carattere -> '%c' k -> %d\n", c, k); return S_ERROR; } break; case S1: if ( c >= '0' && c <= '9' ) { num = num * 10 + c - '0'; } else if ( c == ' ' ) { a[riga][colonna] = num * segno; num = 0; colonna++; stato = S0; } else { printf("Automa: Stato S1 errore sul carattere -> '%c'\n", c); return S_ERROR; } break; case S2: if ( c >= '0' && c <= '9' ) { num = c - '0'; segno = -1; stato = S1; } else { printf("Automa: Stato S2 errore sul carattere -> '%c'\n", c); return S_ERROR; } break; } if ( k >= BUFFER_SIZE ) { numread = fread(buffer, 1, BUFFER_SIZE, fp); if (numread == 0) { fclose(fp); printf("Errore 3 nella lettura del file %s\n", szFileName); return S_ERROR; } k = 0; x++; } } fclose(fp); return stato; } int main() { clock_t c_start, c_end; int **m; int x, y, k; int array_size; Stati stato; char *szFileName = "matrix2.txt"; int riga, colonna; int dim; int somma; int riga2, colonna2; int riga_temp, colonna_temp; int dim_temp; int somma_temp; c_start = clock(); array_size = GetArraySize(szFileName); if ( array_size <= 0 ) return; m = (int**)malloc(sizeof(int*)*array_size); if ( m != NULL ) { for ( x = 0; x < array_size; x++ ) { m[x] = (int*)malloc(sizeof(int)*array_size); if ( m[x] == NULL ) { printf("Memoria insufficiente.\n"); return S_ERROR; } } } else { printf("Memoria insufficiente.\n"); return S_ERROR; } stato = DFA(szFileName, m, array_size); if ( stato == S_ERROR ) { printf("L'automa ha restituito un errore.\n"); return; } c_end = clock(); printf("\nTempo impiegato per la lettura del file -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC); c_start = clock(); x = y = 0; while ( x < array_size - x && y < array_size - y ) { somma = somma_temp = 0; dim = array_size/2; while ( dim > 1 ) { for ( riga = y; riga <= y + dim; riga++ ) { for ( colonna = x; colonna <= x + dim; colonna++ ) { somma += m[riga][colonna]; } if ( somma > somma_temp ) { riga_temp = riga - dim; colonna_temp = colonna - dim; dim_temp = dim; somma_temp = somma; } } somma = 0; --dim; } x++; y++; } riga = riga_temp - 1; colonna = colonna_temp - 1; dim = dim_temp + 1; k = 0; somma = somma_temp; while ( riga >= 0 ) { y = riga--; x = colonna--; for ( k = 0; k < dim; k++ ) { somma += m[y][x+(k+1)]; if ( somma > somma_temp ) { riga_temp = riga; colonna_temp = colonna; dim_temp = dim; somma_temp = somma; } } dim++; } riga = riga_temp + 1; colonna = colonna_temp + 1; dim = dim_temp; somma = 0; for ( y = riga; y <= riga + dim; y++ ) { for ( x = colonna; x <= colonna + dim; x++ ) { somma += m[y][x]; } } if ( somma > somma_temp ) { riga_temp = riga; colonna_temp = colonna; dim_temp = dim; somma_temp = somma; } c_end = clock(); printf("\nRiga -> %d\nColonna -> %d\nDimensione -> %d\nSomma -> %d\n", riga_temp, colonna_temp, dim_temp, somma_temp); printf("\nTempo impiegato per la ricerca -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC); for ( x = 0; x < array_size; x++ ) free(m[x]); free(m); return 0; } ![]() |
![]() |
![]() |
![]() |
#57 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12814
|
Incredibile
![]() In sostanza parto dall'origine (0,0) sommando tutti gli elementi della 2x2 dopodiché vi aggiungo quelli della 3x3, poi quelli della 4x4 e così via facendo sempre confronti col massimo attuale... poi cambio posizione (0,1), (0,2) e così via... Ultima modifica di WarDuck : 18-08-2008 alle 11:37. |
![]() |
![]() |
![]() |
#58 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Tu mi fai paura.
![]() A parte scherzi, ottimo risultato. ![]() Già che ci sei proveresti anche a lanciare la mia soluzione per il punto? Sono curioso di vedere quanto tempo impiega su un computer degno di tale nome. ![]() ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#59 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Comunque, sbaglio io o la sottomatrice è 56x56, e non 55x55? Ho visto l'output stampato dal mio programma (che è 56x56) una volta terminata la ricerca e sommando i numeri mi viene effettivamente 3185...
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#60 | |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
![]() Beh davvero complimenti... lo sospettavo che le versioni migliori sarebbero uscite più in là... cmq come diavolo hai fatto? Io ho tolto qualsiasi cosa, cioè la conversione in float la faccio con un elenco di else if ![]() Dev'essere iostream che non è esattamente velocissimo. Magari una macchina a stati andrebbe di più. Peccato che non abbia idea di come si fa ![]() Cmq niente bambolina, l'hai fatto in Ruby, non in Phyton ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:18.