Os números são amigáveis?


9

Dois números são considerados amigáveis se a soma correta do primeiro divisor for igual ao segundo número, a soma adequada do segundo número for igual ao primeiro número e o primeiro e o segundo número não forem iguais.

Vamos definir S(x)como a soma correta do divisor de x. 220 e 284 são amigáveis ​​porque S(220) = 284e S(284) = 200.

Sua tarefa é, sem surpresa, determinar se dois números introduzidos são amigáveis ​​ou não. As entradas serão números inteiros positivos e você pode gerar dois valores consistentes e distintos para amigável ou não.

Esta é a sequência OEIS A259180

Este é um portanto o código mais curto vence.

Casos de teste

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
Atualizar o desafio de invalidar soluções existentes não é legal nem, no meu livro, é validação de entrada. Eu sugiro permitir que ambos os números sejam iguais ou não exigir que lidemos com esses casos.
Shaggy

@ Shaggy, eu concordo, mas dado que metade das soluções atualmente valida a entrada e que validar a entrada faz parte do desafio, não posso mudar para nenhuma dessas sugestões, pois soluções diferentes estariam fazendo coisas diferentes. Perdi uma supervisão, mas revogá-la tornaria o desafio ainda pior.
caird coinheringaahing

3
@ Shaggy, neste caso, acho que uma exceção pode estar em ordem, já que esta é a definição de cordialidade.
cole

Respostas:


5

Gelatina , 5 bytes

QfÆṣ⁼

Um link monádico que obtém uma lista de dois números inteiros que retorna 1 se eles são um par de números amigáveis ​​e 0 caso contrário.

Experimente online!

Quão?

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ÆṣỊe œ¿ÆṣḊtambém marcar 5 bytes.
Dennis

e ÆṣQU⁼- talvez haja uma sorrateira 4 em algum lugar ...
Jonathan Allan


3

Python 2, 71 67 bytes

-4 bytes graças ao xnor

+9 bytes graças a caird coinheringaahing

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

parcialmente inspirado por [esta resposta]


2
Bem vindo ao site! Você não pode presumir que a entrada possa ser armazenada em uma variável; portanto, você deve incluí-la def f(x): returnno seu bytecount.
caird coinheringaahing

Um mapcom lambdaexpressão é quase sempre maior que uma compreensão de lista.
Xnor


2

Haskell , 53 bytes

-2 bytes graças ao BMO. -1 byte graças a Ørjan Johansen.

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

Experimente online!

Ungolfed with UniHaskell and-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
Como 0 não é uma entrada válida, você pode salvar um byte movendo-se a/=bdentro da compreensão da lista.
Ørjan Johansen

2

J, 51 28 27 24 bytes

-Lotes de bytes graças a @cole

-1 mais byte graças a @cole

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

Experimente online!


