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.
£
是用于获取b
string 的第一个字符的命令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
字符()!@#
0
3-1
字符()!@
2
5-1
字符()#!@#
4
5-1
字符()!@#!
6
7-1
字符()@#!@#!
0
7-1
字符()@#!@#!
2
9-1
字符()@#!@#!@#
4
9-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,c
to 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
现在可以使用其中一些进行调用。