Gleich, Summe oder Differenz!


32

Schreiben Sie den kürzestmöglichen Code, der true zurückgibt, wenn die beiden angegebenen ganzzahligen Werte gleich sind oder ihre Summe oder absolute Differenz 5 beträgt.

Beispiel Testfälle:

4 1 => True
10 10 => True
1 3 => False
6 2 => False
1 6 => True
-256 -251 => True
6 1 => True
-5 5 => False

Die kürzeste, die ich in python2 finden konnte, ist 56 Zeichen lang:

x=input();y=input();print all([x-y,x+y-5,abs(x-y)-5])<1

-9, danke @ElPedro. Es werden Eingaben im Format x, y akzeptiert:

x,y=input();print all([x-y,x+y-5,abs(x-y)-5])<1

9
Willkommen bei PPCG! Dies ist eine gute erste Herausforderung - die Herausforderung ist klar definiert, enthält zahlreiche Testfälle und verwendet unsere Standard-E / A! Wenn Sie eine Weile hier bleiben und sich interessante Herausforderungen überlegen, empfehle ich Ihnen, The Sandbox zu verwenden, um Feedback zu erhalten, bevor Sie diese auf dieser Website veröffentlichen. Ich hoffe, Sie genießen die Zeit, die Sie hier verbringen!
Giuseppe

Antworten:



17

JavaScript (ES6), 28 Byte

Übernimmt die Eingabe als (a)(b). Gibt 0 oder 1 .

a=>b=>a+b==5|!(a-=b)|a*a==25

Probieren Sie es online!


1
Verdammt, ich habe lange gebraucht, um herauszufinden, wie ich mit dem Unterschied umgegangen bin. :)
Vikrant Biswas


8

x86-Maschinencode, 39 Byte

00000000: 6a01 5e6a 055f 5251 31c0 39d1 0f44 c601  j.^j._RQ1.9..D..
00000010: d139 cf0f 44c6 595a 29d1 83f9 050f 44c6  .9..D.YZ).....D.
00000020: 83f9 fb0f 44c6 c3                        ....D..

Versammlung

section .text
	global func
func:					;inputs int32_t ecx and edx
	push 0x1
	pop esi
	push 0x5
	pop edi
	push edx
	push ecx
	xor eax, eax

	;ecx==edx?
	cmp ecx, edx
	cmove eax, esi

	;ecx+edx==5?
	add ecx, edx
	cmp edi, ecx
	cmove eax, esi
	
	;ecx-edx==5?
	pop ecx
	pop edx
	sub ecx, edx
	cmp ecx, 5
	
	;ecx-edx==-5?
	cmove eax, esi
	cmp ecx, -5
	cmove eax, esi

	ret

Probieren Sie es online!


5

J , 12 11 Bytes

1 Byte gespart dank Adám

1#.=+5=|@-,+

Probieren Sie es online!

Erläuterung

Dies ist äquivalent zu:

1 #. = + 5 = |@- , +

Dies kann in die folgende Gabelkette unterteilt werden:

(= + (5 e. (|@- , +)))

Oder visualisiert mit 5!:4<'f':

  ┌─ =               
  ├─ +               
──┤   ┌─ 5           
  │   ├─ e.          
  └───┤          ┌─ |
      │    ┌─ @ ─┴─ -
      └────┼─ ,      
           └─ +      

Kommentiert:

  ┌─ =                                     equality
  ├─ +                                     added to (boolean or)
──┤   ┌─ 5                                   noun 5
  │   ├─ e.                                  is an element of
  └───┤          ┌─ |  absolute value         |
      │    ┌─ @ ─┴─ -  (of) subtraction       |
      └────┼─ ,        paired with            |
           └─ +        addition               | any of these?

Speichern Sie ein Byte mite.
Adám

@Adam Wie so? Die kürzeste Annäherung e.war =+.5 e.|@-,+. Vielleicht hast du vergessen, dass 5e.ein ungültiges Token in J ist?
Conor O'Brien

1
Da zwei Ganzzahlen nicht gleichzeitig 5 ergeben und gleich sein können, können Sie +anstelle von+.
Adám den

@Adam Ah, ich verstehe, danke.
Conor O'Brien

5

R , 40 Bytes (oder 34)

function(x,y)any((-1:1*5)%in%c(x+y,x-y))

Probieren Sie es online!

