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

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:



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!


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


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!


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?

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)

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.


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

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.

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!


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.


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


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!


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




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

1
-1 bajt z{$^a-$^b==5|0|-5|5-2*$b}
Grimmy


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.


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.


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


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





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

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$
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.