Це хіп бути площею


44

Виклик

Так, гм, здається, що, хоча у нас є безліч проблем, які працюють з квадратними числами або числами інших фігур, у нас немає такої, яка просто запитує:

Враховуючи ціле число n(де n>=0) як вхід, повертайте триєдне значення, якщо nце ідеальний квадрат або значення фальси, якщо ні.


Правила

  • Ви можете брати інформацію будь-яким розумним, зручним способом, якщо це дозволено стандартними правилами вводу / виводу .
  • Вам не потрібно обробляти введення більше, ніж те, що обрана вами вибрана мова, і це не призведе до неточностей з плаваючою комою.
  • Вихід повинен бути одним із двох послідовних значень truthy / falsey (наприклад, trueабо false, 1або 0) - truthy, якщо вхід є ідеальним квадратом, фальси, якщо це не так.
  • Це тому виграє найменший байт.

Випробування

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false

@Neil Я зрозумів свою помилку. Я відкликаю цю пропозицію, а натомість пропоную 18014398509481982( 2**54-2), який можна представити подвійним, і спричиняє sqrtневдачу відповідей, які використовують .
Mego

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

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

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

Спробуй це!


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

Цікаво. Отже, чи попередньо цей буфер перелічує список чи це генератор / ітератор, який продовжує перевірку наявності вхідних даних, поки він не припиняється?
Патрік Робертс

@PatrickRoberts Чи можемо ми поговорити у чаті?
Okx

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

Ну, це ... ДІЙСНО ФУНКЦІОНАЛЬНІ
Хром


8

TI-Basic, 4 байти

not(fPart(√(Ans

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


Чи можете ви додати TIO (або еквівалент)?
Кудлатий

@Shaggy Я не думаю, що таких є. TI-Basic є власником і працює лише на калькуляторах TI та в емуляторах, що працюють з ПЗУ з калькулятора, тому ви не можете юридично використовувати TI-Basic, якщо у вас немає калькулятора.
Adám

1
@Shaggy Якщо у вас є ROM, ви можете скористатися емулятором (мої переваги jstified), щоб спробувати це в Інтернеті.
Тімтех

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)

Повертає істину, якщо квадратний корінь 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

постійний струм, 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 байт.

Зауважте, що це число трикутне? з якихось незрозумілих причин не потрібно підтримувати нуль як трикутне число, тому частиною адаптації було додати а, ?щоб зробити ведучий 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

@Mego Я не згоден. 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 байт

Завдяки кальмарам за економію 2 байтів!

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

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

Занадто повільно, щоб повернути відповідь за 2147483647розумну кількість часу. (Але написано за допомогою генератора для збереження пам'яті, оскільки він не коштує жодних байтів.)

Працює і в Python 2, хоча це OverflowErrorє можливою причиною, rangeякщо ви спробуєте це з величезними входами. (A MemoryErrorтакож буде ймовірно в Python 2, також через range.)



5

Наприклад, не працює для великої кількості, наприклад4111817668062926054213257208
Emigna

@Emigna О, тому що це вважається довгим? Я подумав, що 05AB1E використовує Python 3.
Erik the Outgolfer

Не вдалося отримати великі входи (даний вхід є 2**127-1простим рівнем Мерсена).
Mego

Він використовує python 3. Проблема полягає в тому, що квадратний корінь дає помилки округлення для великої кількості.
Емінья

@Emigna О, я думаю, мені доведеться вияснити інший спосіб, але це не повинно бути важким.
Ерік Аутгольфер

5

Python 3 , 19 байт

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

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


Помилки для великих входів, наприклад 4111817668062926054213257208.
L3viathan

lambda n:int(n**.5)**2==n
Зафіксовано

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

@totallyhuman float after %1, безумовно <1, тому ваша пропозиція повернеться істинною для всіх матеріалів. Зауважте, що n**.5це поплавок.
Leaky Nun

5

SageMath , 9 байт

is_square

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

Вбудована функція робить саме те, що написано на бляшанці. Оскільки Sage використовує символічні обчислення, він не містить помилок обчислювальної точності, які плавають IEEE-754.


5

Japt , 3 байти

¬v1

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

Здається, добре працює 2**54-2в інтерпретаторі Japt, але не працює в TIO чомусь ...


Не вдалося отримати великі входи (вхід є 2**127-1простим рівнем Мерсена).
Mego

@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, однак, схоже, це не повертає жодного результату.
Кудлатий

Моє погано, я його оновив.
Григорій

Ні, все ще не працює.
Shaggy

3

CJam , 8 байт

ri_mQ2#=

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

Пояснення

Цілий квадратний корінь, квадрат, порівняйте з початковим числом.


Я думаю, згідно з цим вам не знадобляться перші два байти
Chromium

І, альтернативно, використовуючи ідею цієї відповіді , ви можете це зробити mq1%0=, а це також 6 байт
Chromium

@Chromium Дякую, але в такому випадку мені потрібно {... }щоб код став функціонуючим, так що кількість байтів
Луїс Мендо

Власне, я трохи розгублений, додавати фігурні брекети чи ні. Тому що якщо ви не додаєте їх, це насправді програма, яка дозволена.
Хром

@Chromium Програма повинна взяти свій внесок, тому riпотрібно в цьому випадку
Луїс Мендо

3

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

AtomQ@Sqrt@#&

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


Не вбудований?
Незнайко

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

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

Функція вгорі ( 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

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