Perl, 43 byte
map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>
Hãy thử trực tuyến!
Regex thực sự rất mạnh, các bạn.
Giải trình
Điều đầu tiên mà mã thực hiện là đọc hai số nguyên làm đầu vào thông qua <>
và tạo một phạm vi từ đầu tiên đến thứ hai với ..
. Sau đó, nó sử dụng map
hàm tiêu chuẩn để lặp qua phạm vi này và áp dụng mã sau cho từng giá trị : say if$_==eval s/./+$&**$+[0]/gr
. Điều này có vẻ như vô nghĩa, và nó là như vậy, nhưng đây là những gì đang thực sự xảy ra.
map
ngầm lưu giá trị hiện tại của nó trong biến $_
. Nhiều hàm và hoạt động của perl sử dụng giá trị này khi không được đưa ra. Điều này bao gồm các biểu thức chính quy, chẳng hạn như s///
toán tử thay thế.
Có bốn phần trong biểu thức thay thế:
- Chuỗi được thao tác. Thông thường, toán tử
=~
được sử dụng để áp dụng regex cho chuỗi, nhưng nếu toán tử này vắng mặt, thì regex được áp dụng cho biến ẩn $_
, chứa số hiện tại của chúng ta thông qua map
hàm.
- Chuỗi để tìm kiếm. Trong trường hợp này, chúng tôi đang tìm kiếm bất kỳ ký tự không phải dòng mới nào, được biểu thị bằng ký tự đại diện
.
. Trong thực tế, chúng tôi đang nắm bắt từng chữ số riêng lẻ.
- Chuỗi để thay thế bằng. Chúng ta đang thay thế một dấu cộng
+
theo sau là một biểu thức toán học, trộn lẫn với một số biến Perl kỳ diệu giúp mọi thứ dễ dàng hơn đáng kể.
Biến vô hướng đặc biệt $&
luôn chứa toàn bộ lần chụp regex thành công cuối cùng, trong trường hợp này là một chữ số. Biến mảng đặc biệt @+
luôn chứa một danh sách các độ lệch postmatch cho trận đấu thành công cuối cùng, tức là chỉ mục của văn bản sau trận đấu. $+[0]
là chỉ mục trong $_
văn bản ngay sau đây $&
. Trong trường hợp 135
, chúng tôi nắm bắt chữ số 1
và chỉ số trong 135
văn bản ngay sau đó (cụ thể là 35
) là 1, đó là số mũ của chúng tôi. Vì vậy, chúng tôi muốn tăng $&
(1) lên sức mạnh của $+[0]
(1) và nhận được 1. Chúng tôi muốn tăng 3 lên sức mạnh của 2 và nhận được 9. Chúng tôi muốn tăng 5 lên sức mạnh của 3 và nhận được 125.
Nếu đầu vào là 135
, chuỗi kết quả là +1**1+3**2+5**3
.
- Cờ sửa đổi Regex. Ở đây chúng tôi đang sử dụng hai cờ regex -
/g
và /r
. /g
nói với thông dịch viên tiếp tục thay thế sau khi tìm thấy đầu tiên (nếu không chúng tôi sẽ kết thúc +1**135
). /r
yêu cầu trình thông dịch không sửa đổi chuỗi gốc và thay vào đó trả về chuỗi sẽ là gì sau khi thay thế. Điều này rất quan trọng, vì nếu không, nó sẽ ghi đè lên $_
và chúng ta cần nó cho mục đích so sánh.
Khi toàn bộ sự thay thế được thực hiện, chúng ta sẽ có một biểu thức toán học, được đánh giá bằng eval
hàm. +1**1+3**2+5**3
được đánh giá thành 1 + 9 + 125 = 135
, được so sánh với số ban đầu 135
. Vì hai số này bằng nhau, mã in số.