Reto:
Hay un rompecabezas tonto que circula en las redes sociales que dice:
8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?
Implemente una función u operador que, cuando se le dan dos números enteros positivos x
y de y
modo que x > y > 0
, arroje la respuesta correcta como un entero , donde los dígitos de la respuesta son los dígitos x * y
seguidos por los dígitos x + y
seguidos por los dígitos de x - y
. Muy simple.
Reglas:
- Las lagunas estándar no están permitidas.
- Este es el código de golf, por lo que el código más corto en bytes gana.
- No se requiere validación de datos de entrada . Este programa puede bloquearse o devolver basura cuando se le da una entrada no válida.
- Puede utilizar funciones y operadores numéricos (incluidos números enteros y coma flotante, funciones de biblioteca matemática y otras funciones que aceptan y devuelven números).
- Puede usar una función que devuelve el número de dígitos de un número, si corresponde.
- Estas no permitido el uso de cadenas o cualquier tipo de concatenación en cualquier lugar en el código.
- El resultado puede devolverse o enviarse a la pila, lo que corresponda en el idioma. El resultado debe ser un número entero, no una cadena.
Código de muestra:
El siguiente código crea un operador diádico llamado X
.
X ← {(⍺-⍵) + ((⍺ + ⍵) × 10 * 1 + ⌊10⍟⍺-⍵) + ⍺ × ⍵ × 10 * (2 + ⌊10⍟⍺ + ⍵) + ⌊10⍟⍺- ⍵}
Explicación:
En APL, evalúa de derecha a izquierda.
⍺ and ⍵
son el operando izquierdo y derecho, respectivamente⌊10⍟⍺-⍵
dice lo siguiente:floor of log10(⍺-⍵)
. Primero realiza la resta, luego el logaritmo y luego el piso. De derecha a izquierda. log10 se realiza para contar los dígitos de⍺-⍵
(debe sumar 1 después).⍺×⍵×10*(...)
lee:10 to the (...)th power, multiplied by ⍵, multiplied by ⍺
Por lo tanto,
⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵
es el producto, desplazado hacia la izquierda por la suma del número de dígitos de la suma y la diferencia. Multiplicar por una potencia de 10 desplazará un número entero a la izquierda.((⍺+⍵)×10*1+⌊10⍟⍺-⍵)
es la suma, desplazada a la izquierda por el número de dígitos de la diferencia.(⍺-⍵)
es la diferencia No se necesitan cambios aquí.X←{...}
es cómo define un operador en APL.
Ejemplos:
8 X 2
16106
5 X 4
2091
9 X 6
54153
GNU dc:
El siguiente código crea una macro llamada a
:
[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa
Explicación:
sx
ysy
pop un elemento de la pila y guárdelo en los registrosx
yy
, respectivamente.lx
yly
cargar un elemento de registrosx
yy
respectivamente y empujarlo a la pila.d
duplica el último elemento en la pila.^
calcula el poder de dos números.Z
muestra un número y devuelve su número de dígitos. Esto se hace porquedc
no tiene función de logaritmo.[...]sa
almacena una macro en el registroa
.la
lo cargax
ejecuta la macro en la parte superior de la pila.
Ejemplos:
8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153
fuente
Respuestas:
JavaScript (ES7),
636159 bytesGuardado 4 bytes gracias a Neil .
fuente
10**-~Math.log10(c)
. (Pero +1 por usarreduce
, por supuesto.)async
/await
y el operador de exponenciación**
**
es realmente útil, estoy de acuerdo. Eso debería haber estado en ES6.C,
7975 bytes¡Gracias a @GB por guardar 4 bytes!
Pruébalo en línea!
fuente
Bash, 66
Pruébalo en línea .
fuente
$[...]
están sujetos a la expansión de parámetros sin el explícito$
(por ejemplo, end
lugar de$d
), guardando dos caracteres.((s=$1+$2,d=$1-$2))
para inicializar las dos variables.EXCEL, 61 Bytes
Excel, 18 bytes no válidos
fuente
Apilado , 36 bytes
Pruébalo en línea!
Previamente:
,@A$(-+*){!A...n!}"!:inits$#'"!$summap:[email protected]\^1\,\*sum
Voy a tratar de extraer un byte o dos antes de escribir una explicación. (
#'
= tamaño de, y"
es "hacer en cada uno", sin condiciones adjuntas aquí.)Que no compiten en 26 bytes:
$(*+-)#!!:{%y#'10\^x*y+}#\
.fuente
TI-Basic,
3433 bytesfuente
Prompt A,B
que también debería funcionarGNU dc, 36
Define una macro
m
que toma los dos miembros superiores de la pila, aplica la macro y deja el resultado en la pila (según el ejemplo en la pregunta):Pruébalo en línea .
fuente
Perl 6 ,
81 6158 bytesIntentalo
Intentalo
Intentalo
fuente
x-y
es un identificador válido.Jalea , 27 bytes
Define un enlace / función diádica, invocable con
ç
. Toma dos enteros como entrada y devuelve un entero. Tiene la ventaja adicional de poder tomar x<
y o x>
y usando la diferencia absoluta.Pruébalo en línea!
Explicación:
Detalles:
fuente
PHP,
7975 bytesdos versiones:
toma datos de los argumentos de la línea de comandos; correr con
-r
.Supongo que
strlen
califica como "función que devuelve el número de dígitos",aunque usa el número como una cadena. Avísame si no.
fuente
strlen
sea válido.C (gcc) , 70 bytes
Pruébalo en línea!
basado en la respuesta de Steadybox , poniendo todo en una macro para jugar golf un poco más.
(Nota: asignar el resultado en
d
lugar dea
trabajos, inesperadamente. Eché un vistazo al código de ensamblaje generado y parece estar bien).fuente
Haskell, 54 bytes
El rompecabezas se implementa mediante una función infija
#
, por ejemplo8#2 = 16106
. La otra función,%
define la concatenación de base 10 (suponiendo que el RHS es mayor que 0).fuente
Dyalog APL, 31 bytes
{a⊥⍨10*1+⌊10⍟a←(⍺×⍵)(⍺+⍵)(⍺-⍵)}
basado en el código APL de muestra de la declaración del problema
fuente
PHP, 87 bytes
y una solución no válida para 37 Bytes
fuente
Ruby, 61 bytes
Que sospechosamente se parece mucho a esta respuesta Javascript, pero sin usar un logaritmo.
fuente
Python,
9291 caracteresGracias a la sugerencia de Wizards;)
fuente
)
yif
.R (3.3.1), 104 bytes
devuelve una función anónima
Este es mi primer intento de golf, por lo que cualquier comentario es apreciado.
fuente
REXX, 70 bytes
Por supuesto, la forma nativa sería mucho más corta:
fuente
PowerShell, 88 bytes
PowerShell no tiene un operador de energía que no ayuda. Tampoco puedo contar la longitud de un entero a menos que lo cuentes como una cadena, lo que no podemos hacer, así que verifico si es
-gt
9 para conocer la longitud. Probablemente podría ser más conciso, pero tengo que volver al trabajo.fuente
Python 2.7,
10996 bytesCorregido después de seguir las reglas del concurso. Créditos a mbomb007 por bajar el código de 109 bytes a 96 bytes
fuente
•You're not allowed to use strings or any kind of concatenation anywhere in your code.
a
una lambda.a=lambda n:10**int(...
. También puede hacerlob,c=input()
, dando sus dos entradas separadas por una coma.J , 25 bytes
*;+;-
Encajona los resultados de cada operación.10#.inv&.>
Convierta cada resultado en una matriz de dígitos de base 10. (inv
es^:_1
)[:;
Desempaquete y únase a las matrices.10#.
Convierta una matriz de dígitos de base 10 en un número entero.X=.
define lo anterior como el operadorX
.Resultados:
fuente
X=.
Mathematica, 67 bytes
Toma
x-y
, luego toma el log10 dex-y
, lo redondea, calcula 10 a la potencia de eso y luego lo multiplica porx+y
. Pero también debemos considerarlog10(x-y)
ser 0, por lo que reemplazamos 0 con 1. Luego tomamos el log10 de2x
, redondeado, más 1, y encontramos 10 a la potencia de eso. Multiplique eso porxy
y agréguelo.fuente
05AB1E ,
232216 bytesPruébalo en línea!
Podríamos haber guardado unos pocos bytes si nos hubieran permitido usar cadenas en el programa (pero no en los cálculos) haciendo un bucle sobre una cadena que contiene las operaciones
"-+*"
, ya que el código realizado para cada operación es el mismo.Por supuesto, si se nos hubiera permitido usar la concatenación, habríamos ahorrado mucho más.
fuente
R, 64 bytes
Uso:
fuente