Бедро быть Квадратным


44

Вызов

Итак, кажется, что, хотя у нас есть множество задач, которые работают с квадратными числами или числами других фигур, у нас нет такой, которая просто спрашивает:

Если в качестве входных данных указать целое число n(где n>=0), верните истинное значение, если nэто идеальный квадрат, или значение Фолси, если нет.


правила

  • Вы можете принимать ввод любым разумным и удобным способом, если это разрешено стандартными правилами ввода / вывода. .
  • Вам не нужно обрабатывать входные данные, которые больше, чем те, которые выбранный вами язык может обрабатывать изначально, и которые могут привести к неточностям с плавающей запятой.
  • Выходными данными должно быть одно из двух последовательных значений истинности / ложности (например, trueили false, 1или0 ) - true, если вход является идеальным квадратом, и false, если это не так.
  • Это поэтому выигрывает меньшее количество байт.

Тестовые случаи

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false

@ Нейл, я понял свою ошибку. Я отрекаюсь от этого предложения, и вместо того, чтобы предложить 18014398509481982( 2**54-2), который является представим с двойным, и вызывает ответы , что использование sqrtна провал.
Mego

@Mego Я, вероятно, ошибаюсь или просто неправильно понимаю, что вы говорите, но я уверен, что 2**54-2он по-прежнему больше, чем может безопасно обработать double, по крайней мере в JavaScript18014398509481982 > 9007199254740991
Tom

@Mego Я думаю, что предельное значение равно 9007199515875288. Это не квадрат 94906267, потому что он не представлен в двойном, но если вы возьмете его квадратный корень, то в результате вы получите это целое число.
Нил

@Tom Введите 2**54-2в консоль JS и сравните то, что вы получите 18014398509481982(точное значение). JS выводит точное значение, поэтому 2**54-2представляется двойным. Если это все еще не убеждает вас, возьмите двоичные данные 0100001101001111111111111111111111111111111111111111111111111111, интерпретируйте их как число с плавающей запятой IEEE-754 и посмотрите, какое значение вы получите.
Mego

3
Извините, ребята, отошли на обед и ... ну, это обострилось! И там я подумал, что это будет хороший, простой вызов! Будет ли это включать добавление правила, которое не требует обработки входных данных, которые приводят к неточностям с плавающей запятой на выбранном вами языке?
Лохматый

Ответы:


27

Нейм , 2 байта

q𝕚

Объяснение:

q      Push an infinite list of squares
 𝕚     Is the input in that list?

Когда я говорю «бесконечный», я имею в виду, пока мы не достигнем максимального значения длинных (2 ^ 63-1). Однако Нейм (медленно) переходит к теоретически бесконечно большим BigIntegers.

Попытайся!


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Деннис

Интересный. Итак, это предварительно буферизует список или это генератор / итератор, который продолжает проверять наличие ввода, пока он не завершится?
Патрик Робертс

@PatrickRoberts Можем ли мы поговорить в чате?
Okx

Конечно, просто пинг меня на девятнадцатый байт . Я иногда бываю там.
Патрик Робертс

Ну, это ... ДЕЙСТВИТЕЛЬНО ФУНКЦИОНАЛЬНО
Chromium


8

TI-Basic, 4 байта

