Operador que combina soma, produto e diferença entre dois números


28

Desafio:

Há um quebra-cabeça bobo circulando nas redes sociais que diz:

8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?

Implementar uma função ou um operador que, quando dada dois números inteiros positivos xe yde tal modo que x > y > 0, produz a resposta correcta como um número inteiro , em que a resposta é dígitos são os dígitos de x * yseguindo-se os dígitos de x + yseguindo-se os dígitos de x - y. Muito simples.

Regras:

  • As brechas padrão não são permitidas.
  • Este é o pelo que o código mais curto em bytes vence.
  • A validação de dados de entrada não é necessária. Este programa pode falhar ou retornar lixo quando receber uma entrada inválida.
  • Você tem permissão para usar funções e operadores numéricos (incluindo número inteiro e ponto flutuante, funções da biblioteca matemática e outras funções que aceitam e retornam números).
  • Você tem permissão para usar uma função que retorna o número de dígitos de um número, se aplicável.
  • Você não tem permissão para usar strings ou qualquer tipo de concatenação em qualquer lugar do seu código.
  • O resultado pode ser retornado ou enviado para a pilha, o que se aplica no idioma. O resultado deve ser um número inteiro, não uma sequência.

Código de amostra:

Dyalog APL :

O código a seguir cria um operador diádico chamado X.

X ← {(⍺-⍵) + ((⍺ + ⍵) × 10 * 1 + ⌊10⍟⍺-⍵) + ⍺ × ⍵ × 10 * (2 + ⌊10⍟⍺ + ⍵) + ⌊10⍟⍺- ⍵}

Explicação:

  • No APL, você avalia da direita para a esquerda.

  • ⍺ and ⍵ são o operando esquerdo e direito, respectivamente

  • ⌊10⍟⍺-⍵lê-se: floor of log10(⍺-⍵). Primeiro executa a subtração, depois o logaritmo e o piso. Da direita para esquerda. log10 é feito para contar os dígitos de ⍺-⍵(você deve somar 1 depois).

  • ⍺×⍵×10*(...) lê: 10 to the (...)th power, multiplied by ⍵, multiplied by ⍺

  • Portanto, ⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵é o produto, deslocado para a esquerda pela soma do número de dígitos da soma e a diferença. A multiplicação por uma potência de 10 deslocará um número inteiro para a esquerda.

  • ((⍺+⍵)×10*1+⌊10⍟⍺-⍵) é a soma, deslocada para a esquerda pelo número de dígitos da diferença.

  • (⍺-⍵)é a diferença Nenhuma mudança é necessária aqui.

  • X←{...} é assim que você define um operador no APL.

Exemplos:

      8 X 2
16106
      5 X 4
2091
      9 X 6
54153

GNU dc:

O código a seguir cria uma macro chamada a:

[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa

Explicação:

  • sxe sypop um elemento da pilha e salve-o nos registradores xe y, respectivamente.

  • lxe lycarregue um elemento dos registradores xe, yrespectivamente, e empurre-o para a pilha.

  • d duplica o último elemento na pilha.

  • ^ calcula a potência de dois números.

  • Zaparece um número e retorna seu número de dígitos. Isso é feito porque dcnão possui função de logaritmo.

  • [...]saarmazena uma macro no registro a. lacarrega. xexecuta a macro na parte superior da pilha.

Exemplos:

8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153

Presumo que a conversão de número inteiro para string seja inválida?
— Anthony Pham

2
Eu acho que tivemos um desafio muito parecido com este, mas não sabemos quais termos encontrariam o dupe.
— Xnor

2
@AnthonyPham "Você não tem permissão para usar strings ou qualquer tipo de concatenação em qualquer lugar do seu código."
— somente ASCII

1
Podemos usar um par de números inteiros como entrada?
— Conor O'Brien

1
Posso fazer um programa completo em vez de uma função?
— Erik the Outgolfer

Respostas:


10

JavaScript (ES7), 63 61 59 bytes

Economizou 4 bytes graças a Neil .

(a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c)

<input id=a type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c))(+a.value,+b.value)">
<input id=b type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-!Math.log10(c)+c))(+a.value,+b.value)">
<p id=c>


