Liczba wartości między wejściem a następnym najwyższym kwadratem

9

Podano dodatnią liczbę kwadratową jako dane wejściowe. Podaj liczbę wartości między wejściem a następnym najwyższym kwadratem.

Przykład

Wejście: 1

Wyjście: 2

Powód: Liczby 2 i 3 mają wartość od 1 do 4, kolejny najwyższy kwadrat

Wejście: 4

Wyjście: 4

Powód: liczby 5, 6, 7, 8 są między 4 a 9

Shayne03
źródło
1
Jaki zakres wartości wejściowych musimy obsługiwać?
Martin Ender
16
Myślę, że byłoby to bardziej interesujące, gdyby dane wejściowe nie musiały być kwadratem.
xnor
1
@xnor Hindsight, zdecydowanie się zgadzam.
Shayne03

Odpowiedzi:

8

Galaretka , 2 bajty

½Ḥ

Wypróbuj online!

Port mojej odpowiedzi Mathematica (pierwiastek kwadratowy, a następnie podwój). Jest to ograniczone do danych wejściowych, które można przedstawić dokładnie jako liczbę zmiennoprzecinkową. W takim przypadku trzy bajtowe rozwiązanie ƽḤdziała w przypadku dowolnych kwadratów (które Dennis opublikował jako pierwszy, a następnie usunął).

Martin Ender
źródło
1
Och, przegapiłem całe „wejście będzie kwadratowe”.
Jonathan Allan
1
@JonathanAllan Me też. Dziwna specyfikacja IMO.
Cyfrowa trauma
Czy są jakieś kwadraty, których nie można dokładnie przedstawić w liczbach zmiennoprzecinkowych?
rozproszyć
@Christian Oczywiście, liczby zmiennoprzecinkowe mają stały rozmiar, więc istnieje tylko skończona liczba wartości, które mogą reprezentować.
Martin Ender
@MartinEnder W takim przypadku, biorąc pod uwagę wsparcie Jelly dla liczb całkowitych o dowolnej dokładności i brak specyfikacji górnej granicy, głosuję, że powinno ono obsługiwać wszystkie prawidłowe dane wejściowe.
rozproszyć
12

Brain-Flak , 38 , 22 bajtów

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

Wypróbuj online!

Jestem bardzo dumny z tej odpowiedzi. IMO, jedno z moich najlepszych golfowych uderzeń mózgu.

Jak to działa?

Jak zauważyło wielu innych użytkowników, odpowiedzią jest po prostu sqrt (n) * 2 . Jednak obliczanie pierwiastka kwadratowego w wyładowaniach mózgowych jest bardzo nieprofesjonalne. Ponieważ wiemy, że dane wejściowe zawsze będą kwadratem, możemy zoptymalizować. Piszemy więc pętlę, która odejmuje

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

z danych wejściowych i śledź, ile razy działa. Gdy osiągnie wartość 0, odpowiedzią jest po prostu ostatnia liczba, którą odjęliśmy minus jeden.

Początkowo zepchnąłem licznik na drugi stos. Możemy jednak użyć samego stosu głównego jako licznika, zwiększając wysokość stosu.

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

W pseudokodzie python-y jest to zasadniczo następujący algorytm:

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
źródło
2
Mój mózg dosłownie został zniszczony przez tę dobrą robotę.
Magic Octopus Urn
9

Mathematica, 8 bajtów

2Sqrt@#&

Wypróbuj online! (Korzystanie z matematyki.)

Różnica między n 2 a (n + 1) 2 wynosi zawsze 2n + 1, ale chcemy tylko, aby wartości między nimi nie obejmowały obu końców, czyli 2n .

Można to potencjalnie skrócić 2#^.5& zależności od wymagań dotyczących precyzji.

Martin Ender
źródło
1
Co powiesz na 2√ # i?
chyanog
2

dc, 5

?2*vp

Wypróbuj online .


Wcześniej źle odczytałem pytanie. Ta wersja działa na dowolne wartości całkowite dodatnie, nie tylko na idealne kwadraty:

dc, 12

?dv1+d*1-r-p

Wypróbuj online .

Cyfrowa trauma
źródło
2

Brain-Flak , 20 bajtów

Krzyczcie na niesamowitą (choć nieco dłuższą) odpowiedź DJMcMayhem tutaj

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

Wypróbuj online!

Wyjaśnienie

Ten kod działa poprzez odliczanie od liczby kwadratowej o nieparzyste przyrosty. Ponieważ każdy kwadrat jest sumą kolejnych liczb nieparzystych, osiągnie on 0 w krokach co 1/2 . Sztuczka polega na tym, że faktycznie śledzimy nasze kroki w parzystej liczbie i używamy wartości statycznej, ()aby przesunąć ją do odpowiedniej liczby nieparzystej. Ponieważ odpowiedź to 2n 1/2 , ta parzysta liczba będzie naszą odpowiedzią. Kiedy osiągniemy 0, usuwamy zero i nasza odpowiedź znajduje się na stosie.

