Рівно, сума або різниця!


32

Напишіть найкоротший можливий код, який поверне істину, якщо два заданих цілих значення рівні або їх сума або абсолютна різниця дорівнює 5.

Приклади тестових випадків:

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

Найкоротший, який я міг придумати в python2, - це 56 символів:

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

-9, дякую @ElPedro. Він займає введення у форматі x, y:

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

9
Ласкаво просимо до PPCG! Це хороший перший виклик - виклик чітко визначений, у ньому є достатньо тестових випадків, і використовується наш I / O за замовчуванням! Якщо ви тримаєтесь на деякий час і продовжуєте придумувати цікаві виклики, я б рекомендував скористатися The Sandbox, щоб отримати зворотний зв'язок, перш ніж публікувати їх на цьому сайті. Сподіваюся, вам сподобається час, який ви проводите тут!
Джузеппе

Відповіді:





8

машинний код x86, 39 байт

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

Асамблея

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

Спробуйте в Інтернеті!


5

J , 12 11 байт

1 байт збережено завдяки Adám

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

Спробуйте в Інтернеті!

Пояснення

Це еквівалентно:

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

Це можна розділити на наступний ланцюг виделок:

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

Або візуалізується за допомогою 5!:4<'f':

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

Повідомлення:

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

Збережіть байт за допомогоюe.
Адама

@ Adám Як це? Найкоротший підхід у мене e.був =+.5 e.|@-,+. Можливо, ви забули 5e.- недійсний маркер у J?
Conor O'Brien

1
Оскільки два цілих числа не можуть одночасно дорівнювати 5 і бути рівними, ви можете використовувати +замість+.
Adám

@ Adám Ах, бачу, дякую.
Conor O'Brien

5

R , 40 байт (або 34)

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

Спробуйте в Інтернеті!

Для не-R користувачів:

  • -1:1*5 розширюється до [-5, 0, 5]
  • %in%оператор приймає елементи з лівого і перевірки (поелементно) , якщо вони існують в векторі на праві

Прямий порт рішення @ ArBo має 35 34 байт, тому перейдіть до цієї відповіді, якщо вам це подобається:

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

34 байт можна зменшити на 1 за допомогоюfunction(x,y)x%in%c(y--1:1*5,5-y)
MickyT

Можна перенести на 30 байт, перемістивши віднімання:, function(x,y)(x-y)%in%(-1:1*5)і опустити його далі на 24 байти, скинувши позначення функції для scan()введення: diff(scan())%in%(-1:1*5) Спробуйте в Інтернеті! . Але все одно дуже той самий метод.
Кримінально-

1
@CriminallyVulgar вважає, що сума становить 5?
ArBo

@ArBo Hah, пропустив це в специфікації, і в TIO не було тестового випадку, тому я просто заграв це!
Кримінально-

Невеликі зміни, які можуть бути здійснені для обох, - це використання pryr::f, що може працювати в обох випадках. Чи може він правильно визначити аргументи, це цілком дещо хіт або промах, але, здається, це дві функції. напр. pryr::f(x%in%c(y--1:1*5,5-y)) Спробуйте в Інтернеті! . Отримує відповідно 36 і 29 байт.
Кримінально-

5

Python 2 , 29 31 байт

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

Спробуйте в Інтернеті!

Оскільки я не встиг прочитати завдання уважно перший раз, щоб його виправити, мені довелося придумати зовсім інший підхід, який, на жаль, не є таким стислим.


5

Машинний код 8086, 22 20 байт

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

Безголівки:

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

Введіть числа в AX і BX і повертає нульовий прапор (ZF = 1), якщо результат є істинним. При бажанні ви також можете визначити, яка умова була справжньою, виконавши наступне:

  • ZF = 1 і DX = 5; сума - 5
  • ZF = 1 і AX = 5; різниця 5
  • ZF = 1 і AX = 0; рівний
  • ZF = 0; результат хибний

Якщо різниця між числами дорівнює 0, ми знаємо, що вони рівні. Інакше якщо результат негативний, то спершу заперечуйте його, а потім перевіряйте на 5. Якщо все-таки це неправда, додайте та перевіряйте на 5.

