现在我对Code完全上瘾了,也许是时候学几种高尔夫语言了。
考虑到我几乎只使用JavaScript,杰夫特似乎是一种逻辑语言。我将在下一次获得的机会上深入研究这些文档,但是,在此期间,请在下面的答案中发布您对but的任何提示。
由于我是日本语和高尔夫语言的初学者,如果你能在可能的情况下将你的技巧“翻译”到JavaScript,那将是帮助我处理事情的一个很大的帮助。
发布于 2017-05-18 00:25:54
正如您可能知道的那样,Japt只是JavaScript的一个简短的扩展版本。我创建Japt是因为我厌倦了像String.fromCharCode(x)和Math.floor(x)这样的长属性名称,也厌倦了做诸如创建一个范围之类的单调乏味的事情。下面是您从JavaScript到Japt时需要知道的最低要求:
U、V、W、X、Y和Z;完整的数组存储在N中。最后一个表达式的结果会自动打印出来。a-z (和à-ÿ)方法。当您使用这些字母之一时,Japt填充.和(;Japt中的Uc等同于JavaScript中的U.c(,这可能意味着ceil、charCodeAt或concat,这取决于U的类型。这是Japt的大部分功能来源;您可以在Japt文档的"_____函数“部分(在翻译员上)找到这些方法的完整列表。),)表示))。这是因为当我第一次设计Japt的时候,我想尽可能多地保存字节,这就是我第一次想到这样做的方式。(尽管Us w n确实比Us)w)n)好看,但IMHO。)ABC{...},其中ABC可以是任何变量字符串。函数在很大程度上像在JS中一样工作,主要的区别是自动返回最后一个表达式(而不必使用return或花哨的ES6括号)。'表示单个字符字符串(即'a与"a"相同),#接受下一个字符代码并成为该数字(#e与101相同)。$在转移溢出过程中都保持不变。例如,您可以使用它来实现for循环,因为but没有这些循环,但是我建议使用其他方法(例如字符串和数组上的m,或者数字上的o )。""、0-9、(、+、=等等--在转移时保持不变(至少在大多数情况下)。这就是编写基本Japt代码所需的全部知识。在日本获得最大的高尔夫力量需要更多的知识,但这可以在其他答案中找到。
下面是一个基本的例子。假设您需要一个ASCII字符字符串,并将每个字符替换为十六进制字符代码。下面是如何在JavaScript中这样做的:
U.split("").map(x=>x.charCodeAt(0).toString(16)).join("")现在皈依到杰夫特。JS中的.split("")相当于JS中的q"",甚至更短的JS中的q。.join("")也只是q,区别在于对象是数组而不是字符串。.map(是m,.charCodeAt(是c,.toString(是s。所以我们的our代码看起来可能是:
Uq mX{Xc0 s16} q 但是,在Japt中,m对字符串的工作效果和对数组的工作一样好,因此我们可以删除两个qs:
UmX{Xc0 s16}正如您在"JS代码“框中看到的那样,在线测试!直接转到:
U.m(function(X){return X.c(0).s(16)})当您学习使用Japt时,您将变得越来越不专注于从JavaScript来回转换,并且能够以Japt作为自己的语言进行编码。以下是一个完全省略JavaScript部分的解释:
UmX{Xc0 s16}
// Implicit: U = input string
UmX{ } // Take U, and replace each character X with the result of this function:
Xc0 // Take the char-code at index 0 in X (the first and only one).
s16 // Convert this to a hexadecimal string.
// Implicit: output result of last expression发布于 2017-09-13 15:02:38
更新:本技巧中的工具已经被重写、改进并集成到我的Japt翻译中。为了获得最好的结果,建议您使用该压缩机,而不是下面链接的任何一个。当我有更多的时间时,我将重新讨论这个技巧,并在考虑新的压缩器的情况下重写它。
如果您的代码中有一个字符串数组,那么最明显的压缩方法就是分别对把每一个字符串都穿过去Oc进行压缩。为了本技巧文章的目的,我们将使用数组["lollipop","marshmallow","nougat","oreo"],它最初的重量为42字节。通过Oc运行每个字符串将给我们提供如下信息:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]现在是33个字节,这是一个不错的节省。
但是我们可以做得更好。如果我们将数组加入到一个以换行符分隔的字符串中,则可以去掉括号、逗号和无关的回标,然后在换行符上拆分以获得数组。将其应用到示例数组中,我们将得到以下内容:
`lo¥ipop
Ú\hÚaow
Í
eo`·现在降到26个字节。
但是,我们还能做得更好!我们可以使用小写字母来分隔字符串,而不是换行符,这可能包含在压缩中。z在我们的任何字符串中都没有使用,所以让我们把它放进去,看看我们是如何处理的。
`lo¥ipopzÚ\hÚaowzÍzeo`qz啊,胡说八道--没有改进,我们的字节数增加了一倍!您可能还可以使用另一个字母,但取决于您的字符串,可能会有相当多的字母需要尝试--在我们的示例中,有11:b,c,d,f,j,k,q,v,x,y,z。尝试每个字符串都会非常繁琐,这就是这个方便的工具引入的地方;将换行符分隔为字符串,它将尝试用每个字母分隔字符串,而每个字母都不包含在字符串和输出中:
通过运行示例字符串,可以看到b提供了最好的结果:
`lo¥ipáæqrÚaowbÍÞo`qb在这里,我们只剩下24个字节。
但是,我们可以做得更好!如果数组中的字符串顺序不重要,那么可能会有一个不同的排列,加上一个不同的分隔符,可以计算出更短的时间。不过,尝试每一种可能性都会更加乏味。用我们的4个字符串,有24个不同的排列尝试。与每11个可能的字母成为264!这就是这个工具发挥作用的地方。同样,将新行分隔的字符串提供给它,它将尝试每个置换和每一个分隔字母的每一个组合,输出:
通过运行示例字符串,可以看到以"nougat","oreo","lollipop","marshmallow"作为分隔符的b提供了最好的结果,最终字节数仅为23:
`ÍÞo½o¥ipáæqrÚaow`qb通过首先将每个整数转换为更高的基,可以将相同的原则应用于整数数组。使用此示例,36个字节数组:
[588181,156859,595676,475330,680474]我们可以通过首先将其转换为一个由32条基本字符串组成的数组,然后通过第一个压缩程序运行它,从而将其压缩到29个字节:
`huclt4p5r5ÛÊg62tkogq`qt mnH或低至27个字节使用第二个程序:
`4p5Ïcl5ÛÊg62tkogq`qt mnH通过将整数转换移动到已经在数组上运行的方法,您可能可以在上面保存另一个字节或2个字节。
q<letter>(<space>)比·多花费的1到2个字节。尽管如此,您可能可以使用其中一个Unicode快捷键获得一个字节返回,这取决于您的分隔符(例如,qÊ与ql<space>相同)。发布于 2017-05-17 22:14:59
Japt (当前)使用激波库进行字符串压缩。您可以使用Oc压缩任意字符串,只要它包含小写字母的运行:
Oc"Hello, World!"这输出 HÁM, WŽld! (从技术上讲,Ž是一个不可打印的字符)。您可以通过将它封装在后面来解压它:
`HÁM, WŽld!`在线测试!
或者,您可以使用Od函数解压缩任意字符串。这通常没什么用,但是它有它的目的.
https://codegolf.stackexchange.com/questions/121253
复制相似问题