17

하자 (입력)n=42

그런 다음 제수는 1, 2, 3, 6, 7, 14, 21, 42입니다.

각 제수 제곱 : 1, 4, 9, 36, 49, 196, 441, 1764

합산 (가산) : 2500

이후 그러므로 우리는 truthy 값을 반환합니다. 완벽한 제곱이 아닌 경우 잘못된 값을 반환하십시오.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취하고 제로 (완전한 제곱)를 TRUE0이 아닌 제로로 매핑 할 때 논리적 인 부정을 취하는 고전적인 "완전 제곱 인 경우 테스트"방식 을 사용 FALSE합니다.

몇 바이트를 절약 한 Robert S 에게 감사 합니다!


1
scan()몇 바이트를 절약하는 데 사용할 수 있습니까?
Robert S.

3
@RobertS. 도! 최근에 "실제"R 코딩을 너무 많이했습니다!
주세페

6

자바 스크립트 (ES7),  46 44  42 바이트

@Hedi 덕분에 1 바이트 절약

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대신 2n이 같은 :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

온라인으로 사용해보십시오!

Jo King 덕분에 -13 바이트!

출력이 1참 결과를 출력하고, 0잘못된 결과를.


세 번째 문자가있는 415 바이트
Jo King




3

Brachylog , 12 8 바이트

f^₂ᵐ+~^₂

Brachylog에 요인 함수가 있음을 인식하지 못했던 Fatelize 원인으로 인해 -4 바이트

설명

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에 비해 다른 답변과 매우 유사합니다. "완벽한 정사각형"연산자에 대해 1 바이트를 얻습니다.


알다시피, 뭔가 정말 규범 연산자를해야한다 "MathGolf를"이라는 ... 그 3 바이트 : 당신을 얻었을 것입니다
미샤 라브 로프

@MishaLavrov 그것은 나쁜 생각이 아닙니다! 지금은 원하는만큼 많은 벡터 연산이 없습니다. 요즘에는 다음과 같이 변경할 것입니다
maxb


2

PowerShell , 68 56 바이트

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

온라인으로 사용해보십시오!

매지 덕분에 긴 ...-
12 바이트로 보입니다.

틴에 대해 정확히 말하십시오. 범위에서 1입력 까지 를 취하고 제수인지 여부에 관계없이 $n제곱 $_*$_시간을 곱합니다 !($n%$_). 이로 인해 제수는 0이 아닌 숫자로, 제수가 아닌 제로는 0이됩니다. 그런 다음 누산기로 이들의 합을 가져옵니다 $a. 다시 다음으로, 루프에서 1최대 $a어디 그 숫자를 꺼내 |?{...}그것을 제곱입니다 -eq연간는에 $a. 그것은 파이프 라인에 남아 있으며 출력은 암시 적입니다.

진리에 대해서는 양의 정수를 출력하고 거짓에는 아무것도 출력하지 않습니다.


$args[0]더 짧은 드문 경우 :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
mazzy

1
@mazzy $nfor 루프 내부가 필요하기 때문에 그렇지 않습니다 !($n%$_). 그러나 합계를 다시 쓰면 12 바이트가 절약되므로 감사합니다!
AdmBorkBork

부끄러운 일이야 그래서 나는 $args[0]더 짧은 경우를 찾고 싶습니다 :)
mazzy


2

APL (Dyalog Unicode) , 18 바이트

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

온라인으로 사용해보십시오!

익명의 람다. 진실에 대해서는 1을, 거짓에 대해서는 0을 반환합니다 (TIO의 테스트 사례는 미리 정의 됨).

4 바이트 동안 @ H.PWiz로 소리 질러!

어떻게:

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

@streetster 불행히도, 나는 두 가지 이유로 할 수 없습니다. 먼저, APL의 not연산자 ( ~)는 monadically로 사용될 때 부울 (0 또는 1)에서만 작동합니다. 모듈러스 1은 1과 절대 같지 않기 때문에 ~대신에 사용하면 소수 값이 도메인을 벗어나기 때문에 완벽한 제곱이 아닌 모든 숫자를 0=얻습니다 . 또한 APL의 진실한 값이 0이 아닌 1이므로 거짓 값에 대해 일관된 출력을 얻지 못하기 때문에 단순히을 생략 할 수 없습니다 . domain error~0=
J. Sallé

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 솔루션
  • APL 솔루션 에서 영감을 얻은 -3 바이트


2

Matlab, 39 37 바이트

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

불행히도 Octave (tio)에서는 작동하지 않으므로 tio 링크가 없습니다.

참고 @LuisMendo가 언급했듯이 divisors()Symbolic Toolbox에 속합니다.


1
divisorsSymbolic Toolbox에 속하는 것 같습니다 . 제목에 그 내용을 명시해야합니다. 또한, ~···대신 사용할 수 있습니다···==0
Luis Mendo

당신은 사용하여이 단축 될 수 있습니다 sum(...)^.5대신sqrt(sum(...))
Sanchises

2

하스켈 , 78 64 53 바이트

Ørjan Johansen 덕분에 -14 바이트 . -11는 덕분에 바이트 OVS를 .

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

온라인으로 사용해보십시오!

이봐, 내가 코드를 작성한 지 얼마 되지 않아서 내 Haskell과 골프는 약간 녹슬었을지도 모른다. 귀찮은 Haskell 숫자 유형을 잊어 버렸습니다. :피


1
다른 목록 이해로 제곱근을 검색하여 이러한 변환을 피하는 것이 더 짧지 만 느립니다. 온라인으로 사용해보십시오!
Ørjan Johansen

1
짧게 : fx | s <-sum [i ^ 2 | i <-[1..x], mod x i <1] = round (sqrt $ toEnum s) ^ 2 == s
Damien

2
Ørjan 요한센의 제안에 구축, 53 바이트 작동합니다.
ovs

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

껍질 , 6 바이트

£İ□ṁ□Ḋ

온라인으로 사용해보십시오!

설명

£İ□ṁ□Ḋ  -- 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

수학, 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)

온라인으로 사용해보십시오!

따라서 d1과 n포함 사이의 모든 숫자에 대한 제수를 가져옵니다 . 주 함수 u에서 첫 번째 줄은 모든 제곱 제수의 합을 할당합니다 m. 두 번째 줄은 제수를 구하여 m제곱이 같은지 확인 m합니다.


1

펄 5, 47 바이트

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

true이면 1을, false에는 아무것도 반환하지 않습니다.

설명:

$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

그루비 , 47 바이트

숫자 인수를 허용하는 람다.

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

설명

(1..n) 1에서 n까지의 값의 배열을 만듭니다.

n%i(0 falsy 그대로) 경우 거짓 i분할 n공약

n%i ? 0 : i*i나머지없이 i나누면 값의 제곱의 합입니다. n그렇지 않으면 0입니다.

sum{ i-> n%i ? 0 : i*i }i배열의 모든 결과에서 이전 결과를 합산합니다 .

s%Math.sqrt(s)(0 falsy 같이) 거짓이면의 SQRT s분할 s공약

!(s%Math.sqrt(s))(람다 수익률 return마지막 문에 대한 암시가) !false의 경우 SQRT s분할s나머지 없이 나머지

온라인으로 사용해보십시오!


1

자바 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;}

@ archangel.mjj 덕분에 -5 바이트 .

온라인으로 사용해보십시오.

설명:

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
안녕, 당신은 다음과 같이 t 변수를 제거하여 5 바이트를 줄일 수 있습니다 (for 루프의 본문 내에서 eval 및 할당을 수행) :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 아. 내가 어떻게 그리웠는지 모르겠습니다. 감사! :)
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.