Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-10-2008, 19:54   #1
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
[vari] Contest 6 - Parsing

Per riempire il buco lasciato da Gugo nella numerazione dei contest, propongo il seguente:

Problema 1:
Sia dato, in input, un array di stringhe; ogni stringa rappresenta un'espressione aritmetica.
Gli operatori validi sono: - (unario e binario), + (unario e binario), *, /, ^.
Quest'ultimo rappresenta l'operatore di elevamento a potenza:

2^3 si legge 2 elevato a 3.

Si produca, in output, un file di testo in cui ogni riga contiene l'espressione seguita dal segno di uguale seguito dal risultato.
Per esempio, se in input abbiamo la seguente espressione:

3 * (2.5 + 5)

in output avremo:

3 * (2.5 + 5) = 22.5

In caso di errori, dopo il segno di uguale, va riportata la descrizione dell'errore.
Per esempio:

3 * (2.5 + 5 = Errore: parentesi non bilanciate.

I file possono essere scaricati da QUI.

La prima riga del file contiene il numero di espressioni da valutare; le righe restanti contengono le espressioni(una per ogni riga).


Problema 2:
Sia dato, in input, un array di stringhe contenenti espressioni in formato RPN.
Fornire, in output, un file di testo che contenga le espressioni equivalenti(seguite dal segno di uguale e dal risultato) in notazione infissa.

Per esempio:

input: 3 5 * 4 +
output : 3 * 5 + 4 = 19


I file per il secondo problema possono essere scaricati da QUI

il file espressioni3.txt è quello piccolo; espressioni4.txt è quello grosso.

ATTENZIONE: nella notazione RPN, per distinguere il meno unario da quello binario, è necessario utilizzare due diversi simboli. Nei file suindicati, il simbolo ~ rappresenta il meno unario. Il meno binario è rappresentato dal simbolo usuale: -


Ultima modifica di Vincenzo1968 : 27-10-2008 alle 18:29.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 20:00   #2
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Questi i link ai contest precedenti:

Contest 1

Contest 2

Contest 3

Contest 4

Contest 5

Contest 7

Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 20:20   #3
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Bello, proviamo a lavorarci un po'.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 20:23   #4
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Il formato è libero? Numeri e simboli possono essere separati da un qualsiasi numero di spazi?
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 20:26   #5
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Bello, proviamo a lavorarci un po'.
Grazie

Questi sono i miei tempi:

sul file piccolo:


sul file grosso:


La mia macchina:
Codice:
AMD Athlon(tm) 64 X2
Dual Core Processor 4800+
2.50 GHz
896 MB di RAM

Microsoft Windows XP Professional (32 bit)
Service Pack 3
Questa è la prima parte dei file di output:

file piccolo:


file grosso:



Il sorgente in C può essere scaricato da qui

Ne riporto solo una parte:

Codice:
void Calcola(Array *pArray, char *szFileName)
{
	double dblResult;
	char szResult[1024] = "";
	char szError[256] = "";
	int k;
	FILE *fp;

	fp = fopen(szFileName, "w+");

	for (k = 0; k < pArray->size; k++)
	{
		nNextPos = 0;
		PreviousTokenType = EOL;
		sp_op = 0; 
		sp_val = 0;              

		dblResult = EvalInfix(pArray->m[k], szError);
		if ( szError[0] != '\0' )
			sprintf(szResult, "%s = %s\n", pArray->m[k], szError);
		else
			sprintf(szResult, "%s = %lf\n", pArray->m[k], dblResult);
		fwrite(szResult, strlen(szResult), 1, fp);
	}

	fclose(fp);
}

int main()
{
	Stati stato;
	Array myArray;
	char *szFileName = "espressioni1.txt";
	char *szFileNameOutput = "output1.txt";
	int k;
	clock_t c_start, c_end;

	c_start = clock();
	myArray.m = NULL;
	stato = DFA(szFileName, &myArray);
	c_end = clock();

	printf("\nTempo impiegato per il caricamento dei dati -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC);

	c_start = clock();
	if ( stato != S_ERROR )
		Calcola(&myArray, szFileNameOutput);

	if ( myArray.m != NULL )
	{
		for(k = 0; k < myArray.size; k++)
		{
			if ( myArray.m[k] != NULL )
				free(myArray.m[k]);
		}
		free(myArray.m);
	}
	c_end = clock();

	printf("\nTempo impiegato per il calcolo delle espressioni -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC);

	return 0;
}
Ho utilizzato l'algoritmo conosciuto col nome di Operator Precedence Parsing.

P.S. Dimenticavo: se volete, potete utilizzare tools come Yacc/Bison o ANTLR.
Sono a disposizione per la spiegazione dell'algoritmo che ho utilizzato

Ultima modifica di Vincenzo1968 : 26-10-2008 alle 20:40.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 20:27   #6
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Il formato è libero? Numeri e simboli possono essere separati da un qualsiasi numero di spazi?
Si: gli spazi possono esserci come in:

5.8 + 3.9

oppure no come in:

5.8+3.9

Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 20:52   #7
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Il formato è libero? Numeri e simboli possono essere separati da un qualsiasi numero di spazi?
Le espressioni non contengono nomi di variabili. I token sono costituiti esclusivamente da numeri in virgola mobile, operatori e parentesi.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 20:56   #8
wizard1993
Senior Member
 
L'Avatar di wizard1993
 
Iscritto dal: Apr 2006
Messaggi: 22462
un dettaglio ma se seguo quello che mi hanno insegnato a scuola metà delle espressioni sono sbagliate: mi spiego
-8.5 + 49.96/(3 + -77.83/2)
è errata perchè ci sono due segni ( ... + -77.83....) in successione; a me a scuola quando scrivo una cosa del genere la prof fa un segno rosso e mette il cacolo sbagliato; quando usi quella notazione dte intendi dire questo?
( ... + (-77.83)....)
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza
wizard1993 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:01   #9
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da wizard1993 Guarda i messaggi
un dettaglio ma se seguo quello che mi hanno insegnato a scuola metà delle espressioni sono sbagliate: mi spiego
-8.5 + 49.96/(3 + -77.83/2)
è errata perchè ci sono due segni ( ... + -77.83....) in successione; a me a scuola quando scrivo una cosa del genere la prof fa un segno rosso e mette il cacolo sbagliato; quando usi quella notazione dte intendi dire questo?
( ... + (-77.83)....)
Prova a compilare queste righe in C:

Codice:
	double dbl = -8.5 + 49.96/(3 + -77.83/2);
	printf("valore -> %lf\n", dbl);
vedrai che il compilatore non si lamenta
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:05   #10
wizard1993
Senior Member
 
L'Avatar di wizard1993
 
Iscritto dal: Apr 2006
Messaggi: 22462
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi
Prova a compilare queste righe in C:

Codice:
	double dbl = -8.5 + 49.96/(3 + -77.83/2);
	printf("valore -> %lf\n", dbl);
vedrai che il compilatore non si lamenta
nemmeno il jdk di lamenta; era solo un dettaglio che mi sembrava giusto chiarire
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza
wizard1993 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:07   #11
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Questi sono i tempi per il primo file, togliendo i vari output.
Codice:
Macintosh:Desktop mirco$ time ruby contest6.rb 

real	0m3.078s
user	0m2.993s
sys	0m0.048s
13 righe di codice, 3 minuti per finire tutto
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:11   #12
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da VICIUS Guarda i messaggi
Questi sono i tempi per il primo file, togliendo i vari output.
Codice:
Macintosh:Desktop mirco$ time ruby contest6.rb 

real	0m3.078s
user	0m2.993s
sys	0m0.048s
13 righe di codice, 3 minuti per finire tutto
E il codice? postalo
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:11   #13
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da wizard1993 Guarda i messaggi
nemmeno il jdk di lamenta; era solo un dettaglio che mi sembrava giusto chiarire
Giustissimo
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:13   #14
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi
E il codice? postalo
Appena faccio andare anche il secondo file. Sto avendo problemi con alcuni caratteri utf8 che sembrano essere in mezzo alle espressioni.
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:16   #15
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da VICIUS Guarda i messaggi
Appena faccio andare anche il secondo file. Sto avendo problemi con alcuni caratteri utf8 che sembrano essere in mezzo alle espressioni.
Strano

Questo è il codice che ho usato per creare i due file:

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define BUFFER_SIZE 4096

char *expr[] = {
	"n + (n - n)/n^(1/2)",
	"n / n^0.5",
	"(n - n) + (n * 2)/(n - n)",
	"(n + n/(n+n)) - n * n/2",
	"n + (n^4^0.5 - n)",
	"(n * n/(1 + n) - 5) / (-4.3 + n^(1/2))",
	"-8.5 + n/(3 + n/2)",
	"-5.21 * n*(-8 + n*(n/(2+n^0.5)))",
	"((n * n/(1 + n) - 8.3) / (-4.3 + n^(1/2)))/(-21.8 * n*(-5 + n*(n/(2+n^0.5))))",
	"((n + n/(n+n)) - n * n/2)*(n / n^0.5)",
	"(n + (n^4^0.5 - n)) - ((n * n/(1 + n) - 5) / (-4.3 + n^(1/2))))"
};

int RangedRand(int range_min, int range_max)
{
	// Generate random numbers in the half-closed interval
	// [range_min, range_max). In other words:
	// range_min <= random number < range_max
	return ((double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min);
	//printf( "  %6d\n", u);
}

void CreaFile()
{
	FILE *fp;
	int i, j, k, x;
	int n;
	char szNum[256];
	int p1, p2;
	float f;
	int len1, len2;
	char szExpr[256];
	int numlines = 200000;

	fp = fopen("espressioni2.txt", "w+");
	
	sprintf(szExpr, "%d\n", numlines);
	fwrite(szExpr, strlen(szExpr), 1, fp);

	for ( i = 0; i < numlines; i++ )
	{
		j = RangedRand(0, 11);
		len1 = strlen(expr[j]);
		k = 0;
		for(n = 0; n < len1; n++)
		{
			if ( expr[j][n] != 'n' )
			{
				szExpr[k++] = expr[j][n];
			}
			else
			{
				p1 = RangedRand(-100, 100);
				p2 = RangedRand(0, 100);
				if ( p2 < 10 )
					f = p1 + (float)p2/10;
				else
					f = p1 + (float)p2/100;
				sprintf(szNum, "%3.2f", f);
				len2 = strlen(szNum);
				if ( szNum[len2 - 1] == '0' )
					szNum[len2 - 1] = '1';
				for(x = 0; x < len2; x++)
					szExpr[k++] = szNum[x];
			}
			szExpr[k] = '\0';
		}
		fwrite(szExpr, strlen(szExpr), 1, fp);
		fwrite("\n", 1, 1, fp);
		//printf("record n. %d\n", i);
	}

	fclose(fp);
}

int main()
{
	srand((unsigned)time(NULL));

	CreaFile();

	return 0;
}
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:21   #16
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Ho aperto il file con Notepad++ e mi dice che il file è in formato Windows/Ansi:



Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:25   #17
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
La riga che dava fastidio era la 6. Più precisamente quello strano carattere a doppia S che ruby sembrava non capire essere utf8.
Codice:
(-49.63 + (39.21^4^0.5 § 87.29)) - ((-93.21 * 84.57/(1 + -85.75) - 5) / (-4.3 + -64.86^(1/2))))
Ho dovuto paciugare un po' con iconv per sistemare la codifica ed ora funziona tutto.

I tempi per il secondo file sono:
Codice:
Macintosh:Desktop mirco$ time ruby contest6.rb 

real	0m6.174s
user	0m6.008s
sys	0m0.102s
Il codice è:
Codice:
File.open('prova.txt', 'r') do |file|
  file.gets # ignora la prima riga
  while expression = file.gets
    begin
      result = eval(expression.chop!.gsub('^', '**'))
      puts "#{expression} = #{result}"
    rescue ZeroDivisionError
      puts "#{expression} : Divisione per zero"
    rescue SyntaxError
      puts "#{expression} : Errore di sintassi nella espressione"
    end
  end
end
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:32   #18
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da VICIUS Guarda i messaggi
La riga che dava fastidio era la 6. Più precisamente quello strano carattere a doppia S che ruby sembrava non capire essere utf8.
Codice:
(-49.63 + (39.21^4^0.5 § 87.29)) - ((-93.21 * 84.57/(1 + -85.75) - 5) / (-4.3 + -64.86^(1/2))))
Ho dovuto paciugare un po' con iconv per sistemare la codifica ed ora funziona tutto.

I tempi per il secondo file sono:
Codice:
Macintosh:Desktop mirco$ time ruby contest6.rb 

real	0m6.174s
user	0m6.008s
sys	0m0.102s
Il codice è:
Codice:
File.open('prova.txt', 'r') do |file|
  file.gets # ignora la prima riga
  while expression = file.gets
    begin
      result = eval(expression.chop!.gsub('^', '**'))
      puts "#{expression} = #{result}"
    rescue ZeroDivisionError
      puts "#{expression} : Divisione per zero"
    rescue SyntaxError
      puts "#{expression} : Errore di sintassi nella espressione"
    end
  end
end
Ok,

in questi casi il risultato dell'espressione dev'essere: Errore: operatore non riconosciuto(l'ho inserito a mano dopo aver creato il codice con il sorgente che ho postato sopra )

Posta i dati relativi alla tua macchina
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:40   #19
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Vicius scusa,

ma l'output viene scritto su file o a video? (sai che non me ne intendo di ruby )

Per il calcolo dei tempi devono essere esclusi i tempi di caricamento dell'array di stringhe dal file, ma debbono essere inclusi i tempi di scrittura sul file di output.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21:41   #20
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Sto su un core2 2.4ghz, 2gb di ram.
VICIUS è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
SpaceX Starship: Ship 37 ha eseguito due...
Sharkoon punta sui case a basso costo, m...
La tua rete Wi-Fi fa pena? Questi FRITZ!...
Amazon, un weekend di fuoco per gli scon...
Ancora 3 smartwatch Amazfit in forte sco...
Sharkoon A60 RGB: dissipatore ad aria du...
HONOR 400 Pro a prezzo bomba su Amazon: ...
Offerte da non perdere: robot aspirapolv...
Apple Watch e Galaxy Watch ai minimi sto...
Il rover NASA Perseverance ha ''raccolto...
NASA e ISRO hanno lanciato il satellite ...
Switch 2 ha venduto 5,82 milioni di cons...
Assassin's Creed Black Flag Remake: le m...
Cosa ci fa una Xiaomi SU7 Ultra alle por...
Promo AliExpress Choice Day: prezzi stra...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:34.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v