not(fPart(√(Ans

Просто проверяет, является ли квадратный корень целым числом, ища ненулевую дробную / десятичную часть.


Можете ли вы добавить TIO (или эквивалент)?
Лохматый

@ Shaggy Я не думаю, что есть. TI-Basic является проприетарным и будет работать только на калькуляторах TI и в эмуляторах, запускающих ПЗУ из калькулятора, поэтому вы не можете легально использовать TI-Basic, если у вас нет калькулятора.
Адам

1
@ Shaggy Если у вас есть какие-либо ПЗУ, вы можете использовать эмулятор (я предпочитаю jstific), чтобы попробовать это онлайн.
Timtech

8

C #, 27 байт

n=>System.Math.Sqrt(n)%1==0

Более правильный / точный способ сделать это будет:

n=>System.Math.Sqrt(n)%1<=double.Epsilon*100

double.Epsilon бесполезен для этого типа проверки . tl; dr: при сравнении чисел> 2 Double.Epsilon в основном совпадает с нулем. Умножение на 100 только немного задержит это.
Роберт Фрейзер

@RobertFraser Я только зашёл по такому посту и не слишком много читал. В любом случае это бесполезно, просто не полезно для больших чисел.
TheLethalCoder

...<int>==0это ...!<int>я думаю
Стэн Струм

@StanStrum нет в C #
TheLethalCoder

7

JavaScript (ES6), 13 байт

n=>!(n**.5%1)

Возвращает true, если квадратный корень из n является целым числом.

Отрывок:

f=
n=>!(n**.5%1)

console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(4));
console.log(f(8));
console.log(f(16));
console.log(f(88));
console.log(f(2147483647));


7

DC, 9

0?dvd*-^p

Выходы 1 для правды и 0 для фальси.

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

0            # Push zero.  Stack: [ 0 ]
 ?           # Push input.  Stack: [ n, 0 ]
  dv         # duplicate and take integer square root.  Stack: [ ⌊√n⌋, n, 0 ]
    d        # duplicate.  Stack: [ ⌊√n⌋, ⌊√n⌋, n, 0 ]
     *       # multiply.  Stack: [ ⌊√n⌋², n, 0 ]
      -      # take difference. Stack: [ n-⌊√n⌋², 0 ]
       ^     # 0 to power of the result.  Stack: [ 0^(n-⌊√n⌋²) ]
        p    # print.

Примеч dc«сек ^команда экспоненцирование дает 0 0 = 1 и 0 п = 0, где п> 0.


Прекрасный! +1 за использование dcтаким гениальным способом.
Wildcard

6

Сетчатка , 18 байт

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

Попробуйте онлайн! Бесстыдно адаптировано из ответа @ MartinEnder на треугольник Это число?но с включенным базовым преобразованием по стоимости 6 байтов.

Обратите внимание, что это число треугольное? не по какой-то необъяснимой причине требовалось поддерживать ноль как треугольное число, поэтому частью адаптации было добавление a, ?чтобы сделать начальную 1 необязательной, позволяя группе соответствовать пустой строке и, следовательно, нулевому вводу. Однако теперь, сопоставив пустую строку, +оператор прекращает повторение, чтобы избежать бесконечного цикла, который случился бы, если бы он продолжал жадно сопоставлять пустую строку (в конце концов, ^1?безусловно, продолжал бы совпадать). Это означает, что он даже не пытается сопоставить другую альтернативу в группе, таким образом избегая совпадения 2, 6, 12 и т. Д. Как указывает @MartinEnder, более простой способ избежать этого при сопоставлении пустой строки заключается в якорь матч на старте, делая группу необязательным для того же счетчику байтов: ^(^1|11\1)*$.


С нетерпением ждем вашего объяснения, почему это не совпадает 2, 6или других чисел в форме n^2-n. ;) (Можно было бы избежать такого объяснения для одного и того же числа байтов ^(^1|11\1)*$.)
Мартин Эндер

@MartinEnder Та же причина, по которой ты не мог использовать (^|1\1)+$, я думаю?
Нил

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

Для записи, +он также прекратил бы цикл, если бы не было пустой альтернативы, например, в случае ((?(1)11\1|1?))+. После того, как была пустая итерация, она не будет пробовать дальнейшие, независимо от того, могут ли они быть пустыми или нет.
Мартин Эндер

@MartinEnder В самом деле, я имел в виду «теперь совпадение» вместо «немедленное совпадение». Исправлена.
Нил


6

MATL , 5 4 байта

Спасибо Луису за то, что он сократил мой однобайтовый длинный код на два байта, сделав его самым коротким.

t:Um

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

Объяснение:

         % Implicit input
t        % Duplicate it
 :       % Range from 1 to input value
  U      % Square the range, to get 1 4 9 ... 
   m     % ismember, Checks if the input is a member of the range of perfect squares

Старый ответ:

X^1\~

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

        % Implicit input
X^      % Square root of input
  1\    % Modulus 1. All perfect squares will have 0, the rest will have decimal value
     ~  % Negate, so the 0 becomes 1, and the decimal values become 0

@ Мего, я не согласен. MATL не может даже сделать mod(2**127-, 1000). Если только последние четыре цифры не равны 0 ....
Стьюи Гриффин

Вы также можете использовать t:Um. Это работает для входов до2^53 , из-за ограниченной точности с плавающей точкой
Луис Мендо

Теперь я вижу, что это похоже на ваше редактирование, только немного короче :-)
Луис Мендо

Хорошо спрятано квадратное командование! U: str2num / string to array / square, Я знал, что должна быть квадратная функция, но я не мог ее найти ...
Стьюи Гриффин,

1
@cairdcoinheringaahing, который был частично нарочно. У меня было два решения, одно было 5 байтов, другое 6 байтов. Луис забил два байта из одного с 6-ю. Таким образом, я спас ему два байта, но я сохранил только один байт на счете ...
Стьюи Гриффин

