Toon posts:

[Java] Rekenen met expressies uit een String

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het probleem dat opgelost moet worden is simpel. Ik zal een voorbeeld geven:

2*a^2 - 15*b^3 + 4*c = -3*a^3 + b^2 - 112*c^2

(geen idee of dit wat oplevert, maar het gaat om het idee)

De bedoeling is om a, b en c te vinden. Nu kun je dat vrij simpel 'brute forcen' door wat waarden voor a, b en c in een for-loop te zetten. Bovendien is de expressie ik krijg steeds een andere (ja tis soort van puzzel en je moet de puzzle in 5 seconden doen).

Wat is het probleem nu? Ik heb bovenstaande expressie als een String. En met een String kun je niet rekenen. Ik wil het namelijk zo doen:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(int a = 0; a < 9; a++)
{
    for(int b = 0; b < 9; b++)
    {
          for(int c = 0; c < 9; c++)
          {
               if(2*a^2 - 15*b^3 + 4*c == -3*a^3 + b^2 - 112*c^2)
               {
                    //deze if kan in mijn geval niet, want ik krijg de expressie als String
                    //en heb geen tijd om het 'hardcoded' zoals hier in de if te zetten
               }
          }
    }
}


De vraag: Heeft iemand een idee hoe je met een expressie in een String kan 'rekenen'?

  • XKB
  • Registratie: Oktober 1999
  • Laatst online: 05-04-2021

XKB

Anonymous functional

Je kan zoeken op parsing en lexing op bijvoorbeeld google. Voor een string als deze kan je relatief eenvoudig een simpele parser maken.

Overigens wel een beetje overkill voor zon probleem. Je kan het vast ook met regexes oplossen op de 1 of andere manier.

Choose for Choice! Choose Linux! | src van icon


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 24-05 20:08
Volgens mij kan je dit meestal niet numeriek oplossen (los van de inefficientie). Dit komt omdat je 3 onbekenden hebt en slechts 1 vergelijking. Dus je zou bv a wel in b en c uit kunnen drukken, maar daar houdt het meestal mee op.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
XKB schreef op 29 december 2003 @ 13:59:
Overigens wel een beetje overkill voor zon probleem. Je kan het vast ook met regexes oplossen op de 1 of andere manier.
Een Reguliere Expressie en een Reguliere Grammatica hebben allebei dezelfde uitdrukkingskracht. Je kunt dan ook een RE zo converteren in een RG.
Feitelijk zal een reguliere expressie dan ook de grammatica 'parsen', alleen dan niet door er een gehele AST aan te hangen en dan de symboliek aan te hangen.

  • XKB
  • Registratie: Oktober 1999
  • Laatst online: 05-04-2021

XKB

Anonymous functional

Glimi schreef op 29 december 2003 @ 16:43:
[...]

Een Reguliere Expressie en een Reguliere Grammatica hebben allebei dezelfde uitdrukkingskracht. Je kunt dan ook een RE zo converteren in een RG.
Feitelijk zal een reguliere expressie dan ook de grammatica 'parsen', alleen dan niet door er een gehele AST aan te hangen en dan de symboliek aan te hangen.
Ik bedoelde dingen als ORO of Jregex, "simpele" Java regex libraries.

Maar je hebt idd gelijk :)

Choose for Choice! Choose Linux! | src van icon


  • -Klimaks-
  • Registratie: Maart 2001
  • Laatst online: 13:42
Ik dacht dat ik ooit een library was tegengekomen die vrolijk omging met dit soort problemen, zal straks even kijken of ik het nog kan vinden.

In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Alpha Centauri.
Zaphod in The Hitchhikers Guide To The Galaxy


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Glimi schreef op 29 december 2003 @ 16:43:
[...]

