LoginSignup
0
0

More than 3 years have passed since last update.

お洒落に数式っぽく競技プログラミングをしたい

Posted at

きっかけ

真っ白いRubyプログラムをみて、Pythonでも似たようなことができないかな、と思ってこの記事を書きました。

注意

この記事は真面目に競技プログラミングをしたい人には役に立ちません。AtCoder Problemsなどで、暇な時に簡単な問題を面白く解きたい人向けです。

説明

ギリシャ文字とアルファベットを使い、Pythonで数式にしか見えないコードを書きます。数学好きにはたまらないと思います。残念なことに、は関数名として使えませんでした......。方針:組込関数を全て置き換えてます。

テンプレート

def sin(x):
    print(x)


def cos(x):
    return int(x)

def tan(x):
    return str(x)

#型変換・表示

def π(x):
    return sorted(x)

def Δ(x):
    return list(x)

def Σ(x):
    return tuple(x)

def Π(x):
    return set(x)

def μ(x):
    return len(x)

def Φ(x,y):
    return x+[y]

#list,tuple,set

def dx(x):#階乗
    if x <= 1:
        return 1
    else:
        return dx(x-1)

def dy():
    return input()

def lim(x):
    return x.split()

def log(s,x,y):
    return s.replace(x,y)

def λ(x,y):
    return x in y

def arcsin(x):
    return max(x)

def arccos(x):
    return min(x)

def arctan(x,y):
    return x[y]

まず、この関数を書いてください。(一応、三角関数・逆三角関数よく使うギリシャ文字などを入れました。)

AtCoderの問題を解く

まずは、簡単な問題から解きましょう。ABC133 A - T or Tを解きます。

α = lim(dy())
sin(arccos([cos(arctan(α,1))*cos(arctan(α,0)),cos(arctan(α,2))]))

なぜか数学っぽく見えます!

次に、この問題を解きます。ABC040 C - 柱柱柱柱柱

この問題は簡単なDPで解けます。
この問題は、この数学っぽいプログラムではTLEします。(小さいテストケースではACます)

N = cos(dy())
a = lim(dy())
l = [0,abs(cos(arctan(a,0))-cos(arctan(a,1)))]
for i in range(2,N):
    l = Φ(l,arccos([arctan(l,-1)+abs(cos(arctan(a,i-1))-cos(arctan(a,i))),
                arctan(l,-2)+abs(cos(arctan(a,i-2))-cos(arctan(a,i)))]))

sin(arctan(l,-1))

数式らしくていいですね。他にも、色々な問題が(一応)解けます。是非使ってみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0