Igual, soma ou diferença!


32

Escreva o código mais curto possível que retornará true se os dois valores inteiros forem iguais ou se a soma ou diferença absoluta for 5.

Exemplos de casos de teste:

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

O menor que eu pude criar no python2 tem 56 caracteres:

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

-9, obrigado @ElPedro. É necessário entrada no formato x, y:

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

9
bem-vindo ao PPCG! Esse é um bom primeiro desafio - o desafio está claramente definido, possui amplos casos de teste e usa nossa E / S padrão! Se você ficar por um tempo e continuar pensando em desafios interessantes, eu recomendaria o uso do The Sandbox para obter feedback antes de publicá-los neste site. Espero que você aproveite o tempo que passa aqui!
Giuseppe

Respostas:





8

código de máquina x86, 39 bytes

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

Montagem

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

Experimente online!


5

J , 12 11 bytes

1 byte economizado graças a Adám

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

Experimente online!

Explicação

Isso é equivalente a:

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

Isso pode ser dividido na seguinte cadeia de garfos:

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

Ou visualizado usando 5!:4<'f':

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

Anotado:

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

Salvar um byte come.
Adám 16/01

@ Adám Como assim? A abordagem mais curta que obtive e.foi =+.5 e.|@-,+. Talvez você esqueça que 5e.é um token inválido no J?
Conor O'Brien

11
Como dois números inteiros não podem somar simultaneamente a 5 e serem iguais, você pode usar em +vez de+.
Adám

@ Adám Ah, entendo, obrigado.
Conor O'Brien

5

R , 40 bytes (ou 34)

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

Experimente online!

Para usuários não-R:

  • -1:1*5 expande para [-5, 0, 5]
  • o %in%operador pega elementos da esquerda e verifica (em termos de elementos) se eles existem no vetor à direita

Uma porta direta da solução do @ ArBo possui 35 34 bytes, então vote com mais frequência que responder se quiser:

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

O byte de 34 bytes pode ser reduzido em 1 comfunction(x,y)x%in%c(y--1:1*5,5-y)
MickyT 16/01

Pode cair para 30 bytes movendo a subtração:, function(x,y)(x-y)%in%(-1:1*5)e depois para 24 bytes, largando a notação de função na scan()entrada: diff(scan())%in%(-1:1*5) Experimente online! . Ainda é muito o mesmo método.
CriminallyVulgar

11
@CriminallyVulgar, isso representa a soma de 5?
ArBo 17/01

@ArBo Hah, perdi isso nas especificações, e não havia um caso de teste no TIO, então acabei de encaminhá-lo!
CriminallyVulgar

Pequenas alterações que podem ser feitas em ambos é usar pryr::f, o que acontece nos dois casos. Se ele pode detectar adequadamente os argumentos é inteiramente um tanto imprevisível, mas parece pregar essas duas funções. Por exemplo, pryr::f(x%in%c(y--1:1*5,5-y)) experimente online! . Leva você a 36 e 29 bytes, respectivamente.
CriminallyVulgar

5

Python 2 , 29 31 bytes

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

Experimente online!

Como não consegui ler a tarefa cuidadosamente da primeira vez, para corrigi-la, tive que criar uma abordagem completamente diferente, que infelizmente não é tão concisa.


5

Código de máquina 8086, 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

Digite os números no AX e no BX e retorne a flag zero (ZF = 1) se o resultado for verdadeiro. Se desejar, você também pode determinar qual condição era verdadeira com o seguinte:

  • ZF = 1 e DX = 5; soma é 5
  • ZF = 1 e AX = 5; diff é 5
  • ZF = 1 e AX = 0; igual
  • ZF = 0; resultado falso

Se a diferença entre os números for 0, sabemos que eles são iguais. Caso contrário, se o resultado for negativo, primeiro negue-o e verifique se 5. Se ainda não for verdadeiro, adicione e verifique 5.

