Apakah angkanya bersahabat?

9

Dua angka dianggap bersahabat jika jumlah pembagi yang tepat dari yang pertama sama dengan angka kedua, jumlah pembagi yang tepat angka kedua sama dengan angka pertama, dan angka pertama dan kedua tidak sama.

Mari kita definisikan S(x)sebagai jumlah pembagi yang tepat x. 220 dan 284 bersahabat karena S(220) = 284dan S(284) = 200.

Tugas Anda adalah, secara tidak mengejutkan, untuk menentukan apakah dua angka yang dimasukkan cocok atau tidak. Input akan berupa bilangan bulat positif dan Anda dapat menampilkan dua nilai yang berbeda dan konsisten untuk damai atau tidak.

Ini adalah urutan OEIS A259180

Ini adalah sehingga kode terpendek menang.

Uji kasus

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
caird coinheringaahing
sumber
Terkait , Terkait
caird coinheringaahing
7
Memperbarui tantangan untuk membatalkan solusi yang ada tidak keren juga, dalam buku saya, adalah validasi input. Saya sarankan membiarkan kedua nomor sama atau tidak mengharuskan kami untuk menangani kasus-kasus itu.
Shaggy
@ Shaggy Saya setuju, tetapi mengingat bahwa separuh solusi saat ini memvalidasi input, dan bahwa memvalidasi input adalah bagian dari tantangan, saya tidak dapat benar-benar mengubah salah satu dari saran tersebut, karena solusi yang berbeda akan melakukan hal yang berbeda. Ini kesalahan yang saya lewatkan, tetapi mencabutnya akan membuat tantangan menjadi lebih buruk secara keseluruhan.
caird coinheringaahing
3
@ Shaggy dalam hal ini, saya pikir pengecualian mungkin dilakukan karena ini adalah definisi keramahan.
cole

Jawaban:

5

Jelly , 5 byte

QfÆṣ⁼

Tautan monadik yang mengambil daftar dua bilangan bulat yang mengembalikan 1 jika merupakan pasangan angka damai dan 0 sebaliknya.

Cobalah online!

Bagaimana?

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
Jonathan Allan
sumber
;wÆṣỊdan œ¿ÆṣḊjuga skor 5 byte.
Dennis
dan ÆṣQU⁼- mungkin ada 4 licik di suatu tempat ...
Jonathan Allan
3

Python 2 , 65 63 66 byte

-2 byte terima kasih kepada Tn. Xcoder

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

Cobalah online!

tongkat
sumber
3

Python 2, 71 67 byte

-4 byte terima kasih kepada xnor

+9 byte berkat caird coinheringaahing

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

sebagian terinspirasi oleh [jawaban ini]

Asone Tuhid
sumber
2
Selamat datang di situs ini! Anda mungkin tidak berasumsi bahwa input dapat disimpan dalam variabel, jadi Anda harus memasukkan def f(x): returndalam bytecount Anda.
caird coinheringaahing
Sebuah mapdengan lambdaekspresi hampir selalu lebih lama dari daftar pemahaman.
xnor
3

Brain-Flak , 178 byte

{(({})(<>))<>({<<>(({})<<>{(({})){({}[()])<>}{}}>)<>([{}](({}[()])))>{[()]((<{}{}>))}{}{}}{}<>)<>}<>(({}<>)<>[({}{}<>)])({<{}({<({}<>[{}])>{()(<{}>)}{}})>(){[()](<{}>)}}<{}{}{}>)

Cobalah online!

Nitrodon
sumber
2

Haskell , 53 byte

-2 byte terima kasih kepada BMO. -1 byte terima kasih kepada Ørjan Johansen.

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

Cobalah online!

Tidak tergabung dengan UniHaskell dan-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)
benar-benar manusiawi
sumber
1
Karena 0 bukan input yang valid, Anda dapat menyimpan byte dengan berpindah a/=bke dalam pemahaman daftar.
Ørjan Johansen
2

J, 51 28 27 24 Bytes

-Banyak byte berkat @cole

-1 byte lebih banyak berkat @cole

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

Cobalah online!

