Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese di utilizzo intensivo e l'analisi di oltre 50 scatti, l'articolo offre una panoramica approfondita di Nintendo Switch 2. Vengono esaminate le caratteristiche che la definiscono, con un focus sulle nuove funzionalità e un riepilogo dettagliato delle specifiche tecniche che ne determinano le prestazioni
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


Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
vivo X200 FE: il top di gamma si è fatto tascabile? vivo X200 FE: il top di gamma si è fatto ...
Hanno creato l’IA che li ha sostituiti: ...
Broadcom cambia ancora il programma per ...
Un processore quasi del tutto sconosciut...
Tutte le migliori offerte AliExpress son...
Grazie al telescopio ALMA e al JWST &egr...
Elon Musk apre un ristorante: ecco il pr...
Stranger Things 5, ecco il primo teaser ...
SpaceX ha lanciato con un razzo spaziale...
L'UE punta forte sull'IA e mette 200 mil...
Hanoi dice addio ai motorini a benzina: ...
AMD Ryzen AI 5 330: 4 core e NPU da 50 T...
Tesla sta per lanciare la Model YL: pass...
Scegliere la cartuccia giusta: i consigl...
'Non è un nuovo gioco, ma lo semb...
Google Discover con riassunti generati d...
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: 19:42.


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