在不使用(m)个字母的情况下输出ŋarâþcrîþ字母歌曲


12

您的目标是编写一个不带任何输入并输出以下文本的程序:

ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos.

但是有一个陷阱:L您的来源中的每个字母(Unicode中一般类别以开头的任何字符)都会受到20个字符的罚款!(供参考,要打印的文本有81个字母。)

下面的Perl 6代码具有145个字节和84个字母,因此得分为1,845:

say "ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos."

下面的代码具有152个字节和70个字母,因此得到1,552的得分:

$_="C e N ŋa V o S;
Þ Š R L Ł.
M a P F G T Č;
în J i D Ð.
ar ħo ên ôn ân uħo;
Crþ Tŋ neŋ es nem.
elo cenvos.";s:g/<:Lu>/{$/.lc~'a'}/;.say

禁止出现标准漏洞

最初,我曾考虑过完全禁止使用字母,但是我认为没有多少语言可以实现这一点。非常欢迎您尝试。

(ŋarâþcrîþ[ˈŋaɹa̰θkɹḭθ]是我的母语之一。我想在这里使用大写字母,但在这里却得到了丑陋的大字号。哦,好吧,该语言反正也不会使用大写字母。)

编辑:意识到其中一行是错误的,但由于已经有答案,我将保留它。第三行的正确版本是ma a fa ga pa ta ča; 您可以选择生成更正的文本。


11
kolmogorov-complexityrestricted-source和特殊评分都是从沙箱中仔细考虑后会大大受益的各种东西。目前,似乎最好的方法就是用十进制写出所有代码点,然后将它们转换为带有内置代码的文本,并使用一些快捷方式对所有as 进行编码-取决于是否有多少之所以要使用字母,是因为20个字符确实是一个很大的惩罚(尽管当其他所有内容都按字节计分时,它的定义还不是很清楚...)!
不相关的字符串,

4
考虑到Unicode的调用,可能会需要一些用于管理大多数golflangs特殊代码页的显式规则(可能还需要链接到脚本以验证评分)。
不相关的字符串,

Answers:


21

7,410字符,154个字节7的编码,0字母得分= 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

在线尝试!

在不喜欢使用字母的挑战中,有什么比仅由数字组成的语言更好的语言呢?

这是一个完整的程序,崩溃时会退出,因此有多余的输出到stderr,但是stdout是正确的。

说明

一个7程序在其第一次迭代时,只是将多个元素压入堆栈(因为7中存在的12个命令中,只有8个可以在源程序中表示,而这8个专门用于编写代码将特定的数据结构推送到堆栈)。该程序不使用6命令(这是创建嵌套结构的最简单方法,但是通常不会从字面上出现在源程序中),因此仅由7命令确定结构。7将一个新的空元素压入堆栈顶部(而05命令仅追加到堆栈顶部)。因此,我们可以在程序中添加空格以显示其结构:

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
51405231224134135105230230534534151525 7

55102440304030434030421021030442030424030455 7

33413512410523142410523030523112411350143355142410523414252410510523102410523002
41052341334241114525 7

551220304010420030455 7

41403

程序末尾的元素最后被压入,因此在第二次迭代开始时位于堆栈顶部。在此迭代以及以后的所有迭代中,7解释器会自动生成堆栈顶部的副本并将其解释为程序。文字41403推动(非文字的,实时代码)47463(7个有12个命令,但其中只有8个具有名称;因此,我使用粗体显示代码,并使用非粗体显示生成该代码的文本,这意味着,例如4追加4到顶部堆栈元素的命令)。因此,在第二次迭代中运行的程序是47463。这是做什么的:

47463 
4        交换顶部的两个堆栈元素,在之间添加一个空元素
  7       在堆栈顶部添加一个空的堆栈元素
   4      交换顶部的两个堆栈元素,在之间添加一个空元素
    6     找出哪些命令将生成顶部堆栈元素;
        将其附加到下面的元素(并弹出堆栈的旧顶部)
    3    输出顶部堆栈元素,弹出下面的元素

