Количество значений между входом и следующим наивысшим квадратом


9

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

пример

Вход: 1

Выход: 2

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

Вход: 4

Выход: 4

Причина: числа 5, 6, 7, 8 от 4 до 9


1
Какой диапазон входных значений мы должны поддерживать?
Мартин Эндер

16
Я думаю, что это было бы более интересно, если бы ввод не был квадратом.
xnor

1
@xnor Оглядываясь назад, я определенно согласен.
Shayne03

Ответы:


8

Желе , 2 байта

½Ḥ

Попробуйте онлайн!

Порт моего ответа Mathematica (взять квадратный корень, затем дважды). Это ограничено входными данными, которые могут быть представлены точно как число с плавающей запятой. Если это проблема, трехбайтовое решение ƽḤработает для произвольных квадратов (которые Деннис сначала опубликовал, но затем удалил).


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

1
@JonathanAllan Я тоже. Странная спецификация ИМО.
Цифровая травма

Есть ли квадраты, которые нельзя представить точно в плавающей точке?
разброс

@Christian Конечно, числа с плавающей точкой имеют фиксированный размер, поэтому они могут представлять только конечное число значений.
Мартин Эндер

@MartinEnder В этом случае, учитывая поддержку Jelly целых чисел произвольной точности и отсутствие верхней границы спецификации, я голосую за то, что она должна поддерживать все допустимые входные данные.
разброс

12

Brain-Flak , 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

Mathematica, 8 байт

2Sqrt@#&

Попробуйте онлайн! (Используя математику.)

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

Это может быть сокращено в 2#^.5&зависимости от требований к точности.


1
Как насчет 2√ # &?
chyanog



2

Желе ,  7  6 байт

Я пропустил предостережение "входные данные будут квадратными", но это будет работать для всех неотрицательных целых чисел ... Мартин Эндер уже дал 2-байтовое решение .

½‘Ḟ²’_

Монадическая ссылка, возвращающая счет.

Попробуйте онлайн!



2

Brain-Flak , 20 байтов

Приветствую удивительный ответ DJMcMayhem (albiet чуть дольше) здесь

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

Попробуйте онлайн!

объяснение

Этот код работает путем обратного отсчета от квадратного числа с нечетным приращением. Поскольку каждый квадрат является суммой последовательных нечетных чисел, он достигнет 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

Кстати, вход всегда будет сам квадрат.
Мартин Эндер

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, но есть более короткий путь .
Стинберг

1

MATL ( 8 7 байт)

Я уверен, что это может быть значительно уменьшено (edit: спасибо Луис), но наивное решение:

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.

Нет ссылки TIO для QBIC, к сожалению.

объяснение

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