Anzahl der Werte zwischen Eingabe und nächsthöherem Quadrat

9

Gegeben eine positive quadratische Zahl als Eingabe. Geben Sie die Anzahl der Werte zwischen der Eingabe und dem nächsthöheren Quadrat aus.

Beispiel

Eingabe: 1

Ausgabe: 2

Grund: Die Zahlen 2 und 3 liegen zwischen 1 und 4, dem nächsthöheren Quadrat

Eingabe: 4

Ausgabe: 4

Grund: Die Zahlen 5, 6, 7, 8 liegen zwischen 4 und 9

Shayne03
quelle
1
Welchen Bereich von Eingabewerten müssen wir unterstützen?
Martin Ender
16
Ich denke, das wäre interessanter gewesen, wenn die Eingabe kein Quadrat sein müsste.
xnor
1
@xnor Rückblick, ich stimme definitiv zu.
Shayne03

Antworten:

8

Gelee , 2 Bytes

½Ḥ

Probieren Sie es online aus!

Port meiner Mathematica-Antwort (Quadratwurzel ziehen, dann verdoppeln). Dies ist auf Eingaben beschränkt, die genau als Gleitkommazahl dargestellt werden können. Wenn dies ein Problem ist, ƽḤfunktioniert die Drei-Byte-Lösung für beliebige Quadrate (die Dennis zuerst gepostet, dann aber gelöscht hat).

Martin Ender
quelle
1
Oh, ich habe die ganze "Eingabe wird ein Quadrat sein" verpasst.
Jonathan Allan
1
@ JonathanAllan Ich auch. Seltsame Spezifikation IMO.
Digitales Trauma
Gibt es Quadrate, die nicht genau im Gleitkomma dargestellt werden können?
Streuung
@Christian Sicher, Gleitkommazahlen haben eine feste Größe, daher gibt es nur eine begrenzte Anzahl von Werten, die sie darstellen können.
Martin Ender
@MartinEnder In diesem Fall sollte Jellys Unterstützung für Ganzzahlen mit beliebiger Genauigkeit und das Fehlen einer Obergrenze für die Spezifikation alle gültigen Eingaben unterstützen.
Streuung
12

Brain-Flak , 38 , 22 Bytes

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

Probieren Sie es online aus!

Ich bin sehr stolz auf diese Antwort. IMO, einer meiner besten Brain-Flak-Golfplätze.

Wie funktioniert es?

Wie viele andere Benutzer bereits betont haben, lautet die Antwort einfach sqrt (n) * 2 . Die Berechnung der Quadratwurzel in Brain-Flak ist jedoch sehr, sehr nicht trivial. Da wir wissen, dass die Eingabe immer ein Quadrat sein wird, können wir optimieren. Also schreiben wir eine Schleife, die subtrahiert

1, 3, 5, 7, 9...

von der Eingabe und verfolgen Sie, wie oft es ausgeführt wird. Sobald es 0 erreicht, ist die Antwort einfach die letzte Zahl, die wir abgezogen haben, minus eins.

Ursprünglich hatte ich einen Zähler auf den anderen Stapel geschoben. Wir können jedoch den Hauptstapel selbst als Zähler verwenden, indem wir die Stapelhöhe erhöhen.

#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
([]<>)

Im Python-y-Pseudocode ist dies im Grunde der folgende Algorithmus:

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))
James
quelle
2
Mein Gehirn wurde buchstäblich von diesem netten Job erschüttert.
Magic Octopus Urn
9

Mathematica, 8 Bytes

2Sqrt@#&

Probieren Sie es online aus!(Mit Mathematik.)

Der Unterschied zwischen n 2 und (n + 1) 2 ist immer 2n + 1, aber wir wollen nur die Werte zwischen ihnen ohne beide Enden, was 2n ist .

Dies kann möglicherweise in 2#^.5&Abhängigkeit von den Genauigkeitsanforderungen verkürzt werden.

Martin Ender
quelle
1
Wie wäre es mit 2√ # &?
Chyanog
2

Brain-Flak , 20 Bytes

Shout out zu DJMcMayhem ist erstaunlich (albiet etwas länger) Antwort hier

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

Probieren Sie es online aus!

Erläuterung

Dieser Code zählt in ungeraden Schritten von der quadratischen Zahl herunter. Da jedes Quadrat die Summe aufeinanderfolgender ungerader Zahlen ist, wird dies in n 1/2 Schritten 0 erreichen . Der Trick dabei ist, dass wir unsere Schritte tatsächlich in einer geraden Zahl verfolgen und eine Statik verwenden (), um sie auf die entsprechende ungerade Zahl zu versetzen. Da die Antwort 2n 1/2 ist , wird diese gerade Zahl unsere Antwort sein. Wenn wir also 0 erreichen, entfernen wir die Null und unsere Antwort liegt dort auf dem Stapel.

