Là những con số thân thiện?


9

Hai số được coi là hòa hợp nếu tổng số chia đúng của số thứ nhất giống với số thứ hai, tổng số chia đúng của số thứ hai bằng số thứ nhất và số thứ nhất và số thứ hai không bằng nhau.

Hãy xác định S(x)là tổng ước số thích hợp của x. 220 và 284 là thân thiện vì S(220) = 284S(284) = 200.

Nhiệm vụ của bạn là, không có gì đáng ngạc nhiên, để xác định xem hai số được nhập có thể hòa hợp hay không. Các đầu vào sẽ là các số nguyên dương và bạn có thể xuất hai giá trị riêng biệt, nhất quán để hòa hợp hoặc không.

Đây là trình tự OEIS A259180

Đây là một để mã ngắn nhất sẽ thắng.

Các trường hợp thử nghiệm

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
Cập nhật thách thức để vô hiệu hóa các giải pháp hiện tại không phải là mát mẻ, trong cuốn sách của tôi, là xác nhận đầu vào. Tôi đề nghị hoặc cho phép cả hai số giống nhau hoặc không yêu cầu chúng tôi xử lý các trường hợp đó.
Xù xì

@Shaggy Tôi đồng ý, nhưng với một nửa các giải pháp hiện đang xác thực đầu vào và việc xác thực đầu vào là một phần của thách thức, tôi thực sự không thể thay đổi một trong những đề xuất đó, vì các giải pháp khác nhau sẽ làm những việc khác nhau. Đó là một sự giám sát mà tôi đã bỏ lỡ, nhưng việc thu hồi nó sẽ khiến cho thách thức trở nên tồi tệ hơn.
caird coinheringaahing

3
@Shaggy trong trường hợp này, tôi nghĩ rằng một ngoại lệ có thể theo thứ tự vì đây là định nghĩa của tính dễ hiểu.
cole

Câu trả lời:


5

Thạch , 5 byte

QfÆṣ⁼

Một liên kết đơn âm lấy danh sách hai số nguyên trả về 1 nếu chúng là một cặp số hòa và 0 khác.

Hãy thử trực tuyến!

Làm sao?

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ÆṣỊœ¿ÆṣḊcũng ghi được 5 byte.
Dennis

ÆṣQU⁼- có thể có 4 người lén lút ở đâu đó ...
Jonathan Allan


3

Python 2, 71 67 byte

-4 byte nhờ xnor

+9 byte nhờ caird coinheringaahing

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

một phần lấy cảm hứng từ [câu trả lời này]


2
Chào mừng đến với trang web! Bạn không thể cho rằng đầu vào có thể được lưu trữ trong một biến, vì vậy bạn phải bao gồm def f(x): returntrong đầu vào của bạn.
caird coinheringaahing

Một mapvới lambdabiểu hiện là gần như luôn luôn dài hơn một hiểu danh sách.
xnor


2

Haskell , 53 byte

-2 byte nhờ BMO. -1 byte nhờ rjan Johansen.

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

Hãy thử trực tuyến!

Ung dung với 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
Vì 0 không phải là đầu vào hợp lệ, bạn có thể lưu một byte bằng cách di chuyển a/=bbên trong danh sách hiểu.
Ørjan Johansen

2

J, 51 28 27 24 byte

-Lất nhiều byte nhờ @cole

Thêm byte nhờ vào @cole

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

Hãy thử trực tuyến!


