Сум


17

Пусть (вход)n=42

Тогда делителями являются: 1, 2, 3, 6, 7, 14, 21, 42

Квадрат каждого делителя: 1, 4, 9, 36, 49, 196, 441, 1764

Взятие суммы (добавление): 2500

Поскольку поэтому мы возвращаем истинное значение. Если это не идеальный квадрат, верните ложное значение.50×50=2500

Примеры :

42  ---> true
1   ---> true
246 ---> true
10  ---> false
16  ---> false

Это поэтому выигрывает самый короткий код в байтах для каждого языка

Спасибо @Arnauld за указание последовательности: A046655


2
Может ли программа вывести 0, если результат равен true, и любое другое число, если результат равен false?
JosiahRyanW

Ответы:


6

R , 39 37 байт

!sum((y=1:(x=scan()))[!x%%y]^2)^.5%%1

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

Использует классический подход «проверить, если идеальный квадрат», принимая нецелую часть квадратного корня S^.5%%1и принимая логическое отрицание этого, поскольку он отображает ноль (идеальный квадрат) в TRUEи ненулевой в FALSE.

Спасибо Роберту С за сохранение нескольких байтов!


1
Не могли бы вы использовать, scan()чтобы сохранить несколько байтов?
Роберт С.

3
@RobertS. DOH! В последнее время я делал слишком много "настоящего" R-кодирования!
Джузеппе

6

JavaScript (ES7),  46 44  42 байта

Сохранено 1 байт благодаря @Hedi

n=>!((g=d=>d&&d*d*!(n%d)+g(d-1))(n)**.5%1)

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

комментарии

n =>             // n = input
  !(             // we will eventually convert the result to a Boolean
    (g = d =>    // g is a recursive function taking the current divisor d
      d &&       //   if d is equal to 0, stop recursion 
      d * d      //   otherwise, compute d²
      * !(n % d) //   add it to the result if d is a divisor of n
      + g(d - 1) //   add the result of a recursive call with the next divisor
    )(n)         // initial call to g with d = n
    ** .5 % 1    // test whether the output of g is a perfect square
  )              // return true if it is or false otherwise

1
Вы можете сохранить один байт, dпереходя от nк 0вместо того, 2чтобы nполюбить это:n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
Хеди


5

Язык программирования Шекспира , 434 428 415 байт

,.Ajax,.Ford,.Puck,.Act I:.Scene I:.[Enter Ajax and Ford]Ford:Listen tothy.Scene V:.Ajax:You be the sum ofyou a cat.Ford:Is the remainder of the quotient betweenyou I worse a cat?[Exit Ajax][Enter Puck]Ford:If soyou be the sum ofyou the square ofI.[Exit Puck][Enter Ajax]Ford:Be you nicer I?If solet usScene V.[Exit Ford][Enter Puck]Puck:Is the square ofthe square root ofI worse I?You zero.If notyou cat.Open heart

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

-13 байтов благодаря Джо Кингу!

Выходы 1для истинного результата, выходы 0для ложного результата.


415 байт с третьим символом
Джо Кинг,




3

Брахилог , 12 8 байт

f^₂ᵐ+~^₂

-4 байта благодаря Fatelize, потому что я не понимал, что брахилог имеет функции факторов

объяснение

f^₂ᵐ+~^₂            #   full code
f                   #       get divisors
 ^₂ᵐ                #           square each one
    +               #       added together
      ~^₂           #       is the result of squaring a number

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


f^₂ᵐна 4 байта корочеḋ{⊇×^₂}ᵘ
Fatalize

3

MathGolf , 5 4 байта

─²Σ°

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

объяснение

─     Get all divisors as list (implicit input)
 ²    Square (implicit map)
  Σ   Sum
   °  Is perfect square?

Очень похоже на другие ответы, по сравнению с 05AB1E я получаю один байт для своего оператора "идеальный квадрат".


Вы знаете, что-то под названием "MathGolf" действительно должно иметь оператор нормы ... который бы вывел вас на 3 байта :)
Миша Лавров

@ МишаЛавров, это неплохая идея! Сейчас у меня не так много векторных операций, как хотелось бы, на днях я это
поменяю


2

PowerShell , 68 56 байт

param($n)1..$n|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}

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

Кажется долго ...
-12 байтов благодаря маззи

