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


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


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

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.


1
Co powiesz na 2√ # i?
chyanog





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.



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.


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

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

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

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.

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

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.


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



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.





Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.