数字は友好的ですか?


9

2つの数値は、最初の数値の適切な除数合計が2番目の数値と同じで、2番目の数値の適切な除数合計が最初の数値と等しく、最初と2番目の数値が等しくない場合、友好的と見なされます。

S(x)の適切な約数和であると定義しましょうx。220と284は、友好的な理由はあるS(220) = 284S(284) = 200

あなたの仕事は、当然のことながら、入力された2つの数値が友好的かどうかを判断することです。入力は正の整数であり、友好的かどうかの2つの異なる一貫した値を出力できます。

これはOEISシーケンスA259180です

これはので、最短のコードが優先されます。

テストケース

input, input => output
220, 284 => 1
52, 100 => 0
10744, 10856 => 1
174292, 2345 => 0
100, 117 => 0
6, 11 => 0
495, 495 => 0
6, 6 => 0


7
既存のソリューションを無効にするという課題の更新はクールではなく、私の本では入力検証でもありません。両方の数値を同じにするか、それらのケースを処理する必要がないようにすることをお勧めします。
Shaggy

@Shaggy同意しますが、ソリューションの半分が現在入力を検証しており、入力の検証が課題の一部であることを考えると、ソリューションによって異なることになるため、これらの提案のいずれかに変更することはできません。それは私が見逃した見落としですが、それを取り消すと、全体的に課題が悪化します。
caird coinheringaahing

3
この場合@Shaggyは、友好性の定義であるため、例外が適切である可能性があると思います。
cole

回答:


5

ゼリー、5 バイト

QfÆṣ⁼

2つの整数のリストを取得するモナディックリンク。友好的な数値のペアの場合は1を返し、それ以外の場合は0を返します。

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

どうやって?

QfÆṣ⁼ - Link: pair of numbers L, [a, b]   e.g. [220,284]  or [6,6]  or [6,11]  or [100,52]
Q     - de-duplicate L                         [220,284]     [6]       [6,11]     [100,52]
  Æṣ  - proper divisor sum of L (vectorises)   [284,220]     [6]       [6,1]      [117,46]
 f    - filter keep left if in right           [220,284]     [6]       [6]        []
    ⁼ - equal to L?                            1             0         0          0

;wÆṣỊそしてœ¿ÆṣḊまた、5つのバイトを獲得。
Dennis

そしてÆṣQU⁼-おそらくどこかに卑劣な4があるでしょう...
ジョナサンアラン


3

Python 2、71 67バイト

xnorによる-4バイト

caird coinheringaahingによる+9バイト

lambda c:[sum(i for i in range(1,x)if x%i<1)for x in c]==c[::-1]!=c

[この答え]に部分的に触発された


2
サイトへようこそ!入力を変数に格納できるとは限りません。そのためdef f(x): return、バイト数にを含める必要があります。
caird coinheringaahing

表現は、ほぼ常に長いリスト内包を超えています。maplambda
XNOR


2

Haskell、53バ​​イト

-BMOのおかげで2バイト。ØrjanJohansenのおかげで-1バイト。

a!b=a==sum[i|i<-[1..b-1],b`mod`i<1,a/=b]
a#b=a!b&&b!a

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

Ungolfed UniHaskell-XUnicodeSyntax

import UniHaskell

equalsOmega        Int  Int  Bool
a `equalsOmega` b = a  sum [i | i  1  pred b, i  b, a  b]

areAmicable        Int  Int  Bool
areAmicable a b   = (a `equalsOmega` b)  (b `equalsOmega` a)

1
0は有効な入力ではないのでa/=b、リスト内包に移動することで1バイトを節約できます。
Ørjanヨハンセン

2

J、51 28 27 24バイト

-@coleのおかげで多くのバイト

-1 @coleのおかげでさらに1バイト