Für Nicht-R-Benutzer:

  • -1:1*5 erweitert um [-5, 0, 5]
  • Der %in%Operator entnimmt Elemente von links und prüft (elementweise), ob sie im Vektor auf der rechten Seite vorhanden sind

Ein direkter Port der @ ArBo-Lösung hat 35 bis 34 Bytes. Stimmen Sie also dieser Antwort zu, wenn Sie sie mögen:

function(x,y)x%in%c(y--1:1*5,5-y)

Die 34-Byte-Eins kann mitfunction(x,y)x%in%c(y--1:1*5,5-y)
MickyT

Kann durch Verschieben der Subtraktion: auf 30 Bytes function(x,y)(x-y)%in%(-1:1*5)und durch Fallenlassen der Funktionsnotation zur scan()Eingabe auf 24 Bytes gesenkt werden: diff(scan())%in%(-1:1*5) Probieren Sie es online aus! . Trotzdem sehr ähnlich.
CriminallyVulgar

1
@ CriminallyVulgar ist die Summe 5?
ArBo

@ArBo Hah, ich habe das in der Spezifikation verpasst und es gab keinen Testfall in der TIO, also habe ich es nur beschönigt!
CriminallyVulgar

Eine geringfügige Änderung, die an beiden vorgenommen werden kann, ist die Verwendung pryr::f, die in beiden Fällen funktioniert. Ob es die Argumente richtig erkennen kann, ist ein Treffer oder ein Misserfolg, aber es scheint diese beiden Funktionen zu treffen. zB pryr::f(x%in%c(y--1:1*5,5-y)) Online ausprobieren! . Ruft 36 bzw. 29 Bytes auf.
CriminallyVulgar

5

Python 2 , 29 31 Bytes

lambda a,b:a+b==5or`a-b`in"0-5"

Probieren Sie es online!

Da ich es nicht geschafft habe, die Aufgabe beim ersten Mal sorgfältig zu lesen, musste ich mir einen völlig anderen Ansatz einfallen lassen, der leider nicht so prägnant ist.


5

8086 Maschinencode, 22 20 Bytes

8bd0 2bc3 740e 7902 f7d8 3d0500 7405 03d3 83fa05

Ungolfed:

ESD  MACRO
    LOCAL SUB_POS, DONE
    MOV  DX, AX     ; Save AX to DX
    SUB  AX, BX     ; AX = AX - BX
    JZ   DONE       ; if 0, then they are equal, ZF=1
    JNS  SUB_POS    ; if positive, go to SUB_POS
    NEG  AX         ; otherwise negate the result
SUB_POS:
    CMP  AX, 5      ; if result is 5, ZF=1
    JZ   DONE
    ADD  DX, BX     ; DX = DX + BX
    CMP  DX, 5      ; if 5, ZF=1
DONE:
    ENDM

Geben Sie Zahlen in AX und BX ein und geben Sie Zero Flag (ZF = 1) zurück, wenn das Ergebnis wahr ist. Auf Wunsch können Sie auch bestimmen, welche Bedingung erfüllt ist:

  • ZF = 1 und DX = 5; Summe ist 5
  • ZF = 1 und AX = 5; diff ist 5
  • ZF = 1 und AX = 0; gleich
  • ZF = 0; Ergebnis falsch

Wenn der Unterschied zwischen den Zahlen 0 ist, wissen wir, dass sie gleich sind. Andernfalls, wenn das Ergebnis negativ ist, negieren Sie es zuerst und prüfen Sie dann auf 5. Wenn dies immer noch nicht zutrifft, fügen Sie hinzu und prüfen Sie auf 5.

Beispiel für ein PC-DOS-Testprogramm. Laden Sie es hier herunter ( ESD.COM ).

START:
    CALL INDEC      ; input first number into AX
    MOV  BX, AX     ; move to BX
    CALL INDEC      ; input second number into BX
    ESD             ; run "Equal, sum or difference" routine
    JZ   TRUE       ; if ZF=1, result is true
FALSE:
    MOV  DX, OFFSET FALSY   ; load Falsy string
    JMP  DONE
TRUE:
    MOV  DX, OFFSET TRUTHY  ; load Truthy string
DONE:
    MOV  AH, 9      ; DOS display string
    INT  21H        ; execute
    MOV  AX, 4C00H  ; DOS terminate
    INT  21H        ; execute

TRUTHY   DB 'Truthy$'
FALSY    DB 'Falsy$'

