回答:
½Ḥ
私のMathematica回答の移植版(平方根を取り、それから二重に)。これは、浮動小数点数として正確に表すことができる入力に限定されます。それが問題である場合、3バイトのソリューションƽḤは任意の四角形に対して機能します(デニスが最初に投稿した後、削除しました)。
{([[]](({})))}{}([]<>)
私はこの答えをとても誇りに思っています。IMO、私の最高のブレーンフレークゴルフの1つ。
他の多くのユーザーが指摘したように、答えは単にsqrt(n)* 2です。ただし、ブレインフレークの平方根を計算することは非常に重要です。入力は常に正方形になることがわかっているため、最適化できます。したがって、減算するループを作成します
1, 3, 5, 7, 9...
入力から、それが実行される回数を追跡します。それが0に達すると、答えは単純に私たちが引いた最後の数から1を引いたものです。
もともと、私はカウンターを他のスタックにプッシュしていました。ただし、スタックの高さを増やすことで、メインスタック自体をカウンターとして使用できます。
#While TOS (top of stack, e.g. input) != 0:
{
#Push:
(
#The negative of the height of the stack (since we're subtracting)
[[]]
#Plus the TOS pushed twice. This is like incrementing a counter by two
(({}))
)
#Endwhile
}
#Pop one value off the main stack (or in other words, decrement our stack-counter)
{}
#And push the height of the stack onto the alternate stack
([]<>)
python-y疑似コードでは、これは基本的に次のアルゴリズムです。
l = [input]
while l[-1] != 0: #While the back of the list is nonzero
old_len = len(l)
l.append(l[-1])
l.append(l[-1] - old_len)
l.pop()
print(len(l))
2Sqrt@#&
オンラインでお試しください!(数学を使用しています。)
n 2と(n + 1)2の差は常に2n + 1ですが、両端を除いた2nの値が必要です。
これは2#^.5&、精度要件に応じて短縮される可能性があります。
?2*vp
以前、私は質問を読み間違えました。このバージョンは、完全な二乗だけでなく、任意の正の整数入力に対して機能します。
?dv1+d*1-r-p
「入力は正方形になります」の警告を逃しましたが、これはすべての負でない整数で機能します... Martin Enderはすでに2バイトの解決策を提供しています。
½‘Ḟ²’_
カウントを返すモナディックリンク。
ここで DJMcMayhemの驚くべき(少し長いアルバイト)答えを叫びます
{({}()[({}()())])}{}
このコードは、平方数から奇数の増分でカウントダウンすることによって機能します。すべての正方形は連続する奇数の合計であるため、これはn 1/2ステップで0に到達します。ここでの秘訣は、実際にステップを偶数で追跡し、static ()を使用してそれを適切な奇数にオフセットすることです。答えは2n 1/2なので、この偶数が私たちの答えになります。したがって、0に到達するとゼロを削除し、答えはスタックのそこに置かれます。
@(n)2*n^.5
Martinのはるかに優れたアプローチを使用して15バイトを節約しました。範囲は2*sqrt(n)要素で構成されます。関数は正確にそれを行います:2入力のルートと乗算します。
½‘R²Ṫ_‘
説明:
½‘R²Ṫ_ Input: 40
½ Square root 6.32455532...
‘ Increment 7.32455532...
R Range [1, 2, 3, 4, 5, 6, 7]
² Square [1, 4, 9, 16, 25, 36, 49]
Ṫ Tail 49
_‘ Subtract input+1 8
+?
_
S
+1
^2
-1
-G
O
それがどのように機能するか知りたいですか?まあ、恐れるな!私はあなたを教育するためにここにいます!
+? Add the input to x (the accumulator)
_ Store the input in the input list
S Square root
+1 Add 1
^2 Square
-1 Subtract 1
-G Subtract the input
O Output as number
これは大幅に削減できると確信していますが(編集:Luisに感謝)、単純な解決策は次のとおりです。
X^QUG-q
X^ % Take the square root of the input (an integer)
QU % Square the next integer to find the next square
G- % Subtract the input to find the difference
q % Decrement solution by 1 to count only "in between" values.
2/*<ER
o@i
再度、2 sqrt(n)を計算します。レイアウトにより、標準ソリューションよりも2バイト節約されます。
/o
\i@/2RE2*
IPのリダイレクトを除く、コードの内訳:
2 Push 2 for later.
i Read all input.
i Try reading more input, pushes "".
2 Push 2.
R Negate to get -2.
E Implicitly discard the empty string and convert the input to an integer.
Then take the square root of the input. E is usually exponentiation, but
negative exponents are fairly useless in a language that only understands
integers, so negative exponents are interpreted as roots instead.
* Multiply the square root by 2.
o Output the result.
@ Terminate the program.
?sqr(:)*2
@MartinEnderのアプローチをコピーすることで、多くを節約しました。
残念ながら、QBICのTIOリンクはありません。
? PRINT
sqr( ) The square root of
: the input
*2 doubled
.+
$*
(^1?|11\1)+
$1
オンラインでお試しください!説明:@MartinEnderの三角数値ソルバーに基づいて、数値の平方根をとることで機能します。平方数を一致させた後$1は、平方数と前の平方数の差を単項で表したものです。私たちは次の違いを望んでいますが、排他的です。これを達成するために、null文字列の数をカウントし$1ます。
n->2*Math.sqrt(n)
注:これはJava 8またはJava 9でimport java.util.function.*;取得する必要IntFunction<T>がありjava.util.functionますが、パッケージはデフォルトでJShellにインポートされます。