🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕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
заморозку, чтобы заставить замолчать предупреждение, не влияя на количество байтов.
Расширяет класс inte (целое число) методом с именем 🅰️. Вы можете написать простую программу, которая берет число из ввода, вызывает 🅰️ на номер и печатает результат следующим образом:
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
Эту часть можно много сыграть, пропуская сообщения и обработку ошибок, но она не включена в счет, поэтому я предпочитаю показывать больше возможностей Emojicode, одновременно улучшая читабельность по пути.
Ungolfed
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕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 - это объектно-ориентированный язык программирования, включающий в себя шаблоны, протоколы, дополнительные функции и замыкания, но эта программа не использует замыканий, и все шаблоны и протоколы могут считаться неявными, тогда как в заглушке ввода-вывода отображается только дополнительная опция.
Программа работает только с несколькими типами: 🚂 является целочисленным типом, 🔡 является типом строки и ⏩ является типом диапазона. Также появляется несколько логических значений (👌), но они используются только в условиях. Логические значения могут принимать значения 👍 или 👎, которые соответствуют истинам и ложностям соответственно.
В настоящее время в Emojicode нет операторов, поэтому сложение, сравнения и другие операции, которые обычно являются операторами, реализованы в виде функций, эффективно позволяя выражениям использовать префиксную нотацию . Операторы также запланированы в 0,6.
Давайте сначала займемся тестовой программой.
🏁
Это блок 🏁, который можно сравнить с основным из других языков.
🍇 ... 🍉
Виноград и арбузы объявляют кодовые блоки в смайлик.
🍦str🔷🔡😯🔤Please enter a number🔤
Это объявляет «замороженное» имя str
и устанавливает его значение для новой строки, созданной с использованием инициализатора (конструктора) 😯, который принимает приглашение в виде строки, а затем вводит строку от пользователя. Зачем использовать замороженную вместо переменной? Это не изменится, поэтому переменная выдаст предупреждение.
🍊🍦num🚂str 10
Давайте разберемся с этим. 🚂str 10
вызывает метод on для объекта str
с аргументом 10. По соглашению, методы, названные с именем типа, преобразуют объект в этот тип. 10 - это база для целочисленного преобразования. Этот метод возвращает необязательный 🍬🚂
. Необязательные могут содержать значение базового типа или пустоты, ⚡. Если строка не содержит числа, возвращается ⚡. Чтобы использовать значение, необходимо развернуть необязательное значение с помощью 🍺, что вызывает ошибку времени выполнения, если значение равно ⚡. Следовательно, хорошей практикой является проверка на пустоту перед развертыванием необязательного. Фактически, это так часто, что у Emojicode есть сокращение для этого. Обычно 🍊
это «если».🍊🍦 variable expression
означает: оценить выражение. Если необязательный элемент содержит пустоту, условие оценивается как 👎 (false). В противном случае, замороженное имя variable
создается с развернутым значением необязательного значения, а условие оценивается как 👍 (true). Поэтому при нормальном использовании 🍇 ... 🍉
вводится блок, следующий за условным.
😀🔡🅰️num 10
🅰️ - это метод, к которому основной код добавляет 🚂 с помощью 🐋, который вычисляет количество разделов. Это вызывает 🅰️ для num
замороженного объекта, который мы объявили в условном выражении, и преобразует результат в строку, используя базу 10 методом 🔡. Затем 😀 печатает результат.
🍓🍇 ... 🍉
🍓 означает «еще», поэтому этот блок вводится, когда пользователь неправильно ввел номер.
😀🔤Learn what a number is, you moron!🔤
Печатает строковый литерал.
Теперь давайте посмотрим на основную программу. Я объясню неоправданную версию; В версии для гольфа только что были удалены пробелы и переменные переименованы в одинарные буквы.
🐋🚂🍇 ... 🍉
Расширьте класс 🚂. Это функция, которая не часто встречается в языках программирования. Вместо создания нового класса с 🚂 в качестве суперкласса, 🐋 изменяет 🐋 напрямую.
🐖🅰️➡🚂🍇 ... 🍉
Создает новый метод с именем 🅰️, который возвращает 🚂. Возвращает количество разделов, рассчитанное по формулеa(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
🐕 аналогичен this
или self
из других языков и относится к объекту метод был вызван. Эта реализация является рекурсивной, так что это условие завершения: если число, для которого был вызван метод, меньше или равно 1, вернуть 1.
🍮sum 0
Создайте новую переменную sum
и установите для нее значение 0. Неявно предполагается тип type.
🔂k⏩0🐕
🔂 перебирает все, что реализует протокол 🔂🐚⚪️, тогда как ⏩ является литералом диапазона, который реализуется implement. Диапазон имеет начальное значение, конечное значение и значение шага, которое предполагается равным 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 и частное возвращается. Это объяснение, вероятно, заняло в три раза больше времени, чем написание самого кода ...