Salve alguns bytes usando 10**-~Math.log10(c). (Mas +1 para usar reduce, é claro.)
— Neil

"ES7" Oh, pelo amor de codificar ... Eles estão fazendo outro?
— Feathercrown

@ Penacrown Sim, mas é realmente pior do que ouvir "Java 9"? Além disso, ele tem coisas úteis como async/ awaite o operador de exponenciação**
— ASCII-only

@ Somente ASCII **é realmente útil, eu concordo. Isso deveria estar no ES6.
— Feathercrown


6

Bash, 66

  • 2 bytes salvos graças ao @chepner.
f()(s=$[$1+$2]
d=$[$1-$2]
echo $[($1*$2*10**${#s}+s)*10**${#d}+d])

Experimente online .


É possível tornar isso quase duas vezes menor se você colocar suas variáveis ​​(s, d e a outra para multiplicação que você não definiu) uma ao lado da outra e avaliar isso como uma expressão aritmética.
— Maxim Mikhaylov

3
@ MaxLawnboy Sim, embora isso pareça muito com a concatenação de cordas proibidas para mim.
— Digital Trauma

1
Os nomes de identificadores internos $[...]estão sujeitos à expansão de parâmetros sem o explícito $(por exemplo, em dvez de $d), salvando dois caracteres.
— Chepner # 7/17

@chepner sim - obrigado - eu tinha perdido aqueles.
— Digital Trauma

Encontrei outros dois; use ((s=$1+$2,d=$1-$2))para inicializar as duas variáveis.
— Chepner # 7/17

5

EXCEL, 61 bytes

=A1-B1+(A1+B1)*10^LEN(A1-B1)+A1*B1*10^(LEN(A1-B1)+LEN(A1+B1))

Excel, 18 bytes inválidos

=A1*B1&A1+B1&A1-B1

5

Empilhados , 36 bytes

,@A$(*+-){!A...n!}"!{%y#'10\^x*y+}#\

Experimente online!

Anteriormente: ,@A$(-+*){!A...n!}"!:inits$#'"!$summap:pop@.10\^1\,\*sum

Vou tentar extrair um byte ou dois antes de escrever uma explicação. ( #'= tamanho de e "é "faça em cada", nenhuma string anexada aqui.)

Não concorrentes em 26 bytes: $(*+-)#!!:{%y#'10\^x*y+}#\.



4

GNU dc, 36

Define uma macro mque pega os dois principais membros da pilha, aplica a macro e deixa o resultado na pilha (conforme o exemplo na pergunta):

[sadsbla-dZAr^lalb+*+dZAr^lalb**+]sm

Experimente online .


3

Perl 6 ,  81 61  58 bytes

->\x,\y{($/=($/=x- y)+(x+y)*({10**$++}...*>$/).tail)+x*y*({10**$++}...*>$/).tail}

Tente

->\x,\y{(x*y,x+y,x- y).reduce:{$^a*10**Int(1+log10($^b))+$b}}

Tente

->\x,\y{[[&({$^a*10**Int(1+$^b.log10)+$b})]] x*y,x+y,x- y}

Tente


Não conhecendo o Perl 6, fiquei um pouco surpreso ao descobrir que x-yé um identificador válido.
— 611 Neil

3

Gelatina , 27 bytes

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵*
ạ,+,×Fæ.ç

Define um link / função diádico, que pode ser chamado com ç. Pega dois números inteiros como entrada e retorna um número inteiro. Ele tem o bônus adicional de poder aceitar x <y ou x >y usando a diferença absoluta.

Experimente online!

Explicação:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create link which computes what order of magnitude
                        to multiply the difference, sum, and product by
ạ,+,×Fæ.ç         -- Main link, applies this using dot product

Detalhes:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create dyadic like which does the following:
       l⁵Ḟ‘       -- Create operation which computes number of digits
                       (log base 10 (⁵ is the literal 10), floored, incremented)
           €      -- Apply this to each element in
+,ạ,.1F           -- ... the list [sum,difference,.1]
            R     -- Reverse the list
             +\   -- Add up first n elements to get list.
               ⁵* -- Raise 10 (⁵ is literal 10) to the power of each element

ạ,+,×Fæ.ç         -- Main link, applies above link
ạ,+,×F            -- The list [difference, sum, product]
      æ.          -- Dot product (multiply corresponding elements) with
        ç         -- The above link.

2

PHP, 79 75 bytes

duas versões:

[,$a,$b]=$argv;echo(10**strlen($s=$a+$b)*$a*$b+$s)*10**strlen($d=$a-$b)+$d;
[,$a,$b]=$argv;echo(10**strlen($a+$b)*$a*$b+$a+$b)*10**strlen($a-$b)+$a-$b;

recebe entrada de argumentos de linha de comando; corra com -r.

Eu acho que se strlenqualifica como "função que retorna o número de dígitos",
embora use o número como uma string. Deixe-me saber se não.


'Você não tem permissão para usar strings ou qualquer tipo de concatenação em qualquer lugar do seu código.', Então não acho que strlenseja válido.
— numbermaniac

@numbermaniac Deixe o OP decidir. A restrição era forçar as soluções a criar um resultado em vez de apenas imprimir três resultados um após o outro. Tudo além disso é nitpicking.
— Titus

2

C (gcc) , 70 bytes

#define _ for(c=1;a+b>=(c*=10););d=c*d+a-(b=-b);
c,d;f(a,b){d=a*b;_ _}

Experimente online!

com base na resposta do Steadybox , colocando tudo em uma macro para jogar um pouco mais.

(Nota: atribuir o resultado ao dinvés de afuncionar, inesperadamente. Dei uma olhada no código do assembly gerado e ele parece estar ok.)


2

Haskell, 54 bytes

a%0=a
a%b=10*a%div b 10+mod b 10
a#b=(a*b)%(a+b)%(a-b)

O quebra-cabeça é implementado através de uma função infix #, por exemplo 8#2 = 16106. A outra função, %define a concatenação da base 10 (assumindo que o RHS seja maior que 0).



1

PHP, 87 bytes

[,$a,$b]=$argv;echo($s=$a-$b)+($t=$a+$b)*10**($l=strlen($s))+$a*$b*10**($l+strlen($t));

e uma solução não válida para 37 bytes

[,$a,$b]=$argv;echo$a*$b,$a+$b,$a-$b;

1

Ruby, 61 bytes

->a,b{[a*b,a+b,a-b].reduce{|x,y|z=y;x*=10while(z>z/=10);x+y}}

O que suspeita se parece muito com esta resposta Javascript, mas sem usar um logaritmo.


1

Python, 92 91 caracteres

def g(x,y):
    l=lambda x,i=0:l(x/10,i+1)if x else 10**i
    a=x-y
    a+=(x+y)*l(a)
    return x*y*l(a)+a

Graças à sugestão do Wizards;)


Bem vindo ao site! Você não precisa do espaço entre )e if.
— Assistente de trigo

1

R (3.3.1), 104 bytes

function(x,y)Reduce(function(p,q)p*10^(floor(log10(q)+1))+q,lapply(c(`*`,`+`,`-`),function(z)z(x,y)),0)

retorna uma função anônima.

Esta é minha primeira tentativa de golfe, então qualquer feedback é apreciado.


1
Eu diria para tentar evitar a definição de funções através da palavra reservada 'function', se possível, ela consome muitos bytes. Basta fazer o cálculo.
— precisa saber é o seguinte

0

REXX, 70 bytes

f:arg a b
c=a-b
c=(a+b)*10**length(c)+c
c=a*b*10**length(c)+c
return c

Obviamente, a maneira nativa seria muito mais curta:

f:arg a b
return a*b||a+b||a-b

0

PowerShell, 88 bytes

param($x,$y)$l=2;if(($a=$x+$y)-gt9){$l++};($x*$y)*[math]::Pow(10,$l)+$a*10+$x-$y

O PowerShell não possui um para o operador de energia, o que não ajuda. Também não podemos contar o comprimento de um número inteiro, a menos que você o conte como uma string, o que não podemos fazer, por isso, verifico se é -gt9 para saber o comprimento. Provavelmente poderia ser mais conciso, mas tenho que voltar ao trabalho.


0

Python 2.7, 109 96 bytes

import math
a=lambda n:10**int(math.log10(10*n))
b,c=input()
d=b-c+(b+c)*a(b-c)
print d+b*c*a(d)

Corrigido após seguir as regras do concurso. Créditos ao mbomb007 por reduzir o código de 109 bytes para 96 bytes


1
Das regras deste desafio•You're not allowed to use strings or any kind of concatenation anywhere in your code.
— #

Você pode salvar alguns bytes criando aum lambda. a=lambda n:10**int(.... Você também pode fazer b,c=input(), fornecendo suas duas entradas separadas por vírgula.
— mbomb007

@ mbomb007 b, c = input () fornece TypeError: o objeto 'int' não é iterável. Eu tentei. E a função lambda não salvará bytes porque estou chamando a função duas vezes no código. tentei isso também. :(
— Koishore Roy 06/04

@KoishoreRoy Eu não acho que você entende o que quero dizer. 96 bytes
— mbomb007

0

J , 25 bytes

X=.10#.[:;10#.inv&.>*;+;-
  1. *;+;- Caixa os resultados de cada operação.
  2. 10#.inv&.>Converta cada resultado em uma matriz de dígitos de base 10. ( invé ^:_1)
  3. [:; Desmarque e junte-se às matrizes.
  4. 10#. Converta a matriz de dígitos da base 10 em um número inteiro.
  5. X=.defina o acima como o operador X.

Resultados:

   8 X 2
16106
   5 X 4
2091
   9 X 6
54153

Você não precisaX=.
— Cyoce

@Cyoce - o código APL de amostra no desafio define um operador. Tenho certeza de que devemos definir um operador reutilizável para esse desafio.
— Dane

"3. [:; Unbox e junte-se às matrizes." - "Você não tem permissão para usar strings ou qualquer tipo de concatenação em qualquer lugar do seu código."
— NGN

@ngn - Por favor, expanda seu comentário. Em nenhum momento as strings são usadas.
— Dane

Eu só queria ressaltar que "associação" ("link"?) Pode constituir um "tipo de concatenação", embora eu não esteja muito familiarizado com J e não tenha certeza de como interpretar a declaração do problema neste caso. . Minha própria solução levanta questões semelhantes - eu uso stranding (justaposição de substantivos em APL forma um vetor) que pode ser o mesmo que o "link" de J, mas sem um glifo para representá-lo.
— NGN

0

Mathematica, 67 bytes

c=Ceiling;l=Log10;#-#2+(#+#2)10^(c@l[#-#2]/. 0->1)+10^c@l[2#]10#2#&

Pega x-y, pega o log10 de x-y, arredonda-o, calcula 10 à potência disso e multiplica-o por x+y. Mas também precisamos considerar log10(x-y)0, então substituímos 0 por 1. Então pegamos o log10 de 2x, arredondado para cima, mais 1, e encontramos 10 ao poder disso. Multiplique por xye adicione.


0

05AB1E , 23 22 16 bytes

-Dg°¹²+*Dg°¹²**O

Experimente online!

Poderíamos ter salvo alguns bytes se tivéssemos permissão para usar seqüências de caracteres no programa (mas não nos cálculos) fazendo um loop sobre uma sequência contendo as operações "-+*", pois o código executado para cada operação é o mesmo.
Obviamente, se tivéssemos permissão para usar a concatenação, teríamos economizado muito mais.


0

R, 64 bytes

x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)

Uso:

> x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)
1: 8 2
3: 
Read 2 items
[1] 16106
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.