Eu acho que você pode usar -:[:|.(1#.i.*0=i.|])”0ou algo parecido com isso. A soma do divisor (verbo mais à direita) é retirada do comentário da milha sobre a nossa questão da soma do divisor. Editar: com aspas diferentes, pois estou no celular.
cole

Aparentemente, eles precisam não ser iguais, portanto, anteceda a ~:/*].
cole

Na verdade, acho que você pode ~.-:... (combinar com dados não deduzidos), que roubei da resposta do Jelly.
cole

Eu removi uma correspondência extra -:no seu código, atualizei o bytecount e adicionei um link TIO. Espero que tudo bem por você. Sinta-se à vontade para reverter se não estiver (mas a solução anterior apresentava um erro de domínio que você deseja corrigir).
cole

2
20 bytes com>:@#.~/.~&.q:-:~:*+/
milhas

2

JavaScript (ES6), 53 bytes

Recebe entrada na sintaxe de currying (a)(b). Retorna 0ou 1.

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

Demo

Quão?

Usamos a função g para obter a soma dos divisores adequados de um dado inteiro.

Primeiro calculamos g (a) e comparamos com b . Se g (a) = b , calculamos g (b) e comparamos com a . Caso contrário, calculamos g (1) , que fornece 0 e não pode ser igual a a .

Além disso, verificamos que a não é igual a b .


2

Python 3, 84 bytes

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

Solução simples. d resume os divisores (n% i <1 é avaliado para 1 se s divide n). a ^ b é diferente de zero se a! = b. O LHS da desigualdade é, portanto, 0 se os números não forem amigáveis ​​e> 0 em caso contrário.





1

PowerShell , 87 96 bytes

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

Experimente online!

Recebe entrada $a,$b. Define a filter(aqui equivalente a uma função) que recebe entrada $n. Dentro de nós construir um intervalo de 1ao $n-1, retirar aqueles que são divisores, -join-los juntamente com +e enviar para Invoke-Expression(semelhante a eval).

Finalmente, fora do filtro, simplesmente verificamos se a soma do divisor de uma entrada é igual à outra e vice-versa (e validação da entrada para garantir que não sejam iguais). Esse valor booleano é deixado no pipeline e a saída é implícita.


Falha por 6, 6 .
Xcoder

@ Mr.Xcoder Boo-urns. Corrigido por 9 bytes. : - /
AdmBorkBork

1

Pitão, 12 bytes

q{_msf!%dTtU

Leva a entrada como uma lista.
Experimente online

Explicação

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

Lote, 127 bytes

@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

Saída 1se os parâmetros forem amigáveis. Funciona subtraindo todos os fatores da soma dos números de entrada para cada número de entrada e, se os dois resultados forem zero, os números são amigáveis.


1

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

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

Experimente online!

Infix Dfn, corrigido para o caso de entradas iguais.

Obrigado @Uriel por 8 bytes; @cole por 1 byte; @ Adám por 15 bytes.

Quão?

{(≠/⍵)∧(⌽⍵)≡+/¨¯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 também me ajudou com uma função tácita de 22 20 bytes equivalente ao Dfn:

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

Experimente online!

Quão?

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

Você pode economizar alguns bytes usando eaches em vez de duplicar código
Uriel

@ Uriel Estou realmente trabalhando nisso. Apenas pensei em postar isso para editá-lo mais tarde.
J. Sallé

Falha por 6, 6 .
Xcoder

@ Mr.Xcoder corrigido. Eu não tinha idéia de que era para devolver falsidade por entradas iguais.
J. Sallé

Whitespace golfe para 36 - {(⍺≠⍵)∧⍵⍺≡+/¨¯1↓¨(0=⍺⍵|⍨⍳¨⍺⍵)/¨⍳¨⍺⍵}. Eu não tenho ido através da lógica ainda
Uriel



1

SNOBOL4 (CSNOBOL4) , 153 146 bytes

	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)

Experimente online!

Define uma função Aque calcula a compatibilidade de dois números, retornando 1para amigável e a sequência vazia para não. O algoritmo é o mesmo da minha resposta anterior, então deixo a explicação antiga abaixo.

	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

Pitão , 13 bytes

&-FQqFms{*MyP

+4 bytes para verificar se os valores são distintos, acho que isso não deveria fazer parte do desafio ...

Quase certamente pode ser jogado muito

Experimente 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

Corrigido (preenchimento!)
Dave

1

APL + WIN, 49 54 41 40 35 bytes

Reescrito para rejeitar entradas inteiras iguais

Solicita a entrada na tela de um vetor dos dois números inteiros.

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

Você pode verificar se isso é válido para entradas como 6, 6 ?
Xcoder

@Senhor. Xcoder Isso resulta em 1 para 6,6, o que não concorda com o caso de teste acima. Os divisores de 6 são 1,2,3, que somam 6, então o que estou perdendo?
Graham


@Graham OP disse que eles devem ser números diferentes .
totallyhuman

1

NARS APL, 38 bytes, 18 caracteres

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

11π⍵ encontre a soma dos divisores de ⍵ em 1..⍵; note que a pergunta quer (11π⍵) -⍵ e no APLsm

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

o teste

  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 bytes

Recebe a entrada como uma matriz de 2 números.

®â¬xÃeUâ w

Tente


  • Adicionado 3 bytes para lidar [6,11].
  • Adicionados mais 3 bytes após a atualização do desafio para exigir validação de entrada. (Boo-urnas em ambas as frentes!)
  • Guardado 1 byte graças a Oliver.


1

Braquilog , 9 bytes

≠.{fk+}ᵐ↔

Experimente online!

Recebe as entradas como uma lista e as saídas por sucesso ou falha.

             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

Quarto (gforth) , 80 bytes

Reformulado solução de reffu .

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

Experimente online!

Como funciona

: 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.