APL, 36 34 39 36 33 29 27
*+/x={(∇⍣(⊃x>¯1↑⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕
Виведіть, 1
якщо Кіт, 0
інакше
GolfScript знову вражає !!
Редагувати
+/x={(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕
Використовуючи Right-Reduction ( ⊢/
) замість Take minus 1 ( ¯1↑
), безпосередньо зберігаючи 1 char та побічно економте 1 від Disclose (⊃
)
Пояснення
⍎¨⍕x←⎕
приймає оцінений вхід (трактується як число) і присвоює йому x
. Перетворює його в масив символів (він же "рядок" в інших мовах) і проходить цикл через кожен символ (цифру), перетворюючи його в число. Таким чином, це призводить до числового масиву цифр.
{(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}
є основною функцією "циклу":
+/⍵↑⍨-⍴⍕x
бере останні ⍴⍕x
(без цифр x
) числа з масиву та підсумовує їх.
⍵,
з'єднує його в кінець масиву.
(x>⊢/⍵)
перевірте, чи останнє число в масиві (який ще не +/⍵↑⍨-⍴⍕x
з'єднався) менше x
та повертає 1
чи 0
∇⍣
виконує цю функцію на новому масиві стільки разів. Отже, якщо останнє число менше, ніж x
ця функція повторюється. В іншому випадку просто поверніть новий масив
Після виконання функції масив містить суми до того моменту, коли 2 числа чи більше або дорівнюють x
(наприклад, 14
буде генерувати 1 4 5 9 14 23
, 13
буде генерувати 1 3 4 7 11 18 29
)
Нарешті перевірити, чи кожне число дорівнює, x
і вивести суму отриманого двійкового масив.
Редагувати
1=+/x={(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}⍎¨⍕x←⎕
Додано 2 символи :-( для виведення даних, 0
якщо вхід одноцифровий
Ще одна редакція
+/x=¯1↓{(∇⍣(x>⊢/⍵))1↓⍵,+/⍵}⍎¨⍕x←⎕
Пояснення
Тепер функція скидає перше число ( 1↓
) з масиву замість того, щоб брати останнє ⍴⍕x
( ↑⍨-⍴⍕x
).
Однак такий підхід робить 1=
не адекватним обробляти одноцифрові числа. Тож тепер випадає останнє число з масиву, перш ніж перевірити рівність x
, додати 1 знак
Ви здогадалися: EDIT
+/x=1↓{1↓⍵,+/⍵}⍣{x≤+/⍵}⍎¨⍕x←⎕
Порівняно x
з нещодавно доданим елементом замість останнього останнього, тому випадання першого (замість останнього) елемента перед перевіркою рівності x
є достатньою, збереження знаку мінус. Зберігає ще 3, використовуючи іншу форму оператора живлення (⍣
)
І з’являється відповідь на 25 знаків (Orz)
Остання редакція
x∊1↓{1↓⍵,+/⍵}⍣{x≤+/⍵}⍎¨⍕x←⎕
Не можу повірити, що я пропустив це.
Не можна більше гольфу.