#!/usr/bin/env python3
from math import gcd
class Rational( object ) :
def __init__ ( self , n, d = 1 ) :
if d != 0 :
g = gcd( abs ( n) , abs ( d) )
self .numer , self .denom = n // g, d // g
else :
raise ZeroDivisionError
def __add__ ( self , that) :
match type ( that) .__name__:
case 'Rational' :
return Rational(
self .numer * that.denom + that.numer * self .denom , \
self .denom * that.denom
)
case 'int' :
return Rational( self .numer + that * self .denom , self .denom )
case _:
return NotImplemented
## if isinstance(that, Rational):
## return Rational(
## self.numer * that.denom + that.numer * self.denom,\
## self.denom * that.denom
## )
## elif isinstance(that, int):
## return Rational(self.numer + that * self.denom, self.denom)
## else:
## return NotImplemented
def __sub__ ( self , that) :
match type ( that) .__name__:
case 'Rational' :
return Rational(
self .numer * that.denom - that.numer * self .denom , \
self .denom * that.denom
)
case 'int' :
return Rational( self .numer - that * self .denom , self .denom )
case _:
return NotImplemented
## if isinstance(that, Rational):
## return Rational(
## self.numer * that.denom - that.numer * self.denom,\
## self.denom * that.denom
## )
## elif isinstance(that, int):
## return Rational(self.numer - that * self.denom, self.denom)
## else:
## return NotImplemented
def __mul__ ( self , that) :
match type ( that) .__name__:
case 'Rational' :
return Rational( self .numer * that.numer , self .denom * that.denom )
case 'int' :
return Rational( self .numer * that, self .denom )
case _:
return NotImplemented
## if isinstance(that, Rational):
## return Rational(self.numer * that.numer, self.denom * that.denom)
## elif isinstance(that, int):
## return Rational(self.numer * that, self.denom)
## else:
## return NotImplemented
def __truediv__( self , that) :
match type ( that) .__name__:
case 'Rational' :
return Rational( self .numer * that.denom , self .denom * that.numer )
case 'int' :
return Rational( self .numer , self .denom * that)
case _:
return NotImplemented
## if isinstance(that, Rational):
## return Rational(self.numer * that.denom, self.denom * that.numer)
## elif isinstance(that, int):
## return Rational(self.numer, self.denom * that)
## else:
## return NotImplemented
def __repr__ ( self ) :
return f'{self.numer}/{self.denom}'
if __name__ == '__main__' :
oneHalf = Rational( 1 , 2 )
print ( oneHalf)
twoThirds = Rational( 2 , 3 )
print ( twoThirds)
print ( oneHalf / 7 )
print ( Rational( 1 , 2 ) )
x = Rational( 1 , 3 )
print ( x)
y = Rational( 5 , 7 )
print ( y)
print ( oneHalf + twoThirds)
y = Rational( 3 )
print ( y)
print ( Rational( 66 , 42 ) )
print ( oneHalf + twoThirds)
print ( oneHalf + oneHalf * twoThirds)
print ( ( oneHalf + oneHalf) * twoThirds)
print ( oneHalf + ( oneHalf * twoThirds) )
r = Rational( 2 , 3 )
print ( r * r)
print ( r * 2 )
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoKZnJvbSBtYXRoIGltcG9ydCBnY2QKCmNsYXNzIFJhdGlvbmFsKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbiwgZCA9IDEpOgogICAgICAgIGlmIGQgIT0gMDoKICAgICAgICAgICAgZyA9IGdjZChhYnMobiksIGFicyhkKSkKICAgICAgICAgICAgc2VsZi5udW1lciwgc2VsZi5kZW5vbSA9IG4gLy8gZywgZCAvLyBnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IKICAgIGRlZiBfX2FkZF9fKHNlbGYsIHRoYXQpOgogICAgICAgIG1hdGNoIHR5cGUodGhhdCkuX19uYW1lX186CiAgICAgICAgICAgIGNhc2UgJ1JhdGlvbmFsJzoKICAgICAgICAgICAgICAgIHJldHVybiBSYXRpb25hbCgKICAgICAgICAgICAgICAgICAgICBzZWxmLm51bWVyICogdGhhdC5kZW5vbSArIHRoYXQubnVtZXIgKiBzZWxmLmRlbm9tLFwKICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbm9tICogdGhhdC5kZW5vbQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgY2FzZSAnaW50JzoKICAgICAgICAgICAgICAgIHJldHVybiBSYXRpb25hbChzZWxmLm51bWVyICsgdGhhdCAqIHNlbGYuZGVub20sIHNlbGYuZGVub20pCiAgICAgICAgICAgIGNhc2UgXzoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAojIyAgICAgICAgaWYgaXNpbnN0YW5jZSh0aGF0LCBSYXRpb25hbCk6CiMjICAgICAgICAgICAgcmV0dXJuIFJhdGlvbmFsKAojIyAgICAgICAgICAgICAgICBzZWxmLm51bWVyICogdGhhdC5kZW5vbSArIHRoYXQubnVtZXIgKiBzZWxmLmRlbm9tLFwKIyMgICAgICAgICAgICAgICAgc2VsZi5kZW5vbSAqIHRoYXQuZGVub20KIyMgICAgICAgICAgICAgICAgKQojIyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRoYXQsIGludCk6CiMjICAgICAgICAgICAgcmV0dXJuIFJhdGlvbmFsKHNlbGYubnVtZXIgKyB0aGF0ICogc2VsZi5kZW5vbSwgc2VsZi5kZW5vbSkKIyMgICAgICAgIGVsc2U6CiMjICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICBkZWYgX19zdWJfXyhzZWxmLCB0aGF0KToKICAgICAgICBtYXRjaCB0eXBlKHRoYXQpLl9fbmFtZV9fOgogICAgICAgICAgICBjYXNlICdSYXRpb25hbCc6CiAgICAgICAgICAgICAgICByZXR1cm4gUmF0aW9uYWwoCiAgICAgICAgICAgICAgICAgICAgc2VsZi5udW1lciAqIHRoYXQuZGVub20gLSB0aGF0Lm51bWVyICogc2VsZi5kZW5vbSxcCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZW5vbSAqIHRoYXQuZGVub20KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGNhc2UgJ2ludCc6CiAgICAgICAgICAgICAgICByZXR1cm4gUmF0aW9uYWwoc2VsZi5udW1lciAtIHRoYXQgKiBzZWxmLmRlbm9tLCBzZWxmLmRlbm9tKQogICAgICAgICAgICBjYXNlIF86CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIyMgICAgICAgIGlmIGlzaW5zdGFuY2UodGhhdCwgUmF0aW9uYWwpOgojIyAgICAgICAgICAgIHJldHVybiBSYXRpb25hbCgKIyMgICAgICAgICAgICAgICAgc2VsZi5udW1lciAqIHRoYXQuZGVub20gLSB0aGF0Lm51bWVyICogc2VsZi5kZW5vbSxcCiMjICAgICAgICAgICAgICAgIHNlbGYuZGVub20gKiB0aGF0LmRlbm9tCiMjICAgICAgICAgICAgICAgICkKIyMgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0aGF0LCBpbnQpOgojIyAgICAgICAgICAgIHJldHVybiBSYXRpb25hbChzZWxmLm51bWVyIC0gdGhhdCAqIHNlbGYuZGVub20sIHNlbGYuZGVub20pCiMjICAgICAgICBlbHNlOgojIyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgZGVmIF9fbXVsX18oc2VsZiwgdGhhdCk6CiAgICAgICAgbWF0Y2ggdHlwZSh0aGF0KS5fX25hbWVfXzoKICAgICAgICAgICAgY2FzZSAnUmF0aW9uYWwnOgogICAgICAgICAgICAgICAgcmV0dXJuIFJhdGlvbmFsKHNlbGYubnVtZXIgKiB0aGF0Lm51bWVyLCBzZWxmLmRlbm9tICogdGhhdC5kZW5vbSkKICAgICAgICAgICAgY2FzZSAnaW50JzoKICAgICAgICAgICAgICAgIHJldHVybiBSYXRpb25hbChzZWxmLm51bWVyICogdGhhdCwgc2VsZi5kZW5vbSkKICAgICAgICAgICAgY2FzZSBfOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiMjICAgICAgICBpZiBpc2luc3RhbmNlKHRoYXQsIFJhdGlvbmFsKToKIyMgICAgICAgICAgICByZXR1cm4gUmF0aW9uYWwoc2VsZi5udW1lciAqIHRoYXQubnVtZXIsIHNlbGYuZGVub20gKiB0aGF0LmRlbm9tKQojIyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRoYXQsIGludCk6CiMjICAgICAgICAgICAgcmV0dXJuIFJhdGlvbmFsKHNlbGYubnVtZXIgKiB0aGF0LCBzZWxmLmRlbm9tKQojIyAgICAgICAgZWxzZToKIyMgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgIGRlZiBfX3RydWVkaXZfXyhzZWxmLCB0aGF0KToKICAgICAgICBtYXRjaCB0eXBlKHRoYXQpLl9fbmFtZV9fOgogICAgICAgICAgICBjYXNlICdSYXRpb25hbCc6CiAgICAgICAgICAgICAgICByZXR1cm4gUmF0aW9uYWwoc2VsZi5udW1lciAqIHRoYXQuZGVub20sIHNlbGYuZGVub20gKiB0aGF0Lm51bWVyKQogICAgICAgICAgICBjYXNlICdpbnQnOgogICAgICAgICAgICAgICAgcmV0dXJuIFJhdGlvbmFsKHNlbGYubnVtZXIsIHNlbGYuZGVub20gKiB0aGF0KQogICAgICAgICAgICBjYXNlIF86CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIyMgICAgICAgIGlmIGlzaW5zdGFuY2UodGhhdCwgUmF0aW9uYWwpOgojIyAgICAgICAgICAgIHJldHVybiBSYXRpb25hbChzZWxmLm51bWVyICogdGhhdC5kZW5vbSwgc2VsZi5kZW5vbSAqIHRoYXQubnVtZXIpCiMjICAgICAgICBlbGlmIGlzaW5zdGFuY2UodGhhdCwgaW50KToKIyMgICAgICAgICAgICByZXR1cm4gUmF0aW9uYWwoc2VsZi5udW1lciwgc2VsZi5kZW5vbSAqIHRoYXQpCiMjICAgICAgICBlbHNlOgojIyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBmJ3tzZWxmLm51bWVyfS97c2VsZi5kZW5vbX0nCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgb25lSGFsZiA9IFJhdGlvbmFsKDEsIDIpCiAgICBwcmludChvbmVIYWxmKQogICAgdHdvVGhpcmRzID0gUmF0aW9uYWwoMiwgMykKICAgIHByaW50KHR3b1RoaXJkcykKICAgIHByaW50KG9uZUhhbGYgLyA3KQogICAgcHJpbnQoUmF0aW9uYWwoMSwgMikpCiAgICB4ID0gUmF0aW9uYWwoMSwgMykKICAgIHByaW50KHgpCiAgICB5ID0gUmF0aW9uYWwoNSwgNykKICAgIHByaW50KHkpCiAgICBwcmludChvbmVIYWxmICsgdHdvVGhpcmRzKQogICAgeSA9IFJhdGlvbmFsKDMpCiAgICBwcmludCh5KQogICAgcHJpbnQoUmF0aW9uYWwoNjYsIDQyKSkKICAgIHByaW50KG9uZUhhbGYgKyB0d29UaGlyZHMpCiAgICBwcmludChvbmVIYWxmICsgb25lSGFsZiAqIHR3b1RoaXJkcykKICAgIHByaW50KChvbmVIYWxmICsgb25lSGFsZikgKiB0d29UaGlyZHMpCiAgICBwcmludChvbmVIYWxmICsgKG9uZUhhbGYgKiB0d29UaGlyZHMpKQogICAgciA9IFJhdGlvbmFsKDIsIDMpCiAgICBwcmludChyICogcikKICAgIHByaW50KHIgKiAyKQo=
compilation info
Traceback (most recent call last):
File "/usr/lib/python3.9/py_compile.py", line 144, in compile
code = loader.source_to_code(source_bytes, dfile or file,
File "<frozen importlib._bootstrap_external>", line 918, in source_to_code
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "./prog.py", line 13
match type(that).__name__:
^
SyntaxError: invalid syntax
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python3.9/py_compile.py", line 150, in compile
raise py_exc
py_compile.PyCompileError: File "./prog.py", line 13
match type(that).__name__:
^
SyntaxError: invalid syntax
stdout