二乗和の整数を返します


31

紹介とクレジット

数字が11で割り切れるか3で割り切れるかをテストするための素晴らしいルールを知っていますが、これは数字の桁の賢い合計です。現在、この課題は、数字の合計を計算し、結果が完全な整数二乗であるかどうかを確認することを要求することにより、これを新しいレベルに引き上げます。このプロパティは、数値を見るときに非常にわかりにくいため、人間の作業を節約できるように、数値のリスト全体に対してこれを実行する必要があります。これがあなたの挑戦です!

これは私の大学の関数型プログラミングコースでの課題でした。この課題は現在クローズされており、クラスで議論されており、ここに投稿する教授の許可があります(明示的に尋ねました)。

仕様

入力

入力は、任意の標準I / O形式の非負整数のリストです。
言語で必要に応じてリスト形式を選択できます

出力

出力は、標準I / O形式の整数のリストです。

何をすべきか?

入力リストから、数字の合計が(整数の)正方形でないすべての整数をフィルターで除外します。
要素の順序は変更できません。たとえば、取得した[1,5,9]場合返されません[9,1]

潜在的なコーナーケース

0 非負の整数であり、したがって有効な入力であり、0も有効な整数のルートです。たとえば、0は整数の2乗としてカウントされます。
空のリストも有効な入力および出力です。

誰が勝ちますか?

これはコードゴルフなので、バイト単位の最短回答が勝ちです!
もちろん、標準ルールが適用されます。

テストケース

[1,4,9,16,25,1111] -> [1,4,9,1111]
[1431,2,0,22,999999999] -> [1431,0,22,999999999]
[22228,4,113125,22345] -> [22228,4,22345]
[] -> []
[421337,99,123456789,1133557799] -> []

段階的な例

Example input: [1337,4444]
Handling first number:
Sum of the digits of 1337: 1+3+3+7=14
14 is not an integer square, thus will be dropped!
Handling second number:
Sum of the digits of 4444: 4+4+4+4=16
16 is an integer square because 4*4=16, can get into the output list!
Example output: [4444]

11
素敵な最初の挑戦、そしてサイトへようこそ!
DJMcMayhem

今後の課題については、サンドボックスに注意してください。メインサイトに掲載する前に課題を置いて、レビューやコンテンツのクエリができるようにします。ただし、これが悪い質問ではないということではありません(実際、非常に気に入っています)
ブルー

@muddyfish、私はこれについて読んでそこに投稿することを検討しましたが、ここに逃すことはできない/恐ろしく間違っていることはないと確信していたので、それをしないことを決めました:もちろん、疑いがある場合は何かがあるかもしれませんそこに投稿するのが恋しいです。
SEJPM

12
サンドボックスを回避することはまったく問題ありませんが、そこに投稿した場合、個々の整数のテストについてのみ挑戦することをお勧めします。興味深いタスクはテストです。そのタスクをフィルターでラップすることは特に面白くありません。型として配列を持たない難解な言語では、チャレンジをかなり難しくするだけです。それは少し耳障りに聞こえるかもしれませんが、これはまだ素晴らしい最初の投稿です。サンドボックスがそこにあると言っているのは、あなたがどれだけ確実であるにせよ、何かを見逃していないからといって、何かを見逃したからです。
FryAmTheEggman

1
@FryAmTheEggman Mathematicaについて言えば、この関数をリスト可能にすると、物事がやや非自明な方法で複雑になるため、まったく退屈ではありません。
LLlAMnYP

回答:



5

Mathematica、39 36バイト

匿名関数:

Select[AtomQ@√Tr@IntegerDigits@#&]

LLlAMnYPはバイトを保存しました。ありがとうございました!

マーティン・エンダーは、に置き換えIntegerQてさらに3つ節約したAtomQ。賢い!(の結果は正確になるためSqrt[5]、引数が正方形でない場合のような複合式を返します。)


...Digits@#&...Digits[#]&
LLlAMnYP


4

Brachylog v2、8バイト

{ẹ+√ℤ&}ˢ

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

説明

{ẹ+√ℤ&}ˢ
{     }ˢ  Map the following operation over {the input}, discarding elements that error:
 ẹ         Split into a list of digits
  +        Sum that list
   √       Take its square root
    ℤ      Assert that the result is an integer
     &     Return to the original value

&手段は、要素の出力は、入力リストと同じであることが、ブロックの入力は平方数でない場合、我々は廃棄された非正方形の数字の合計を持つ要素を持つ入力リストを取得するので、出てエラーになります。

ここでは、最初は浮動小数点の不正確性の問題があるように見えるかもしれないことに注意してください(非常に大きな非正方形整数には、丸めによる整数平方根があります)。ただし、Brachylogはbignum算術をサポートし、実際にこの動作をその実装にファクタリングします。平方根は整数)は、その平方根が整数値を持つ浮動小数点数として報告されます。便利なことに、前者の種類の戻り値のみを許可し、後者のアサーション失敗を許可します。