Exemplo de programa de teste para PC DOS. Faça o download aqui ( 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

Saída do programa de teste:

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

Geléia , 7 bytes

+,ạ5eo=

Experimente online!

Como funciona

+,ạ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 graças a @DjMcMayhem

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

Experimente online!


Seu TIO é realmente de 42 bytes, mas você pode corrigi-lo excluindo os espaços entre os 5eor
ElPedro 16/01

3
Na verdade, o link do TIO pode ter 38 bytes
DJMcMayhem

@ElPedro a função em si era de 40 bytes, mas eu usei f = para poder chamá-lo
fəˈnɛtɪk 16/01

11
@DJMcMayhem Normalmente não jogo golfe em python. Acabei de fazer isso porque o autor da pergunta usava python como exemplo
fəˈnɛtɪk 16/01



4

PowerShell , 48 44 40 bytes

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

Experimente online! ou Verifique todos os casos de teste

Pega entrada $ae $b. Verifica se $bé -ino grupo ( $a-5, 5-$a 5+$a, ou $a), o qual verifica todas as combinações possíveis de $a, $be 5.

-4 bytes graças ao mazzy.
-4 bytes graças ao KGlasier.


($a-$b)é -$x:)
mazzy 16/01

@mazzy Ooo, boa ligação.
AdmBorkBork 16/01

Se você alternar 5e $bem torno de você pode cortar um par de bytes (ou seja param($a,$b)$b-in($a-5),(5-$a),($a+5),$a) Experimente aqui
KGlasier

11
@KGlasier Excelente sugestão. Eu precisava trocar $a+5para 5+$aobter a conversão adequada ao receber a entrada da linha de comando, mas, de outra forma, impressionante. Obrigado!
AdmBorkBork 17/01

4

Pascal (FPC) ,26 70 bytes

Editar: + variáveis ​​de entrada.

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

Experimente online!


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

Experimente online!

Espero que minha resposta esteja de acordo com todas as regras do código-golfe. Foi divertido de qualquer maneira.


2
Olá, e bem-vindo ao PPCG! Normalmente, você precisa receber informações, em vez de assumir que já está em variáveis. Não conheço Pascal, mas acho que é isso que esse código está fazendo.
NoOneIsHere 20/01

Olá, NoOneIsHere e obrigado pela observação. Também pode ser preocupante - devo incluir a inicialização das variáveis. Olhando para várias outras soluções, como Java, por exemplo, onde a definição de função com parâmetros foi excluída do comprimento total da solução, decidi não incluir o ReadLn.
Dessy Stoeva 20/01

Bem. Bem-vindo ao PPCG!
NoOneIsHere 20/01

A submissão Java é uma lambda anônima que aceita dois parâmetros. Parece usar variáveis ​​predefinidas, o que não é um método válido de entrada.
Jo King

11
Não tem problema, vou mudar minha inscrição.
Dessy Stoeva 24/01

3

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

EDIT: Tentei usar% e, aparentemente, esqueceu como%. Obrigado a Arnauld por apontar isso!

EDIT2: AdmBorkBork com um campo de golfe de -1 bytes reorganizando os parênteses para ficar ao lado do retorno, para que não seja necessário espaço adicional!

EDIT3: Agradecimentos a dana pelo golfe de -14 bytes pelo atalho de retorno em uma linha e currying a função (Ty Embodiment of Ignorance por vincular ao TIO).

C # (.NET Core) , 33 bytes

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

Experimente online!


Bah. Tentando evitar o System.Math. Voltar para ele! Obrigado por apontar isso: D
Destroigo

11
Você pode reduzi-lo a 33 bytes aplicando as dicas da dana
Modalidade de Ignorância

3

C (gcc) , 33 bytes

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

Experimente online!

Tentei uma abordagem que não vi mais ninguém tentar usar. A expressão de retorno é equivalente a a+b==5||((-6<a-b||a-b<6)&&(a-b)%5==0).




