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 x
e y
de 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 * y
seguindo-se os dígitos de x + y
seguindo-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:
sx
esy
pop um elemento da pilha e salve-o nos registradoresx
ey
, respectivamente.lx
ely
carregue um elemento dos registradoresx
e,y
respectivamente, e empurre-o para a pilha.d
duplica o último elemento na pilha.^
calcula a potência de dois números.Z
aparece um número e retorna seu número de dígitos. Isso é feito porquedc
não possui função de logaritmo.[...]sa
armazena uma macro no registroa
.la
carrega.x
executa a macro na parte superior da pilha.
Exemplos:
8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153