> 1
> Input
>> 1…2
>> L!
>> L+1
>> L∣2
>> L⋅R
>> 2%L
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
> {0}
>> 12∖13
>> Each 8 14
>> L≠1
>> Each 16 15
>> Each 7 17 15
>> 18∖13
>> [19]
>> 2’
>> 21⋅20
>> Output 22
Hãy thử trực tuyến!
Điều này trả về một danh sách trống cho các số nguyên tố không phải là Pillai và một danh sách không trống khác.
Làm thế nào nó hoạt động
Whispers được thiết kế để thao tác trên các số thực / số phức, với một ít lệnh mảng được thêm vào để đo lường tốt, do đó việc sử dụng Each
lặp đi lặp lại các danh sách được tạo.
Một chút nền tảng về Whispers:
Lời thì thầm hơi khác trong đường dẫn thực thi của nó đối với hầu hết các ngôn ngữ khác. Thay vì làm việc theo từng dòng một cách tuyến tính, chỉ phân nhánh tại các điều kiện, Whispers bắt đầu ở dòng cuối cùng trong tệp bắt đầu bằng >
(quy tắc phức tạp hơn một chút so với điều đó, nhưng đó là tất cả những gì chúng ta cần biết bây giờ) và ý nghĩa của các con số khác nhau, tùy thuộc vào việc dòng bắt đầu bằng >
hoặc >>
.
Nếu dòng bắt đầu bằng >
, chẳng hạn như > 1
hoặc > Input
, đây là một dòng không đổi - nó trả về cùng một giá trị mỗi lần. Ở đây, các số đại diện cho dạng số của chúng, vì vậy dòng đầu tiên sẽ luôn trả về 1 khi được gọi.
>>
Tuy nhiên, nếu dòng bắt đầu bằng , các số được coi là tham chiếu đến các dòng khác, giống như các lệnh gọi hàm, nếu bạn muốn. Ví dụ, trong dòng >> 1…2
, điều này không thực hiện …
lệnh trên các số nguyên 1 và 2 , mà là các giá trị được trả về từ dòng 1 và 2 . Trong trường hợp này, các giá trị đó là số nguyên 1 và bất kỳ số nguyên nào chúng tôi chuyển qua làm đầu vào.
Trong ví dụ này, hãy xem xét đầu vào của 23 . Hãy nhớ rằng, do tiền xử lý của Whispers, dòng thứ hai ( > Input
) được chuyển đổi thành > 23
.
Lệnh đầu tiên của chúng tôi là trên dòng 3 : >> 1…2
. …
là phạm vi dyadic, trong trường hợp này từ 1 đến 23 , thu được {1, 2, ... 22, 23} . Tiếp theo, chúng tôi bỏ qua các dòng 9 đến 12 :
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
Ở đây chúng ta có 4 Each
câu lệnh liên tục, mỗi câu lặp lại kết quả trước đó, về cơ bản ánh xạ 4 lệnh trên mảng trên dòng 3 : phạm vi. Ba câu lệnh đầu tiên là các bản đồ đơn giản, với các dòng 4 , 5 và 6 :
>> L!
>> L+1
>> L∣2
Ba lệnh này, trên một số nguyên n , mang lại (n! +1) x , trong đó ! biểu thị thừa , | biểu divisbility và x là đầu vào. Cuối cùng, dòng 12 có cấu trúc bản đồ dyadic .
Một cấu trúc bản đồ dyadic có ba số nguyên: mục tiêu, bên trái và bên phải, mỗi chỉ mục cho các dòng khác. Ở đây, chúng tôi nén bên trái và bên phải để tạo danh sách các cặp, sau đó giảm từng cặp bằng lệnh dyadic (mục tiêu). Ở đây, nếu đầu vào là 23 , thì các danh sách là {1, 2, ... 22, 23} và {0, 0, ... 1, 0} và lệnh là
>> L⋅R
nhân số đối số bên trái của bên phải. Điều này tạo ra một mảng các số nguyên, với 0 tại các chỉ số của các số nguyên có các yếu tố tăng dần không chia hết cho các đầu vào và chỉ mục ban đầu của chúng. Chúng tôi sẽ gọi cho mảng này Một . Tiếp theo, chúng tôi xóa 0 s khỏi A bằng cách lấy chênh lệch đã đặt giữa {0} và A :
> {0}
>> 12∖13
Với đầu vào ví dụ của chúng tôi, điều này tạo ra tập {14, 18, 22} . Tiếp theo, chúng tôi lấy phần còn lại của đầu vào được chia cho mỗi giá trị trong tập hợp và kiểm tra xem phần còn lại có bằng không 1 :
>> 2%L
>> Each 8 14
>> L≠1
>> Each 16 15
Một lần nữa, chúng tôi có một danh sách 0 hoặc 1 giây và cần xóa 0 s và thay thế 1 s bằng các giá trị ban đầu. Ở đây chúng tôi lặp lại mã chúng tôi đã thấy ở trên, nhưng với >> 18∖13
hơn là 12
. Cuối cùng, chúng tôi bỏ kết quả này được đặt thành một danh sách để kiểm tra lần cuối. Thật không may, mã của chúng tôi cũng phải từ chối các số tổng hợp đạt được tất cả các tiêu chí này, chẳng hạn như 437 . Vì vậy, chúng tôi thêm kiểm tra cuối cùng của chúng tôi, nhân danh sách cuối cùng của chúng tôi với tính nguyên thủy của đầu vào. Do cách nhân của Python hoạt động trên các danh sách, 0 thay thế nó bằng một danh sách trống và 1 không có hiệu lực. Vì vậy, chúng tôi tính toán tính nguyên thủy của đầu vào, nhân số đó với danh sách m giây cho đầu vào và đưa ra kết quả cuối cùng:
>> 2’
>> 21⋅20
>> Output 22