INCLUDE INDEC.ASM   ; generic decimal input prompt routine

Ausgabe des Testprogramms:

A>ESD.COM
: 4
: 1
Truthy

A>ESD.COM
: 10
: 10
Truthy

A>ESD.COM
: 1
: 3
Falsy

A>ESD.COM
: 6
: 2
Falsy

A>ESD.COM
: 1
: 6
Truthy

A>ESD.COM
: -256
: -251
Truthy

A>ESD.COM
: 6
: 1
Truthy

A>ESD.COM
: 9999999999
: 9999999994
Truthy

4

Gelee , 7 Bytes

+,ạ5eo=

Probieren Sie es online!

Wie es funktioniert

+,ạ5eo=  Main link. Arguments: x, y (integers)

+        Yield x+y.
  ạ      Yield |x-y|.
 ,       Pair; yield (x+y, |x-y|).
   5e    Test fi 5 exists in the pair.
      =  Test x and y for equality.
     o   Logical OR.

4

Python 2, 38 Bytes

-2 Bytes dank @DjMcMayhem

lambda a,b:a+b==5or abs(a-b)==5or a==b

Probieren Sie es online!


Ihr TIO hat tatsächlich 42 Bytes, aber Sie können es beheben, indem Sie die Leerzeichen zwischen dem 5s und dem ors
löschen

3
Tatsächlich könnte die TIO-Verbindung 38 Bytes
betragen

@ElPedro die Funktion selbst war 40 Bytes, aber ich habe f = verwendet, um es aufrufen zu können
fəˈnəˈtɛk

1
@DJMcMayhem Ich spiele normalerweise nicht in Python. Ich habe es einfach getan, weil der Fragesteller Python als Beispiel verwendet hat
16.



4

PowerShell , 48 44 40 Byte

param($a,$b)$b-in($a-5),(5-$a),(5+$a),$a

Probieren Sie es online! oder Überprüfen Sie alle Testfälle

Nimmt Eingabe $aund $b. Prüft , ob $bist -indie Gruppe ( $a-5, 5-$a 5+$a, oder $a), die überprüft , alle möglichen Kombinationen von$a , $b, und 5.

-4 Bytes dank mazzy.
-4 Bytes dank KGlasier.


($a-$b)ist -$x:)
mazzy

@mazzy Ooo, guter Anruf.
AdmBorkBork

Wenn Sie umschalten 5und $bherum können Sie ein paar Bytes abschneiden (dh param($a,$b)$b-in($a-5),(5-$a),($a+5),$a) Probieren Sie es hier aus
KGlasier

1
@KGlasier Ausgezeichneter Vorschlag. Ich musste tauschen $a+5, 5+$aum es bei der Eingabe über die Befehlszeile entsprechend umzusetzen, aber ansonsten war es großartig. Vielen Dank!
AdmBorkBork

4

Pascal (FPC) ,26 70 Bytes

Bearbeiten: + Eingabevariablen.

Procedure z(a,b:integer);begin Writeln((abs(a-b)in[0,5])or(a+b=5))end;

Probieren Sie es online!


(abs(a-b)in[0,5])or(a+b=5)

Probieren Sie es online!

Ich hoffe, dass meine Antwort allen Regeln des Code-Golf entspricht. Es hat trotzdem Spaß gemacht.


2
Hallo und willkommen bei PPCG! Normalerweise müssen Sie Eingaben vornehmen, anstatt davon auszugehen, dass es sich bereits um Variablen handelt. Ich kenne Pascal nicht, aber ich denke, das ist es, was dieser Code tut.
NoOneIsHere

Hallo, NoOneIsHere und danke für die Bemerkung. Möglicherweise ging es auch darum - soll ich die Initialisierung der Variablen mit einbeziehen? Als ich mir einige andere Lösungen ansah, wie zum Beispiel Java, bei denen die Funktionsdefinition mit Parametern von der Gesamtlänge der Lösung ausgeschlossen war, entschied ich mich, ReadLn nicht einzuschließen.
Dessy Stoeva

In Ordung. Willkommen bei PPCG!
NoOneIsHere

Die Java-Übermittlung ist ein anonymes Lambda mit zwei Parametern. Dies scheint vordefinierte Variablen zu verwenden, was keine gültige Eingabemethode ist.
Jo King

1
Kein Problem, ich werde meine Einsendung ändern.
Dessy Stoeva

