Perl, 43 bayt
map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>
Çevrimiçi deneyin!
Regex gerçekten güçlü, millet.
açıklama
Kodun yaptığı ilk şey, üzerinden iki tamsayı okumaktır <>
ve birinci ile ikinci arasında bir aralık oluşturur ..
. Bunlar daha sonra standart kullanan map
bu aralık boyunca yineleme fonksiyonu, ve her bir değeri için aşağıdaki kod geçerlidir: say if$_==eval s/./+$&**$+[0]/gr
. Bu saçma sapan gibi görünüyor, ve bir çeşit, ama işte gerçekten olan şey.
map
örtük olarak geçerli değerini değişkende saklar $_
. Birçok perl işlevi ve işlemi, hiçbiri verilmediğinde bu değeri kullanır. Bu, s///
ikame operatörü gibi normal ifadeleri içerir .
Bir ikame regex'in dört bölümü vardır:
- İşlenecek dize. Normalde, operatör
=~
bir dizgeye bir regex uygulamak için kullanılır, ancak bu operatör yoksa, o zaman regex, işlev $_
aracılığıyla geçerli numaramızı içeren örtük değişkene uygulanır map
.
- Aranacak dize. Bu durumda, joker karakterle gösterilen herhangi bir yeni satır dışı karakter arıyoruz
.
. Aslında her bir basamağı yakalayacağız.
- İle değiştirilecek dize. Her
+
şeyi çok daha kolaylaştıran bazı sihirli Perl değişkenleriyle karıştırılmış matematiksel ifadenin ardından artı işaretini kullanıyoruz .
Özel skalar değişkeni $&
her zaman, bu durumda tek bir rakam olan son başarılı regex yakalamanın tamamını içerir. Özel dizi değişkeni @+
her zaman son başarılı eşleşme için eşleşme sonrası ofsetlerin bir listesini içerir , yani eşleşmeden sonraki metnin dizini . $+[0]
içinde endeksidir $_
hemen aşağıdaki metin $&
. Böyle bir durumda 135
, rakamı yakalarız 1
ve 135
hemen sonra gelen metnin içindeki indeks (yani 35
) bizim üssümüz olan 1'dir. Böylece, $&
(1) 'i (1)' in gücüne yükseltmek $+[0]
ve 1 elde etmek istiyoruz. 3 'ü 2' ye yükseltmek ve 9 elde etmek istiyoruz. 5 'i 3' e yükseltmek ve 125 elde etmek istiyoruz.
Girdi olsaydı, 135
sonuçta ortaya çıkan dize +1**1+3**2+5**3
.
- Regex değiştiren bayraklar. Burada iki regex bayrağı kullanıyoruz -
/g
ve /r
. /g
tercümana ilk bulunduktan sonra yerine koymaya devam etmesini söyler (aksi halde sona ereriz +1**135
). /r
tercümana orijinal dizeyi değiştirmemesini ve bunun yerine dizeden sonra ne olacağını döndürmesini söyler . Bu önemlidir, çünkü aksi takdirde üzerine yazılır $_
ve karşılaştırma amacıyla buna ihtiyacımız vardır.
İkame işleminin tamamı tamamlandıktan sonra, eval
işlevle birlikte değerlendirilen matematiksel bir ifade elde ederiz . Orijinal sayı ile karşılaştırılarak +1**1+3**2+5**3
değerlendirilir . Bu ikisi eşit olduğundan, kod sayıyı yazdırır.1 + 9 + 125 = 135
135