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


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).


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))

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.


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.



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.


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

Ü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

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

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.

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.


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



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.





Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.