Perl, 43 bytes
map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>
Pruébalo en línea!
Regex es realmente poderoso, muchachos.
Explicación
Lo primero que hace el código es leer dos enteros como entrada vía <>
, y crea un rango del primero al segundo con ..
. Luego usa la map
función estándar para recorrer este rango y aplica el siguiente código a cada valor:say if$_==eval s/./+$&**$+[0]/gr
. Esto parece galimatías, y lo es, pero esto es lo que realmente está sucediendo.
map
almacena implícitamente su valor actual en la variable $_
. Muchas funciones y operaciones de Perl usan este valor cuando no se da ninguna. Esto incluye expresiones regulares, como el s///
operador de sustitución.
Hay cuatro partes en una expresión regular de sustitución:
- Cadena para ser manipulada. Normalmente, el operador
=~
se utiliza para aplicar una expresión regular a una cadena, pero si este operador está ausente, la expresión regular se aplica a la variable implícita $_
, que contiene nuestro número actual a través de la map
función.
- Cadena para buscar. En este caso, estamos buscando cualquier carácter único que no sea de nueva línea, indicado por el comodín
.
. En efecto, estamos capturando cada dígito individual.
- Cadena para reemplazar con. Estamos sustituyendo un signo más
+
seguido de una expresión matemática, mezclada con algunas variables mágicas de Perl que hacen que todo sea mucho más fácil.
La variable escalar especial $&
siempre contiene la totalidad de la última captura de expresiones regulares exitosa, que en este caso es un solo dígito. La variable de matriz especial @+
siempre contiene una lista de compensaciones posteriores a la coincidencia para la última coincidencia exitosa, es decir, el índice del texto después de la coincidencia. $+[0]
es el índice $_
del texto que sigue inmediatamente $&
. En el caso de 135
, capturamos el dígito 1
y el índice en135
del texto inmediatamente después (es decir, 35
) es 1, que es nuestro exponente. Entonces, queremos elevar $&
(1) a la potencia de $+[0]
(1) y obtener 1. Queremos elevar 3 a la potencia de 2 y obtener 9. Queremos elevar 5 a la potencia de 3 y obtener 125.
Si la entrada fue 135
, la cadena resultante es +1**1+3**2+5**3
.
- Banderas modificadoras de expresiones regulares. Aquí estamos usando dos banderas regex -
/g
y /r
. /g
le dice al intérprete que continúe con los reemplazos después de encontrar el primero (de lo contrario, terminaríamos con +1**135
). /r
le dice al intérprete que no modifique la cadena original y, en su lugar, devuelva cuál sería la cadena después de los reemplazos. Esto es importante, porque de lo contrario, se sobrescribiría $_
, y lo necesitamos para fines de comparación.
Una vez que se realiza la sustitución completa, obtenemos una expresión matemática, que se evalúa con la eval
función. +1**1+3**2+5**3
se evalúa en 1 + 9 + 125 = 135
, que se compara con el número original 135
. Como estos dos son iguales, el código imprime el número.