Równa, suma lub różnica!

32

Napisz możliwie najkrótszy kod, który zwróci wartość true, jeśli dwie podane wartości całkowite są równe lub ich suma lub różnica bezwzględna wynosi 5.

Przykładowe przypadki testowe:

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

Najkrótsza, jaką mogłem wymyślić w python2, ma 56 znaków:

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

-9, dzięki @ElPedro. Pobiera dane wejściowe w formacie x, y:

x,y=input();print all([x-y,x+y-5,abs(x-y)-5])<1
Vikrant Biswas
źródło
9
Witamy w PPCG! To dobre pierwsze wyzwanie - wyzwanie jest jasno zdefiniowane, ma wiele przypadków testowych i korzysta z naszych domyślnych operacji we / wy! Jeśli przez jakiś czas będziesz się zastanawiać i zastanowić nad interesującymi wyzwaniami, polecam skorzystanie z The Sandbox, aby uzyskać opinie przed opublikowaniem ich na tej stronie. Mam nadzieję, że spodoba ci się czas spędzony tutaj!
Giuseppe

Odpowiedzi:

22

Python 2 , 30 bajtów

lambda a,b:a in(b,5-b,b-5,b+5)

Wypróbuj online!

Jeden bajt zapisany przez Arnaulda

Trzy bajty zapisane przez alephalpha

ArBo
źródło
To niezwykle zwięzłe, dzięki
Vikrant Biswas
To samo można zrobić w Octave / MATLAB w 29 bajtach ( Wypróbuj online! ).
Tom Carpenter
17

JavaScript (ES6), 28 bajtów

Pobiera dane wejściowe jako (a)(b). Zwraca 0 lub 1 .

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

Wypróbuj online!

Arnauld
źródło
1
Cholera, zajęło mi dużo czasu, aby dowiedzieć się, jak to poradzić sobie z różnicą. :)
Vikrant Biswas
9

Dyalog APL , 9 bajtów

=∨5∊+,∘|-

Wypróbuj online!

Przeliterowano:

  =     5                      +   ,     |            -
equal or 5 found in an array of sum and absolute of difference.
dzaima
źródło
8

kod maszynowy x86, 39 bajtów

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

montaż

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

Wypróbuj online!

Logern
źródło
5

J , 12 11 bajtów

1 bajt zapisany dzięki Adámowi

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

Wypróbuj online!

Wyjaśnienie

Jest to równoważne z:

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

Można to podzielić na następujący łańcuch wideł:

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

Lub wizualizowane za pomocą 5!:4<'f':

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

Adnotacja:

  ┌─ =                                     equality
  ├─ +                                     added to (boolean or)
──┤   ┌─ 5                                   noun 5
  │   ├─ e.                                  is an element of
  └───┤          ┌─ |  absolute value         |
      │    ┌─ @ ─┴─ -  (of) subtraction       |
      └────┼─ ,        paired with            |
           └─ +        addition               | any of these?
Conor O'Brien
źródło
Uratuj bajt ze.
Adám
@ Adám Jak to zrobić? Najkrótszym podejściem e.było =+.5 e.|@-,+. Może zapomniałeś, że 5e.jest nieprawidłowy token w J?
Conor O'Brien
1
Ponieważ dwie liczby całkowite nie mogą jednocześnie sumować się do 5 i być równe, możesz użyć +zamiast+.
Adám
@ Adám Ah, rozumiem, dziękuję.
Conor O'Brien
5

R , 40 bajtów (lub 34)

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

Wypróbuj online!

Dla użytkowników innych niż R:

  • -1:1*5 rozwija się do [-5, 0, 5]
  • %in%operator wykonuje elementy z lewej i kontroli (element mądry), jeżeli takie istnieją w wektorze po prawej

Bezpośredni port rozwiązania @ ArBo ma 35 34 bajtów, więc jeśli chcesz, wybierz tę odpowiedź:

