Rating: 4.0

The output is output = sin(flag % pi()).

We can get flag % pi() = arcsin(output) using a binary search. Note that there are 2 possible answers.

So, we want to calculate k such that flag - k * pi() = arcsin(output).

Due to the Decimal, these values are calculated in 300-digits precision. That means,

pi          =           3.1415...4120
k           = xxxx...xxxx
k * pi      = wwww...wwww.wwww...wwww
flag        = yyyy...yyyy
flag - k*pi = zzzz...zzzz.zzzz...zzzz = arcsin(output)

To get correct k, determine from least-significant-digit to most-significant-digit of k so that the lower digits of arcsin(output) + k * pi will all be zero. This can be done in integers.

Considering 2 outputs of arcsin and some noise in arcsin, we get some candidates of k, and get a flag.

Original writeup (https://gist.github.com/n-ari/f3caa913483ed5a7831ab04ff6fcef40).