3

CJam、14バイト

1バイトを保存してくれた@FryAmTheEggmanに感謝します!

{{Ab:+mq_i=},}

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

これは名前のないブロックで、スタック上の入力リストを予期し、フィルタリングされたリストを残します。

説明

{e#新しいブロックを開始
 Ab e#基数10に変換->数字を数字に分割
 :+ e#合計th桁
 mq e#平方根を取得
 _ e#結果を複製する
 IE#整数に変換
 = e#変換された平方根と元の平方根が等しいかどうかを確認します
} e#終了ブロック
、e#は入力リストをフィルタリングします

3

Haskell- 70 60 59バイト

f=filter(\x->elem(sum.map(read.pure).show$x)$map(^2)[0..x])

使用法:

> f [0..100]
[0,1,4,9,10,13,18,22,27,31,36,40,45,54,63,72,79,81,88,90,97,100]

とても簡単です。桁の合計を計算し、floor(sqrt(y))^ 2 == yかどうかを確認します

編集:C. Quilleyから正方形のリストをチェックするというアイデアを盗みました


2
興味深いアプローチ。f=この回答にが必要かどうかはわかりません。
マイケルクライン

3

05AB1E、19 10バイト

vySOtDï->—

説明

vy                     # for each int in list
  SO                   # digit sum
    tDï-               # difference between sqrt() and int(sqrt())
        >              # increase by 1 giving 1 (true) when equal
         —             # print current int in list if truthy

オンラインで試す

編集:@Adnanのおかげで9バイト保存


それぞれの桁の合計を取得するには、vySO正方形かどうかをすぐに確認できます。私はこれを5にしましたtDï->。また、yに等しいときに印刷する特別なビルトイン1)があります。だから、それはだろうvySOtDï->—
アドナン

@Adnan:Sのことを忘れたとは信じられません。私も見ていませんでした。タスクがリストとして出力するように言っていたのですが、他の答えも同じように見えるので大丈夫だと思います。
エミグナ

はい、改行で区切られたアイテムは、チャレンジが明示的にそうしないと言わない限り、デフォルトで受け入れられます。
アドナン

3

R57 55バイト

Filterベクターで使用します。32ビットの整数を想定しているため、最大10桁。

コーナーケース:NULL空のベクターおよびnumeric(0)有効な数値のないベクターに対して返されます。これらは両方とも長さがゼロなので、許容できるはずです。

-2 @Giuseppeに感謝

Filter(function(n)!sum(n%/%10^(0:10)%%10)^.5%%1,scan())

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


3

PowerShell64 54バイト

$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}

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

mazzyのおかげで-10バイト

入力をコマンドライン引数として受け取り(以下の例を参照)、PowerShellで処理されて配列に格納され$argsます。出力を選択するために、それを(に類似した関数)の?エイリアスにパイプします。私たちの選択は、.NET呼び出しに基づいており、数字の数字の合計はの整数です。整数の結果は0になります。edは整数になり、非整数のルートはになります。Where-Objectfilter[math]::Sqrt()!(...%1)notTrueFalse

他の場所で述べたように、空の配列を「返す」ことは無意味です。$nullスコープを離れるとすぐに変換されるため、空の入力の出力は何もありません。

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1 4 9 16 25 1111
1
4
9
1111

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1431 2 0 22 999999999
1431
0
22
999999999

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 22228 4 113125 22345
22228
4
22345

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 

PS C:\Tools\Scripts\golfing> .\return-integers-with-square-digit-sums.ps1 1337 4444
4444

1
$n%1かどうかをチェックするだけのint$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
mazzy

2

Python 2、76バイト

lambda l:filter(lambda n:eval(("sum(map(int,`n`))**.5==int("*2)[:-6]+")"),l)

ここで試してみてください!

平方数をチェックするためのevalの乱用もありますが、残りはかなり目立たないものです。
evalステートメントはsum(map(int,n ))**.5==int(sum(map(int,nと評価されます))**.5)


2

Oracle SQL 11.2、213バイト

