Sind die Zahlen einvernehmlich?


9

Zwei Zahlen gelten als einvernehmlich, wenn die richtige Teilersumme der ersten Zahl mit der zweiten Zahl übereinstimmt, die richtige Teilersumme der zweiten Zahl gleich der ersten Zahl ist und die erste und die zweite Zahl nicht gleich sind.

Definieren S(x)wir die richtige Divisorsumme von x. 220 und 284 sind einvernehmlich, weil S(220) = 284und S(284) = 200.

Es ist nicht überraschend, dass Ihre Aufgabe darin besteht, festzustellen, ob zwei eingegebene Zahlen einvernehmlich sind oder nicht. Die Eingaben sind positive ganze Zahlen, und Sie können zwei unterschiedliche, konsistente Werte für gütlich oder nicht einvernehmlich ausgeben.

Dies ist die OEIS-Sequenz A259180

Dies ist ein also gewinnt der kürzeste Code.

Testfälle

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
Das Aktualisieren der Herausforderung zur Ungültigmachung vorhandener Lösungen ist weder cool noch in meinem Buch eine Eingabevalidierung. Ich schlage vor, entweder zuzulassen, dass beide Zahlen gleich sind, oder dass wir diese Fälle nicht bearbeiten müssen.
Shaggy

@Shaggy Ich stimme zu, aber da die Hälfte der Lösungen derzeit die Eingabe validiert und die Validierung der Eingabe Teil der Herausforderung ist, kann ich zu keinem dieser Vorschläge wirklich wechseln, da unterschiedliche Lösungen unterschiedliche Dinge bewirken würden. Es ist ein Versehen, das ich verpasst habe, aber es zu widerrufen, würde die Herausforderung insgesamt verschlimmern.
Caird Coinheringaahing

3
@Shaggy in diesem Fall denke ich, dass eine Ausnahme angebracht sein könnte, da dies die Definition von Freundlichkeit ist.
Cole

Antworten:


5

Gelee , 5 Bytes

QfÆṣ⁼

Eine monadische Verbindung, die eine Liste von zwei ganzen Zahlen enthält, die 1 zurückgibt, wenn es sich um ein Paar gütlicher Zahlen handelt, andernfalls 0.

Probieren Sie es online aus!

Wie?

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ÆṣỊund œ¿ÆṣḊauch 5 Bytes punkten.
Dennis

und ÆṣQU⁼- vielleicht gibt es irgendwo eine hinterhältige 4 ...
Jonathan Allan


3

Python 2, 71 67 Bytes

-4 Bytes dank xnor

+9 Bytes dank Caird Coinheringaahing

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

teilweise inspiriert von [dieser Antwort]


2
Willkommen auf der Seite! Sie dürfen nicht davon ausgehen, dass Eingaben in einer Variablen gespeichert werden können, daher müssen Sie die def f(x): returnin Ihre Bytezahl aufnehmen.
Caird Coinheringaahing

Ein mapmit lambdaAusdruck ist fast immer länger als ein Listenverständnis.
xnor


2

Haskell , 53 Bytes

-2 Bytes dank BMO. -1 Byte dank Ørjan Johansen.

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

Probieren Sie es online aus!

Ungolfed mit UniHaskell und-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
Da 0 keine gültige Eingabe ist, können Sie ein Byte speichern, indem Sie sich a/=binnerhalb des Listenverständnisses bewegen .
Ørjan Johansen

2

J, 51 28 27 24 Bytes

-Viele Bytes dank @cole

-1 mehr Byte dank @cole

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

Probieren Sie es online aus!


