🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉
在线尝试!
通过使用“小于或等于1”而不是“小于2”来获得-3个字节,因为“小于”表情符号具有相当长的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🐕
🍉
🍉
说明
注意:在emojicode 0.5中,很多表情符号选择没有太大意义。毕竟是0.x。0.6将解决此问题。
Emojicode是一种面向对象的编程语言,具有泛型,协议,可选和闭包,但是该程序不使用闭包,并且所有泛型和协议都可以视为隐式的,而唯一的可选出现在I / O存根中。
该程序仅适用于以下几种类型:🚂是整数类型,🔡是字符串类型,⏩是范围类型。也会出现一些布尔值(👌),但它们仅在条件中使用。布尔值可以取👍或👎的值,分别对应于true和false。
Emojicode当前没有运算符,因此通常作为运算符的加法,比较和其他运算均作为函数实现,从而有效地使表达式使用前缀表示法。运营商也计划在0.6。
让我们首先解决测试程序。
🏁
这是🏁块,可以与其他语言的main块进行比较。
🍇 ... 🍉
葡萄和西瓜在emojicode中声明代码块。
🍦str🔷🔡😯🔤Please enter a number🔤
这将声明一个名为“ frozen”的名称str
,并将其值设置为使用初始化程序(构造函数)😯创建的新字符串,该字符串以提示符作为字符串,然后从用户输入一行。为什么使用冻结而不是变量?它不会改变,因此变量将发出警告。
🍊🍦num🚂str 10
让我们分解一下。🚂str 10
在str
带有参数10 的冻结对象上调用🚂方法。按照约定,以类型名称命名的方法会将对象转换为该类型。10是用于整数转换的基数。此方法返回可选的🍬🚂
。可选参数可以包含基本类型的值,也可以包含虚无的⚡。当字符串不包含数字时,返回⚡。要使用该值,必须使用un解开可选值,如果值是⚡,则会引发运行时错误。因此,优良作法是在展开可选组件之前检查是否没有内容。实际上,是如此普遍,以至于Emojicode有一个简写形式。通常,🍊
是一个“如果”。🍊🍦 variable expression
表示:评估表达式。如果可选内容不包含任何内容,则条件的计算结果为👎(假)。否则,将variable
使用可选的未包装值创建一个冻结的named ,条件的计算结果为👍(true)。因此,在正常使用情况下,将🍇 ... 🍉
输入条件之后的块。
😀🔡🅰️num 10
🅰️是主代码使用adds来计算分区数的方法。这会num
在条件语句中声明的冻结对象上调用🅰️,并通过🔡方法使用以10为底的结果将其转换为字符串。然后,😀打印结果。
🍓🍇 ... 🍉
🍓的意思是“ else”,因此当用户未正确输入数字时,将输入此块。
😀🔤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。隐式假定类型为🚂。
🔂k⏩0🐕
over迭代实现🔂🐚⚪️协议的任何内容,而⏩是恰好实现🔂🐚🚂的范围文字。一个范围具有一个起始值,一个终止值和一个步进值,如果为start < stop
,则假定为1 ,否则为-1。也可以通过使用⏭创建范围文字来指定步长值。开始值是包含的,而停止值是排他性的,所以这是相当于for k in range(n)
或Sum_{k=0..n-1}
在公式中。
🍦nmk➖🐕k
我们需要计算sigma(n-k)或n - k
换言之的除数之和,并且该参数需要几次,因此将其存储n - k
在变量中nmk
以节省一些字节。
🍮sig nmk
🔂i⏩1 nmk
这会将sig
变量设置为sigma的参数,并迭代从1到的所有数字nmk - 1
。我可以将变量初始化为0并在1..nmk上进行迭代,但是这样做更短。
🍊😛🚮nmk i 0
s计算余数,即模数,然后😛检查是否相等,因此条件是👍如果i
是的除数nmk
。
🍮➕sig i
这是通过呼叫进行的分配,类似于+= -= >>=
某些次等的无表情符号语言中的操作员系列。这行也可以写成🍮 sig ➕ sig i
。因此,在内循环完成后,sig
将包含n - k
或的除数之和。sigma(n - k)
🍮➕sum✖sig🅰️k
通过调用进行另一项分配,因此这sigma(n - k) * A(k)
与公式中的总和相同。
🍎➗sum🐕
最后,将总和除以n并返回商。这种解释可能花费了编写代码本身三倍的时间。