Ad Hoc Garf Hunter
źródło
1

Oktawa , 25 10 bajtów

@(n)2*n^.5

Wypróbuj online!

Zaoszczędź 15 bajtów, stosując znacznie lepsze podejście Martina. Zakres składa się z 2*sqrt(n)elementów. Funkcja robi dokładnie to: Mnoży 2przez pierwiastek wejściowy.

Stewie Griffin
źródło
1

Galaretka , 7 bajtów

½‘R²Ṫ_‘

Wypróbuj online!

Wyjaśnienie:

½‘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
rozpraszać
źródło
Przy okazji, wejście zawsze będzie samo kwadratem.
Martin Ender
1
@JonathanAllan Naprawiono
rozproszenie
@MartinEnder Całkowicie źle odczytałem wyzwanie, a następnie ... w interesie nie kopiowania twojej odpowiedzi (ponieważ teraz jest oczywiste, dlaczego to działa), zostawię to.
rozproszyć
1

JavaScript ES6, 10 bajtów

n=>n**.5*2

Wypróbuj online! Math.sqrtjest dość długi i dlatego używamy**.5

Downgoat
źródło
2
Więc to ES7 zamiast ES6 ...
Neil
1

TI-Basic, 3 bajty

2√(Ans

Najprostsze podejście ...

Timtech
źródło
1

05AB1E , 2 bajty

Wypróbuj online!

Kolejny port przedłożenia Martina Endera ...

kosmiczne śmieci
źródło
Witamy w PPCG!
Erik the Outgolfer
1

Dodaj ++ , 22 20 bajtów

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

Wypróbuj online!

Chcesz wiedzieć, jak to działa? Nie bój się! Jestem tutaj, aby cię edukować!

+?   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
Cairney Coheringaahing
źródło
Miałem tę samą logikę dla mojej oryginalnej odpowiedzi QBIC, ale jest krótsza droga .
steenbergh
1

MATL ( 8 7 bajtów)

Jestem pewien, że można to znacznie zmniejszyć (edytuj: dzięki Luis), ale naiwnym rozwiązaniem jest:

X^QUG-q

Wypróbuj online!

Wyjaśnienie:

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
źródło
1
Możesz zastąpić 2^ przez U(a działało to w wersji 20.1.1 , która była najnowsza w momencie wyzwania, więc odpowiedź byłaby możliwa nawet według naszego starego standardu)
Luis Mendo
1
Dzięki, Luis! Dziwi mnie, że moje naiwne podejście zmarnowało tylko 1 znak w stosunku do mistrza MATL. :)
DrQuarius
0

PHP , 44 bajty

<?=count(range($argn,(sqrt($argn)+1)**2))-2;

Wypróbuj online!

Jörg Hülsermann
źródło
0

Alice , 10 bajtów

2/*<ER
o@i

Wypróbuj online!

Wyjaśnienie

Ponownie oblicza 2 sqrt (n) . Układ oszczędza dwa bajty w stosunku do standardowego rozwiązania:

/o
\i@/2RE2*

Podział kodu, z wyłączeniem przekierowania adresu 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
źródło
0

Idź , 56 bajtów

import."math"
func f(n float64)float64{return 2*Sqrt(n)}

Wypróbuj online!

całkowicie ludzki
źródło
0

QBIC , 19 9 bajtów

?sqr(:)*2

Uratowałem sporo, kopiując podejście @ MartinEnder.

Niestety nie ma linku TIO do QBIC.

Wyjaśnienie

?          PRINT
 sqr( )    The square root of
     :     the input
        *2 doubled
Steenbergh
źródło
0

Retina , 21 bajtów

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

Wypróbuj online! Objaśnienie: Działa na podstawie pierwiastka kwadratowego z liczby na podstawie trójkątnego solvera liczb Martininandera. Po dopasowaniu liczby kwadratowej, $1jest różnicą między liczbą kwadratową a poprzednią liczbą kwadratową, w jednostkach. Chcemy kolejnej różnicy, ale ekskluzywnej, która jest tylko 1 dodatkową. Aby to osiągnąć, liczymy liczbę łańcuchów zerowych w $1.

Neil
źródło
0

Java (OpenJDK 9) / JShell, 17 bajtów

n->2*Math.sqrt(n)

Wypróbuj online!

Uwaga: Wymagałoby import java.util.function.*;to pobrania IntFunction<T>w Javie 8 lub Java 9, ale java.util.functionpakiet jest domyślnie importowany w JShell.

David Conrad
źródło
0

Haskell, 9 bajtów

(*2).sqrt

Wypróbuj online

Wejścia i wyjścia będą traktowane jako wartości zmiennoprzecinkowe.

Antisthenes
źródło
0

Noether, 7 bajtów

I.5^2*P

Wypróbuj tutaj!

Tak samo jak każda inna odpowiedź: wypisuje dwa razy pierwiastek kwadratowy.

Rozpad beta
źródło