> 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
Спробуйте в Інтернеті!
Це повертає порожній список для не-Pillai праймес, а не порожній список в іншому випадку.
Як це працює
Шепіт був розроблений для маніпулювання на реальних / складних числах, з хорошою мірою додано трохи команд масиву, отже, неодноразове використання Each
для повторення генерованих списків.
Трохи фону про Шепіт:
Шепіт дещо відрізняється у своєму виконанні до більшості інших мов. Замість того, щоб працювати через кожен рядок лінійно, лише розгалужуючись на умовних умовах, Шепіт починається з останнього рядка у файлі, починаючи з >
(правила дещо складніше, ніж це, але це все, що нам потрібно знати зараз), і значення чисел відрізняються залежно від того, починається лінія з >
або >>
.
Якщо рядок починається з >
, наприклад, > 1
або > Input
, це постійний рядок - він щоразу повертає те саме значення. Тут цифри представляють їх числову форму, тому перший рядок завжди повертатиме 1, коли його називають.
Якщо рядок починається з цього >>
пункту, цифри трактуються як посилання на інші рядки, як би виклики функцій, якщо ви хочете. Наприклад, у рядку >> 1…2
це виконує не …
команду на цілі числа 1 і 2 , а на значення, повернені з рядків 1 і 2 . У цьому випадку ці значення є цілим числом 1 і будь-яким цілим числом, яке ми передаємо як вхідне.
Для цього прикладу розглянемо вхід 23 . Майте на увазі, що завдяки попередній обробці Whispers другий рядок ( > Input
) перетворюється в > 23
.
Наша перша команда в рядку 3: >> 1…2
. …
є діадичним діапазоном, в даному випадку від 1 до 23 , даючи {1, 2, ... 22, 23} . Далі ми переходимо до рядків від 9 до 12 :
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
Тут ми маємо 4 консеквентивні Each
твердження, кожне з яких повторює попередній результат, по суті відображаючи 4 команди над масивом у рядку 3 : діапазон. Перші три твердження - це прості карти із рядками 4 , 5 та 6 :
>> L!
>> L+1
>> L∣2
Ці три команди, над цілим n , дають (n! +1) ∣x , де ! позначає факторіала , | позначає divisbility і х є входом. Нарешті, рядок 12 має діадичну структуру карти .
Структура діадичної карти містить три цілі числа: цільове, ліве та праве, кожне вказує на інші рядки. Тут ми блискавки праворуч і праворуч створюємо список пар, а потім зменшуємо кожну пару командою діадік (ціль). Тут, якщо вхід 23 , списки {1, 2, ... 22, 23} і {0, 0, ... 1, 0} і команда:
>> L⋅R
який помножує лівий аргумент на правий. Це створює масив цілих чисел з 0 в індексах цілих чисел, чиї фактичні показники, збільшені не поділяються на вхідні дані, та вихідний індекс, де вони є. Ми будемо називати цей масив A . Далі, ми видаляємо 0 s з A , приймаючи встановлену різницю між {0} і A :
> {0}
>> 12∖13
З нашого прикладу введення, це створює множину {14, 18, 22} . Далі беремо залишок вхідного сигналу, поділеного на кожне значення в наборі, і перевіряємо, чи не залишилося це значення 1 :
>> 2%L
>> Each 8 14
>> L≠1
>> Each 16 15
Знову ми маємо список або 0, або 1 с, і потрібно видалити 0 с і замінити 1 с вихідними значеннями. Тут ми повторюємо код, який ми бачили вище, але з >> 18∖13
замість цього 12
. Нарешті, ми видаємо цей отриманий набір до списку для остаточної перевірки. На жаль, наш код також повинен відхиляти складені числа, які досягають усіх цих критеріїв, наприклад 437 . Тож ми додаємо остаточну перевірку, помноживши наш остаточний список на первинність введення. Завдяки тому, як множення Python працює у списках, 0 замінює його порожнім списком, а 1 не впливає. Отже, обчислюємо первинність вхідного даних, помножимо його на список ms для введення та вихідного кінцевого результату:
>> 2’
>> 21⋅20
>> Output 22