🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉
Спробуйте в Інтернеті!
-3 байти, використовуючи "менше або дорівнює 1" замість "менше 2", оскільки емодзі "менше, ніж" має досить довге кодування UTF-8. Також зробив t
заморожене, щоб замовкнути попередження, не впливаючи на кількість байтів.
Розширює клас 🚂 (ціле число) методом, який називається 🅰️. Ви можете написати просту програму, яка приймає число з введення, дзвонить 🅰️ на номер і друкує результат таким чином:
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
Цю частину можна було б багато пограти, пропустивши повідомлення та обробляти помилки, але вона не включена в рахунок, тому я вважаю за краще показувати більше можливостей Emojicode, в той час як покращуючи читабельність по дорозі.
Безумовно
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕2🍇
🍎1
🍉
🍮sum 0
🔂k⏩0🐕🍇
🍦nmk➖🐕k
🍮sig nmk
🔂i⏩1 nmk🍇
🍊😛🚮nmk i 0🍇
🍮➕sig i
🍉
🍉
🍮➕sum✖sig🅰️k
🍉
🍎➗sum🐕
🍉
🍉
Пояснення
Зауважте: багато емоцій вибору не має великого сенсу в емоджикоде 0,5. Зрештою, це 0.x. 0,6 це виправить.
Emojicode - це об'єктно-орієнтована мова програмування, що містить дженерики, протоколи, необов’язкові та закриття, але ця програма не використовує закриття, і всі дженерики та протоколи можна вважати неявними, тоді як єдиний необов'язковий відображається в заглушці вводу / виводу.
Програма працює лише на декілька типів: 🚂 цілий тип, type тип рядка і ⏩ тип діапазону. З'являється також кілька булевих (appear), але вони використовуються лише в умовах. Булеви можуть приймати значення 👍 або 👎, що відповідають істинному та хибному відповідно.
Наразі в Emojicode немає операторів, тому додавання, порівняння та інші операції, які зазвичай є операторами, реалізуються як функції, ефективно змушуючи вирази використовувати позначення префікса . Операторів також планується в 0,6.
Розглянемо спочатку програму тестування.
🏁
Це блок 🏁, який можна порівняти з основним з інших мов.
🍇 ... 🍉
Виноград і кавуни оголошують кодові блоки в еможикоді.
🍦str🔷🔡😯🔤Please enter a number🔤
Це оголошує "заморожене" ім'я str
та встановлює його для нової рядки, створеної за допомогою ініціалізатора (конструктора) 😯, який приймає підказку як рядок і потім вводить рядок від користувача. Навіщо використовувати заморожений замість змінної? Він не зміниться, тому змінна може надсилати попередження.
🍊🍦num🚂str 10
Давайте розбимо його. 🚂str 10
викликає метод 🚂 на str
замороженому з аргументом 10. За умовою , методи, названі з іменем типу, перетворюють об'єкт у цей тип. 10 є базовою для цілочислового перетворення. Цей метод повертає необов'язковий, 🍬🚂
. Необов’язкові можуть містити значення базового типу або небуття, ⚡. Якщо рядок не містить числа, ⚡ повертається. Щоб використовувати значення, слід розгортати необов'язковий за допомогою 🍺, що призводить до помилки виконання, якщо значення is. Тому корисною практикою перевірити наявність нічого, перш ніж розгортати необов’язковий. Насправді настільки поширене, що Емоджікод має для цього скорочення. Зазвичай, 🍊
це "якщо".🍊🍦 variable expression
означає: оцінити вираз. Якщо необов'язково містить нічого, умова оцінюється на 👎 (false). В іншому випадку заморожений ім'я variable
створюється з розпакованим значенням необов'язкового, і умова оцінюється на 👍, (вірно). Тому при звичайному використанні 🍇 ... 🍉
вводиться блок, що відповідає умовному.
😀🔡🅰️num 10
🅰️ - метод, який основний код додає до 🚂, використовуючи 🐋, який обчислює кількість розділів. Це викликає 🅰️ на num
замороженому, який ми оголосили в умовному, і перетворює результат у рядок, використовуючи базу 10 методом 🔡. Потім 😀 друкує результат.
🍓🍇 ... 🍉
🍓 означає "else", тому цей блок вводиться, коли користувач неправильно ввів номер.
😀🔤Learn what a number is, you moron!🔤
Друкує рядковий літерал.
Тепер давайте розглянемо основну програму. Я поясню неперевершений варіант; у версії для гольфу просто було видалено пробіли, а змінні перейменовано на назви з однієї літери.
🐋🚂🍇 ... 🍉
Розширити клас 🚂. Це особливість, яка часто не зустрічається в мовах програмування. Замість створення нового класу з 🚂 як суперкласу, 🐋 змінює fies безпосередньо.
🐖🅰️➡🚂🍇 ... 🍉
Створює новий метод під назвою 🅰️, який повертає 🚂. Він повертає кількість розділів, обчислених за формулоюa(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
🐕 подібний this
або self
з інших мов і відноситься до об'єкта, до якого був викликаний метод. Ця реалізація є рекурсивною, тому це умова завершення: якщо число, за яким було викликано метод, менше або дорівнює 1, поверніть 1.
🍮sum 0
Створіть нову змінну sum
та встановіть її на 0. Неодмінно передбачається тип 🚂.
🔂k⏩0🐕
Повторює будь-що, що реалізує протокол,, тоді як ⏩ є літералом діапазону, який трапляється реалізувати Діапазон має початкове значення, стоп-значення та значення кроку, яке вважається рівним 1, якщо start < stop
інше -1. Можна також вказати значення кроку, використовуючи ⏭ для створення літералу діапазону. Стартове значення включно, тоді як стоп-значення є виключним, тому це еквівалентно for k in range(n)
або Sum_{k=0..n-1}
формулою.
🍦nmk➖🐕k
Нам потрібно обчислити сигму (n - k) або суму дільників n - k
іншими словами, і аргумент потрібен кілька разів, тому це зберігається n - k
у змінній, nmk
щоб зберегти деякі байти.
🍮sig nmk
🔂i⏩1 nmk
Це встановлює sig
змінну до аргументу сигми та ітералізує всі числа від 1 до nmk - 1
. Я міг би ініціалізувати змінну до 0 і ітератувати більше 1..nmk, але робити це таким чином коротше.
🍊😛🚮nmk i 0
🚮 обчислює залишок, або модуль і 😛 перевіряє рівність, тож умовою буде 👍, якщо i
це дільник nmk
.
🍮➕sig i
Це призначення за викликом, подібне до += -= >>=
сімейства операторів у деяких із нижчих мов, вільних від емодзі. Цей рядок можна також записати як 🍮 sig ➕ sig i
. Тому після завершення внутрішнього циклу sig
буде міститися сума дільників n - k
, абоsigma(n - k)
🍮➕sum✖sig🅰️k
Ще одне завдання за викликом, так що це додає sigma(n - k) * A(k)
до загального, так само, як у формулі.
🍎➗sum🐕
Нарешті, сума ділиться на n, а коефіцієнт повертається. Це пояснення, ймовірно, зайняло втричі більше часу, ніж написання самого коду ...