Bolce Bussiere
sumber
Saya pikir Anda dapat menggunakan -:[:|.(1#.i.*0=i.|])”0atau sesuatu yang mirip dengannya. Jumlah pembagi (kata kerja paling kanan) diambil dari komentar mile pada pertanyaan jumlah pembagi kami. Sunting: dengan tanda kutip yang berbeda sejak saya di ponsel.
cole
Rupanya mereka harus tidak sama, jadi tambahkan a ~:/*].
cole
Sebenarnya saya pikir Anda bisa melakukan ~.-:... (cocok dengan input dedpulicated), yang saya curi dari jawaban Jelly.
cole
Saya menghapus ekstra-pertandingan -:dalam kode Anda, memperbarui bytecount, dan menambahkan tautan TIO. Semoga kamu baik-baik saja. Jangan ragu untuk memutar kembali jika tidak (tetapi solusi sebelumnya memiliki kesalahan domain yang ingin Anda perbaiki).
cole
2
20 byte dengan>:@#.~/.~&.q:-:~:*+/
mil
2

JavaScript (ES6), 53 byte

Mengambil input dalam sintaks currying (a)(b). Pengembalian 0atau 1.

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

Demo

Bagaimana?

Kami menggunakan fungsi g untuk mendapatkan jumlah pembagi yang tepat dari bilangan bulat yang diberikan.

Kami pertama kali menghitung g (a) dan membandingkannya dengan b . Jika g (a) = b , kami menghitung g (b) dan membandingkannya dengan a . Jika tidak, kita menghitung g (1) , yang memberikan 0 dan tidak mungkin sama dengan a .

Kami juga memeriksa bahwa a tidak sama dengan b .

Arnauld
sumber
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

Solusi mudah. d merangkum pembagi (n% i <1 mengevaluasi hingga 1 jika aku membagi n). a ^ b bukan nol jika a! = b. LHS dari ketimpangan dengan demikian adalah 0 jika angkanya tidak bersahabat dan> 0 sebaliknya.

rikhavshah
sumber
1

R , 67 byte

function(a,b)sum(which(!a%%1:a))-a==b&sum(which(!b%%1:b))-b==a&b!=a

Cobalah online!

Pengembalian TRUEuntuk damai, FALSEuntuk tidak.

Giuseppe
sumber
2
@BrunoCosta sayangnya, saya tidak bisa: itu akan menjadi 68 byte
Giuseppe
1

Perl 6 , 53 byte

{([!=] $_)&&[eqv] .map: {set +$_,sum grep $_%%*,^$_}}

Cobalah online!

Mengambil input sebagai daftar dua angka.

Sean
sumber
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

Cobalah online!

Mengambil input $a,$b. Menentukan filter(di sini setara dengan fungsi) yang mengambil input $n. Di dalam kami membuat rentang dari 1ke $n-1, menarik mereka yang merupakan pembagi, -joinmereka bersama-sama +dan mengirimkannya ke Invoke-Expression(mirip dengan eval).

Akhirnya, di luar filter, kami cukup memeriksa apakah jumlah pembagi dari satu input sama dengan yang lain dan sebaliknya (dan validasi input untuk memastikan mereka tidak sama). Nilai Boolean itu ditinggalkan di jalur pipa dan hasilnya tersirat.

AdmBorkBork
sumber
Gagal untuk 6, 6 .
Tn. Xcoder
@ Mr.Xcoder Boo-guci. Dikoreksi untuk 9 byte. : - /
AdmBorkBork
1

Pyth, 12 byte

q{_msf!%dTtU

Mengambil input sebagai daftar.
Cobalah online

Penjelasan

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.

sumber
1

05AB1E , 8 7 byte

ÙÑO¥`_`

Cobalah online!

Uriel
sumber
Lebih baik daripada üQ_sÑOüQ&pasti lol.
Magic Gurita Guci
1

Batch, 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

Keluaran 1jika parameternya bersahabat. Berfungsi dengan mengurangkan semua faktor dari jumlah angka input untuk setiap nomor input, dan jika kedua hasilnya nol maka angka tersebut bersahabat.

Neil
sumber
1

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

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

Cobalah online!

Infix Dfn, diperbaiki untuk kasus input yang sama.

Terima kasih @riel untuk 8 byte; @cole untuk 1 byte; @ Adám selama 15 byte.

Bagaimana?

{(≠/⍵)∧(⌽⍵)≡+/¨¯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 juga membantu saya dengan fungsi 22 byte tacit yang setara dengan Dfn:

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

Cobalah online!

Bagaimana?

≠/∧⌽≡(+/∘∊⍳⊆⍨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.
J. Sallé
sumber
Anda dapat menyimpan beberapa byte dengan menggunakan eaches daripada menggandakan kode
Uriel
@Uriel Saya sebenarnya sedang mengerjakan itu. Hanya berpikir saya harus memposting ini sehingga saya dapat mengeditnya nanti.
J. Sallé
Gagal untuk 6, 6 .
Tn. Xcoder
@ Mr.Xcoder diperbaiki. Saya tidak tahu itu seharusnya mengembalikan falsy untuk input yang sama.
J. Sallé
Whitespace golf untuk 36 - {(⍺≠⍵)∧⍵⍺≡+/¨¯1↓¨(0=⍺⍵|⍨⍳¨⍺⍵)/¨⍳¨⍺⍵}. Saya belum melalui logika
Uriel
1

Merah , 117 byte

d: func[n][s: 0 repeat i n / 2[if n // i = 0[s: s + i]]]
a: func[n m][either(m = d n)and(n = d m)and not n = m[1][0]]

Cobalah online!

Galen Ivanov
sumber
1

Java (OpenJDK 9) , 87 byte

a->b->a!=b&f(a)==b&f(b)==a
int f(int n){int s=0,d=0;for(;++d<n;)s+=n%d<1?d:0;return s;}

Cobalah online!

Olivier Grégoire
sumber
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)

Cobalah online!

Menentukan fungsi Ayang menghitung kedamaian dari dua angka, mengembalikan 1untuk kedamaian dan string kosong untuk tidak. Algoritmanya sama dengan jawaban saya sebelumnya jadi saya tinggalkan penjelasan lama di bawah ini.

	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
Giuseppe
sumber
1

Pyth , 13 byte

&-FQqFms{*MyP

+4 byte untuk memeriksa apakah nilainya berbeda, saya merasa seperti itu seharusnya tidak menjadi bagian dari tantangan ...

Hampir bisa dipastikan banyak bermain golf

Cobalah online!


&-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
sumber
Diperbaiki (pengisi!)
Dave
1

APL + WIN, 49 54 41 40 35bytes

Ditulis ulang untuk menolak input integer yang sama

Anjuran untuk input layar dari vektor dua bilangan bulat.

(≠/n)×2=+/n=⌽+/¨¯1↓¨(0=m|n)×m←⍳¨n←⎕
Graham
sumber
Bisakah Anda memeriksa apakah ini valid untuk input seperti 6, 6 ?
Tn. Xcoder
@Pak. Xcoder menghasilkan 1 untuk 6,6 yang tidak setuju dengan test case di atas. Pembagi 6 adalah 1,2,3 yang berjumlah 6 jadi apa yang saya lewatkan?
Graham
OP dan saya berdiskusi sebelumnya .
Tn. Xcoder
@Graham OP mengatakan nomornya pasti berbeda .
manusiawi
1

APL NARS, 38 byte, 18 karakter

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

11π⍵ menemukan jumlah pembagi ⍵ di 1..⍵; perhatikan bahwa pertanyaannya ingin (11π⍵) -⍵ dan di APLsm

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

ujian

  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
RosLuP
sumber
1

Japt , 7 12 10 byte

Mengambil input sebagai array dari 2 angka.

®â¬xÃeUâ w

Cobalah


  • Menambahkan 3 byte untuk ditangani [6,11].
  • Menambahkan 3 byte lagi setelah tantangan diperbarui untuk meminta validasi input. (Boo-guci di kedua front!)
  • Disimpan 1 byte, terima kasih kepada Oliver.
Shaggy
sumber
1

Keempat (gforth) , 91 86 byte

: d { n } 0 n 1 do n i mod 0= i * - loop ; 
: f { a b } a b = 1+ a d b = b d a = * * ;

Cobalah online!

Keempat (gforth) Tidak Ada Lokal, 94 byte

Versi lebih "Forthy" yang tidak menggunakan variabel lokal

: d 0 over 1 do over i mod 0= i * - loop nip ;
: f 2dup = 1+ -rot 2dup d -rot d = -rot = * * ;

Cobalah online!

reffu
sumber
1

Brachylog , 9 byte

≠.{fk+}ᵐ↔

Cobalah online!

Mengambil input sebagai daftar dan keluaran melalui keberhasilan atau kegagalan.

             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.
String yang tidak terkait
sumber
1

Keempat (gforth) , 80 byte

Refactored solusi reffu ini .

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

Cobalah online!

Bagaimana itu bekerja

: 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
Bubbler
sumber