Суми


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, якщо результат істинний, і будь-яке інше число, якщо результат хибний?
JosiahRyanW

Відповіді:


6

R , 39 37 байт

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

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

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

Дякуємо Роберту S за те, що зберегли пару байтів!


1
Не могли б ви scan()зберегти кілька байт?
Роберт С.

3
@RobertS. да! Я робив занадто багато "справжнього" кодування 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 байт :)
Міша Лавров

@MishaLavrov, це не погана ідея! Зараз у мене немає такої кількості векторних операцій, як я хотів би, днями я це зміню
maxb


2

PowerShell , 68 56 байт

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

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

Здається довго ...
-12 байт завдяки маззі

Робить саме те, що написано на жерсті. Бере діапазон від 1введення $nі множить на квадратні $_*$_рази, будь то дільник чи ні !($n%$_). Це робить дільники рівними нульовому числу, а нероздільники - нулю. Потім ми беремо суму їх у наш акумулятор $a. Далі, ми знову обводимо цикл з 1вершини на $aта витягуємо ті числа, у яких |?{...}це квадрат, - це -eqнереально $a. Те, що залишилося на конвеєрі, і вихід неявний.

Виводить позитивне ціле число для truthy, а нічого для фальси.


рідкісний випадок, коли $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 причин. По-перше, notоператор APL ( ~), коли використовується монадично, працює лише з булевими (або 0, або 1). Оскільки будь-яке число по модулю 1 ніколи не дорівнює 1, якщо я використовував ~замість нього 0=, я отримав би domain errorбудь-яке число, яке не є ідеальним квадратом, оскільки десяткові значення не входять у ~домен. Крім того, я не можу просто опустити це значення 0=, оскільки значення "truthy" APL дорівнює 1, а не 0, і воно не матиме послідовного виводу для фальшивих значень.
Дж. Салле

2

K (oK) , 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 і гольф можуть трохи іржавіти. Я забув неспокійні числові типи Хаскелла. : P


1
Уникнути цих перетворень коротше (але повільніше), шукаючи квадратний корінь з іншим розумінням списку. Спробуйте в Інтернеті!
Ørjan Johansen

1
Коротше: fx | s <-sum [i ^ 2 | i <- [1..x], mod x i <1] = круглий (sqrt $ toEnum s) ^ 2 == s
Дамієн

2
На основі пропозиції Ørjan Johansen, це має працювати на 53 байти.
ов

2

Pyt , 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

Математика, 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 - хибний), якщо sqrt 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.