Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-10-2008, 20: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 19:29.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21: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, 21: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, 21: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, 21: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 21:40.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2008, 21: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, 21: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, 21: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, 22: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, 22: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, 22: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, 22: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, 22: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, 22: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, 22: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, 22: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, 22: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, 22: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, 22: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, 22: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


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Nasce l'albo degli influencer 'rilevanti...
Il Digital Networks Act è stato r...
ASUS ROG ha lanciato due nuovi monitor d...
I nuovi iPhone 18 Pro potrebbero present...
Una parte dei Galaxy S26 avrà chi...
Amazon permetterà agli autori ind...
Il caso Zuckerberg a Palo Alto: una scuo...
Texas contro Roblox: il procuratore gene...
Offerte auto da urlo su Amazon: da CarPl...
Windows 11 26H1 in arrivo fra pochi mesi...
Un Black Friday continuo a rilascio lent...
Redmi Pad Pro da 12,1" 2560x2600 pi...
Tesla Roadster rinviata (di nuovo): ora ...
Il nuovo TV premium 2025 Samsung OLED 4K...
Ecco una TV QLED da 55'' che costa 303€:...
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: 23:09.


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