Perl6 22/30
Tôi sẽ xem liệu Perl6 có thể suy ra trình tự cho tôi không.
Để làm điều đó tôi đã sử dụng REPL được tích hợp trong Perl6
$ perl6
> 1,2,4,7...*
Unable to deduce arithmetic or geometric sequence from 2,4,7 (or did you really mean '..'?)
> 1,2,4,7,10...*
1 2 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 ...
Hmm, tôi thấy mô hình mà Perl suy luận. Sau 4 để có giá trị tiếp theo, bạn chỉ cần thêm 3.
1,2,4,*+3...*
Việc lưu một ký tự tạo mã để có được một danh sách vô hạn các số trong chuỗi Stöhr dài 13 ký tự.
Mã này chỉ thực hiện một cái gì đó hữu ích trong REPL vì nó in ý chính của kết quả cho chúng tôi. Để có được nó để in nếu không bạn sẽ phải nói rõ ràng với Perl để in kết quả.
$ perl6 -e 'say 1,2,4,*+3...*'
( * + 3
chỉ đơn giản là một cách để có được một tham chiếu mã trả về 3 được thêm vào đối số duy nhất của nó. Các cách khác để viết nó sẽ là { $_ + 3 }
, hoặc -> $i { $i + 3 }
, { $^i + 3 }
hoặc sub ($i){ $i + 3 }
)
Con đường ngắn nhất để tạo ra một cái gì đó Callable để tạo ra đầu tiên n yếu tố là để có được một lát trong những yếu tố.
{(1,2,4,*+3...*)[^$_]} # 22
Trong bối cảnh trống sẽ tạo ra các $_
giá trị đầu tiên , sau đó nhanh chóng ném chúng đi.
Trong bất cứ điều gì khác ngoài ngữ cảnh void, nó tạo ra một khối mã ẩn danh (một chương trình con cơ bản không có tên), có một đối số.
# store it in a scalar variable
my $sub = {(1,2,4,*+3...*)[^$_]};
say $sub.(5);
# 1 2 4 7 10
# use it immediately
say {(1,2,4,*+3...*)[^$_]}.(5);
# 1 2 4 7 10
# pretend it always had a name
my &Stöhr-first = {(1,2,4,*+3...*)[^$_]};
say Stöhr-first 5;
Nếu bạn thực sự nghĩ rằng nó phải có một cái tên để đủ điều kiện là hợp lệ cho thử thách này, bạn có thể sẽ làm điều này:
sub s(\n){(1,2,4,*+3...*)[^n]} # 30
Mặc dù kể từ đó s
cũng được sử dụng cho toán tử thay thế, để gọi đây là parens là không tùy chọn. (Bạn có thể đặt cho nó một cái tên khác mà tôi cho là)
say s(5);
# 1 2 4 7 10