3

C # (.NET Core) , 43 , 48 , 47 , 33 Byte

BEARBEITEN: Versucht,% zu verwenden und anscheinend vergessen, wie man%. Vielen Dank an Arnauld für diesen Hinweis!

EDIT2: AdmBorkBork mit einem -1-Byte-Golf, der die Klammern so anordnet, dass sie sich neben dem Return befinden, sodass kein zusätzlicher Platz benötigt wird!

EDIT3: Danke an Dana für -14-Byte-Golf für die einzeilige Rücksprungverknüpfung und das Ausführen der Funktion (Ty Ausführungsform der Ignoranz für die Verknüpfung mit TIO).

C # (.NET Core) , 33 Byte

a=>b=>a==b|a+b==5|(a-b)*(a-b)==25

Probieren Sie es online!


Bah. Versuchen, System.Math zu vermeiden. Zurück dahin! Vielen Dank für den Hinweis: D
Destroigo

1
Sie können es auf 33 Bytes reduzieren, indem Sie Danas Tipps anwenden
Verkörperung der Ignoranz

3

C (gcc) , 33 Bytes

f(a,b){a=!(a+b-5&&(a-=b)/6|a%5);}

Probieren Sie es online!

Ich habe versucht, einen Ansatz zu finden, bei dem noch niemand versucht hat, ihn zu verwenden. Der Rückgabeausdruck ist äquivalent zu a+b==5||((-6<a-b||a-b<6)&&(a-b)%5==0).




3

Perl 6 , 24 Bytes

-1 Byte danke an Grimy

{$^a-$^b==5|0|-5|5-2*$b}

Probieren Sie es online!

Dies nutzt die Any Junction aber technisch ^könnte das auch funktionieren.

Erläuterung:

{                      }  # Anonymous code block
 $^a-$^b==                # Is the difference equal to
           | |  |        # Any of
          0 
            5
              -5
                 5-2*$b

1
-1 Byte mit{$^a-$^b==5|0|-5|5-2*$b}
Grimmy


2

05AB1E , 13 12 Bytes

ÐO5Qs`α5QrËO

Probieren Sie es online!

Übernimmt die Eingabe als Liste von Ganzzahlen und speichert ein Byte. Vielen Dank @ Wisław!

Alternative 12-Byte-Antwort

Q¹²α5Q¹²+5QO

Probieren Sie es online!

Dieser nimmt Eingaben in separaten Zeilen vor.


1
Können Sie nicht davon ausgehen, dass es sich bei der Eingabe um eine Liste von Ganzzahlen handelt, da diese nicht sehr genau angegeben ist, wodurch die Initiale eliminiert wird |?
Wisław

@Wisław Guter Punkt, ich habe meine Antwort aktualisiert. Vielen Dank!
Cowabunghole

Ich fand eine 11 Byte Alternative: OI`αª5¢IË~Ā. Eingabe ist eine Liste von ganzen Zahlen.
Wisław

1
OIÆÄ)5QIËMist 10.
Magic Octopus Urn

1
@MagicOctopusUrn Ich bin nicht sicher, wie genau die Regeln lauten, aber ich denke, Ihre Lösung unterscheidet sich genug von meiner, um Ihre eigene Antwort einzureichen, nein? Außerdem habe ich nichts damit zu tun, aber ich habe Ihren Benutzernamen auf dieser Site schon lange gesehen, aber erst nachdem ich ihn
abgetippt

2

05AB1E , 10 Bytes

OIÆ‚Ä50SåZ

Probieren Sie es online!


O           # Sum the input.
 IÆ         # Reduced subtraction of the input.
   ‚        # Wrap [sum,reduced_subtraction]
    Ä       # abs[sum,red_sub]
     50S    # [5,0]
        å   # [5,0] in abs[sum,red_sub]?
         Z  # Max of result, 0 is false, 1 is true.

Versucht, es mit Nur-Stapel-Operationen zu tun, aber es war länger.


1
Dies ist leider der Fall, wenn die Summe 0wie [5, -5]
folgt

1
Ihre andere 10-Byte-Lösung, die Sie als Kommentar ( OIÆÄ‚5QIËM) hinterlassen haben, ist korrekt [5,-5].
Kevin Cruijssen

Eine andere 10-Byte-Lösung, die ich mir ausgedacht habe, ist OsÆÄ‚5åsË~. Es scheint fast identisch mit deinem zu sein. Probieren Sie es online!
Wisław