Делает именно то, что говорит на жестяной банке. Принимает диапазон от 1ввода $nи умножает квадрат на квадраты, $_*$_независимо от того, делитель это или нет !($n%$_). Это делает делители равными ненулевому числу, а делители равными нулю. Затем мы берем их сумму с нашим аккумулятором $a. Затем мы делаем цикл снова от 1до до $aи вытащить те числа , где |?{...}он в квадрате -eqUAL с $a. Это остается на конвейере и вывод неявный.

Выводит положительное целое число для правды и ничего для фальси.


редкий случай, где $args[0]короче :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
Маззи

1
@mazzy Это не так, потому что вам нужно $nвнутри цикла для !($n%$_). Но ваша перезапись суммы сэкономила 12 байтов, так что спасибо!
AdmBorkBork

какой позор поэтому я хотел бы найти случай, где $args[0]короче :)
mazzy


2

APL (Dyalog Unicode) , 18 байт

0=1|.5*⍨2+.*⍨∘∪⍳∨⊢

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

Анонимная лямбда. Возвращает 1 для правдивых и 0 для ложных (тестовые случаи в TIO предварительно проверены).

Привет @ H.PWiz за 4 байта!

Как:

0=1|.5*⍨2+.*⍨∘∪⍳∨⊢    Main function, argument   42
                ∨⊢    Greatest common divisor (∨) between  (⊢)
                      and the range (⍳) [1..⍵]
                     Get the unique items (all the divisors of 42; 1 2 3 6 7 14 21 42)
                      Then
                      Swap arguments of
        2+.*           dot product (.) of sum (+) and power (*) between the list and 2 
                       (sums the result of each element in the vector squared)
                      Use the result vector as base
    .5*                Take the square root
  1|                   Modulo 1
0=                     Equals 0

Можете ли вы сделать эквивалент, notа не 0=сохранить байт?
Стритстер

@streetster, к сожалению, я не могу по 2 причинам. Во-первых, APLnot оператор ( ~), когда используется монадически, работает только с логическими значениями (0 или 1). Поскольку любое число по модулю 1 никогда не равно 1, если бы я использовал ~вместо него 0=, я бы получил a domain errorна любое число, которое не является идеальным квадратом, так как десятичные значения находятся вне ~домена. Кроме того, я не могу просто опустить 0=, поскольку истинное значение APL равно 1, а не 0, и у него не будет согласованного вывода для ложных значений.
J. Sallé

2

K (ок) , 26 25 22 байта

Решение:

{~1!%+/x*x*~1!x%:1+!x}

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

Объяснение:

{~1!%+/x*x*~1!x%:1+!x} / the solution
{                    } / lambda taking x as input
                   !x  / range 0..x-1                        \
                 1+    / add 1                               |
              x%:      / x divided by and save result into x |
            1!         / modulo 1                            | get divisors
           ~           / not                                 |
         x*            / multiply by x                       /
       x*              / multiply by x (aka square)          > square
     +/                / sum up                              > sum up
    %                  / square root                         \  
  1!                   / modulo 1                            | check if a square
 ~                     / not                                 / 

Примечания:

  • -1 байт, вдохновленный решением PowerShell
  • -3 байта черпают вдохновение из решения APL


2

Матлаб, 39 37 байт

@(v)~mod(sqrt(sum(divisors(v).^2)),1)

К сожалению, он не работает в Octave (на tio), поэтому нет ссылки на tio.

Примечание Как указано @LuisMendo, divisors()принадлежит Symbolic Toolbox.


1
Похоже, divisorsпринадлежит к Symbolic Toolbox. Вы должны указать это в заголовке. Кроме того, вы можете использовать ~···вместо···==0
Луис Мендо

Вы можете сократить это, используя sum(...)^.5вместоsqrt(sum(...))
Sanchises

2

Haskell , 78 64 53 байта

-14 байтов благодаря Орджану Йохансену . -11 байт благодаря овс .

f x=sum[i^2|i<-[1..x],x`mod`i<1]`elem`map(^2)[1..x^2]

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

Эй, это было время , так как я ... написал никакого кода, поэтому мой Haskell и игра в гольф может немного ржавый. Я забыл хлопотные числовые типы Haskell. :П


1
Короче (но медленнее) избежать этих преобразований путем поиска квадратного корня с другим пониманием списка. Попробуйте онлайн!
Эрджан Йохансен,

1
Короче: fx | s <-sum [i ^ 2 | i <- [1..x], mod x i <1] = round (sqrt $ toEnum s) ^ 2 == s
Дэмиен