function(x,y)x%in%c(y--1:1*5,5-y)
ngm
źródło
34-bajtowy można zmniejszyć o 1 za pomocąfunction(x,y)x%in%c(y--1:1*5,5-y)
MickyT
Można upuścić do 30 bajtów, przesuwając odejmowanie: function(x,y)(x-y)%in%(-1:1*5)i upuścić go dalej do 24 bajtów, upuszczając notację funkcji do scan()wprowadzenia: diff(scan())%in%(-1:1*5) Wypróbuj online! . Jednak wciąż bardzo ta sama metoda.
CriminallyVulgar
1
@CriminallyVulgar czy to odpowiada 5?
ArBo
@ArBo Hah, tęskniłem za tym w specyfikacji, aw TIO nie było przypadku testowego, więc po prostu się nad nim przełożyłem!
CriminallyVulgar
Niewielką zmianą, którą można wprowadzić w obu przypadkach, jest użycie pryr::f, co zdarza się w obu przypadkach. To, czy potrafi poprawnie wykryć argumenty, jest całkowicie trafione lub przegapione, ale wydaje się, że łączy te dwie funkcje. np. pryr::f(x%in%c(y--1:1*5,5-y)) Wypróbuj online! . Daje odpowiednio 36 i 29 bajtów.
CriminallyVulgar
5

Python 2 , 29 31 bajtów

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

Wypróbuj online!

Ponieważ po raz pierwszy nie udało mi się dokładnie przeczytać zadania, aby je naprawić, musiałem wymyślić zupełnie inne podejście, co niestety nie jest tak zwięzłe.

Kirill L.
źródło
5

Kod maszynowy 8086, 22 20 bajtów

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

Nie golfowany:

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

Wprowadź liczby w AX i BX i zwraca Zero Flag (ZF = 1), jeśli wynik jest prawdziwy. W razie potrzeby możesz również określić, który warunek był spełniony, wykonując następujące czynności:

  • ZF = 1 i DX = 5; suma wynosi 5
  • ZF = 1 i AX = 5; diff wynosi 5
  • ZF = 1 i AX = 0; równy
  • ZF = 0; wynik fałszywy

Jeśli różnica między liczbami wynosi 0, wiemy, że są one równe. W przeciwnym razie, jeśli wynik jest ujemny, najpierw go zaneguj, a następnie sprawdź 5. Jeśli nadal nie jest to prawda, dodaj i sprawdź 5.

Przykładowy program testowy DOS na PC. Pobierz tutaj ( 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

Wyjście programu testowego:

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
640 KB
źródło
4

Galaretka , 7 bajtów

+,ạ5eo=

Wypróbuj online!

Jak to działa

+,ạ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.
Dennis
źródło
4

Python 2, 38 bajtów

-2 bajty dzięki @DjMcMayhem

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

Wypróbuj online!

Fəˈnɛtɪk
źródło
Twoje TIO ma w rzeczywistości 42 bajty, ale możesz to naprawić, usuwając spacje między 5s i ors
ElPedro
3
W rzeczywistości łącze TIO może mieć 38 bajtów
DJMcMayhem
@ElPedro sama funkcja miała 40 bajtów, ale użyłem f =, aby móc ją wywołać
fəˈnɛtɪk
1
@DJMcMayhem Zwykle nie gram w golfa w pythonie. Właśnie to zrobiłem, ponieważ pytający użył python na ich przykład
fəˈnɛtɪk
4

PowerShell , 48 44 40 bajtów

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

Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe

Pobiera dane wejściowe $ai $b. Sprawdza, czy $bjest -ingrupa ( $a-5, 5-$a 5+$alub $a), który sprawdza wszystkie możliwe kombinacje $a, $bi 5.

-4 bajty dzięki mazzy.
-4 bajty dzięki KGlasier.

AdmBorkBork
źródło
($a-$b)jest -$x:)
mazzy
@ mazzy Ooo, dobra rozmowa.
AdmBorkBork
Jeśli przełącznik 5i $bwokół można odciąć kilka bajtów (czyli param($a,$b)$b-in($a-5),(5-$a),($a+5),$a) Wypróbuj go tutaj
KGlasier
1
@KGlasier Doskonała sugestia. I potrzebne do zamiany $a+5na 5+$acelu zmusić go do oddania odpowiednio przy podejmowaniu wejścia wiersza polecenia, ale poza tym super. Dzięki!
AdmBorkBork
4

Pascal (FPC) ,26 70 bajtów

Edycja: + zmienne wejściowe.

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

Wypróbuj online!


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

Wypróbuj online!

Mam nadzieję, że moja odpowiedź jest zgodna ze wszystkimi zasadami golfa kodowego. W każdym razie było fajnie.