6

Python 3 , 40 38 байт

Спасибо squid за сохранение 2 байта!

lambda n:n in(i*i for i in range(n+1))

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

Слишком медленно, чтобы вернуть ответ 2147483647 разумное количество времени. (Но написано с использованием генератора для экономии памяти, так как это не стоит никаких байтов.)

Работает в Python 2 также, хотя это OverflowErrorвозможно, rangeесли вы попробуете это с огромными затратами. (А MemoryErrorтакже вероятно в Python 2, также из-за range.)


5

Perl 5 , 14 байт

13 байт кода + -pфлаг.

$_=sqrt!~/\./

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

Вычисляет квадратный корень и ищет, является ли оно целым числом (точнее, если оно не содержит точку ( /\./).


5

Например, не работает для больших номеров4111817668062926054213257208
Emigna

@ Emigna О, потому что это считается длинным? Я думал, что 05AB1E использует Python 3.
Эрик Outgolfer

Сбой для больших входов (заданный вход - 2**127-1простое число Мерсенна).
Mego

Он использует Python 3. Проблема в том, что квадратный корень дает ошибки округления для больших чисел.
Emigna

@ Emigna О ... Я думаю, мне придется найти другой способ, не должно быть трудно.
Эрик Outgolfer

5

Python 3 , 19 байт

lambda n:n**.5%1==0

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


Не подходит для больших входов, например 4111817668062926054213257208.
L3viathan

Исправлено в 25 байтах:lambda n:int(n**.5)**2==n
L3viathan

4
@ L3viathan Это (наряду с любым решением, которое включает в себя sqrt) терпит неудачу на значениях, которые находятся вне диапазона двойного, например 2**4253-1.
Mego

@totallyhuman a float after %1- это определенно <1, поэтому ваше предложение вернет true для всех входных данных. Обратите внимание, что n**.5это поплавок.
Дрянная Монахиня

5

SageMath , 9 байт

is_square

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

Встроенная функция делает именно то, что говорит на жестяной банке. Поскольку Sage использует символьные вычисления, в нем нет ошибок точности вычислений, которые мешают IEEE-754.


5

Japt , 3 байта

¬v1

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

Кажется, хорошо работает 2**54-2в интерпретаторе Japt, но по какой-то причине не работает на TIO ...


Сбой для больших входов (вход - 2**127-1простое число Мерсенна).
Mego

@ Мего, разве не является нормой, что решения не должны обрабатывать числа больше, чем способен язык?
Лохматый

@Shaggy Japt основан на JavaScript, который использует поплавки двойной точности. 2**127-1находится в диапазоне двойного.
Mego

2
@Mego Разве не максимально безопасный int для JavaScript 2**53-1?
Том

3
@Mego Но числа JavaScript имеют только 53 бита точности, поэтому JS не может точно представить значение 2**127-1в виде числа. Самое близкое, что это может получить 2**127.
ETHproductions



5

MathGolf , 1 байт

°

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

Я не думаю, что объяснение необходимо. Прежде чем я увидел эту проблему, я увидел необходимость в операторе «идеально квадрат», поскольку этот язык предназначен для решения математических задач в гольф. Возвращает 0 или 1, поскольку MathGolf использует целые числа для представления логических значений.


4

PHP, 21 байт

<?=(-1)**$argn**.5<2;

Если квадратный корень не является целым числом, (-1)**$argn**.5есть NAN.


Как мне это запустить?
Тит

@Titus С -Fфлагом и трубопровода: echo 144 | php -F script.php.
user63956

Ах, я fнаписал это письмо. Спасибо.
Тит

4

Рубин, 25 байт

Math.sqrt(gets.to_i)%1==0

Вероятно, есть более короткий путь, но это все, что я нашел.

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


Добро пожаловать в PPCG :) Не могли бы вы добавить TIO (или эквивалент) к этому, пожалуйста?
Лохматый

Спасибо за добавление TIO, однако, это, похоже, не возвращает никакого вывода.
Лохматый

Мой плохой, я обновил его.
Грегори

Нет, все еще не работает.
Лохматый

3

CJam , 8 байт

ri_mQ2#=

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

объяснение

Целочисленный квадратный корень, квадрат, сравните с исходным числом.


Я предполагаю, что в соответствии с этим вам не нужны первые 2 байта
Chromium

И, альтернативно, используя идею этого ответа , вы можете сделать mq1%0=, что также 6 байтов
Chromium

@Chromium Спасибо, но в этом случае мне нужно {... }сделать код функцией, таким же счетчиком байтов
Луис Мендо