如果我们看看堆栈发生了什么,这更容易理解:

  • ... d Ç b 一个 47463(代码运行:47463
  • ... d Ç b 清空一个(代码来运行:)47463 7463
  • ... d Ç b 清空一个(代码运行:)47463 463
  • ... d Ç b 一个(代码运行:)47463 63
  • ... d Ç b 一个 ”(代码运行:)47463 3
  • d c b (要运行的代码:47463

换句话说,我们将栈顶放在a的顶部,计算出最有可能生成它的代码,然后输出该代码。7解释器在迭代结束时自动从堆栈顶部弹出空元素,因此47463,就像在原始程序中一样,我们最终将堆栈底部放回顶部。应该很容易看出下一步会发生什么:我们最终逐个搅动每个堆栈元素,将它们全部输出,直到堆栈下溢并且程序崩溃为止。因此,我们基本上已经创建了一个简单的输出循环,该循环查看程序的源代码以确定要输出的内容(我们不输出由我们的0…压入堆栈的数据结构。5命令,我们通过查看创建的结构并输出这些结构来重新创建使用的命令。因此,第一个数据输出是551220304010420030455(生成从上至下的堆栈元素3341351…114525的源代码),第二个数据是(生成从上至下堆栈的元素的源代码),依此类推。

但是,显然,这些源代码并不是未编码地输出。7包含几种不同的领域特定语言,用于编码输出;一旦选择了特定领域的语言,它将一直使用直到明确清除为止,但是如果尚未选择任何一种语言,则输出的代码的第一位将确定使用哪种语言。在此程序中,仅使用两种语言:5513

551非常简单:它基本上是用来在电传打字机上传输字母的旧式Baudot / teletype代码,为5位字符集,但经过修改以使所有字母都变为小写。因此,要输出的第一部分代码按以下方式解码:

551  22 03 04 01 04 20 03 04  55
     c  a  SP e  SP n  a  SP  reset output format

可以看出,我们将每个字符设置为两个八进制数字,这是相当不错的压缩率。0-5范围内的数字对给了我们36种可能性,而Baudot则需要32种可能性,因此其余的4种用于特殊命令。在这种情况下,55最后的会清除记住的输出格式,让我们对产生的下一个输出使用不同的格式。

3从概念上讲更简单,但又有所不同。基本思想是将三位数字组成一组(同样,在0-5范围内,因为这些数字我们可以保证可以从其输出中重新创建原始源代码),将它们解释为三位数字数字以6为基数,然后将其作为字节以二进制形式输出(因此,通过输出多个字节,我们就可以在所需的输出中输出多字节字符)。但是,这种扭曲来自以下事实:在基数6中只有216个三位数字(可能有前导零),但有256个可能的字节。7通过将从332₆=128₁₀向上的数字链接到两个不同的字节来解决这个问题;332可以输出字节128或192,333字节129或193,依此类推,直到515输出字节191或255。

程序如何知道要输出的两种可能性中的哪一种?可以使用520向上的数字三元组来显式地控制它,但是在此程序中我们不必:7的默认值是选择所有模棱两可的字节,以使输出为有效的UTF-8!事实证明,总是有最多一种方法来执行此操作,因此,只要我们要使用UTF-8(在这种情况下就是这样做),我们就可以保持模棱两可,并且程序仍然可以运行。

每个3…部分的末尾是525,它会重置输出格式,让我们回到551下一部分。


在未压缩的表示形式中为410字节+ 0个字母,在压缩的表示形式中为154字节+很多字母。计算一个字节的字节数和另一个字节的字数似乎是骗人的。
Grimmy19年

1
@Grimy:您将字节与字符混淆。打包的表示形式由7个编码的154个字节组成,它们编码410个八进制数字,每个八进制数字都是一个数字而不是字母。您的推理意味着,例如,ɓ在Jelly中不是字母(因为如果以典型的8位字符集而不是字母来解释,则其在Jelly编码中的编码对应于控制代码“ CSI”)。与Jelly一样,7也使用自定义编码。但是由于7不使用字母,因此编码不需要对字母进行编码,因此无法编码。
ais523

10

Haskell,0个字母,423个字节=得分423

(['\10'..]!!)<$>[89,87,22,91,22,100,87,22,321,87,22,108,87,22,101,22,105,87,49,0,244,87,22,343,87,22,104,87,22,98,87,22,312,87,36,0,99,87,22,87,22,102,87,22,92,87,22,93,87,22,106,87,22,259,87,49,0,228,100,22,96,87,22,95,22,90,87,22,230,87,36,0,87,104,22,285,101,22,224,100,22,234,100,22,216,100,22,107,285,101,49,0,89,87,104,244,22,106,87,321,22,100,91,321,22,91,105,22,100,91,99,36,0,91,98,101,22,89,91,100,108,101,105,36]

在线尝试!


6

果冻 274 260  212个字节 + 2页的信 =  314 300  252

-48个字节,感谢Nick Kennedy

“19ב+49;7883,8220,8216,7884Ọ“19937801,1169680277365253“38“68112“;107¤+1+\“@“&%"("/%"@%"6%"0"3%$!<%" %"2%"-%"?%#!.%"%"1%")%"*%"4%"=%$!9/",%"+"'%":%#!%2">0"8/";/"7/"5>0$!&%2<"4%@"/(@"(3"/(.#!(-0"&(/603#“_32¤”;";/V

(用途!"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”其中V是Unicode字母,并用于每一次)

在线尝试!




@NickKennedy我曾经打过高尔夫球,但是没有退后一步,只是想抵消普通的东西,好东西-谢谢!
乔纳森·艾伦,

3

PowerShell中,分数601 546

-join(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14|%{[char]($_+32)})

在线尝试!

天真的方法;我只是把代码点,并将它们转换为十进制,减去32,那么这段代码将它们视为char-join荷兰国际集团其重新组合成一个单一的字符串。




3

果冻 321字节+ 2个字母=得分361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

在线尝试!

这太可怕了,有人肯定可以做得更好。

验证分数


1
实际上没有看起来差那么多
ASCII码仅

2

Python 3,380字节+ 5个字母= 480

print("""\143\141 \145 \156\141 \513\141 \166\141 \157 \163\141;
\376\141 \541\141 \162\141 \154\141 \502\141.
\155\141 \141 \160\141 \146\141 \147\141 \164\141 \415\141;
\356\156 \152\141 \151 \144\141 \360\141.
\141\162 \447\157 \352\156 \364\156 \342\156 \165\447\157;
\143\141\162\376 \164\141\513 \156\145\513 \145\163 \156\145\155.
\145\154\157 \143\145\156\166\157\163.""")

在线尝试!


1

视网膜,140个字符,159个字节,14个字母=得分439


%# ' 1# !# 9# 2 6#;¶þ# š# 5# /# ł#.¶0# # 3# (# )# 7# č#;¶î1 ,# + &# ð#.¶#5 ħ2 ê1 ô1 â1 8ħ2;¶%#5þ 7#! 1'! '6 1'0.¶'/2 %'1926.
T`!--/-9`ŋ\`-{

在线尝试!编辑:通过从K`换行符保存了1个字母。现在在Retina 0.8.2中也可以使用(但标题太长)。


1

Japt -S304个 286字节+ 2 1个字母小号 = 344 306

好吧,这真是令人敬畏!

"3 1
5
14 1
235 1
22 1
15
19 1 -37 -86 158 1
257 1
18 1
12 1
226 1 -50 -86 13 1
1
16 1
6 1
7 1
20 1
173 1 -37 -86 142 14
10 1
9
4 1
144 1 -50 -86 1 18
199 15
138 14
148 14
130 14
21 199 15 -37 -86 3 1 18 158
20 1 235
14 5 235
5 19
14 5 13 -50 -86 5 12 15
3 5 14 22 15 19 -50"·®¸®°d96} ¬

尝试一下


1

PHP -a,402字节+ 200罚款= 602得分

foreach([67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,8,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14] as $i){echo ''.mb_chr($i+32);}

港口Artermis Fowl的回答,以及我的第一个代码高尔夫球入门!

让我希望chr()能够支持UTF-8。那些额外的3个字节+ 40个字符很痛苦!


欢迎来到PPCG :)
Shaggy

1

05AB1E,得分209(189字节+ 1个字母的罚款20)

•£?;\:'%¢;.'¡£/':¢?'¢°':¢°#@¢«>#%¡¤;®[¢:¥¢:©¢:¦¢;®¢>#¡£#¨¢#&¢+¢#,¢:§¡¤#¬¢#@¢#)¢#(¢#<¢#¢#/¡£#¯¢#.¢#>¢#±¢#«¡¤#?¢;¢#\¢#°¢#:¢'¢#%•[₅‰`©®_#∞158+902201401301670804020409010150250102709022¾¡.¥>:ç?

在线尝试!

唯一的字母是瀣¢在Unicode中,货币符号不视为字母。


0

Python 3,397个字节+ 19个字母= 777得分

print(''.join(chr(i+32)for i in[67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14]))

在线尝试!

AdmBorkBork的答案端口。




562,-2(如果使用python 2)

TIO在我的组织中不起作用,因此我必须等待回家才能添加这些。
Artemis仍然不相信

0

R,384字节+ 12个字母* 20分= 684得分

不是很原始。

cat(intToUtf8(c(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14)+32))

在线尝试!


0

05AB1E,得分383 365(325 个字节 + 2页的信* 20罚分)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

@HyperNeutrino的果冻端口。

将尝试在这里进行改进。该数字可被一堆数字整除,但是不幸的是,它们都无法节省任何字节,并且压缩的较大除数至少包含1个字母。

多亏@Grimy,从而获得-18(+2字节和-20罚分),将字母J(join)替换为.««(通过级联减少)。

在线尝试。


1
J可以.««为-18。或者使用完全不同的方法,请参阅我的答案
Grimmy19年

@肮脏的谢谢!:)很好的答案!
凯文·克鲁伊森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.