Answers:
由于它不是05AB1E GitHub页面上Wiki的一部分(我认为应该),所以我现在就将其添加到这里,以便我自己更好地理解它。
05AB1E具有以下word.ex词典文件,其中包含它知道的所有单词。但是,我们如何访问该词典中的单词?让我们以这个词"testing"为例:
"testing"可以在字典文件的第1453行上找到。由于前两行不是单词,并且我们需要索引为0的单词,
所以我们减去3。所以,现在有了索引(1450),但是如何使用它呢?
我们用“†打开并开始一个压缩字符串。然后,我们查看info.txt文件的第二列。(因此€,00为;‚01为;等等。)
在这种情况下,"testing"表示î(14)和»(50)。
因此,压缩字符串为"testing":“ 在线尝试。与几乎所有05AB1E代码段一样,“如果您不访问字符串,则尾随是可选的,因此在这种情况下,也无法正常工作。
注意事项:
info.txt文件中没有任何索引的所有字符都可以按原样使用。例如,这对于添加a s以输出复数形式而不是单数形式或使用标点符号很有用,.?!。
ÿ要在字符串中插入堆栈中的值时,也可以使用(string-interpolation)。
注意:每个在info.txt文件中没有任何索引的松散字符都将被视为以下压缩类型的单词。
†您可以使用不同类型的压缩字符串:
':按原样使用单个压缩词(无需尾随')- 'î»:“测试”„:使用两个带空格分隔符的压缩字(无需结尾„)- „î»î»:“测试测试”…:接受三个带空格分隔符的压缩字(无需尾随…)- …î»î»î»:“测试测试”“:使用带空格分隔符的压缩字符串- “î»î»“:“测试测试”’:压缩后的字符串不带任何隐含空格- ’î»î»’:“ testingtesting””:以带空格定界符的标题大小写压缩字符串- ”î»î»”:“测试测试”‘:使用带空格分隔符的压缩字符串以全大写形式- ‘î»î»‘:“ TESTING TESTING”这是一个有用的程序,用于基于空格分隔的单词输入来获取压缩的字符串:
'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,
该程序将:
lAð«Ã#),或包裹词语的列表如果只有一个字被输入(¸˜)vyU)"€...ï"Dâvy),它将尝试作为05AB1E程序("“ÿ“".V)运行XlQiy?1#使用输入时good bye world,输出将为“‚¿Þ¡‚ï“。在线尝试。
注意:为了使此生成器正常工作,您仍然需要查看字典中是否存在该单词,它将忽略任何特殊字符或复数单词。仅会找到字典中完全相同的单词。
这是我…Ÿ™‚ï!在字符串“ hello world!”中使用的示例。并’‚¿Þ¡ ÿ ‚ï!’用于字符串“再见ÿ世界!”。请注意如何使用空格和感叹号,因为它们在info.txt文件中没有索引。另外,它用于ÿ插入位于堆栈顶部的“残酷”,但不幸的是,它不是字典的一部分(但仍使用下面部分的方法进行了压缩)。
尽管words.ex词典文件很大(准确地说是10,000个单词),但是您可能需要一个不属于其中的单词,或者只是一个乱七八糟的字符串。那么有没有办法压缩它们呢?
通过使用.•,肯定是一个基于base-255压缩字母的压缩字符串。注意:此方法只能用于小写字母和空格中的字符。
这是一个有用的程序,可将单词/字符串转换为基于255的压缩的基于字母的字符串:
vAyk})> 27β 255B ".•ÿ•"
上面这个程序的作用是:
vAyk})>:获取输入的各个字母的1索引字母索引,空格变为索引027β:将这些索引从27转换为一个数字255B:使用05AB1E自己的代码页将此数字转换为Base-255".•ÿ•":在此压缩字符串之前.•放置首尾•这是一个示例答案,其中@Kaldo用于.•zíΘ•压缩单词“ goose”。
假设我们要为某物使用很大的数字,但实际上不能通过pow计算来检索它。例如,假设我们18238098189071058293出于任何原因都想要访问大整数。
在这种情况下,我们可以同时使用前导和尾随•来压缩格式中的数字[1-9][0-9]+。
上面的示例编号将变为•15Y₁Ò'Θpc•。在线尝试。同样,就像压缩的字典字符串一样,尾部•可以有选择地删除。
可选地,当整数足够小而只需要使用2个压缩字符时,我们可以Ž改用,在这种情况下,我们不需要尾随字节来关闭它,并且整数以3个字节(而不是4个)压缩。例如,整数13562将导致•rl•,但是由于它仅使用两个字符,因此可以Žrl改为。
同样,[101, 355]可以使用Ƶ05AB1E的代码页中的附加字符,将范围内的数字压缩为2个字节。因此,例如,Ƶ–可以用于integer 250。这里是所有可用数字的概述。这些字符从Base-255转换为Base-10,然后添加101(因为范围内的数字[0,100]已经是1或2个字节)。
如何在这些15Y₁Ò'Θpc和rl创造的呢?很简单,使用05AB1E自己的代码页将数字转换为Base-255。所以,你可以使用下面的程序得到一个压缩的数字,它将再使用Ƶ.,Ž..或•...•取决于压缩整数大小:
101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"
在这里,其中一个例子答案@Emigna使用•3Èñ•的整数246060。
有时您希望压缩整数的整个列表,而不是单个数字。例如,假设我们[5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]出于任何原因想要列表。在这种情况下,我们可以改用以下方法:•4βŸ{©£MG]q‡dZΘp•94в 在线尝试。
这是一个有用的程序,用于生成此压缩数字和我们要转换为的基数:
Z>© β 255B ®s"•ÿ•ÿв"
上面这个程序的作用是:
Z>:获取输入列表的最大数量+1(©:并将其存储在寄存器中)β:将输入列表从基数max+1转换为单个数字255B:压缩这个数字(就像我们在上一节中所做的一样)®s"•ÿ•ÿв":以以下格式返回结果:前导•,压缩数字•,max + 1,尾随в这是我•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в用来压缩列表的示例答案[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]。
PS:在此答案中,•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ô是一个等字节(57)的替代方案,因为所有数字都恰好有两位数字。在某些情况下(尤其是较小的列表),这可能是一个较短的选择。
整数压缩与整数列表压缩:
有了这两个,它可以任意选择。有时压缩列表更短,有时压缩整数,有时完全不同的替代选择更短。因此,请始终使用自己的判断力和打高尔夫球技巧进一步打高尔夫球,而不是完全依赖上述生成器。这里有一些例子:
•A–•60в 是7个字节(由压缩整数列表生成器生成)•H|•2ô或•H|•2ä或硬编码44 59‚均为6个字节ŽH|2ô或者ŽH|2ä都是5个字节„,;Ç最好使用4个字节(字符“,”和“;”的代码点)10101001100101001(在我的答案中使用):
•a½₄Ƶ6®í• 是9个字节(由压缩的大整数生成器生成)•1∊}•2вJ 是8个字节(由带有合并的压缩整数列表生成器生成)•1∊}•b,最好使用6个字节(压缩的整数列表,使用a 代替二进制2в,隐式地加入)[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84](在我的答案中使用):
•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в 是57个字节(由压缩整数列表生成器生成)•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-øJδŠ+Öηôî®À8†6 /ðÎ6ùøΓΓ°ÓĆ; ˆ©Ā•2ô`也是57个字节(压缩整数,分成2个部分)•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
,λ₂ϦP(Ì•65в₂+但是,通过压缩列表,将每个值降低26,然后将其缩短2个字节,然后在其后加上`2+ `。此后添加单字节值的技巧通常可以用于将字节保存在压缩列表中。早在05AB1E发行时,隐式输入是相当新的和奇特的。如今,似乎有必要与其他竞争性语言(如Jelly,MATL,Pyth等)保持一致。
例如,当您想将两个数字相加时,可以执行以下操作II+:
I # Input_1.
I # Input_2.
+ # Add them up.
但是,使用隐式输入,我们可以缩短到1个字节,即+:
+ # Take two numbers implicitly and add them up.
仅当堆栈的长度小于操作员的友好程度时,才会发生这种情况。最后一个例子是3+。+运算符的Arity 为2,而堆栈中只有1个元素:
3 # Push the number 3 on top of the stack.
+ # Request implicit input and add to the 3.
£是用于获取bstring 的第一个字符的命令a。
例如: "hello_world"5£ -> "hello"
但是,如果b有一个索引列表,则会将字符串分成(最多)这些大小的一部分。
例如: "hello_world"5L£ -> ['h', 'el', 'lo_', 'worl', 'd']
它们在05AB1E中有些隐藏。这是所有预定义变量的列表:
¾推送0 =>几乎等于非助记符
¾推送一个计数器变量,该计数器变量初始化为0。如果只想推送0,当然0更自然,但如果要推送5,0,7,5¾7则比短2个字节5 0 7。
print(3 / 4)在Python 2中给了我0。
M按-Inf。
Λ或.Λ)由于它不是文档的一部分,并且@Adnan目前有点忙于编写它,因此我现在请求允许在此处添加它作为提示。
画布功能(Λ或.Λ)可用于在屏幕上绘制ASCII线。它具有三个必需的参数:
[0,7]方向的数字,可以使用一个或多个。还有一些特殊的选项需要一个特定的字符(稍后会有更多介绍)。方向数字[0,7]映射到以下方向:
7 0 1
↖ ↑ ↗
6 ← X → 2
↙ ↓ ↘
5 4 3
一些示例05AB1E回答了使用Canvas的位置:
让我们做与上一个类似的操作,因此假设我们使用Λ具有以下三个参数的Canvas 函数:
[3,3,5,5,7,7,9,9]!@#[0,2,4,6]这将给出以下输出:
!@#!@#!
# @
@ #!@ #
! @ # !
# ! ! @
@ @ #
!#@!# !
@
@!#@!#@!#
那么它是怎样工作的?好了,这是上面这些输入的步骤:
3字符()!@#03-1字符()!@25-1字符()#!@#45-1字符()!@#!67-1字符()@#!@#!07-1字符()@#!@#!29-1字符()@#!@#!@#49-1字符()!@#!@#!@6该-1在那里,因为线路重叠。因此,前两个步骤是:
#
@
!
和
!@
合并的是:
#!@
@
!
一些小注意事项:
[0,7]还有一些可用的特定选项,它们基本上转化为特定的方向序列。
+('+内联)转换为pattern 04402662,它+与给定长度的手臂创建一个-cross。看到它在行动。×('×内联)转换为pattern 15513773,它X与给定长度的手臂创建一个-cross。看到它在行动。8返回到我们开始绘制的位置的原点。在实际操作中查看它,并在不使用的情况下查看差异8。Λ会立即输出,并且.Λ结果被压入栈,我们仍然可以重新使用,修改和做,我们会想什么的字符串。一些例子:
循环和条件语句在程序末尾会自动包含右括号,因此,如果您需要在循环/条件语句之外的内容,则只需在代码中添加它们即可。
例如,此(解开链)程序创建了一个第一个n质数的列表,不需要使用方括号。
[¹¾Q#NpiNˆ¼
但是,如果我们想对结果列表执行某些操作,例如使用delta,则需要首先关闭循环。
[¹¾Q#NpiNˆ¼]¯¥
将通过我在此过程中学到的一些小技巧来扩展它。(仅亲自启动05AB1E。)
DÐ与s(swap)和Š(triple-swap a,b,cto c,a,b)组合使用(duplicate)和(triplicate)通常比在循环内使用©(save in global_variable)和®(push global_variable)短。这保存在这个回答我的一个字节中,以及两个这样的回答我的。½(如果为1,则在a的末尾不需要将counter_variable加1)µ(而counter_variable!= a,do ...),因为它是隐式完成的(在我的这个答案中保存了一个字节)。.B在换行符上隐式拆分。当我们在寻找(split)的替代品同时仍保留空项目时,这在我的答案中很有用¡(注意:当元素拆分后包含尾随空格时,链接答案中的解决方案将不起作用。)-希望内置被添加以拆分,但以后保留空白行。SÖ(input-integer的哪个数字可以平均除以input-integer)将包含数字本身的数字0(而不是被零除错误)。例如,1053将导致[1,1053,0,1](1053被1和3整除;未被5整除;并给出0除以零的误差)。这在我的这个答案中非常有用,因为1它占据了列表的力量,因为在05AB1E中只有真相,而其他所有东西都是假的。SÖP因此,如果结果为true(1),则表示输入整数可以被其每个数字均分。û(palindromize给定的字符串)后,我很惊讶没有内置的is_palindrome。但是后来我意识到仅需要2个字节即可完成操作ÂQ(在哪里Â是分叉的,这是缩写DR:Duplicate&Reverse copy;Q用于检查堆栈上的前两个值是否相等)。Ds*(复制,交换,乘以充当逻辑与)与}ʒ(关闭第一个过滤器,再次过滤)。例如:在这个挑战中,我们必须列出所有四位数长的数字,至少包含一个0,并且数字总和等于9。使用范围可以[1000,10000]覆盖四位数的长度,但是接下来还有两个过滤器。最初,我使用了₄4°ŸʒD0åsSO9Q*(14个字节),但是通过使用两个过滤器,可以节省一个字节:₄4°Ÿʒ0å}ʒSO9Q(13个字节)。(后来得到了golfed到₄4°ŸεW°ö9Q由(10个字节)@Grimy)0作为填充符压缩时,可以使用0ζ。但是,与此相关的一个问题是填充0符将变为字符串"0",因此如果您以后尝试使用混合的字符串和整数进行排序,则很可能不会给出您想要的结果。这是一个如何对压缩的内部列表进行排序的示例:0ζ€{。这可以通过添加显式转换为INT(固定ï拉链后),也只有这样的排序:0ζï€{。但是,在zip-filler中使用¾as常量0将导致它在zip期间保持为整数而不是字符串。因此¾ζ€{将在此处保存一个字节。该提示由@ Mr.Xcoder提供,用于在我的这个答案中保存一个字节。€SO。但是使用会更短1ö,它会自动向量化。@Grimy提供了此技巧,以在此处保存一个字节(在此处保存2个字节)。2‹。然而,使用!(阶乘)也只会造成1(truthy)为0和1,和所有其他值将导致更高的东西(因此falsey,由于仅1是在truthy 05AB1E)。@Grimy提供了此技巧,以在此处保存一个字节。请注意,05AB1E中的某些运算符会在数组上自动矢量化。例如,代码5L3+,它反汇编为以下伪代码:
[1, 2, 3, 4, 5] + 3
会成为:
[4, 5, 6, 7, 8]
如果它不能自动矢量化,则也可以使用€运算符。它只需要一个字符命令,并在每个元素上执行该(单子)运算符。下面的代码是拆分每个元素的示例(在此处尝试):
€S
普通S运算符会将数组中的每个元素拆分并将其展平为单个数组(在此处尝试)。
ñ之前的n(index)值合并列表。tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
以下代码有助于使用自定义基本转换将ASCII艺术转换为05AB1E。
|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"
这是通过以下方式完成的:
0-9A-Za-z顺序将输入的字符映射到,每个不同的字符都有自己的映射字符,直到每个字符都被替换为止。•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ。将“让你也压缩串引号"; 在Åв将使用该字符串基转换使用字符串作为定制基所生成的整数; 并将J所有这些字符连接到一个字符串中,该字符串将隐式输出。
接受最多包含62个唯一字符的模式,非常适合ASCII艺术。
唯一字符的数量越少,压缩效果越好。
绘制XNOR数字时序图的示例输出(214字节,9个唯一字符):
┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──
┌───┐ ┌───┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐
B ┘ └─┘ └─┘ └─┘ └───┘ └─┘ └
┌─────┐ ┌─┐ ┌─┐ ┌───┐
X ──┘ └───┘ └───┘ └───┘ └────
将会:
•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ
(106/214)* 100 =原始ASCII字符串的大小的49.53%。
这与我针对 05AB1E(旧版)中提出的挑战的实际提交次数相同。
注意:绝对不要打代码。它是为将ASCII艺术转换为最有效的压缩而迅速编写的,因此它非常丑陋且冗长。
|» # Take multi-line input
© # Store it in the register to reuse later
ÐÙS # Only leave unique characters (as list)
DŠ¢ø # Map it with the count for each of those characters
Σθ}R # Sort it based on that count (highest to lowest)
€н # Remove the count again, so the sorted characters remain
¬®sÅ?i # If the input starts with the most occurring character:
D2£RDŠKsì} # Swap the first two characters in the list
J© # Join everything together, and store it in the register to reuse later
žLR‡ # Map each character to [0-9A-Za-z]
®gö # Get the amount of unique characters, and convert it to that Base
₅B # And then convert that to Base-255
®s # Push the string and swap so the compressed integer is at the top again
"•ÿ•“ÿ“ÅвJ" # Insert it in the correct output format
# `•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ`
"•ÿ•" # (after which the result is output implicitly with trailing newline)
<str><compr_int><int>вèJ代替你的<compr_int><int>BžLR<str>‡; 而“不是使用"字符串引号,因此"可以作为输入的一部分。
05AB1E具有以下常规循环和迭代器:
F,它循环访问0 .. n-1。G,它迭代1 .. n-1。ƒ,它循环访问0 .. n。v,它会在每个元素s [0],s [1],..,s [n]上进行迭代。ʒ,这不完全是一个循环,而是一个filter-by命令。我们滥用此命令是因为它无意间遍历了每个元素。使用这些循环,我们可以得出以下隐藏循环:
gF,你可以使用v它也有一个N可以使用-index。vy -> ʒ更换是需要一些技巧:
y在此类循环中无法进行调用。[,µ并且ε是正常循环/迭代的一部分吗?
y现在可以使用其中一些进行调用。