Dessy Stoeva
źródło
2
Witaj i witaj w PPCG! Zwykle trzeba przyjmować dane wejściowe, zamiast zakładać, że są one już zmienne. Nie znam Pascala, ale myślę, że właśnie to robi ten kod.
NoOneIsHere
Cześć, NoOneIsHere i dziękuję za uwagę. To też może dotyczyć - czy powinienem uwzględnić inicjalizację zmiennych. Patrząc na kilka innych rozwiązań, takich jak na przykład Java, w których definicja funkcji z parametrami została wykluczona z całkowitej długości rozwiązania, postanowiłem nie uwzględniać ReadLn.
Dessy Stoeva
W porządku. Witamy w PPCG!
NoOneIsHere
Zgłoszenie Java jest anonimową lambda, która przyjmuje dwa parametry. Wygląda na to, że używa predefiniowanych zmiennych, co nie jest prawidłową metodą wprowadzania.
Jo King
1
Nie ma problemu, zmienię swoje zgłoszenie.
Dessy Stoeva
3

C # (.NET Core) , 43 , 48 , 47 , 33 bajtów

EDYCJA: Próbowałem użyć% i najwyraźniej zapomniałem jak%. Dzięki Arnauldowi za zwrócenie na to uwagi!

EDYCJA 2: AdmBorkBork z golfem -1-bajtowym przestawia nawiasy, aby usiąść obok zwrotu, więc nie jest potrzebne dodatkowe miejsce!

EDYCJA 3: Dzięki dana dla golfa -14 bajtów za jednokreskowy skrót powrotu i curry funkcji (Ty Embodiment of Ignorance za połączenie z TIO).

C # (.NET Core) , 33 bajty

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

Wypróbuj online!

Destroigo
źródło
Bah. Próbując uniknąć System.Math. Wróć do tego! Dzięki za zwrócenie na to uwagi: D
Destroigo
1
Możesz zmniejszyć go do 33 bajtów, stosując wskazówki
Dany
3

C (gcc) , 33 bajty

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

Wypróbuj online!

Wypróbowałem podejście, którego nie widziałem nikt inny. Zwracane wyrażenie jest równoważne z a+b==5||((-6<a-b||a-b<6)&&(a-b)%5==0).


attinat
źródło
3

Scala, 43 bajty

def f(a:Int,b:Int)=a+b==5|(a-b).abs==5|a==b

Wypróbuj online!

Xavier Guihot
źródło
Nie jest to możliwe Golf ||do |? Wiem, że jest to możliwe w Javie, C #, Pythonie lub JavaScript, ale nie jestem pewien co do Scali.
Kevin Cruijssen
Aktualnie tak! dzięki
Xavier Guihot
3

Perl 6 , 24 bajtów

-1 bajt dzięki Grimy

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

Wypróbuj online!

To używa Any Junction, ale technicznie ^może również działać.

Wyjaśnienie:

{                      }  # Anonymous code block
 $^a-$^b==                # Is the difference equal to
           | |  |        # Any of
          0 
            5
              -5
                 5-2*$b
Jo King
źródło
1
-1 bajt z{$^a-$^b==5|0|-5|5-2*$b}
Grimmy
2

C (gcc) , 41 34 bajtów

f(a,b){a=5==abs(a-b)|a+b==5|a==b;}

Wypróbuj online!

cleblanc
źródło
1
Dlaczego fpowraca a? Tylko jakieś niezdefiniowane zachowanie?
Tyilo
@Tyilo Tak, jest to specyficzne dla implementacji. Tak się dzieje, że pierwszy parametr jest przechowywany w tym samym rejestrze, co wartość zwracana.
cleblanc
@Logern nie działa dla f (6,1)
cleblanc
@ceilingcat Nie działa dla f (6,1)
cleblanc
2

05AB1E , 13 12 bajtów

