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
fonte
Respostas:
JavaScript (ES7),
636159 bytesEconomizou 4 bytes graças a Neil .
fonte
10**-~Math.log10(c)
. (Mas +1 para usarreduce
, é claro.)async
/await
e o operador de exponenciação**
**
é realmente útil, eu concordo. Isso deveria estar no ES6.C,
7975 bytesObrigado a @GB por economizar 4 bytes!
Experimente online!
fonte
Bash, 66
Experimente online .
fonte
$[...]
estão sujeitos à expansão de parâmetros sem o explícito$
(por exemplo, emd
vez de$d
), salvando dois caracteres.((s=$1+$2,d=$1-$2))
para inicializar as duas variáveis.EXCEL, 61 bytes
Excel, 18 bytes inválidos
fonte
Empilhados , 36 bytes
Experimente online!
Anteriormente:
,@A$(-+*){!A...n!}"!:inits$#'"!$summap:[email protected]\^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+}#\
.fonte
TI-Basic,
3433 bytesfonte
Prompt A,B
também deve funcionarGNU dc, 36
Define uma macro
m
que pega os dois principais membros da pilha, aplica a macro e deixa o resultado na pilha (conforme o exemplo na pergunta):Experimente online .
fonte
Perl 6 ,
81 6158 bytesTente
Tente
Tente
fonte
x-y
é um identificador válido.Gelatina , 27 bytes
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:
Detalhes:
fonte
PHP,
7975 bytesduas versões:
recebe entrada de argumentos de linha de comando; corra com
-r
.Eu acho que se
strlen
qualifica 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.
fonte
strlen
seja válido.C (gcc) , 70 bytes
Experimente online!
com base na resposta do Steadybox , colocando tudo em uma macro para jogar um pouco mais.
(Nota: atribuir o resultado ao
d
invés dea
funcionar, inesperadamente. Dei uma olhada no código do assembly gerado e ele parece estar ok.)fonte
Haskell, 54 bytes
O quebra-cabeça é implementado através de uma função infix
#
, por exemplo8#2 = 16106
. A outra função,%
define a concatenação da base 10 (assumindo que o RHS seja maior que 0).fonte
Dyalog APL, 31 bytes
{a⊥⍨10*1+⌊10⍟a←(⍺×⍵)(⍺+⍵)(⍺-⍵)}
com base no código APL de amostra da declaração do problema
fonte
PHP, 87 bytes
e uma solução não válida para 37 bytes
fonte
Ruby, 61 bytes
O que suspeita se parece muito com esta resposta Javascript, mas sem usar um logaritmo.
fonte
Python,
9291 caracteresGraças à sugestão do Wizards;)
fonte
)
eif
.R (3.3.1), 104 bytes
retorna uma função anônima.
Esta é minha primeira tentativa de golfe, então qualquer feedback é apreciado.
fonte
REXX, 70 bytes
Obviamente, a maneira nativa seria muito mais curta:
fonte
PowerShell, 88 bytes
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 é
-gt
9 para saber o comprimento. Provavelmente poderia ser mais conciso, mas tenho que voltar ao trabalho.fonte
Python 2.7,
10996 bytesCorrigido após seguir as regras do concurso. Créditos ao mbomb007 por reduzir o código de 109 bytes para 96 bytes
fonte
•You're not allowed to use strings or any kind of concatenation anywhere in your code.
a
um lambda.a=lambda n:10**int(...
. Você também pode fazerb,c=input()
, fornecendo suas duas entradas separadas por vírgula.J , 25 bytes
*;+;-
Caixa os resultados de cada operação.10#.inv&.>
Converta cada resultado em uma matriz de dígitos de base 10. (inv
é^:_1
)[:;
Desmarque e junte-se às matrizes.10#.
Converta a matriz de dígitos da base 10 em um número inteiro.X=.
defina o acima como o operadorX
.Resultados:
fonte
X=.
Mathematica, 67 bytes
Pega
x-y
, pega o log10 dex-y
, arredonda-o, calcula 10 à potência disso e multiplica-o porx+y
. Mas também precisamos considerarlog10(x-y)
0, então substituímos 0 por 1. Então pegamos o log10 de2x
, arredondado para cima, mais 1, e encontramos 10 ao poder disso. Multiplique porxy
e adicione.fonte
05AB1E ,
232216 bytesExperimente 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.
fonte
R, 64 bytes
Uso:
fonte