Зразок тестової програми ПК DOS. Завантажте його тут ( 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

Вихід програми тестування:

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

Python 2, 38 байт

-2 байти завдяки @DjMcMayhem

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

Спробуйте в Інтернеті!


Ваш TIO насправді становить 42 байти, але ви можете це виправити, видаливши пробіли між 5s та ors
ElPedro

3
Власне, посилання TIO може становити 38 байт
DJMcMayhem

@ElPedro сама функція складала 40 байт, але я використовував f = для того, щоб можна було її викликати
fəˈnɛtɪk

1
@DJMcMayhem Я зазвичай не гольфу в пітон. Я просто зробив це, тому що запитувач запитань використовував python для свого прикладу
fəˈnɛtɪk



4

PowerShell , 48 44 40 байт

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

Спробуйте в Інтернеті! або Перевірте всі тестові випадки

Бере введення $aта $b. Перевірки , якщо $bє -inгрупа ( $a-5, 5-$a 5+$aабо $a), який перевіряє всі можливі комбінації $a, $bі 5.

-4 байти завдяки маззі.
-4 байти завдяки KGlasier.


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

@mazzy Ooo, гарний дзвінок.
AdmBorkBork

Якщо ви переключитесь 5і $bнавколо, ви можете відрізати пару байт (тобто param($a,$b)$b-in($a-5),(5-$a),($a+5),$a) Спробуйте це тут
KGlasier

1
@KGlasier Відмінна пропозиція. Мені потрібно було поміняти місцями, $a+5щоб 5+$aзмусити його належним чином керуватись при введенні командного рядка, але в іншому випадку дивним. Спасибі!
AdmBorkBork

4

Паскаль (FPC) ,26 70 байт

Редагувати: + вхідні змінні.

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

Спробуйте в Інтернеті!


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

Спробуйте в Інтернеті!

Я сподіваюся, що моя відповідь відповідає всім правилам code-golf. Було весело все одно.


2
Привіт, ласкаво просимо до PPCG! Зазвичай ви повинні брати вклад, замість того, щоб вважати, що він вже є змінними. Я не знаю Паскаля, але я думаю, що саме це робить цей код.
NoOneIshere

Привіт, NoOneIsHere і дякую за зауваження. Це може також стосуватися - чи включатиму я ініціалізацію змінних. Переглядаючи кілька інших рішень, як, наприклад, Java, де визначення функції з параметрами було виключено із загальної довжини рішення, я вирішив не включати ReadLn.
Дессі Стоєва

Добре. Ласкаво просимо до PPCG!
NoOneIshere

Представлення Java - це анонімна лямбда, яка приймає два параметри. Здається, використовується попередньо визначені змінні, що не є правильним методом введення.
Jo King

1
Немає проблем, я зміню своє подання.
Дессі Стоєва

3

C # (.NET Core) , 43 , 48 , 47 , 33 байт

EDIT: Намагався використовувати% і, мабуть, забув, як%. Дякуємо Арнольду, що вказав на це!

EDIT2: AdmBorkBork з -1-байтовим гольфом переставляє дужки, щоб сидіти поруч із поверненням, тому додаткового місця не потрібно!

EDIT3: Завдяки Dana за -14 байт-гольф за однолінійний ярлик для повернення та функцію каррінгу (Ty Втілення Невідомості для посилання на TIO).

C # (.NET Core) , 33 байти

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

Спробуйте в Інтернеті!


Ба. Намагається уникати System.Math. Назад до цього! Дякуємо, що
вказали

1
Ви можете звести його до 33 байтів, застосувавши підказки сьогодні
Втілення Невігластва



3

Perl 6 , 24 байти

-1 байт завдяки Гримі

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

Спробуйте в Інтернеті!

При цьому використовується будь-який з'єднання, але технічно це ^може також працювати.

Пояснення:

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

1
-1 байт с{$^a-$^b==5|0|-5|5-2*$b}
Гриммі

2

C (gcc) , 41 34 байт

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

Спробуйте в Інтернеті!


1
Чому fповертається a? Просто якась невизначена поведінка?
Тиїло

@Tyilo Так, це конкретна реалізація. Так буває, що перший параметр зберігається в тому ж регістрі, що і повернене значення.
cleblanc


@Logern не працює для f (6,1)
cleblanc

@ceilingcat Не працює для f (6,1)
cleblanc

2

05AB1E , 13 12 байт

ÐO5Qs`α5QrËO

Спробуйте в Інтернеті!

Приймає введення як список цілих чисел, зберігаючи один байт. Дякую @ Wisław!

Чергуйте 12-байтну відповідь

Q¹²α5Q¹²+5QO

Спробуйте в Інтернеті!

Цей приймає дані про окремі рядки.


1
Оскільки це не дуже чітко визначено, чи не можна вважати, що вхід є списком цілих чисел, тим самим виключаючи початкові |?
Віслав

@ Wisław Добре, я оновив свою відповідь. Спасибі!
Cowabunghole

Я знайшов 11 байт альтернативи: OI`αª5¢IË~Ā. Введення - це список цілих чисел.
Віслав


1
@MagicOctopusUrn Я не впевнений, які саме правила є, але я думаю, що ваше рішення досить відрізняється від мого, щоб подати власну відповідь, ні? Крім того, я не пов’язаний, але я давно бачив ваше ім'я користувача на цьому сайті, але лише після його введення зрозумів, що це "Urn", а не "Um" :)
Cowabunghole

2

05AB1E , 10 байт

OIÆ‚Ä50SåZ

Спробуйте в Інтернеті!


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.

Намагався робити це за допомогою операцій лише для стека, але це було довше.


1
Це, на жаль, повернеться правдою, якщо сума буде 0такою, як для[5, -5]
Emigna

1
Ваше інше 10-байтове рішення, яке ви залишили як коментар ( OIÆÄ‚5QIËM), є правильним [5,-5].
Кевін Круїссен

Ще одне 10-байтне рішення, яке я придумав, - це OsÆÄ‚5åsË~. Майже ідентично вашому, здається. Спробуйте в Інтернеті!
Віслав

2

Рубі , 34 байт

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

Online Eval - Thanks @ASCII-Only


do you check if they're equal though...
ASCII-only

Oops, forgot to add that check. Thanks @ASCII-only for pointing out the mistake.
Jatin Dhankhar

1
i'd be nice if you could link to this
ASCII-only

this might be valid? not completely sure though, you might wanna check with someone else
ASCII-only

This will work but it requires .nil? check to give output in the required format. ->(a,b){[a+5,a-5,5-a,a].index(b).nil?}, this is longer than the current one.
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

Takes input as command-line arguments and outputs 1 on success, nothing on failure. Batch can't easily do disjunctions so I use De Morgan's laws to turn it into a conjunction.



1

Japt, 13 12 bytes

x ¥5|50ìøUra

Try it or run all test cases

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

Fails for [-5,5] (should be falsey)
Kevin Cruijssen

Thanks, @KevinCruijssen. Rolled back to the previous version.
Shaggy


1

Brachylog, 8 bytes

=|+5|-ȧ5

Takes input as a list of two numbers (use _ for negatives). Try it online!

Explanation

Pretty much a direct translation of the spec:

=          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}$

Try it online! Link includes test cases. Explanation: The first two lines convert the inputs into unary. The final line then checks for any of the permitted matches:

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

Pivoted by the last column we get:

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$
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.