Perl, 43 byte
map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>
Cobalah online!
Regex sangat kuat, kalian.
Penjelasan
Hal pertama yang dilakukan kode adalah membaca dua bilangan bulat sebagai input via <>
, dan membuat rentang dari yang pertama ke yang kedua..
. Ia kemudian menggunakan standar map
fungsi untuk iterate melalui kisaran ini, dan berlaku kode berikut untuk setiap nilai: say if$_==eval s/./+$&**$+[0]/gr
. Ini terlihat seperti omong kosong, dan memang begitulah, tapi inilah yang sebenarnya terjadi.
map
secara implisit menyimpan nilai saat ini dalam variabel $_
. Banyak fungsi perl dan operasi menggunakan nilai ini ketika tidak ada yang diberikan. Ini termasuk ekspresi reguler, seperti s///
operator substitusi.
Ada empat bagian untuk regex substitusi:
- String yang akan dimanipulasi. Biasanya, operator
=~
digunakan untuk menerapkan regex ke string, tetapi jika operator ini tidak ada, maka regex diterapkan ke variabel implisit$_
, yang berisi nomor kami saat ini melaluimap
fungsi.
- String untuk mencari. Dalam hal ini, kami sedang mencari karakter tunggal non-baris baru, dilambangkan dengan wildcard
.
. Akibatnya, kami menangkap setiap digit individu.
- String untuk diganti dengan. Kami mengganti tanda tambah
+
diikuti oleh ekspresi matematika, dicampur dengan beberapa variabel Perl ajaib yang membuat semuanya secara signifikan lebih mudah.
Variabel skalar khusus $&
selalu berisi keseluruhan dari penangkapan regex sukses terakhir, yang dalam hal ini adalah satu digit. Variabel array khusus @+
selalu berisi daftar offset postmatch untuk kecocokan sukses terakhir, yaitu indeks teks setelah pertandingan. $+[0]
adalah indeks $_
teks segera berikut $&
. Dalam kasus 135
, kami menangkap digit 1
, dan indeks 135
teks segera setelahnya (yaitu, 35
) adalah 1, yang merupakan eksponen kami. Jadi, kami ingin meningkatkan $&
(1) ke kekuatan$+[0]
(1) dan mendapatkan 1. Kami ingin menaikkan 3 ke kekuatan 2 dan mendapatkan 9. Kami ingin menaikkan 5 ke kekuatan 3 dan mendapatkan 125.
Jika input tadi 135
, string yang dihasilkan adalah +1**1+3**2+5**3
.
- Regex-modifying flags. Di sini kami menggunakan dua bendera regex -
/g
dan /r
. /g
memberitahu juru bahasa untuk melanjutkan penggantian setelah yang pertama ditemukan (kalau tidak kita akan berakhir dengan +1**135
). /r
memberi tahu penerjemah untuk tidak mengubah string asli , dan sebaliknya mengembalikan apa yang akan menjadi string setelah penggantian. Ini penting, karena jika tidak, itu akan ditimpa $_
, dan kita memerlukannya untuk tujuan perbandingan.
Setelah seluruh penggantian dilakukan, kita mendapatkan ekspresi matematika, yang dievaluasi dengan eval
fungsinya. +1**1+3**2+5**3
dievaluasi menjadi 1 + 9 + 125 = 135
, yang dibandingkan dengan nomor aslinya 135
. Karena keduanya sama, kode mencetak angka.