WITH v AS(SELECT a,SQRT(XMLQUERY(REGEXP_REPLACE(a,'(\d)','+\1')RETURNING CONTENT).GETNUMBERVAL())s FROM(SELECT TRIM(COLUMN_VALUE)a FROM XMLTABLE(('"'||REPLACE(:1,',','","')||'"'))))SELECT a FROM v WHERE s=CEIL(s);

ゴルフをしていない

WITH v AS
(  
  SELECT a,SQRT(XMLQUERY( 
                   REGEXP_REPLACE(a,'(\d)','+\1')  -- Add a + in front of each digit 
                   RETURNING CONTENT
               ).GETNUMBERVAL())s                  -- Evaluate the expression generated by the added +
  FROM 
  (SELECT TRIM(COLUMN_VALUE)a FROM XMLTABLE(('"'||REPLACE(:1,',','","')||'"'))) -- Split string on ','
)
SELECT a FROM v WHERE s=CEIL(s) -- Is a square if square has no decimal part

2

Brachylog、26バイト

:1f.
e.(:ef+~^[X:2]h>0;.0)

例:

?- run_from_file('code.brachylog',[1431:2:0:22:999999999],Z).
Z = [1431, 0, 22, 999999999]

説明

これは、何かがうまく機能しすぎている状況です...この~^[X:2]部分はポジティブとネガティブの両方に当てはまるため、X重複を避けるためにそれを指定する必要がありX > 0ます。

この;.0部分はバグのためにあります(整数0では列挙は機能しません)。

  • 主な述語

    :1f.                Find all values of Input which satisfy predicate 1
    
  • 述語1

    e.                  Unify output with an element of the input
    (
      :ef               Find all elements of Output (i.e. all digits)
         +              Sum the digits
          ~^[X:2]       True if that sum is the result of X², whatever X is
                 h>0    Impose that X > 0
    ;                   OR
      .0                True if Output is 0
    )
    

2

Python 2、53バイト

lambda x:[n for n in x if sum(map(int,`n`))**.5%1==0]

Ideoneでテストします。


1
以下の場合f([1111111111111111])のように、それは見えrepr(n)含ま'L'int('L')スローValueErrorstr(n)ここに必要な気がしますか?
リン

2
確かに、長い整数では機能しません。ただし、これは固定幅整数を持つ言語のソリューションとは違うとは思わない。
デニス

2

J、33 27バイト

@milesのおかげで6バイト。

#~[:(=<.)@%:+/"1@(10&#.inv)

オンライン通訳でinvは、格納されていません。^:_1代わりにそれを変更してください。

使用法

>> f =: #~[:(=<.)@%:+/"1@(10&#.inv)
>> f 1 4 9 16 25 1111 0
<< 1 4 9 1111 0

>>STDINと<<STDOUT はどこにあります。

わずかに食べられない

to_base_10 =: 10&#.^:_1
sum        =: +/"1
sqrt       =: %:
floor      =: <.
itself     =: ]
equals     =: =
of         =: @
is_integer =: equals floor
test       =: is_integer of sqrt
copies_of  =: #
f =: copies_of~ [: test (sum of to_base_10)

以前の33バイトバージョン

(]=*:@<.@%:)@(+/"1@(10#.^:_1]))#]

使用法

>> f =: (]=*:@<.@%:)@(+/"1@(10#.^:_1]))#]
>> f 1 4 9 16 25 1111 0
<< 1 4 9 1111 0

>>STDINと<<STDOUT はどこにあります。

わずかに食べられない

to_base_10 =: 10#.^:_1]
sum        =: +/"1
sqrt       =: %:
floor      =: <.
square     =: *:
itself     =: ]
equals     =: =
of         =: @
test       =: itself equals square of floor of sqrt
copies_of  =: #
f =: (test of (sum of to_base_10)) copies_of itself

1
f&.gを適用するために使用しg、次にf、そしてその逆gを短縮*:@<.@%:して<.&.%:2バイトを節約します。を再配置し、floorのみを使用#~[:(=<.)@%:+/"1@(10&#.inv)して27バイトを取得できます。ここinv^:_1、は既に定義されています。
マイル

2

Javascript 66バイト

a=>a.filter(b=>(e=Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d)))==(e|0))

7バイトを節約してくれたSergioFCに感謝


c+d代わりに使用することはできませんc-+-dか?さらにn%1==0、結果がintであるかどうかをテストするために使用できるためb=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)、フィルタリングに使用するバイトを節約できる場合があります
sergioFC

@sergioFC私は変更することはできません- + - +に、なぜなら彼らだ文字列
バリント

2

Perl 5、42バイト

41、プラス1の-pe代わりに-e