~.-:[:|.(1#.i.*0=i.|])"0

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


-:[:|.(1#.i.*0=i.|])”0それに似たものを使ってもいいと思います。約数和(右端の動詞)は、約数和の質問に対するマイルのコメントから取得されます。編集:私はモバイルなので、別の引用符を付けます。
cole

どうやらそれらは等しくない必要があるので、先頭にを付けます~:/*]
cole

実際、私はあなたが代わりにできると思います~.-:...(重複排除された入力と一致します)、これはジェリーの答えから盗みました。
cole

-:コードから余分な-match を削除し、バイトカウントを更新して、TIOリンクを追加しました。よろしくお願いします。そうでない場合は、遠慮なくロールバックしてください(ただし、以前に解決したいドメインエラーがソリューションにあった場合)。
コール

2
20バイト、>:@#.~/.~&.q:-:~:*+/
マイル

2

JavaScript(ES6)、53バイト

カリー化構文で入力を受け取ります(a)(b)0またはを返します1

a=>b=>a!=b&a==(g=n=>--a&&a*!(n%a)+g(n))(a=g(a)-b?1:b)

デモ

どうやって?

関数gを使用して、特定の整数の適切な除数の合計を取得します。

最初にg(a)を計算しそれをbと比較します。もしグラム()= B、我々コンピュートグラム(B)とし、それを比較します。それ以外の場合は、g(1)を計算しますこれにより、0が返され、aと等しくなることはありません。

さらに、abと等しくないことを確認します。


2

Python 3、84バイト

d=lambda n:sum(i*(n%i<1)for i in range(1,n))
f=lambda a,b:(d(a)==b)*(d(b)==a)*(a^b)>0

簡単なソリューション。dは除数を合計します(n%i <1は、iがnを除算する場合に1に評価されます)。a ^ bは、a!= bの場合にゼロ以外です。したがって、不等式のLHSは、数値が友好的でない場合は0、それ以外の場合は> 0です。





1

PowerShell87 96バイト

param($a,$b)filter f($n){(1..($n-1)|?{!($n%$_)})-join'+'|iex}(f $a)-eq$b-and(f $b)-eq$a-and$a-$b

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

入力を受け取ります$a,$bfilterinputを取る(ここでは関数と同等)を定義します$n。内部では、から1までの範囲を作成し、$n-1約数であるものを引き出し、-joinそれらを一緒に+送信しますInvoke-Expression(と同様eval)。

最後に、フィルターの外で、1つの入力の約数合計が他の値と等しいかどうか、またその逆かどうかを確認します(また、入力の検証により、それらが等しくないことを確認します)。そのブール値はパイプラインに残され、出力は暗黙的です。


6、6の失敗。
Xcoder氏2018年

@ Mr.Xcoder Boo-urns。9バイトに修正されました。:-/
AdmBorkBork

1

Pyth、12バイト

q{_msf!%dTtU

入力をリストとして受け取ります。
オンラインでお試しください

説明

q{_msf!%dTtU
   m         Q    For each element d of the (implicit) input...
          tUd     ... get the range [1, ..., d - 1]...
     f!%dT        ... filter those that are factors of d...
    s             ... and take the sum.
 {_               Reverse and deduplicate...
q             Q   ... and check if the end result is the same as the input.


1

バッチ、127バイト

@if %1==%2 exit/b
@set/as=t=%1+%2
@for /l %%i in (1,1,%s%)do @set/as-=%%i*!(%1%%%%i),t-=%%i*!(%2%%%%i)
@if %s%%t%==00 echo 1

1パラメータが友好的である場合に出力します。各入力番号の入力番号の合計からすべての要素を差し引くことで機能し、両方の結果がゼロの場合、その番号は友好的です。


1

APL(Dyalog Unicode)45 38 44 36 35 20バイト

{(≠/⍵)∧(⌽⍵)≡+/¨¯1↓¨(0=⍵|⍨⍳¨⍵)/¨⍳¨⍵}

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

接頭辞Dfn、等しい入力の場合に修正されました。

8バイトをありがとう@Uriel; @cole(1バイト)。15バイトの@Adám。

どうやって?

{(≠/⍵)∧(⌽⍵)≡+/¨¯1↓¨(0=⍵|⍨⍳¨⍵)/¨⍳¨⍵}  Main function, infix. Input is ⍵.
{                               ⍳¨⍵}  Generate the range [1,n] for each element of ⍵.
                                    Replicate into each the resulting vectors of:
                   (  ⍵|⍨⍳¨⍵)          modulo each element of the ranges;
                    0=                Equals 0?
               ¯1↓¨                   Drop the last element of each
            +/¨                       Sum of each
       (⌽⍵)≡                          Check if the results match the inverse of ⍵.
                                     Logical AND.
 (≠/⍵)                                Inputs are different

@Adámは、Dfnと同等の22の 20バイトの暗黙の関数でも私を助けてくれました。

≠/∧⌽≡(+/∘∊⍳⊆⍨0=⍳|⊢)¨

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

どうやって?

≠/∧⌽≡(+/∘∊⍳⊆⍨0=⍳|⊢)¨⍝ Tacit fn, takes one right argument.
     (              For each element e of the argument
               ⍳|⊢    e modulo range [1,e]
             0=       Equals 0? This generates a boolean vector
                     Swap arguments for the following op/fn
                     Partition. This partitions the right vector argument according to 1-runs from a left boolean vector argument of same size.
                     Range [1,e]
                     Enlist; dump all elements into a single vector.
                     And then
      +/              Sum the elements
   ⌽≡                 Check if the resulting sums match the inverse of the argument
                     Logical AND
≠/                    The elements of the argument are different.

eachコードを複製するのではなく、es を使用することで数バイトを節約できます
Uriel

@Uriel実際に取り組んでいます。後で編集できるように、これを投稿する必要があると思いました。
J.サレ

6、6の失敗。
Xcoder氏18年

@ Mr.Xcoderを修正しました。同等の入力に対して偽の値を返すことになっているとは思いもしませんでした。
J.サレ

36のホワイトスペースゴルフ- {(⍺≠⍵)∧⍵⍺≡+/¨¯1↓¨(0=⍺⍵|⍨⍳¨⍺⍵)/¨⍳¨⍺⍵}。私はまだ論理を通過していません
Uriel



1

SNOBOL4(CSNOBOL4)153 146バイト

	DEFINE('D(X)I')
	DEFINE('A(M,N)')
A	A =EQ(D(M),N) EQ(D(N),M) ~EQ(N,M) 1 :(RETURN)
D	I =LT(I,X - 1) I + 1	:F(RETURN)
	D =EQ(REMDR(X,I)) D + I	:(D)

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

A2つの数値の友好性を計算する関数を定義し、1友好的な場合は空の文字列を返し、そうでない場合は空の文字列を返します。アルゴリズムは以前の答えと同じなので、以下の古い説明は残しておきます。

	DEFINE('D(X)I')					;*function definition
	M =INPUT					;*read M,N as input
	N =INPUT
	OUTPUT =EQ(D(M),N) EQ(D(N),M) ~EQ(N,M) 1 :(END)	;* if D(M)==N and D(N)==M and N!=M, output 1. goto end.
D	I =LT(I,X - 1) I + 1	:F(RETURN)		;* function body: increment I so long as I+1<X, return if not.
	D =EQ(REMDR(X,I)) D + I	:(D)			;* add I to D if D%%I==0, goto D
END

1

Pyth、13バイト

&-FQqFms{*MyP

+4バイトで値が異なるかどうかを確認します。これは課題の一部ではないように思います...

ほぼ確実にゴルフができる

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


&-FQqFms{*MyP     Full program, takes input from stdin and outputs to stdout
 -FQ              Q0 - Q1 is true, meaning elements are distinct
&                  and
      m       Q   for each element of the input list, apply
           yPd    take the powerset of the prime factors
        {*M       multiply each list and deduplicate
       s          and sum the list (this represents S(n)+n )
    qF            and fold over equality, returning whether the two elements are equal

修正済み(フィラー!)
Dave

1

APL + WIN、49 54 41 40 35バイト

等しい整数入力を拒否するように書き直されました

2つの整数のベクトルの画面入力を要求します。

(≠/n)×2=+/n=⌽+/¨¯1↓¨(0=m|n)×m←⍳¨n←⎕

これが6、6などの入力に対して有効かどうかを確認できますか?
Xcoder氏2018年

@氏。Xcoder結果は6,6で1になり、上記のテストケースと一致しません。6の除数は1、2、3で合計は6になるため、何が欠けていますか?
グラハム


@Graham OPは、異なる数値である必要があると述べました。
完全に人間的な

1

APL NARS、38バイト、18文字

{≠/⍵∧∧/⍵=⌽-⍵-11π⍵}

11π⍵は、1..⍵のofの約数の合計を求めます。質問は(11π⍵)-⍵とAPLsmで欲しいことに注意してください

-⍵-11π⍵=-(⍵-11π⍵)=(11π⍵)-⍵

テスト

  t←{≠/⍵∧∧/⍵=⌽-⍵-11π⍵}
  t 284 220⋄t 52 100⋄t 10744 10856 ⋄t 174292 2345
1
0
1
0
  t 100 117⋄t 6 11⋄t 495 495⋄t 6 6
0
0
0
0

1

ジャプト7 12 10バイト

入力を2つの数値の配列として受け取ります。

®â¬xÃeUâ w

それを試してみてください


  • 処理する3バイトを追加 [6,11]
  • 入力検証を要求するようにチャレンジが更新された後、さらに3バイトが追加されました。(両方の面でブーン!)
  • 1バイトを保存しました。Oliverに感謝します。



1

フォース(gforth)、80バイト

reffuのソリューションをリファクタリング。

: d { n } 0 n 1 do n i mod 0= i * - loop ;
: f 2dup <> -rot 2dup d swap d d= * ;

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

使い方

: d { n -- divsum } \ Takes a number and gives its divisor sum (excluding self)
                    \ Store n as a local variable
  0 n 1 do          \ Push 0 (sum) and loop through 1 to n-1...
    n i mod 0=      \   If n % i == 0, push -1 (built-in true in Forth); otherwise push 0
    i * -           \   If the value above is -1, add i to the sum
  loop ;            \ End loop and leave sum on the stack

: f ( n1 n2 -- f )  \ Main function f. Takes two numbers and gives if they are amicable
  2dup <>           \ Are they not equal? ( stack: n1 n2 n1<>n2 )
  -rot              \ Move the boolean under n1 n2 ( stack: n1<>n2 n1 n2 )
  2dup d swap d     \ Copy two numbers, apply d to both and swap
                    \ ( stack: n1<>n2 n1 n2 n2.d n1.d )
  d=                \ Compare two 2-cell numbers for equality; n1=n2.d && n2=n1.d
  * ;               \ Return the product of the two booleans
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.