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 código-golfe, 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:
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:
sxesypop um elemento da pilha e salve-o nos registradoresxey, respectivamente.lxelycarregue um elemento dos registradoresxe,yrespectivamente, e empurre-o para a pilha.dduplica 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 porquedcnão possui função de logaritmo.[...]saarmazena uma macro no registroa.lacarrega.xexecuta a macro na parte superior da pilha.
Exemplos:
8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153