На самом деле, я немного запутался, добавлять фигурные скобки или нет. Потому что, если вы не добавите их, это на самом деле программа, которая разрешена.
Хром

@Chromium Программа должна принимать свои данные, поэтому riв этом случае требуется
Луис Мендо

3

Mathematica, 13 байт

AtomQ@Sqrt@#&

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


Нет встроенного? Странно ....
TheLethalCoder

1
Вы можете использовать AtomQвместо IntegerQ.
Мартин Эндер

1
конечно лохматый ...
J42161217

1
Вы все еще можете использовать @*.
Мартин Эндер

4
AtomQ@*Sqrtэто синоним для AtomQ@Sqrt@#&. Например, AtomQ@*Sqrt@4возвращает Trueи AtomQ@*Sqrt@5возвращает False. (Из-за старшинства AtomQ@*Sqrt[4]не работает правильно, возвращаясь AtomQ@*2.)
Грег Мартин


3

AWK , 27 + 2 байта

{x=int($0^0.5);$0=x*x==$1}1

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

Добавьте +2байты для использования -Mфлага для произвольной точности. Первоначально я использовал сравнение строк, потому что большое число сравнивалось, хотя они не были, но они sqrtтакже возвращали неточные значения. 2^127-2не должно быть идеальным квадратом.


3

T-SQL, 38 байт

SELECT IIF(SQRT(a)LIKE'%.%',0,1)FROM t

Ищет десятичную точку в квадратном корне. IIFспецифичен для MS SQL, протестирован и работает в MS SQL Server 2012.

Входные данные находятся в столбце a существующей таблицы t согласно нашим правилам ввода .


3

Ом , 2 байта

Ʋ

Использует CP-437кодирование.

объяснение

Неявный ввод -> Встроенный идеальный квадрат -> Неявный вывод ...


3

Java 8, 20 байт

n->Math.sqrt(n)%1==0

Вход является int .

Попробуй это здесь.


Не подлежит обсуждению: вопрос явно говорит: «Дано целое число n (где n> = 0)». Самый короткий ответ - лучший. Изменить: не будет +1, пока самый короткий ответ не будет первым: p
Оливье Грегуар

@ OlivierGrégoire Хм, это хороший способ посмотреть на это. Но вы до сих пор не знаю , является ли это int, long, short. И с вопросами, где они задают целое число, но формат ввода гибкий, я иногда использую ввод String, чтобы сохранить несколько байтов. Лично я думаю, что использование n->- это хорошо, и вы должны просто указать, что это за тип, но, очевидно, не все с этим согласны. С другой стороны, если исходить из истории ответов Java 7, переход от int c(int n){return ...;}к (int n)->...имеет больше смысла, чем n->...(хотя я лично предпочитаю второе, поскольку оно короче, конечно).
Кевин Круйссен,

2
@ OlivierGrégoire Хорошо, я изменил это. Прочитав обсуждение в этом ответе , я пришел к выводу, что указание ввода - это целое число в Java, и нет никакой разницы, чем утверждение, что ввод представляет собой список двух строк в CJam или массив ячеек строк в MATL .
Кевин Круйссен


3

Добавить ++ , 24 13 11 байт

+?
S
%1
N
O

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

Я удалил неуклюжую функцию сверху и переписал ее в основной части вопроса, чтобы удалить 11 байтов.

Как первый раздел уже объяснен ниже, давайте узнаем только, как работает новая часть

S   Square root
%1  Modulo by 1. Produced 0 for integers and a decimal for floats
N   Logical NOT

Старая версия, 24 байта

D,i,@,1@%!
+?
^.5
$i,x
O

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

Функция top ( D,i,@,1@%!) является основной частью программы, поэтому давайте углубимся в детали.

D,     Create a function...
  i,   ...called i...
  @,   ...that takes 1 argument (for this example, let's say 3.162 (root 10))
    1  push 1 to the stack; STACK = [1, 3.162]
    @  reverse the stack;   STACK = [3.162, 1]
    %  modulo the stack;    STACK = [0.162]
    !  logical NOT;         STACK = [False]

+?     Add the input to accumulator (x)
^.5    Square root (exponent by 0.5)
$i,x   Apply function i to x
O      Output the result

3

Python 3 , 28 27 25 байт

  • Благодаря @mdahmoune за 1 байт: сравните int в квадратном квадрате с оригиналом
  • 2 байта сохранены: лямбда сокращена
lambda x:int(x**.5)**2==x

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


1
как насчет f = лямбда x: int (x **. 5) ** 2 == x 27 байт
mdahmoune
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.