ÐO5Qs`α5QrËO

Wypróbuj online!

Pobiera dane wejściowe jako listę liczb całkowitych, oszczędzając jeden bajt. Dzięki @ Wisław!

Alternatywna 12 bajtowa odpowiedź

Q¹²α5Q¹²+5QO

Wypróbuj online!

Ten pobiera dane w osobnych wierszach.

Cowabunghole
źródło
1
Ponieważ nie jest to bardzo jasno określone, czy nie możesz założyć, że wejście jest listą liczb całkowitych, eliminując w ten sposób wartość początkową |?
Wisław
@ Wisław Dobra uwaga, zaktualizowałem swoją odpowiedź. Dzięki!
Cowabunghole
Znalazłem 11 bajtów alternatywa: OI`αª5¢IË~Ā. Dane wejściowe to lista liczb całkowitych.
Wisław
1
OIÆÄ)5QIËMjest 10.
Magic Octopus Urn
1
@MagicOctopusUrn Nie jestem pewien, jakie dokładnie są reguły, ale myślę, że twoje rozwiązanie jest wystarczająco różne od mojego, aby przesłać własną odpowiedź, nie? Również niezwiązany, ale widziałem twoją nazwę użytkownika na tej stronie od dawna, ale dopiero po wpisaniu go zdałem sobie sprawę, że jest to „Urna”, a nie „Um” :)
Cowabunghole
2

05AB1E , 10 bajtów

OIÆ‚Ä50SåZ

Wypróbuj 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.

Próbowałem to zrobić, używając operacji tylko na stosie, ale było to dłuższe.

Urna Magicznej Ośmiornicy
źródło
1
To niestety zwróci prawdę, jeśli suma będzie 0taka jak dla[5, -5]
Emigna
1
Twoje inne 10-bajtowe rozwiązanie, które pozostawiłeś jako komentarz ( OIÆÄ‚5QIËM), jest poprawne [5,-5].
Kevin Cruijssen
Innym 10-bajtowym rozwiązaniem, które wymyśliłem, jest OsÆÄ‚5åsË~. Wydaje się prawie identyczny z twoim. Wypróbuj online!
Wisław
2

Ruby , 34 bajty

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

Online Eval - Thanks @ ASCII-Only

Jatin Dhankhar
źródło
czy sprawdzacie, czy są równe ...
tylko o ASCII
Ups, zapomniałem dodać tę kontrolę. Dzięki @ ASCII-tylko za wskazanie błędu.
Jatin Dhankhar
1
Byłbym miły, gdybyś mógł link do tego
tylko ASCII
to może być ważne? nie do końca pewny, możesz chcieć skontaktować się z kimś innym
tylko ASCII
To zadziała, ale wymaga .nil?sprawdzenia, aby uzyskać dane wyjściowe w wymaganym formacie. ->(a,b){[a+5,a-5,5-a,a].index(b).nil?}, jest dłuższy niż obecny.
Jatin Dhankhar
1

Partia, 81 bajtów

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

Pobiera dane wejściowe jako argumenty wiersza polecenia i zwraca 1 w przypadku powodzenia, a nic w przypadku niepowodzenia. Batch nie może łatwo dokonywać rozróżnień, więc używam praw De Morgana, aby przekształcić je w koniunkcję.

Neil
źródło
1

Japt, 13 12 bajtów

x ¥5|50ìøUra

Wypróbuj lub uruchom wszystkie przypadki testowe

x ¥5|50ìøUra
                 :Implicit input of array U
x                :Reduce by addition
  ¥5             :Equal to 5?
    |            :Bitwise OR
     50ì         :Split 50 to an array of digits
        ø        :Contains?
         Ur      :  Reduce U
           a     :    By absolute difference
Kudłaty
źródło
Nie [-5,5]działa (powinien być falsey)
Kevin Cruijssen
Dzięki, @KevinCruijssen. Przywrócono do poprzedniej wersji.
Kudłaty
1

Common Lisp, 48 bajtów

(lambda(a b)(find 5(list(abs(- b a))a(+ a b)b)))
rdzeń rdzeniowy
źródło
1

Brachylog , 8 bajtów

=|+5|-ȧ5

Pobiera dane wejściowe jako listę dwóch liczb (użyj _dla negatywów). Wypróbuj online!

Wyjaśnienie

Prawie bezpośrednie tłumaczenie specyfikacji:

=          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
DLosc
źródło
0

Retina 0.8.2 , 82 bajty

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

Wypróbuj online! Link zawiera przypadki testowe. Objaśnienie: Pierwsze dwa wiersze przekształcają dane wejściowe w jednoargumentowe. Ostatnia linia sprawdza następnie dowolne dozwolone mecze:

^(-?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

Obrócone w ostatniej kolumnie otrzymujemy:

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$
Neil
źródło