2

Rubin , 34 Bytes

->(a,b){[a+5,a-5,5-a,a].include?b}

Online-Auswertung - Dank nur an ASCII


Prüfen Sie, ob sie gleich sind ...
Nur ASCII

Hoppla, ich habe vergessen, diesen Scheck hinzuzufügen. Vielen Dank an @ ASCII-only für den Hinweis auf den Fehler.
Jatin Dhankhar

1
i wäre schön, wenn Sie verknüpfen könnte dies
ASCII-only

das könnte gültig sein? Ich bin mir jedoch nicht ganz sicher, ob Sie sich bei jemand anderem erkundigen möchten
Nur ASCII

Dies funktioniert, erfordert jedoch eine .nil?Überprüfung, um die Ausgabe im erforderlichen Format zu ermöglichen. ->(a,b){[a+5,a-5,5-a,a].index(b).nil?}Dies ist länger als die aktuelle.
Jatin Dhankhar



1

Batch, 81 Bytes

@set/as=%1+%2,d=%1-%2
@if %d% neq 0 if %d:-=% neq 5 if %s% neq 5 exit/b
@echo 1

Nimmt Eingaben als Befehlszeilenargumente und gibt bei Erfolg 1 aus, bei Fehlern nichts. Batch kann nicht leicht disjunktieren, daher verwandle ich es nach den Gesetzen von De Morgan in eine Konjunktion.




1

Common Lisp, 48 Bytes

(lambda(a b)(find 5(list(abs(- b a))a(+ a b)b)))

1

Brachylog , 8 Bytes

=|+5|-ȧ5

Nimmt die Eingabe als Liste mit zwei Zahlen ( _für Negative verwenden).Probieren Sie es online!

Erläuterung

Ziemlich genau eine direkte Übersetzung der Spezifikation:

=          The two numbers are equal
 |         or
  +        The sum of the two numbers
   5       is 5
    |      or
     -     The difference of the two numbers
      ȧ    absolute value
       5   is 5

0

Retina 0.8.2 , 82 Bytes

\d+
$*
^(-?1*) \1$|^(-?1*)1{5} -?\2$|^-?(-?1*) (\3)1{5}$|^-?(1 ?){5}$|^(1 ?-?){5}$

Probieren Sie es online! Link enthält Testfälle. Erläuterung: Die ersten beiden Zeilen wandeln die Eingaben in unäre um. Die letzte Zeile prüft dann, ob eine der zulässigen Übereinstimmungen vorliegt:

^(-?1*) \1$                              x==y
^(-?1*)1{5} -?\2$   x>=0 y>=0 x=5+y i.e. x-y=5
                    x>=0 y<=0 x=5-y i.e. x+y=5
                    x<=0 y<=0 x=y-5 i.e. y-x=5
^-?(-?1*) (\3)1{5}$ x<=0 y<=0 y=x-5 i.e. x-y=5
                    x<=0 y>=0 y=5-x i.e. x+y=5
                    x>=0 y>=0 y=5+x i.e. y-x=5
^-?(1 ?){5}$        x>=0 y>=0 y=5-x i.e. x+y=5
                    x<=0 y>=0 y=5+x i.e. y-x=5
^(1 ?-?){5}$        x>=0 y>=0 x=5-y i.e. x+y=5
                    x>=0 y<=0 x=5+y i.e. x-y=5

Geschwenkt durch die letzte Spalte, die wir bekommen:

x==y            ^(-?1*) \1$
x+y=5 x>=0 y>=0 ^-?(1 ?){5}$
      x>=0 y>=0 ^(1 ?-?){5}$
      x>=0 y<=0 ^(-?1*)1{5} -?\2$
      x<=0 y>=0 ^-?(-?1*) (\3)1{5}$
      x<=0 y<=0 (impossible)       
x-y=5 x>=0 y>=0 ^(-?1*)1{5} -?\2$
      x>=0 y<=0 ^(1 ?-?){5}$
      x<=0 y>=0 (impossible)
      x<=0 y<=0 ^-?(-?1*) (\3)1{5}$
y-x=5 x>=0 y>=0 ^-?(-?1*) (\3)1{5}$
      x>=0 y<=0 (impossible)
      x<=0 y>=0 ^-?(1 ?){5}$
      x<=0 y<=0 ^(-?1*)1{5} -?\2$
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.