Een Reguliere Expressie en een Reguliere Grammatica hebben allebei dezelfde uitdrukkingskracht.
niet mee eens, een grammatica kan iets als recursie, iets wat met een reguliere expressie niet mogelijk is (ja, met die perl extensies oid, maar zo waren regexen nooit bedoeld)
Je kunt dan ook een RE zo converteren in een RG.
Dat wel, maar andersom niet.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
.oisyn: niet mee eens, een grammatica kan iets als recursie, iets wat met een reguliere expressie niet mogelijk is.
Hij zegt niet voor niets reguliere grammaticas.

Talen worden vaak onderverdeeld in de Chomsky hierarchie. Deze hierarchie definieert een aantal deelverzamelingen van talen en de grammaticale kracht die je nodig hebt om die talen te beschrijven.

De grammaticas waar jij op doelt zijn context-vrije grammaticas. Deze worden gebruikt voor context-vrije talen. Reguliere expressies en reguliere grammaticas zijn twee notaties voor reguliere talen.

Simpele expressie taaltjes zoals de taal van de topicstarter zijn vaak al niet meer niet regulier.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Aha, dat wist ik niet, weer wat geleerd :). Maar dan vind ik z'n opmerking eigenlijk nergens op slaan ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
.oisyn schreef op 29 december 2003 @ 17:56:
Aha, dat wist ik niet, weer wat geleerd :). Maar dan vind ik z'n opmerking eigenlijk nergens op slaan ;)
"Spreek niet hoogmoedig in de derde persoon als deze persoon het horen kan"
Hoezeer de opmerking geen oplossing bied voor het probleem, haakt het wel in op de opmerking van XKB en plaats het gewoon een feitje erbij. Dat is niet 'nergens op slaan', maar een bepaalde mate van off-topic posten.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ach, het is op zich wel nuttig: Hij geeft aan dat de keuze tussen een grammatica of een reguliere expressie slechts een notatie keuze is. Het is tussen al deze regexp nerds wel eens goed om te benadrukken dat (een bepaalde deelverzameling van) 'gewone' grammaticas precies dezelfde talen beschrijven.

Een grammatica voor grotere of lastigere talen ook veel duidelijker zijn. In Perl 6 kan je ook een dergelijke notatie gaan gebruiken, zoals Arien hier (6-6-2002 @12:21) een keertje liet zien, naar aanleiding van een opmerking van mij in een regexp topic.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • -Klimaks-
  • Registratie: Maart 2001
  • Laatst online: 13:42
Hier http://www.singularsys.com/jep vind je de Java Math Expression Parser. Is denk ik wat je zoekt.

In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Alpha Centauri.
Zaphod in The Hitchhikers Guide To The Galaxy


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Glimi schreef op 29 december 2003 @ 18:19:
[...]

"Spreek niet hoogmoedig in de derde persoon als deze persoon het horen kan"
ik hoopte natuurlijk ook gewoon dat je het zou lezen :Y)
Hoezeer de opmerking geen oplossing bied voor het probleem
daar doelde ik dan ook niet op :)
haakt het wel in op de opmerking van XKB
nou daar doelde ik dus wel op, aangezien XKB het natuurlijk over context-vrije grammatica's heeft (of een subset daarvan), hence de "parsers" in zijn opmerking over "parsers en lexers". Jouw opmerking, hoewel waar en interessant, leek me dan ook niet helemaal van toepassing op de opmerking van XKB, vandaar mijn opmerking
en plaats het gewoon een feitje erbij.
dat zonder meer :)

Maar we zijn aan het mierenneuken

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
.oisyn schreef op 29 december 2003 @ 18:56:
nou daar doelde ik dus wel op, aangezien XKB het natuurlijk over context-vrije grammatica's heeft (of een subset daarvan), hence de "parsers" in zijn opmerking over "parsers en lexers".
offtopic:
Reguliere Grammatica's zijn een subset van context vrije grammatica's. Je kunt elke context vrije grammatica dan ook transformeren in een reguliere maar niet altijd van een RG naar een CVG.
Een RG is in de vorm van
N = non-terminal
T = terminal
N -> T+ N?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

offtopic:
met subset doelde ik meer op LL, LR en LALR grammatica's, en je gaat aan het punt voorbij

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1