Haskell,306 + 624 = 930字节
程序1:带有伪参数并返回字符串的匿名函数。
(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"İĴİóđđđÝöÝâÝæÝääē××êääē××İēÀħđĮâħēĕóİóòòĮááħááđéêâéêēááĮÀħ""(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"
在线尝试!
程序2:q[[40,...]]
最后是一个匿名函数,它带有一个虚拟参数并返回一个字符串。
z~z=[[['@','0'..]!!4..]!!z]
q[x,q]_=z=<<x++q++[34,34]++x
q[[40,92,98,32,99,40,41,45,62,102,111,108,100,114,40,92,97,45,62,109,97,112,32,112,114,101,100,41,98,40,115,104,111,119,40,41,62,62,99,41,96,109,97,112,112,101,110,100,96,115,104,111,119,40,109,97,112,40,109,97,112,32,102,114,111,109,69,110,117,109,41,36,116,97,105,108,40,115,104,111,119,32,99,41,58,112,117,114,101,32,98,41,41,34],[304,308,304,243,273,273,273,221,246,221,226,221,230,221,228,228,275,215,215,234,228,228,275,215,215,304,275,192,295,273,302,226,295,275,277,243,304,243,242,242,302,225,225,295,225,225,273,233,234,226,233,234,275,225,225,302,192,295]]
在线尝试!
字符集1(包括空格):
"$()-:>E\`abcdefhilmnoprstuw×ÝáâäæéêñòóöđēĕħĮİĴ
字符集2(包括换行符):
!'+,.0123456789<=@[]_qxz~
由于仅集合1包含非ASCII字符,因此它们的UTF-8字节也不相交。
怎么运行的
演练,程序1
b
和c
分别是程序2和1的字符串文字的值,作为lambda表达式的最终参数给出。()
仅是为了满足PPCG规则(程序应定义函数)的伪参数。
foldr(\a->map pred)b(show()>>c)
通过对该字符串b
应用map pred
等于show()>>c == c++c
或的长度的次数,将该字符串解码为程序2的核心代码182
。
tail(show c)
将字符串转换c
为程序1的核心代码,并附加最后的双引号。
:pure b
将其与字符串结合在列表中b
。
map(map fromEnum)$
将字符串转换为代码点列表。
`mappend`show(...)
序列化结果列表列表,最后将其附加到程序2的核心代码中。
演练,程序2
- 顶层
z~z=[[['@','0'..]!!4..]!!z]
是将代码点转换回字符的函数(由于并非所有字符toEnum
都可用,因此必须编写)。
- 其代码点参数也称为
z
。懒惰标记~
在该位置无效,但避免使用空格字符。
['@','0'..]
是一个从ASCII代码64开始的后退步进列表范围,然后每步向下跳16。
!!4
对此应用一个\NUL
字符。
- 将其包装在一个
[ ..]
范围内可得到所有字符的列表,并进行!!z
索引。
- 角色最终被包裹在一个单例列表中。这允许
z
使用=<<
代替不可用的map
和映射列表上的功能<$>
。
- 最高层
q[x,q]_=z=<<x++q++[34,34]++x
是从quine数据列表构建程序1的功能。
x
是程序1核心的数据(包括最后的双引号),而内部q
是程序2核心的模糊数据。_
是另一个伪参数,仅使最终匿名函数成为函数,而不仅仅是字符串。
x++q++[34,34]++x
将片段连接起来,包括两个带ASCII码34的双引号。
z=<<
z
通过在串联上进行映射以从代码点转换为字符来构造程序1 。
- 最后
q[[40,...]]
是一个匿名函数q
,与quine数据结合在一起。