fork download
  1. # -*- coding: utf-8 -*-
  2.  
  3. import re
  4. from fractions import Fraction
  5.  
  6. wyrazenie= re.compile( "{ *(-? *[0-9]*|\( *-? *[0-9]+ */ *-? *[0-9]+ *\)) *x *\+ *(-? *[0-9]*|\( *-? *[0-9]+ */ *-? *[0-9]+ *\)) *y *= *(-? *[0-9]+|-? *[0-9]+ */ *-? *[0-9]+)" )
  7.  
  8. def liczba_wymierna( napis ):
  9. if napis == "":
  10. return Fraction(1,1)
  11. if '/' in napis:
  12. a,b = map(int,napis.replace('(','').replace(')','').split('/'))
  13. if b == 0:
  14. raise RuntimeError, napis + " nie jest poprawną liczbą wymierną!"
  15. return Fraction(a,b)
  16. return Fraction(int(napis),1)
  17.  
  18. def rownanie( linia ):
  19. r = wyrazenie.match( linia )
  20. if not r:
  21. raise RuntimeError, "Wyrażenie " + repr(linia) + " jest niepoprawne!"
  22. return map( liczba_wymierna, r.groups() )
  23.  
  24. def rozwiarz( r1, r2 ):
  25. a1,b1,c1 = r1
  26. a2,b2,c2 = r2
  27.  
  28. w = a1*b2 - b1*a2
  29. w1 = c1*b2 - b1*c2
  30. w2 = a1*c2 - c1*a2
  31.  
  32. if w == 0:
  33. print w1,w2
  34. if w1 == 0 or w2 == 0:
  35. raise RuntimeError, "Rownanie ma nieskończenie wiele roziwązań!"
  36. else:
  37. raise RuntimeError, "Rownanie jest nieoznaczone!"
  38.  
  39. return w1/w, w2/w
  40.  
  41.  
  42. x,y = rozwiarz( rownanie( raw_input() ), rownanie( raw_input() ) )
  43.  
  44. def napis_liczby_wymiernej( f ):
  45. if f.denominator == 1:
  46. return str(f.numerator)
  47. return str(f.numerator)+'/'+str(f.denominator)
  48.  
  49. print "x= ", napis_liczby_wymiernej(x)
  50. print "y= ", napis_liczby_wymiernej(y)
  51.  
Runtime error #stdin #stdout #stderr 0.09s 12440KB
stdin
{ (-1/3)x+(3/7)y= 1337/11
{ (1/3)x+(-6/14)y= -4011/33
stdout
1146 2674/3
stderr
Traceback (most recent call last):
  File "prog.py", line 42, in <module>
  File "prog.py", line 37, in rozwiarz
RuntimeError: Rownanie jest nieoznaczone!