Ad-hoc-Garf-Jäger
quelle
1

Oktave , 25 10 Bytes

@(n)2*n^.5

Probieren Sie es online aus!

Durch die Verwendung von Martins viel besserem Ansatz wurden 15 Bytes eingespart. Der Bereich besteht aus 2*sqrt(n)Elementen. Die Funktion macht genau das: Multipliziert 2mit der Wurzel der Eingabe.

Stewie Griffin
quelle
1

Gelee , 7 Bytes

½‘R²Ṫ_‘

Probieren Sie es online aus!

Erläuterung:

½‘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
streuen
quelle
Übrigens ist die Eingabe selbst immer ein Quadrat.
Martin Ender
1
@ JonathanAllan behoben
Streuung
@MartinEnder Ich habe die Herausforderung total falsch verstanden, dann ... um Ihre Antwort nicht zu kopieren (da es jetzt offensichtlich ist, warum das funktioniert), lasse ich diese Frage offen.
Streuung
1

JavaScript ES6, 10 Bytes

n=>n**.5*2

Probieren Sie es online aus! Math.sqrtist ziemlich lang, weshalb wir verwenden**.5

Downgoat
quelle
2
Dann ist das eher ES7 als ES6 ...
Neil
1

TI-Basic, 3 Bytes

2√(Ans

Einfachster Ansatz ...

Timtech
quelle
1

05AB1E , 2 Bytes

Probieren Sie es online aus!

Ein weiterer Hafen von Martin Enders Einreichung ...

Weltraumschrott
quelle
Willkommen bei PPCG!
Erik der Outgolfer
1

Add ++ , 22 20 Bytes

+?
_
S
+1
^2
-1
-G
O

Probieren Sie es online aus!

Möchten Sie wissen, wie es funktioniert? Nun, fürchte dich nicht! Ich bin hier, um dich zu erziehen!

+?   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
Caird Coinheringaahing
quelle
Ich hatte die gleiche Logik für meine ursprüngliche QBIC-Antwort, aber es gibt einen kürzeren Weg .
Steenbergh
1

MATL ( 8 7 Bytes)

Ich bin sicher, dass dies erheblich reduziert werden kann (bearbeiten: danke Luis), aber eine naive Lösung ist:

X^QUG-q

Probieren Sie es online aus!

Erläuterung:

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.
DrQuarius
quelle
1
Sie können ersetzen 2^ durch U(und dies funktionierte in Version 20.1.1 , die zum Zeitpunkt der Herausforderung die neueste war, sodass die Antwort auch nach unserem alten Standard zulässig wäre)
Luis Mendo
1
Danke Luis! Ich bin überrascht, dass mein naiver Ansatz nur 1 Zeichen im Vergleich zum MATL-Master verschwendet hat. :)
DrQuarius
0

Alice , 10 Bytes

2/*<ER
o@i

Probieren Sie es online aus!

Erläuterung

Berechnet erneut 2 sqrt (n) . Das Layout spart zwei Bytes gegenüber der Standardlösung:

/o
\i@/2RE2*

Aufschlüsselung des Codes ohne Umleitung der 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.
Martin Ender
quelle
0

QBIC , 19 9 Bytes

?sqr(:)*2

Durch Kopieren des Ansatzes von @ MartinEnder wurde ein Haufen gespart.

Leider kein TIO-Link für QBIC.

Erläuterung

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

Netzhaut , 21 Bytes

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

Probieren Sie es online aus! Erläuterung: Nimmt die Quadratwurzel der Zahl basierend auf dem dreieckigen Zahlenlöser von @ MartinEnder. Nach dem Abgleichen der Quadratzahl $1ist die Differenz zwischen der Quadratnummer und der vorherigen Quadratnummer unär. Wir wollen den nächsten Unterschied, aber exklusiv, der nur noch 1 ist. Um dies zu erreichen, zählen wir die Anzahl der Nullzeichenfolgen in $1.

Neil
quelle
0

Java (OpenJDK 9) / JShell, 17 Byte

n->2*Math.sqrt(n)

Probieren Sie es online aus!

Hinweis: Dies würde erfordern import java.util.function.*;, um IntFunction<T>in Java 8 oder Java 9 zu erhalten, aber das java.util.functionPaket wird standardmäßig in JShell importiert.

David Conrad
quelle