/?.R?y.@
\i.!yDo/
Hãy thử trực tuyến!
Giải trình
/...@
\.../
Đây chỉ là mẫu thông thường cho mã tuyến tính trong chế độ Ordinal. Nếu chúng ta mở ra điều này, chương trình thực tế sẽ trở thành:
i.!?D.?.Ryyo
Ý tưởng ở đây tương tự như câu trả lời của tôi . Vì Alice không có cách dễ dàng lập chỉ mục thành các chuỗi với số nguyên, nên dễ dàng nhất để sao chép hành vi này bằng cách chuyển ngữ ( y
trong Alice). Tuy nhiên, ngữ nghĩa chuyển ngữ của Alice chung chung hơn nhiều so với của CJam, điều đó có nghĩa là Alice không bỏ qua các ánh xạ lặp đi lặp lại. Ví dụ: nếu chúng ta chỉ muốn chuyển ngữ Mmm, marshmallows
ngược lại, thì điều này sẽ đại diện cho danh sách ánh xạ sau đây:
M -> s
m -> w
m -> o
, -> l
-> l
m -> a
a -> m
r -> h
s -> s
h -> r
m -> a
a -> m
l ->
l -> ,
o -> m
w -> m
s -> M
Lưu ý rằng chúng tôi đã có, ví dụ, m -> w
, m -> o
, m -> a
và m -> a
. CJam sẽ loại bỏ tất cả ngoại trừ ánh xạ đầu tiên, nhưng Alice thay vào đó sẽ quay vòng qua những thứ này. Vì vậy, cái đầu tiên m
sẽ được ánh xạ tới w
, thứ hai đến o
, thứ năm một lần nữa w
và như vậy. Trong trường hợp này không hữu ích, vì nói chung nếu chúng tôi thực hiện y
trên AAB
(đối với một số chuỗi A
và B
) như chúng tôi đã làm ở CJam, chúng tôi sẽ luôn B
tham gia Alice.
Vậy làm thế nào để chúng ta tính toán một ánh xạ hoạt động cho y
(nghĩa là làm thế nào để chúng ta loại bỏ các ánh xạ lặp lại theo cách thủ công)? Tất nhiên, bằng cách sử dụng một phiên âm khác. :)
Nguồn của ánh xạ mà chúng ta muốn phải là nub của đầu vào (tức là đầu vào bị trùng lặp). Nếu chúng ta áp dụng ánh xạ trên cho nub, thì mỗi ký tự chỉ xuất hiện một lần, vì vậy chúng ta chỉ sử dụng ánh xạ đầu tiên của mỗi ánh xạ lặp lại. Vì vậy, bằng cách chuyển ngữ từ nub với đầu vào và ngược lại, chúng ta thực sự chỉ cần loại bỏ các ánh xạ trùng lặp. Sau đó chúng ta có thể sử dụng nub và kết quả mới này làm ánh xạ cho đầu vào ban đầu. Tôi chắc chắn điều đó có ý nghĩa với ai đó ...
Vì vậy, mã:
i Read input. ["Mmm, marshmallows"]
.! Store a copy on the tape.
?D Push the nub of the input. ["Mmm, marshmallows" "Mm, arshlow"]
. Duplicate. ["Mmm, marshmallows" "Mm, arshlow" "Mm, arshlow"]
? Retrieve input. ["Mmm, marshmallows" "Mm, arshlow" "Mm, arshlow" "Mmm, marshmallows"]
.R Push its reverse. ["Mmm, marshmallows" "Mm, arshlow" "Mm, arshlow" "Mmm, marshmallows" "swollamhsram ,mmM"]
y Transliterate. ["Mmm, marshmallows" "Mm, arshlow" "swllmhsr mm"]]
y Transliterate. ["swwllwmhsrwm mms"]
o Output. []