Ich denke, Sie können -:[:|.(1#.i.*0=i.|])”0oder etwas ähnliches verwenden. Die Divisorsumme (Verb ganz rechts) stammt aus dem Kommentar von Mile zu unserer Divisorsummenfrage. Bearbeiten: mit einem anderen Anführungszeichen, da ich auf dem Handy bin.
Cole

Anscheinend müssen sie nicht gleich sein, also stellen Sie a voran ~:/*].
Cole

Eigentlich denke ich, dass Sie stattdessen ~.-:... (Übereinstimmung mit dedpulizierten Eingaben) tun können , was ich aus der Jelly-Antwort gestohlen habe.
Cole

Ich habe ein Extra entfernt -: Übereinstimmung in Ihrem Code entfernt, die Anzahl der Bytes aktualisiert und einen TIO-Link hinzugefügt. Hoffe das ist OK von dir. Fühlen Sie sich frei, ein Rollback durchzuführen, wenn dies nicht der Fall ist (aber die vorherige Lösung hatte einen Domänenfehler, den Sie beheben möchten).
Cole

2
20 Bytes mit >:@#.~/.~&.q:-:~:*+/
Meilen

2

JavaScript (ES6), 53 Byte

Nimmt Eingaben in die Curry-Syntax vor (a)(b). Rückgabe 0oder 1.

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

Demo

Wie?

Wir verwenden die Funktion g , um die Summe der richtigen Teiler einer gegebenen ganzen Zahl zu erhalten.

Wir berechnen zuerst g (a) und vergleichen es mit b . Wenn g (a) = b ist , berechnen wir g (b) und vergleichen es mit a . Ansonsten berechnen wir g (1) , was 0 ergibt und möglicherweise nicht gleich a sein kann .

Wir prüfen zusätzlich, ob a nicht gleich b ist .


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

Einfache Lösung. d summiert Teiler (n% i <1 ergibt 1, wenn i n teilt). a ^ b ist ungleich Null, wenn a! = b. Die LHS der Ungleichung ist somit 0, wenn die Zahlen nicht gütlich sind, und ansonsten> 0.





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

Probieren Sie es online aus!

Nimmt Eingaben vor $a,$b. Definiert eine filter(hier äquivalent zu einer Funktion), die Eingaben entgegennimmt $n. Im Inneren konstruieren wir einen Bereich von 1bis $n-1, ziehen diejenigen heraus, die Teiler sind, -joinsie zusammen mit +und senden diese an Invoke-Expression(ähnlich wie eval).

Schließlich überprüfen wir außerhalb des Filters einfach, ob die Divisorsumme eines Eingangs gleich dem anderen ist und umgekehrt (und die Eingabevalidierung, um sicherzustellen, dass sie nicht gleich sind). Dieser boolesche Wert bleibt in der Pipeline und die Ausgabe ist implizit.


Schlägt für 6, 6 fehl .
Herr Xcoder

@ Mr.Xcoder Boo-Urnen. Korrigiert für 9 Bytes. : - /
AdmBorkBork

1

Pyth, 12 Bytes

q{_msf!%dTtU

Nimmt die Eingabe als Liste auf.
Probieren Sie es online aus

Erläuterung

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

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

1Wird ausgegeben, wenn die Parameter einvernehmlich sind. Subtrahiert alle Faktoren von der Summe der Eingabenummern für jede Eingabenummer. Wenn beide Ergebnisse Null sind, sind die Zahlen einvernehmlich.


1

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

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

Probieren Sie es online aus!

Infix Dfn, fest für den Fall gleicher Eingänge.

Danke @Uriel für 8 Bytes; @cole für 1 Byte; @ Adám für 15 Bytes.

Wie?

{(≠/⍵)∧(⌽⍵)≡+/¨¯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 hat mir auch mit einer half 22 20 Byte stillschweigende Funktion, die den Dfn äquivalent ist:

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

Probieren Sie es online aus!

Wie?

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

Sie können ein paar Bytes sparen, indem Sie eaches verwenden, anstatt Code zu duplizieren
Uriel

@ Uriel Ich arbeite gerade daran. Ich dachte nur, ich sollte das posten, damit ich es später bearbeiten kann.
J. Sallé

Schlägt für 6, 6 fehl .
Herr Xcoder

@ Mr.Xcoder behoben. Ich hatte keine Ahnung, dass es für gleiche Eingaben falsch sein sollte.
J. Sallé

Whitespace Golf für 36 - {(⍺≠⍵)∧⍵⍺≡+/¨¯1↓¨(0=⍺⍵|⍨⍳¨⍺⍵)/¨⍳¨⍺⍵}. Ich habe die Logik noch nicht durchlaufen
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)

Probieren Sie es online aus!

Definiert eine Funktion A, die die Freundlichkeit zweier Zahlen berechnet, wobei 1für freundschaftlich und die leere Zeichenfolge für nicht zurückgegeben wird. Der Algorithmus ist der gleiche wie meine vorherige Antwort, daher lasse ich die alte Erklärung unten.

	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 Bytes

&-FQqFms{*MyP

+4 Bytes, um zu überprüfen, ob die Werte unterschiedlich sind. Ich denke, das sollte nicht Teil der Herausforderung sein ...

Kann mit ziemlicher Sicherheit viel Golf gespielt werden

Probieren Sie es online aus!


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

Behoben (Füller!)
Dave

1

APL + WIN, 49 54 41 40 35 Byte

Umgeschrieben, um gleiche Ganzzahl-Eingaben abzulehnen

Fordert zur Bildschirmeingabe eines Vektors der beiden Ganzzahlen auf.

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

Können Sie bitte überprüfen, ob dies für Eingaben wie 6, 6 gültig ist ?
Herr Xcoder

@Herr. Xcoder Es ergibt 1 für 6,6, was mit dem obigen Testfall nicht übereinstimmt. Die Teiler von 6 sind 1,2,3, was 6 ergibt. Was fehlt mir also?
Graham

Das OP und ich hatten diese Diskussion früher .
Herr Xcoder

@ Abraham OP sagte, dass sie unterschiedliche Zahlen sein müssen.
totalmenschlich

1

APL NARS, 38 Bytes, 18 Zeichen

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

11π⍵ finde die Summe der Teiler von ⍵ in 1..⍵; Beachten Sie, dass die Frage (11π⍵) -⍵ und in APLsm

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

die Prüfung

  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

Nimmt die Eingabe als Array von 2 Zahlen auf.

®â¬xÃeUâ w

Versuch es


  • 3 zu behandelnde Bytes hinzugefügt [6,11] .
  • Weitere 3 Bytes wurden hinzugefügt, nachdem die Challenge aktualisiert wurde, um eine Eingabevalidierung zu erfordern. (Boo-Urnen an beiden Fronten!)
  • 1 Byte gespeichert, danke an Oliver.



1

Forth (gforth) , 80 Bytes

Refactored Reffus Lösung .

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

Probieren Sie es online aus!

Wie es funktioniert

: 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.