Suma


17

Niech (wejście)n=42

Zatem dzielnikami są: 1, 2, 3, 6, 7, 14, 21, 42

Kwadrat każdego dzielnika: 1, 4, 9, 36, 49, 196, 441, 1764

Biorąc sumę (dodanie): 2500

Ponieważ dlatego zwracamy prawdziwą wartość. Jeśli nie jest to idealny kwadrat, zwróć wartość fałszowania.50×50=2500

Przykłady:

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

To jest więc wygrywa najkrótszy kod w bajtach dla każdego języka

Dzięki @Arnauld za wskazanie sekwencji: A046655


2
Czy program może wyprowadzić 0, jeśli wynik jest prawdziwy, i dowolną inną liczbę, jeśli wynik jest fałszywy?
JosiahRyanW

Odpowiedzi:


6

R , 39 37 bajtów

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

Wypróbuj online!

Wykorzystuje klasyczne podejście „testuj idealnie kwadratowy”, biorąc nie integralną część pierwiastka kwadratowego S^.5%%1i przyjmując logiczną negację, ponieważ odwzorowuje zero (idealny kwadrat) na TRUEi niezerowe FALSE.

Dziękujemy Robertowi S za zaoszczędzenie kilku bajtów!


1
Czy możesz scan()zapisać kilka bajtów?
Robert S.

3
@RobertS. doh! Ostatnio robiłem za dużo „prawdziwego” kodowania R!
Giuseppe,

6

JavaScript (ES7),  46 44  42 bajtów

Zapisano 1 bajt dzięki @Hedi

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

Wypróbuj online!

Skomentował

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
Można zapisać jeden bajt z ddzieje z naby 0zamiast 2do ntak:n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
Hedi


5

Język programowania Szekspira , 434 428 415 bajtów

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

Wypróbuj online!

-13 bajtów dzięki Jo King!

Wyjścia 1dla prawdziwego wyniku, wyniki 0dla fałszywego wyniku.


415 bajtów z trzecim znakiem
Jo King,




3

Brachylog , 12 8 bajtów

f^₂ᵐ+~^₂

-4 bajty dzięki Fatelize, bo nie zdawałem sobie sprawy, że brachylog ma funkcje czynników

wyjaśnienie

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

Wypróbuj online!


f^₂ᵐjest 4 bajty krótszy niżḋ{⊇×^₂}ᵘ
Fatalize

3

MathGolf , 5 4 bajtów

─²Σ°

Wypróbuj online!

Wyjaśnienie

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

Bardzo podobny do innych odpowiedzi, w porównaniu do 05AB1E Zyskuję jeden bajt dla mojego operatora „jest idealny kwadrat”.


Wiesz, coś o nazwie „MathGolf” naprawdę powinno mieć operatora normalnego ... co doprowadziłoby cię do 3 bajtów :)
Misha Lavrov

@MishaLavrov to niezły pomysł! W tej chwili nie mam tak wielu operacji wektorowych, jak bym chciał, jednego z tych dni to zmienię
maxb

3

MATL , 9 bajtów

Z\UsX^tk=

Wypróbuj online!

Tak proste, jak to możliwe

Z\ % Divisors of (implicit) input
U  % Square
s  % Sum
X^ % Square root
t  % Duplicate this value
k= % Is it equal to its rounded value?

2

PowerShell , 68 56 bajtów

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

Wypróbuj online!

Wydaje się długi ...
-12 bajtów dzięki mazzy

Robi dokładnie to, co mówi na puszce. Pobiera zakres od 1do wejścia $ni mnoży kwadratowe $_*$_razy, bez względu na to, czy jest to dzielnik, czy nie !($n%$_). To powoduje, że dzielniki są równe liczbie niezerowej, a niepodzielniki równe zeru. Następnie pobieramy ich sumę za pomocą naszego akumulatora $a. Następnie znów pętla od 1góry do $ai wyciągnąć te numery, gdzie |?{...}to jest kwadrat -eqseksualnego do $a. Pozostaje to w potoku, a dane wyjściowe są niejawne.

Wypisuje dodatnią liczbę całkowitą dla prawdy i nic dla falsey.


rzadki przypadek, gdy $args[0]jest krótszy :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
mazzy

1
@mazzy To nie jest, ponieważ potrzebujesz $nwewnątrz pętli !($n%$_). Ale przepisanie sumy pozwoliło zaoszczędzić 12 bajtów, więc dziękuję!
AdmBorkBork,

jaka szkoda. więc chciałbym znaleźć przypadek, w którym $args[0]jest krótszy :)
mazzy


2

APL (Dyalog Unicode) , 18 bajtów

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

Wypróbuj online!

Anonimowa lambda. Zwraca 1 dla prawdy i 0 dla fałszu (przypadki testowe w TIO są wstępnie zapisane).

Krzyki do @ H.PWiz na 4 bajty!

W jaki sposób:

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

Czy możesz zrobić ekwiwalent notzamiast 0=zaoszczędzić bajt?
streetster,

