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


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

;wÆṣỊdan œ¿ÆṣḊjuga skor 5 byte.
Dennis

dan ÆṣQU⁼- mungkin ada 4 licik di suatu tempat ...
Jonathan Allan


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]


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!


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)

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!


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 .


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.



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.


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


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.


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.


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.


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.

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

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

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

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←⎕

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


@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

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.


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.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.