my$s;map$s+=$_,/./g;$_ x=sqrt$s==~~sqrt$s

説明:

  • -p新しい行で各入力整数を取得し、$_その文字列に割り当てます。
  • my$s$s入力整数ごとに変数を新たに初期化します。
  • map$s+=$_,/./g各数値文字を取得し、数値的にに追加し$sます。(数値化すると、改行は0になります。)
  • sqrt$s==~~sqrt$sかどうかをテスト$s非整数平方根を有し、そして$_ x=なる$_自体又はその試験に応じて、空の文字列に変換します。
  • -p プリント $_

3バイトを節約してくれたBrad Gilbert b2gillsに感謝します。

また41プラス1:

my$s;s/./$s+=$&/ger;$_ x=sqrt$s==~~sqrt$s
  • s/./$s+=$&/ger各数字を追加$sします(上記のように改行は0です)

2

JavaScript(Node.js)、48バイト

a=>a.filter(b=>eval([...b+""].join`+`)**.5%1==0)

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

説明

a =>                                  // lambda function taking one argument
    a.filter(                         // filter the list
        eval(                         // begin eval
            [...b+""]                 // convert number to array of digits 
                .join`+`              // join them with + sign
            )                         // close eval. we achieved sum of all digits of number
        **.5                          // square root of number
        %1==0                         // check for perfect square
    )                                 // end filter and return value

1

MATL、16 14 13バイト

"@tV!UsX^1\?x

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

説明

        % Implicitly grab input
"       % For each number in the input
  @t    % Get this element and duplicate
  V     % Convert to it's string representation
  !     % Transpose the string so each digit is on it's own row
  U     % Convert each row to a number (separates the digits)
  s     % Compute the sum of the digits
  X^    % Compute the square root
  1\    % mod with 1 to determine if the square root is an integer
  ?x    % If there is a remainder, then remove this element from the stack
        % Implicitly display the stack contents

1

ジュリア-38バイト

!X=filter(i->√sum(digits(i))%1==0,X)

これが何をするのかを見るのはとても簡単です。digits数字をその数字のリストに変換しsum、数字の合計を計算します。数字が正方形の場合は整数を生成し、そうでない場合は小数部分があります。%1は小数部分のみを返し、ゼロ(==0)の場合filterはリストに保持し、そうでない場合はフィルターで除外されます。

使用されます ![22228,4,113125,22345]



1

MATLAB、52 43 42バイト

