Perl, 43 byte
map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>
Provalo online!
Regex è davvero potente, ragazzi.
Spiegazione
La prima cosa che fa il codice è leggere due numeri interi come input via <>
e crea un intervallo dal primo al secondo ..
. Quindi esso utilizza lo standard map
funzione per scorrere questa gamma, e applica il seguente codice a ciascun valore: say if$_==eval s/./+$&**$+[0]/gr
. Sembra incomprensibile, e lo è, ma ecco cosa sta succedendo davvero.
map
memorizza implicitamente il suo valore corrente nella variabile $_
. Molte funzioni e operazioni perl usano questo valore quando non ne viene dato nessuno. Ciò include espressioni regolari, come l' s///
operatore di sostituzione.
Ci sono quattro parti in una regex di sostituzione:
- Stringa da manipolare. Di solito, l'operatore
=~
viene utilizzato per applicare una regex a una stringa, ma se questo operatore è assente, la regex viene applicata alla variabile implicita $_
, che contiene il nostro numero corrente tramite la map
funzione.
- Stringa da cercare. In questo caso, stiamo cercando qualsiasi carattere non di nuova riga singola, indicata con il carattere jolly
.
. In effetti, stiamo acquisendo ogni singola cifra.
- Stringa da sostituire con. Sostituiamo un segno più
+
seguito da un'espressione matematica, mescolata con alcune variabili magiche del Perl che rendono tutto molto più semplice.
La speciale variabile scalare $&
contiene sempre la totalità dell'ultima acquisizione regex riuscita, che in questo caso è una singola cifra. La variabile matrice speciale @+
contiene sempre un elenco di offset post-corrispondenza per l'ultima corrispondenza corretta, ovvero l'indice del testo dopo la corrispondenza. $+[0]
è l'indice in $_
del testo che segue immediatamente $&
. Nel caso di 135
, catturiamo la cifra 1
e l'indice nel 135
testo immediatamente successivo (ovvero, 35
) è 1, che è il nostro esponente. Quindi, vogliamo aumentare $&
(1) alla potenza di $+[0]
(1) e ottenere 1. Vogliamo aumentare 3 alla potenza di 2 e ottenere 9. Vogliamo aumentare 5 alla potenza di 3 e ottenere 125.
Se l'input era 135
, la stringa risultante è +1**1+3**2+5**3
.
- Flag di modifica del regex. Qui stiamo usando due flag regex -
/g
e /r
. /g
dice all'interprete di continuare le sostituzioni dopo che il primo è stato trovato (altrimenti finiremmo con +1**135
). /r
dice all'interprete di non modificare la stringa originale e restituisce invece quale sarebbe la stringa dopo le sostituzioni. Questo è importante, perché altrimenti sovrascriverebbe $_
e ne abbiamo bisogno a fini comparativi.
Una volta effettuata l'intera sostituzione, otteniamo un'espressione matematica, che viene valutata con la eval
funzione. +1**1+3**2+5**3
viene valutato in 1 + 9 + 125 = 135
, che viene confrontato con il numero originale 135
. Poiché questi due sono uguali, il codice stampa il numero.