# -*- coding: utf-8 -*-
import re
from fractions import Fraction
wyrazenie= re.compile( "{ *(-? *[0-9]*|\( *-? *[0-9]+ */ *-? *[0-9]+ *\)) *x *\+ *(-? *[0-9]*|\( *-? *[0-9]+ */ *-? *[0-9]+ *\)) *y *= *(-? *[0-9]+|-? *[0-9]+ */ *-? *[0-9]+)" )
def liczba_wymierna( napis ):
if napis == "":
return Fraction(1,1)
if '/' in napis:
a,b = map(int,napis.replace('(','').replace(')','').split('/'))
if b == 0:
raise RuntimeError, napis + " nie jest poprawną liczbą wymierną!"
return Fraction(a,b)
return Fraction(int(napis),1)
def rownanie( linia ):
r = wyrazenie.match( linia )
if not r:
raise RuntimeError, "Wyrażenie " + repr(linia) + " jest niepoprawne!"
return map( liczba_wymierna, r.groups() )
def rozwiarz( r1, r2 ):
a1,b1,c1 = r1
a2,b2,c2 = r2
w = a1*b2 - b1*a2
w1 = c1*b2 - b1*c2
w2 = a1*c2 - c1*a2
if w == 0:
print w1,w2
if w1 == 0 or w2 == 0:
raise RuntimeError, "Rownanie ma nieskończenie wiele roziwązań!"
else:
raise RuntimeError, "Rownanie jest nieoznaczone!"
return w1/w, w2/w
x,y = rozwiarz( rownanie( raw_input() ), rownanie( raw_input() ) )
def napis_liczby_wymiernej( f ):
if f.denominator == 1:
return str(f.numerator)
return str(f.numerator)+'/'+str(f.denominator)
print "x= ", napis_liczby_wymiernej(x)
print "y= ", napis_liczby_wymiernej(y)
IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCmltcG9ydCByZQpmcm9tIGZyYWN0aW9ucyBpbXBvcnQgRnJhY3Rpb24KCnd5cmF6ZW5pZT0gcmUuY29tcGlsZSggInsgKigtPyAqWzAtOV0qfFwoICotPyAqWzAtOV0rICovICotPyAqWzAtOV0rICpcKSkgKnggKlwrICooLT8gKlswLTldKnxcKCAqLT8gKlswLTldKyAqLyAqLT8gKlswLTldKyAqXCkpICp5ICo9ICooLT8gKlswLTldK3wtPyAqWzAtOV0rICovICotPyAqWzAtOV0rKSIgKQoKZGVmIGxpY3piYV93eW1pZXJuYSggbmFwaXMgKToKICAgIGlmIG5hcGlzID09ICIiOgogICAgICAgcmV0dXJuIEZyYWN0aW9uKDEsMSkKICAgIGlmICcvJyBpbiBuYXBpczoKICAgICAgIGEsYiA9IG1hcChpbnQsbmFwaXMucmVwbGFjZSgnKCcsJycpLnJlcGxhY2UoJyknLCcnKS5zcGxpdCgnLycpKQogICAgICAgaWYgYiA9PSAwOgogICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIG5hcGlzICsgIiBuaWUgamVzdCBwb3ByYXduxIUgbGljemLEhSB3eW1pZXJuxIUhIgogICAgICAgcmV0dXJuIEZyYWN0aW9uKGEsYikKICAgIHJldHVybiBGcmFjdGlvbihpbnQobmFwaXMpLDEpCgpkZWYgcm93bmFuaWUoIGxpbmlhICk6CglyID0gd3lyYXplbmllLm1hdGNoKCBsaW5pYSApCglpZiBub3QgcjoKCSAgICByYWlzZSBSdW50aW1lRXJyb3IsICJXeXJhxbxlbmllICIgKyByZXByKGxpbmlhKSArICIgamVzdCBuaWVwb3ByYXduZSEiCglyZXR1cm4gbWFwKCBsaWN6YmFfd3ltaWVybmEsIHIuZ3JvdXBzKCkgKQoKZGVmIHJvendpYXJ6KCByMSwgcjIgKToKICAgIGExLGIxLGMxID0gcjEKICAgIGEyLGIyLGMyID0gcjIKICAgIAogICAgdyA9IGExKmIyIC0gYjEqYTIgCiAgICB3MSA9IGMxKmIyIC0gYjEqYzIKICAgIHcyID0gYTEqYzIgLSBjMSphMgogICAgCiAgICBpZiB3ID09IDA6CiAgICAgICBwcmludCB3MSx3MgogICAgICAgaWYgdzEgPT0gMCBvciB3MiA9PSAwOgogICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiUm93bmFuaWUgbWEgbmllc2tvxYRjemVuaWUgd2llbGUgcm96aXfEhXphxYQhIgogICAgICAgZWxzZToKICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIlJvd25hbmllIGplc3Qgbmllb3puYWN6b25lISIKICAgIAogICAgcmV0dXJuIHcxL3csIHcyL3cKICAKCngseSA9IHJvendpYXJ6KCByb3duYW5pZSggcmF3X2lucHV0KCkgKSwgcm93bmFuaWUoIHJhd19pbnB1dCgpICkgKQoKZGVmIG5hcGlzX2xpY3pieV93eW1pZXJuZWooIGYgKToKICAgIGlmIGYuZGVub21pbmF0b3IgPT0gMToKICAgICAgIHJldHVybiBzdHIoZi5udW1lcmF0b3IpCiAgICByZXR1cm4gc3RyKGYubnVtZXJhdG9yKSsnLycrc3RyKGYuZGVub21pbmF0b3IpCgpwcmludCAieD0gIiwgbmFwaXNfbGljemJ5X3d5bWllcm5laih4KQpwcmludCAieT0gIiwgbmFwaXNfbGljemJ5X3d5bWllcm5laih5KQo=