2
Основываясь на предложении Орджана Йохансена, это должно работать на 53 байта.
ovs

2

Пыть , 7 байт

ð²ƩĐř²∈

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

объяснение

            Implicit input
ð           Get list of divisors
 ²          Square each element
  Ʃ         Sum the list [n]
   Đ        Duplicate the top of the stack
    ř²      Push the first n square numbers
      ∈     Is n in the list of square numbers?
            Implicit output

ð²Ʃ√ĐƖ=

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

объяснение

            Implicit input
ð           Get list of divisors
 ²          Square each element
  Ʃ         Sum the list [n]
   √        Take the square root of n
    Đ       Duplicate the top of the stack
     Ɩ      Cast to an integer
      =     Are the top two elements on the stack equal to each other?
            Implicit output

ð²Ʃ√1%¬

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

объяснение

            Implicit input
ð           Get list of divisors
 ²          Square each element
  Ʃ         Sum the list [n]
   √        Take the square root of n
    1%      Take the square root of n modulo 1
      ¬     Negate [python typecasting ftw :)]
            Implicit output




1

Mathematica, 32 байта

IntegerQ@Sqrt[2~DivisorSigma~#]&

Чистая функция. Принимает число как ввод и возвращает Trueили Falseкак вывод. Не совсем уверен, есть ли более короткий метод проверки идеальных квадратов.






1

F #, 111 байт

let d n=Seq.where(fun v->n%v=0){1..n}
let u n=
 let m=d n|>Seq.sumBy(fun x->x*x)
 d m|>Seq.exists(fun x->x*x=m)

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

Так dполучаются делители для всех чисел от 1 до nвключительно. В основной функции uпервая строка присваивает сумму всех квадратов делителей m. Вторая строка получает делители для mи определяет, равен ли любой из них в квадрате m.


1

Perl 5, 47 байт

$a+=$_*$_*!($n%$_)for 1..$n;$a=!($a**.5=~/\D/); 

Возвращает 1 для истины и ничего для ложных.

Объяснение:

$a+=              for 1..$n;                      sum over i=1 to n
    $_*$_                                         square each component of the sum
         *!($n%$_)                                multiply by 1 if i divides n.
                            $a=                   a equals
                                ($a**.5           whether the square root of a
                               !       =~/\D/);   does not contain a non-digit.

1

Groovy , 47 байтов

Лямбда, принимающая числовой аргумент.

n->s=(1..n).sum{i->n%i?0:i*i}
!(s%Math.sqrt(s))

объяснение

(1..n) создает массив значений от 1 до n

n%iложно (так как 0 ложно), если iделится nбез остатка

n%i ? 0 : i*iявляется суммой квадрата значения, iесли оно делится nбез остатка, в противном случае равно 0

sum{ i-> n%i ? 0 : i*i }суммирует предыдущий результат по всему iмассиву.

s%Math.sqrt(s)ложно (так как 0 ложно), если квадрат sделится sбез остатка

!(s%Math.sqrt(s))возвращает из лямбды ( returnнеявной в последнем утверждении), !falseкогда sqrt sделится sбез остатка

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


1

Java 8, 75 70 байт

n->{int s=0,i=0;for(;++i<=n;)s+=n%i<1?i*i:0;return Math.sqrt(s)%1==0;}

-5 байт благодаря @ archangel.mjj .

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

Объяснение:

n->{             // Method with integer parameter and boolean return-type
  int s=0,       //  Sum-integer, starting at 0
      i=0;       //  Divisor integer, starting at 0
  for(;++i<=n;)  //  Loop `i` in the range [1, n]
    s+=n%i<1?    //   If `n` is divisible by `i`:
        i*i      //    Increase the sum by the square of `i`
       :         //   Else:
        0;       //    Leave the sum the same by adding 0
  return Math.sqrt(s)%1==0;}
                 //  Return whether the sum `s` is a perfect square

1
Привет, вы можете сократить 5 байтов, удалив переменную t (выполните eval и присваивание внутри тела цикла for), например так:n->{int s=0,i=0;for(;++i<=n;)s+=n%i<1?i*i:0;return Math.sqrt(s)%1==0;}
archangel.mjj

@ archangel.mjj Ну, конечно. Не уверен, как я это пропустил. Благодарность! :)
Кевин Круйссен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.