@streetster niestety nie mogę z 2 powodów. Po pierwsze, notoperator APL ( ~), gdy jest używany monadycznie, działa tylko z logicznymi wartościami logicznymi (0 lub 1). Ponieważ dowolna liczba modulo 1 nigdy nie jest równa 1, gdybym użyła ~zamiast niej 0=, dostałbym domain errordowolną liczbę, która nie jest idealnym kwadratem, ponieważ wartości dziesiętne są poza ~domeną. Co więcej, nie mogę po prostu pominąć 0=, ponieważ prawdziwa wartość APL to 1, a nie 0, i nie miałby spójnego wyniku dla wartości fałszowania.
J. Sallé,

2

K (oK) , 26 25 22 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

{~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                                 / 

Uwagi:

  • -1 bajty czerpiące inspirację z PowerShell rozwiązania
  • -3 bajty czerpiące inspirację z rozwiązania APL


2

Matlab, 39 37 bajtów

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

Niestety nie działa na Octave (na tio), więc nie ma łącza do tio.

Uwaga Jak stwierdzono w @LuisMendo, divisors()należy do Symbolic Toolbox.


1
Wygląda na to, że divisorsnależy do Symbolic Toolbox. Należy podać to w tytule. Możesz także użyć ~···zamiast···==0
Luis Mendo

Możesz to skrócić, używając sum(...)^.5zamiastsqrt(sum(...))
Sanchises

2

Haskell , 78 64 53 bajtów

-14 bajtów dzięki Ørjan Johansen . -11 bajtów dzięki ovs .

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

Wypróbuj online!

Hej, minęło trochę czasu, odkąd ... napisałem jakikolwiek kod, więc mój Haskell i gra w golfa mogą być trochę zardzewiałe. Zapomniałem kłopotliwych typów numerycznych Haskella. : P


1
Jest krótszy (ale wolniejszy), aby uniknąć tych konwersji, szukając pierwiastka kwadratowego z innym rozumieniem listy. Wypróbuj online!
Ørjan Johansen

1
Krótszy: fx | s <-sum [i ^ 2 | i <- [1..x], mod x i <1] = okrągły (sqrt $ toEnum s) ^ 2 == s
Damien

2
Opierając się na sugestii Ørjana Johansena, powinno to działać na 53 bajty.
ovs

2

Pyt , 7 bajtów

ð²ƩĐř²∈

Wypróbuj online!

Wyjaśnienie

            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

ð²Ʃ√ĐƖ=

Wypróbuj online!

Wyjaśnienie

            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%¬

Wypróbuj online!

Wyjaśnienie

            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

Łuska , 6 bajtów

£İ□ṁ□Ḋ

Wypróbuj online!

Wyjaśnienie

£İ□ṁ□Ḋ  -- example input 12
     Ḋ  -- divisors: [1,2,3,4,6,12]
   ṁ    -- map the following ..
    □   -- | square: [1,4,9,16,36,144]
        -- .. and sum: 210
£       -- is it element of (assumes sorted)
 İ□     -- | list of squares: [1,4,9,16..196,225,..



1

Mathematica, 32 bajty

IntegerQ@Sqrt[2~DivisorSigma~#]&

Czysta funkcja. Pobiera liczbę jako dane wejściowe i zwraca Truelub Falsedane wyjściowe. Nie do końca pewny, czy istnieje krótsza metoda sprawdzania idealnych kwadratów.






1

F #, 111 bajtów

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)

Wypróbuj online!

Więc ddostaje dzielniki dla wszystkich liczb od 1 do nwłącznie. W głównej funkcji upierwszy wiersz przypisuje sumę wszystkich dzielników kwadratowych do m. Druga linia pobiera dzielniki mi określa, czy którykolwiek z nich jest równy m.


1

Perl 5, 47 bajtów

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

Zwraca 1 za prawdę, a nic za fałsz.

Wyjaśnienie:

$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 bajtów

Lambda akceptuje argument liczbowy.

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

Wyjaśnienie

(1..n) tworzy tablicę wartości od 1 do n

n%ijest fałszem (ponieważ 0 jest fałszem), jeśli idzieli nbez reszty

n%i ? 0 : i*ijest sumą kwadratu wartości, ijeśli dzielin bez reszty, w przeciwnym razie wynosi 0

sum{ i-> n%i ? 0 : i*i } podsumowuje poprzedni wynik dla wszystkich i w tablicy.

s%Math.sqrt(s)jest fałszem (ponieważ 0 jest fałszem), jeśli sqrt sdzielis bez reszty

!(s%Math.sqrt(s))zwraca z lambda ( returndomyślnie na ostatniej instrukcji), !falsegdy sqrt sdzielis bez reszty

Wypróbuj online!


1

Java 8, 75 70 bajtów

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

-5 bajtów dzięki @ archangel.mjj .

Wypróbuj online.

Wyjaśnienie:

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
Cześć, możesz wyciąć 5 bajtów, usuwając zmienną t (wykonaj eval i przypisanie w ciele pętli for), tak jak: 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 Ach, oczywiście. Nie jestem pewien, jak mi tego brakowało. Dzięki! :)
Kevin Cruijssen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.