Равен, сумма или разница!


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! Это хорошая первая задача - задача четко определена, в ней достаточно тестовых случаев и используется наш ввод / вывод по умолчанию! Если вы задержитесь на некоторое время и продолжите думать об интересных задачах, я бы порекомендовал использовать «Песочницу» для получения отзывов, прежде чем публиковать их на этом сайте. Я надеюсь, вам понравится время, которое вы проводите здесь!
Джузеппе

Ответы:





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 байт сохранен благодаря Адаму

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?
Конор О'Брайен

1
Поскольку два целых числа не могут одновременно суммироваться до 5 и быть равными, вы можете использовать +вместо+.
Адам

@ Adám Ах, понятно, спасибо.
Конор О'Брайен

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 Ха, пропустил это в спецификации, и в 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

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

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

  • 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

@ElPedro сама функция была 40 байтов, но я использовал f = для того, чтобы ее можно было вызвать
fəˈnɛtɪk

1
@DJMcMayhem Я обычно не играю в гольф на питоне. Я просто сделал это, потому что
задающий



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 Ооо, хороший звонок.
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

Здравствуйте, NoOneIsЗдесь и спасибо за замечание. Это тоже может касаться - включу ли я инициализацию переменных. Рассматривая несколько других решений, таких как Java, например, где определение функции с параметрами было исключено из общей длины решения, я решил не включать ReadLn.
Десси Стоева

Хорошо. Добро пожаловать в PPCG!
NoOneIsHere

Представление Java - это анонимная лямбда, которая принимает два параметра. Это похоже на использование предопределенных переменных, что не является допустимым методом ввода.
Джо Кинг

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

3

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

РЕДАКТИРОВАТЬ: пытался использовать% и, видимо, забыл, как%. Спасибо Арно за то, что указал на это!

РЕДАКТИРОВАТЬ 2: AdmBorkBork с -1-байтовым полем для гольфа переставляет скобки, чтобы сидеть рядом с возвратом, так что дополнительное пространство не требуется!

РЕДАКТИРОВАТЬ 3: Спасибо Дане за -14 байт-гольф за однострочное возвращение ярлыка и карри функции (Ty Embodiment of Ignorance для связи с TIO).

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

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

Попробуйте онлайн!


Ба. Пытаясь избежать System.Math. Вернуться к этому! Спасибо за указание на это: D
Destroigo

1
Вы можете уменьшить его до 33 байт, применяя подсказки
Даны

3

C (gcc) , 33 байта

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

Попробуйте онлайн!

Пробовал подход, я не видел, чтобы кто-то еще пытался использовать. Возвращаемое выражение эквивалентно a+b==5||((-6<a-b||a-b<6)&&(a-b)%5==0).




3

Perl 6 , 24 байта

-1 байт благодаря Грими

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

Попробуйте онлайн!

Это использует Any Junction, но технически, также ^может работать.

Объяснение:

{                      }  # 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}
Grimmy

2

C (gcc) , 41 34 байта

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

Попробуйте онлайн!


1
Почему fвозвращается a? Просто какое-то неопределенное поведение?
Tyilo

@Tyilo Да, это зависит от реализации. Так случилось, что первый параметр сохраняется в том же регистре, что и возвращаемое значение.
cleblanc


@Logern не работает для f (6,1)
cleblanc

@ceilingcat не работает для f (6,1)
cleblanc

2

05AB1E , 13 12 байт

ÐO5Qs`α5QrËO

Попробуйте онлайн!

Принимает ввод как список целых чисел, сохраняя один байт. Спасибо @ Вислав!

Альтернативный 12-байтовый ответ

Q¹²α5Q¹²+5QO

Попробуйте онлайн!

Этот ввод в отдельных строках.


1
Поскольку он не очень четко указан, не можете ли вы предположить, что входные данные являются списком целых чисел, тем самым исключая начальные |?
Вислав

@ Вислав Хороший вопрос, я обновил свой ответ. Благодарность!
Cowabunghole

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


1
@MagicOctopusUrn Я не уверен, какие именно правила, но я думаю, что ваше решение достаточно отличается от моего, чтобы представить свой собственный ответ, нет? Кроме того, не имеет отношения, но я давно видел ваше имя пользователя на этом сайте, но только после его ввода я понял, что это «Урна», а не «Гм» :)
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]
Эминья

1
Ваше другое 10-байтовое решение, которое вы оставили в качестве комментария ( OIÆÄ‚5QIËM), подходит для [5,-5].
Кевин Круйссен

Еще одно 10-байтовое решение, которое я придумал, это OsÆÄ‚5åsË~. Кажется, почти идентично твоему.Попробуйте онлайн!
Вислав

2

Рубин , 34 байта

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

Онлайн Eval - Спасибо @ ASCII-Only


Вы проверяете, равны ли они, хотя ...
Только для ASCII

Ой, забыл добавить эту проверку. Спасибо @ ASCII-только за указание на ошибку.
Джатин Дханхар

1
было бы неплохо, если бы вы могли сослаться на это
только ASCII

это может быть действительным? не совсем уверен, однако, вы могли бы проверить с кем-то еще
только ASCII

Это будет работать, но требует .nil?проверки, чтобы выдать вывод в требуемом формате. ->(a,b){[a+5,a-5,5-a,a].index(b).nil?}, это длиннее, чем текущий.
Джатин Дханхар



1

Пакет, 81 байт

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

Принимает ввод в качестве аргументов командной строки и выводит 1 при успехе, ничего при сбое. Пакет не может легко сделать дизъюнкции, поэтому я использую законы Де Моргана, чтобы превратить его в соединение.



1

Japt, 13 12 байт

x ¥5|50ìøUra

Попробуйте или запустите все тесты

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

Не удается [-5,5](должно быть фальшиво)
Кевин Круйссен

Спасибо, @KevinCruijssen. Откатился на предыдущую версию.
лохматый


1

Брахилог , 8 байт

=|+5|-ȧ5

Вводит в виде списка из двух чисел (используйте _для негативов). Попробуйте онлайн!

объяснение

Практически прямой перевод спецификации:

=          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

Сетчатка 0.8.2 , 82 байта

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

Попробуйте онлайн!Ссылка включает в себя тестовые случаи. Пояснение: первые две строки преобразуют входные данные в унарные. Последняя строка затем проверяет наличие любого из разрешенных совпадений:

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

Повернув последний столбец, мы получим:

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.