合計


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
結果がtrueの場合、プログラムは0を出力でき、結果がfalseの場合、他の数値を出力できますか?
-JosiahRyanW

回答:


6

R39 37バイト

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

オンラインでお試しください!

古典的な「完全平方の場合のテスト」アプローチを使用して、平方根の非整数部分をS^.5%%1取り、その論理否定を取ります。ゼロ(完全平方)をTRUE0に、非ゼロをにマッピングしますFALSE

数バイトを節約してくれたRobert Sに感謝します!


1
scan()数バイトを節約するために使用できますか?
ロバートS.

3
@RobertS。ドッ!私は最近、あまりにも多くの「本物の」Rコーディングを行っています。
ジュゼッペ

6

JavaScript(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
このようにする代わりにto を使用しdて1バイトを保存できますn02nn=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
。– Hedi


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偽の結果のために。


3番目の文字を含む415バイト
ジョーキング




3

Brachylog12 8バイト

f^₂ᵐ+~^₂

-4バイトはFatelizeのおかげで、brachylogにはファクター関数があることに気づかなかった

説明

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

オンラインでお試しください!


f^₂ᵐより短い4バイトḋ{⊇×^₂}ᵘ
18

3

MathGolf5 4バイト

─²Σ°

オンラインでお試しください!

説明

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

05AB1Eと比較すると、他の回答と非常によく似ていますが、「完全な正方形」演算子で1バイトを取得します。


ご存知のように、「MathGolf」と呼ばれるものには、実際に標準演算子が必要です。これにより、3バイトになります:)
ミシャラヴロフ

@MishaLavrovそれは悪い考えではありません!現時点では、必要な数のベクトル演算はありません。最近の1つを変更します
-maxb


2

PowerShell68 56バイト

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

オンラインでお試しください!

長いようです...
mazzyのおかげで-12バイト

それは錫で言うことを正確に行います。1から入力までの範囲を取り、それが除数であるかどうかにかかわらず$n平方$_*$_時間を乗算し!($n%$_)ます。これにより、除数はゼロ以外の数に等しくなり、非除数はゼロに等しくなります。次に、それらの合計をアキュムレータで取得します$a。再び次に、ループからの1アップに$a、どこでそれらの数字を引き出す|?{...}ことが乗である-eqUALがします$a。それはパイプラインに残り、出力は暗黙的です。

真実の場合は正の整数を出力し、偽の場合は何も出力しません。


まれなケース$args[0]短いです:)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
mazzy

1
@mazzy $nループの内側に必要なため、そうではありません!($n%$_)。しかし、合計を書き直すと12バイト節約されたので、ありがとう!
AdmBorkBork

残念だ。だから私$args[0]は短いケースを見つけたいと思います:)
狂気の


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には2つの理由があります。まず、APLのnot演算子(~)は、単項で使用される場合、ブール値(0または1)でのみ機能します。1を法とする任意の数が1になることは決してないため、の~代わりにを使用すると0=domain error10進値は~の領域外であるため、完全な正方形ではない任意の数を取得します。さらに、0=APLの真理値は0ではなく1であるため、単純にを省略することはできず、偽の値に対して一貫した出力が得られません。
J.サレ

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                                 / 

ノート:

  • PowerShellソリューションからインスピレーションを得た-1バイト
  • 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
ルイスメンドー

あなたは使用してこれを短縮することができますsum(...)^.5代わりにsqrt(sum(...))
Sanchises

2

Haskell78 64 53バイト

-14のおかげバイトØrjanヨハンセンをovsのおかげで-11バイト。

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

オンラインでお試しください!

私は...書いたので、ちょっと、それはしばらくしている任意のコードを、私はHaskellとゴルフが少し錆びたかもしれないので、。面倒なHaskell数値型を忘れてしまいました。:P


1
別のリスト内包表記で平方根を検索することにより、これらの変換を回避するために短くなります(しかし遅くなります)。オンラインでお試しください!
Ørjanヨハンセン

1
短縮:fx | s <-sum [i ^ 2 | i <-[1..x]、mod x i <1] = round(sqrt $ toEnum s)^ 2 == s
ダミアン

2
ØrjanJohansenの提案に基づいて、これは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

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ます。2行目はの約数を取得し、mそれらの2乗が等しいかどうかを決定しmます。


1

Perl 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

Groovy、47バイト

数値引数を受け入れるラムダ。

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

説明

(1..n) 値1からnの配列を作成します

n%i剰余なしでi除算する場合はfalse(0は偽です)n

n%i ? 0 : i*i余りなくi除算する場合は値の2乗の合計n、それ以外の場合は0

sum{ i-> n%i ? 0 : i*i }i配列内のすべての前の結果を合計します。

s%Math.sqrt(s)除算の平方根ss剰余なしである場合はfalse(0は偽である)

!(s%Math.sqrt(s))除算のsqrtが剰余なしで除算されるとき、ラムダ(return最後のステートメントで暗黙的)から戻る!falsess

オンラインでお試しください!


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

@ 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
:こんにちは、あなたはそうのように、(forループの本体内にevalや割り当てを行う)トン変数を除去することにより、5つのバイトを切ることができる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ああ、もちろん。どうしてそれを見逃したのかわかりません。ありがとう!:)
ケビンクルーイッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.