@(x)x(~mod(sum(dec2base(x,10)'-48).^.5,1))

ans入力として配列を使用して呼び出すことができる名前の付いた匿名関数を作成しますans([22228,4,113125,22345])

オンラインデモ。オンラインデモはOctaveにあり、空の入力では機能しませんが、MATLABでは機能します。

説明

入力配列の各要素を基数10に変換すると、各行に配列の数値の桁が含まれる2D文字配列が生成されます。これらの文字を数字に変換するには、48(ASCIIは'0')を引きます。次に、行全体で合計し、平方根を取り、各値が完全な平方であるかどうかを判断し~mod 1ます。次に、このブール値を使用して入力配列をフィルタリングします。


1

Clojure、110バイト

(fn[t](filter(fn[x](let[a(reduce +(*(count(str x))-48)(map int(str x)))](some #(=(* % %)a)(range(inc a)))))t))

数字の合計を計算し、合計に等しい数が存在しない数字を除外します。

ここで結果を見ることができます-https://ideone.com/ciKOje


1

Perl 6の 38の   35バイト

{.grep: {($/=sqrt [+] .comb)==$/.Int}}
{.grep: {($/=.comb.sum.sqrt)==$/.Int}}
{.grep: {($/=sqrt [+] .comb)==^$/}}
{.grep: {($/=.comb.sum.sqrt)==^$/}}

テスト:

#! /usr/bin/env perl6

use v6.c;
use Test;

my @tests = (
  [1,4,9,16,25,1111] => [1,4,9,1111],
  [1431,2,0,22,999999999] => [1431,0,22,999999999],
  [22228,4,113125,22345] => [22228,4,22345],
  [] => [],
  [421337,99,123456789,1133557799] => [],
);

plan +@tests;

my &sq-digit-sum = {.grep: {($/=sqrt [+] .comb)==^$/}}

for @tests -> $_ ( :key($input), :value($expected) ) {
  is sq-digit-sum($input), $expected, .gist
}
1..5
ok 1 - [1 4 9 16 25 1111] => [1 4 9 1111]
ok 2 - [1431 2 0 22 999999999] => [1431 0 22 999999999]
ok 3 - [22228 4 113125 22345] => [22228 4 22345]
ok 4 - [] => []
ok 5 - [421337 99 123456789 1133557799] => []

1

C、143 141バイト

  • 2バイト保存、@ user6188402
i;q(char*n){double m=0;while(*n)m+=*n++-48;m=sqrt(m)-(int)sqrt(m);return !m;}s(n,s)char**n;{i=-1;while(++i<s)if(q(n[i]))printf("%s\n",n[i]);}

Ungolfed オンラインしてみてください

int q(char*n)
{
    double m=0;

    while(*n) // sum digits
        m+=*n++-48;

    // get the decimal part of its square root
    m=sqrt(m)-(int)sqrt(m);

    // true if decimal part is zero
    return !m;
}

// input is text, can be a file
void s(char**n, int s)
{
    int i=-1;

    while(++i<s) // for each number in input
        if(q(n[i])) // if is square
            printf("%s\n",n[i]); // output is terminal
}

1

網膜、69

網膜の完全な正方形をテストするため。これは、一般化整数平方根計算用変更できます。

。+
$&a $&
+ `\ b \ d
$ * b 


\ bb
$&:
+ `(\ bb +):( bb \ 1)
$ 1 $ 2:
G`(:a | 0 $)
。* a

入力は改行で区切られたリストです。

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

  • ステージ1-各行で番号を繰り返し、 a
  • ステージ2- スペースで区切らaれたbsで表される単項への前の各数字を変換します
  • ステージ3-スペースの削除-各単項式は数字の合計を表すようになりました
  • ステージ4および5-完全な正方形が1 + 3 + 5 + 7 + ...で表現される可能性があるという事実を使用します。それに応じて各単項を分割します
  • ステージ6-上記の形式に正確に分割されたものだけをgrepフィルターします
  • ステージ7-元の番号を除くすべてを破棄する

私はこれを改善する方法をいくつか考えましたが、ほとんどの部分を書き直しました。それでも、これはまさにあなたの考えです。入力を複製し、前半で数字を展開し、奇数の和の形で正方形をフィルタリングし、残りの行の前半を破棄します。私がステップをたどった方法は、%-configuration、\Gおよび前方参照を使用することです。お気軽にどうぞretina.tryitonline.net/… :)
マーティンエンダー

1

Python、50バイト

filter(lambda x:sum(map(int,str(x)))**0.5%1==0,in)

nが数字の入力リストである場合


1
こんにちは、サイトへようこそ!これは、たとえば最短のコードを書くことができるコードとゴルフのコンペティションであるため、すべての提出物が少なくともある程度ゴルフされる必要があります。ここには、Pythonゴルフのヒントのリストがあります。私の頭の一番上で、あなたができる明らかな改善の1つは、余分な空白をすべて削除し、変数の名前をそれぞれ1文字に変更することです。コマンドライン引数の代わりに、関数引数またはSTDINとして入力を受け取ることもできます。
DJMcMayhem

また、言語とバイトカウントも指定する必要があります。たとえば、そこにカウントされます。
ニカエル

1
PPCGへようこそ!他の人が言ったことに加えて、すべてのソリューションは完全なプログラムまたは呼び出し可能な関数でなければならないことに注意してください。これまでのところ、すべての答えはスニペットであり、入力が何らかの変数に格納されていると仮定して結果を評価するだけであり、残念ながら無効になっています。受け入れ可能なI / Oメソッドについては、このメタ投稿を参照してください。
マーティンエンダー


1

K(oK)19 17 13バイト

溶液:

(~1!%+/.:'$)#

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

説明:

(~1!%+/.:'$)# / the solution
(          )# / apply function to list
          $   / convert to string
       .:'    / value (.:) each (')
     +/       / sum
    %         / square-root
  1!          / modulo 1
 ~            / not

ノート:

  • -正方形を識別するよりスマートな方法で-2バイト
  • ngnのおかげで-4バイト

1
filter(func#listについて知っていますか?
ngn

私はしませんでした
ストリートスター

1

MathGolf5 4バイト

gÅΣ°

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

説明:

gÅ    Filter by the next two instructions
  Σ   The digit sum
   °  Is a perfect square?

MathGolfはまだ開発中です。そのため暗黙の入力が間もなくその最初のバイトを削減するものと思われます。わーい!


私ではなく最初のMathGolfの回答おめでとうございます!暗黙の入力についてエミグナと話し合ったところ、彼は素晴らしいアイデアをくれました。うまくいけばすぐに来ます。
maxb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.