入力と次に高い二乗の間の値の数


9

入力として正の平方数を指定します。入力と次に高い二乗の間の値の数を出力します。

入力:1

出力:2

理由:2と3は1と4の間で、次に大きい正方形

入力:4

出力:4

理由:5、6、7、8の数字は4から9の間です


1
どの範囲の入力値をサポートする必要がありますか?
マーティンエンダー2017年

16
入力が正方形である必要がなかった場合、これはもっと興味深いでしょう。
xnor

1
@xnor Hindsight、私は間違いなく同意します。
Shayne03

回答:


8

ゼリー、2バイト

½Ḥ

オンラインでお試しください!

私のMathematica回答の移植版(平方根を取り、それから二重に)。これは、浮動小数点数として正確に表すことができる入力に限定されます。それが問題である場合、3バイトのソリューションƽḤは任意の四角形に対して機能します(デニスが最初に投稿した後、削除しました)。


1
ああ、私は「入力は正方形になる」おっと全体を逃しました。
ジョナサンアラン

1
@JonathanAllan私も。変な仕様のIMO。
デジタルトラウマ2017年

浮動小数点で正確に表現できない正方形はありますか?
散布

@クリスチャン確かに、浮動小数点数はサイズが固定されているため、表現できる値の数は有限です。
マーティンエンダー2017年

@MartinEnderその場合、Jellyが任意精度整数をサポートし、仕様に上限がないため、すべての有効な入力をサポートするように投票します。
散布

12

脳高射砲38、22のバイト

{([[]](({})))}{}([]<>)

オンラインでお試しください!

私はこの答えをとても誇り思っています。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))

2
私の脳は文字通り、この素晴らしい仕事に失敗しました。
Magic Octopus Urn






2

Brain-Flak、20バイト

ここで DJMcMayhemの驚くべき(少し長いアルバイト)答えを叫びます

{({}()[({}()())])}{}

オンラインでお試しください!

説明

このコードは、平方数から奇数の増分でカウントダウンすることによって機能します。すべての正方形は連続する奇数の合計であるため、これはn 1/2ステップで0に到達します。ここでの秘訣は、実際にステップを偶数で追跡し、static ()を使用してそれを適切な奇数にオフセットすることです。答えは2n 1/2なので、この偶数が私たちの答えになります。したがって、0に到達するとゼロを削除し、答えはスタックのそこに置かれます。




1

ゼリー、7バイト

½‘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

ところで、入力は常に正方形そのものです。
マーティンエンダー2017年

1
@JonathanAllan固定
散布

@MartinEnder私は完全に挑戦を誤解しました...それであなたの答えをコピーしないために(これがなぜ機能するかは今では明らかなので)これはそのままにしておきます。
2017年






1

Add ++22 20バイト

+?
_
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

私の元のQBIC回答と同じロジックがありましたが、より短い方法があります。
steenbergh

1

MATL(8 7バイト)

これは大幅に削減できると確信していますが(編集: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.

1
あなたは置き換えることができます2^ によってU(これは、バージョン20.1.1で働いていた、それも私たちの古い規格で資格がある答えので、挑戦している時点で最も新しいだった、)
ルイス・Mendo

1
ルイス、ありがとう!私の素朴なアプローチがMATLマスターに比べて1文字しか無駄にしていないことに驚いています。:)
DrQuarius



0

アリス、10バイト

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.


0

QBIC19 9バイト

?sqr(:)*2

@MartinEnderのアプローチをコピーすることで、多くを節約しました。

残念ながら、QBICのTIOリンクはありません。

説明

?          PRINT
 sqr( )    The square root of
     :     the input
        *2 doubled



0

網膜、21バイト

.+
$*
(^1?|11\1)+
$1

オンラインでお試しください!説明:@MartinEnderの三角数値ソルバーに基づいて、数値の平方根をとることで機能します。平方数を一致させた後$1は、平方数と前の平方数の差を単項で表したものです。私たちは次の違いを望んでいますが、排他的です。これを達成するために、null文字列の数をカウントし$1ます。





弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.