3

Perl 6 , 24 bytes

-1 byte graças ao Grimy

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

Experimente online!

Isso usa o Any Junction, mas tecnicamente, também ^pode funcionar.

Explicação:

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

11
-1 byte com{$^a-$^b==5|0|-5|5-2*$b}
Grimmy 17/01


2

05AB1E , 13 12 bytes

ÐO5Qs`α5QrËO

Experimente online!

Recebe a entrada como uma lista de números inteiros, economizando um byte. Obrigado @ Wisław!

Resposta alternativa de 12 bytes

Q¹²α5Q¹²+5QO

Experimente online!

Este recebe entrada em linhas separadas.


11
Como não está claramente especificado, você não pode assumir que a entrada é uma lista de números inteiros, eliminando a inicial |?
Wisław 16/01

@ Wisław Bom ponto, eu atualizei minha resposta. Obrigado!
Cowabunghole 16/01

Eu encontrei um 11 bytes alternativa: OI`αª5¢IË~Ā. Entrada é uma lista de números inteiros.
Wisław 16/01

11
OIÆÄ)5QIËMé 10.
Magic Octopus Urn

11
@MagicOctopusUrn Não sei exatamente quais são as regras, mas acho que sua solução é diferente o suficiente da minha para enviar sua própria resposta, não? Além disso, sem relação, mas eu já vi seu nome de usuário neste site há muito tempo, mas somente depois de digitá-lo é que percebi que é "Urna", não "Um" :)
Cowabunghole 16/01

2

05AB1E , 10 bytes

OIÆ‚Ä50SåZ

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

Tentei fazer isso usando operações apenas de pilha, mas foi mais longo.


11
Infelizmente, isso retornará verdadeiro se a soma for 0como[5, -5]
Emigna 16/01

11
Sua outra solução de 10 bytes que você deixou como comentário ( OIÆÄ‚5QIËM) está correta [5,-5].
Kevin Cruijssen 17/01

Outra solução de 10 bytes que eu vim com é OsÆÄ‚5åsË~. Quase idêntico ao seu, parece. Experimente online!
Wisław 17/01

2

Ruby , 34 bytes

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

Eval Online - Obrigado @ Somente ASCII


você verifica se eles são iguais ...
ASCII-only

Opa, esqueci de adicionar essa verificação. Obrigado @ ASCII-only por apontar o erro.
Jatin Dhankhar 20/01

11
eu seria legal se você pudesse criar um link para isso
somente ASCII

isso pode ser válido? não completamente certo, porém, você pode querer verificar com outra pessoa
somente ASCII

Isso funcionará, mas requer .nil?verificação para fornecer a saída no formato necessário. ->(a,b){[a+5,a-5,5-a,a].index(b).nil?}, isso é mais longo que o atual.
Jatin Dhankhar 28/01



1

Lote, 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

Recebe a entrada como argumentos da linha de comando e gera 1 em caso de êxito, nada em caso de falha. Lote não pode fazer disjunções facilmente, então eu uso as leis de De Morgan para transformá-lo em uma conjunção.



1

Japonês, 13 12 bytes

x ¥5|50ìøUra

Experimente ou execute todos os casos de teste

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

Não consegue [-5,5](deve ser falsey)
Kevin Cruijssen 17/01

Obrigado, @KevinCruijssen. Revertida para a versão anterior.
Shaggy

1

Lisp comum, 48 bytes

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

1

Braquilog , 8 bytes

=|+5|-ȧ5

Recebe a entrada como uma lista de dois números (use _para negativos). Experimente online!

Explicação

Praticamente uma tradução direta das especificações:

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

Experimente online! O link inclui casos de teste. Explicação: As duas primeiras linhas convertem as entradas em unárias. A linha final verifica então qualquer uma das correspondências permitidas:

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

Pivotado pela última coluna, obtemos:

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$
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.