Кількість значень між вхідним та наступним найвищим квадратом


9

Дано додатне квадратне число як вхідне. Виведіть кількість значень між вхідним та наступним найвищим квадратом.

Приклад

Вхід: 1

Вихід: 2

Причина: числа 2 і 3 знаходяться між 1 і 4, наступним найвищим квадратом

Вхід: 4

Вихід: 4

Причина: Числа 5, 6, 7, 8 знаходяться між 4 і 9


1
Який діапазон вхідних значень ми повинні підтримувати?
Мартін Ендер

16
Я думаю, що це було б цікавіше, якби вхід не повинен був бути квадратним.
xnor

1
@xnor Hindsight, я однозначно згоден.
Shayne03

Відповіді:


8

Желе , 2 байти

½Ḥ

Спробуйте в Інтернеті!

Порт моєї відповіді Mathematica (візьміть квадратний корінь, а потім подвійний). Це обмежується входами, які точно можуть бути представлені у вигляді числа з плаваючою комою. Якщо це проблема, трибайтне рішення ƽḤпрацює для довільних квадратів (які Денніс розмістив спочатку, але потім видалили).


1
Ой, я пропустив весь "вхід буде квадратний" ой.
Джонатан Аллан

1
@JonathanAllan і мене теж. Дивна специфікація ІМО.
Цифрова травма

Чи є квадрати, які не можуть бути точно представлені у плаваючій точці?
розкидання

@Christian Sure, числа з плаваючою комою фіксуються за розміром, тому існує лише кінцева кількість значень, які вони можуть представляти.
Мартін Ендер

@MartinEnder У такому випадку, враховуючи підтримку Jelly для довільних точних цілих чисел та відсутність верхньої межі специфікації, я голосую, що він повинен підтримувати всі дійсні дані.
розкидання

12

Мозг-Флак , 38 , 22 байти

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

Спробуйте в Інтернеті!

Я дуже пишаюся цією відповіддю. ІМО, один з моїх найкращих гольфів із головним мозком

Як це працює?

Як зазначають багато інших користувачів, відповідь просто sqrt (n) * 2 . Однак обчислення квадратного кореня в мозку-мозку є дуже нетривіальним. Оскільки ми знаємо, що вхід завжди буде квадратним, ми можемо оптимізувати. Тому пишемо цикл, який віднімає

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

з вводу та відстежуйте, скільки разів він працює. Як тільки він дорівнює 0, відповідь - це просто останнє число, яке ми відняли мінус одне.

Спочатку я штовхнув прилавок на інший стек. Однак ми можемо використовувати сам основний стек як лічильник, збільшуючи висоту стека.

#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
Мій мозок буквально заграв цією приємною роботою.
Чарівний восьминога Урна

9

Математика, 8 байт

2Sqrt@#&

Спробуйте в Інтернеті! (Використання математики.)

Різниця між n 2 та (n + 1) 2 завжди є 2n + 1, але ми просто хочемо, щоб значення між ними виключали обидва кінці, що становить 2n .

Це потенційно може бути скорочено до 2#^.5&залежно від вимог до точності.


1
Як щодо 2√ # &?
chyanog





2

Мозок-Флак , 20 байт

Викрикуючи дивовижний (albiet трохи - трохи більше) відповідь DJMcMayhem в тут

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

Спробуйте в Інтернеті!

Пояснення

Цей код працює шляхом відліку від числа квадрата на непарні кроки. Оскільки кожен квадрат є сумою послідовних непарних чисел, це досягне 0 за n 1/2 кроків. Хитрість тут полягає в тому, що ми насправді відслідковуємо наші кроки в парному числі і використовуємо статику, ()щоб компенсувати її до відповідного непарного числа. Оскільки відповідь 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

Btw, вхід завжди буде сам квадрат.
Мартін Ендер

1
@JonathanAllan Виправлено
розкидайте

@MartinEnder Я повністю перечитав виклик, то ... в інтересах не копіювати вашу відповідь (оскільки зараз очевидно, чому це працює) я залишу цю справу.
розкидання






1

Додайте ++ , 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 байт)

Я впевнений, що це можна значно зменшити (редагувати: спасибі Луїс), але наївне рішення:

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 , яка була найсвіжішою на момент виклику, тому відповідь на нього буде прийнятна навіть за нашим старим стандартом)
Луїс Мендо

1
Спасибі Луїс! Я здивований, що мій наївний підхід марнував лише 1 персонажа відносно майстра MATL. :)
DrQuarius



0

Аліса , 10 байт

2/*<ER
o@i

Спробуйте в Інтернеті!

Пояснення

Знову обчислює 2 sqrt (n) . Макет економить два байти над стандартним рішенням:

/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

QBIC , 19 9 байт

?sqr(:)*2

Зберегли купу, скопіювавши підхід @ MartinEnder.

На жаль, для QBIC немає посилання на TIO.

Пояснення

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



0

Сітківка , 21 байт

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

Спробуйте в Інтернеті! Пояснення: Працює, беручи квадратний корінь числа на основі трикутного вирішувача чисел @ MartinEnder. Після відповідності квадратного числа, $1різниця між числом квадрата та попереднім номером квадрата, в одинаковому. Ми хочемо наступної різниці, але ексклюзивної, яка лише на 1 більше. Для цього ми підраховуємо кількість нульових рядків у $1.





Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.