Tôi nghĩ rằng bạn có thể sử dụng -:[:|.(1#.i.*0=i.|])”0hoặc một cái gì đó giống như nó. Tổng số chia (động từ ngoài cùng bên phải) được lấy từ nhận xét của dặm về câu hỏi tổng số chia của chúng tôi. Chỉnh sửa: với một dấu ngoặc kép khác nhau kể từ khi tôi trên điện thoại di động.
cole

Rõ ràng họ cần không bằng nhau nên trả trước a ~:/*].
cole

Trên thực tế, tôi nghĩ rằng bạn có thể thay vào đó ~.-:... (khớp với đầu vào suy diễn), mà tôi đã đánh cắp từ câu trả lời Jelly.
cole

Tôi đã xóa một mã bổ sung -:trong mã của bạn, cập nhật mã byte và thêm liên kết TIO. Hy vọng đó là OK của bạn. Vui lòng quay lại nếu không (nhưng giải pháp trước đó đã có lỗi tên miền bạn muốn khắc phục).
cole

2
20 byte với>:@#.~/.~&.q:-:~:*+/
dặm

2

JavaScript (ES6), 53 byte

Đưa đầu vào theo cú pháp currying (a)(b). Trả về 0hoặc 1.

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

Bản giới thiệu

Làm sao?

Chúng ta sử dụng hàm g để lấy tổng các ước của một số nguyên cho trước.

Đầu tiên chúng ta tính g (a) và so sánh nó với b . Nếu g (a) = b , chúng ta tính g (b) và so sánh nó với a . Mặt khác, chúng tôi tính g (1) , cho 0 và không thể bằng a .

Chúng tôi cũng kiểm tra thêm rằng a không bằng b .


2

Python 3, 84 byte

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

Giải pháp đơn giản. d tổng các ước số (n% i <1 ước tính thành 1 iff i chia n). a ^ b là khác không iff a! = b. Do đó, LHS của bất đẳng thức là 0 nếu các số không thể hòa hợp và> 0 khác.





1

PowerShell , 87 96 byte

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

Hãy thử trực tuyến!

Đưa đầu vào $a,$b. Xác định một filter(ở đây tương đương với một chức năng) có đầu vào $n. Bên trong chúng tôi xây dựng một phạm vi từ 1đến $n-1, kéo ra những cái là ước số, -joinchúng cùng với +và gửi nó đến Invoke-Expression(tương tự eval).

Cuối cùng, bên ngoài bộ lọc, chúng tôi chỉ cần kiểm tra xem tổng của một đầu vào có bằng với đầu vào kia hay ngược lại (và xác thực đầu vào để đảm bảo chúng không bằng nhau). Giá trị Boolean đó được để lại trên đường ống và đầu ra là ẩn.


Thất bại trong 6, 6 .
Ông Xcoder

@ Mr.Xcoder Boo-urns. Đã sửa cho 9 byte. : - /
admBorkBork

1

Bình thường, 12 byte

q{_msf!%dTtU

Lấy đầu vào như một danh sách.
Dùng thử trực tuyến

Giải trình

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

Mẻ, 127 byte

@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

Đầu ra 1nếu các tham số là thân thiện. Hoạt động bằng cách trừ tất cả các yếu tố từ tổng các số đầu vào cho mỗi số đầu vào và nếu cả hai kết quả đều bằng 0 thì các số đó đều có thể hòa giải được.


1

APL (Dyalog Unicode) , 45 38 44 36 35 20 byte

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

Hãy thử trực tuyến!

Infix Dfn, cố định cho trường hợp đầu vào bằng nhau.

Cảm ơn @Uriel cho 8 byte; @cole cho 1 byte; @ Adám cho 15 byte.

Làm sao?

{(≠/⍵)∧(⌽⍵)≡+/¨¯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 cũng đã giúp tôi với chức năng ngầm định 22 20 byte tương đương với Dfn:

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

Hãy thử trực tuyến!

Làm sao?

≠/∧⌽≡(+/∘∊⍳⊆⍨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.

Bạn có thể lưu một vài byte bằng cách sử dụng eaches thay vì sao chép mã
Uriel

@Uriel Tôi thực sự đang làm việc trên đó. Chỉ cần nghĩ rằng tôi nên đăng bài này để tôi có thể chỉnh sửa nó sau.
J. Sallé

Thất bại trong 6, 6 .
Ông Xcoder

@ Mr.Xcoder đã sửa. Tôi không có ý tưởng rằng nó sẽ được trả lại giả cho đầu vào bằng nhau.
J. Sallé

Khoảng trắng golf cho 36 - {(⍺≠⍵)∧⍵⍺≡+/¨¯1↓¨(0=⍺⍵|⍨⍳¨⍺⍵)/¨⍳¨⍺⍵}. Tôi chưa đi qua logic
Uriel



1

SNOBOL4 (CSNOBOL4) , 153 146 byte

	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)

Hãy thử trực tuyến!

Xác định một hàm Atính toán mức độ dễ hiểu của hai số, trả về giá 1trị hòa và chuỗi trống không. Thuật toán giống như câu trả lời trước của tôi vì vậy tôi để lại lời giải thích cũ bên dưới.

	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

Bình thường , 13 byte

&-FQqFms{*MyP

+4 byte để kiểm tra xem các giá trị có khác biệt không, tôi cảm thấy như đó không phải là một phần của thách thức ...

Gần như chắc chắn có thể được chơi golf rất nhiều

Hãy thử trực tuyến!


&-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

Đã sửa lỗi (filler!)
Dave

1

APL + THẮNG, 49 54 41 40 35byte

Viết lại để từ chối đầu vào số nguyên bằng nhau

Lời nhắc cho đầu vào màn hình của một vectơ của hai số nguyên.

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

Bạn có thể kiểm tra xem điều này có hợp lệ cho các đầu vào như 6, 6 không?
Ông Xcoder

@Ông. Xcoder Kết quả là 1 cho 6,6 không phù hợp với trường hợp thử nghiệm ở trên. Các ước của 6 là 1,2,3 mà tổng bằng 6 vậy tôi còn thiếu gì?
Graham


@Graham OP cho biết họ phải là những con số khác nhau .
hoàn toàn là

1

APL NARS, 38 byte, 18 ký tự

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

11π⍵ tìm tổng các ước của trong 1..⍵; lưu ý rằng câu hỏi muốn (11π⍵)-và trong APLsm

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

các bài kiểm tra

  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

Japt , 7 12 10 byte

Lấy đầu vào là một mảng gồm 2 số.

®â¬xÃeUâ w

Thử nó


  • Đã thêm 3 byte để xử lý [6,11].
  • Đã thêm 3 byte sau khi thử thách được cập nhật để yêu cầu xác thực đầu vào. (Boo-urns trên cả hai mặt trận!)
  • Đã lưu 1 byte cảm ơn Oliver.


1

Brachylog , 9 byte

≠.{fk+}ᵐ↔

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng danh sách và đầu ra thông qua thành công hay thất bại.

             The input
≠            which contains no duplicate values
 .           is the output variable,
  {   }ᵐ     and its elements'
    k        proper
   f         divisor
     +       sums
        ↔    reversed
             are also the output variable.

1

Forth (gforth) , 80 byte

Giải pháp tái cấu trúc của reffu .

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

: 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.