这是一个受限源,kolmogorov-复杂性,密码-高尔夫挑战,以产生没有输入的固定输出。
但是,输出格式是灵活的--它可以打印为标准输出、打印为标准错误、返回为字符列表、返回为字节列表或返回为整数列表。如果你认为其他的事情似乎是合理的,请在评论中问一问!
下面是一个简单的、大号字母的ASCII艺术CODEGOLF:
CCCC OOO DDDD EEEEE GGG OOO L FFFFF
C O O D D E G O O L F
C O O D D EEE G GG O O L FFF
C O O D D E G G O O L F
CCCC OOO DDDD EEEEE GGGG OOO LLLLL F没有任何换行符(或任何行上的尾随空格),它有256个字符长:
CCCC OOO DDDD EEEEE GGG OOO L FFFFFC O O D D E G O O L FC O O D D EEE G GG O O L FFFC O O D D E G G O O L F CCCC OOO DDDD EEEEE GGGG OOO LLLLL F非空格字符的(0)索引如下:
1, 2, 3, 4, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 29, 30, 31, 36, 37, 38, 42, 49, 50, 51, 52, 53, 54, 61, 65, 68, 72, 75, 82, 89, 93, 96, 103, 104, 111, 115, 118, 122, 125, 126, 127, 132, 135, 136, 139, 143, 146, 153, 154, 155, 156, 163, 167, 170, 174, 177, 184, 188, 191, 195, 198, 205, 207, 208, 209, 210, 214, 215, 216, 220, 221, 222, 223, 227, 228, 229, 230, 231, 235, 236, 237, 238, 242, 243, 244, 248, 249, 250, 251, 252, 255您在代码中不使用这97个字节中的任何一个,但是必须按照这个顺序生成一个列表(或类似的输出),用正在使用的代码页中的第32个字节替换丢失的字节(在许多许多代码页中,一个空格字符)。
如果有帮助,您可以包括漂亮的打印*换行符(但行上没有尾随空格)。
例如,使用果冻代码-页,这个输出是可以接受的:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 12345
6 = A D H K R Y ] ` g
h o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓ
ƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ
ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”...but也是如此:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 123456 = A D H K R Y ] ` gh o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”...and也是如此:
[32, 1, 2, 3, 4, 32, 32, 32, 8, 9, 10, 32, 32, 32, 14, 15, 16, 17, 32, 32, 32, 21, 22, 23, 24, 25, 32, 32, 32, 29, 30, 31, 32, 32, 32, 32, 36, 37, 38, 32, 32, 32, 42, 32, 32, 32, 32, 32, 32, 49, 50, 51, 52, 53, 54, 32, 32, 32, 32, 32, 32, 61, 32, 32, 32, 65, 32, 32, 68, 32, 32, 32, 72, 32, 32, 75, 32, 32, 32, 32, 32, 32, 82, 32, 32, 32, 32, 32, 32, 89, 32, 32, 32, 93, 32, 32, 96, 32, 32, 32, 32, 32, 32, 103, 104, 32, 32, 32, 32, 32, 32, 111, 32, 32, 32, 115, 32, 32, 118, 32, 32, 32, 122, 32, 32, 125, 126, 127, 32, 32, 32, 32, 132, 32, 32, 135, 136, 32, 32, 139, 32, 32, 32, 143, 32, 32, 146, 32, 32, 32, 32, 32, 32, 153, 154, 155, 156, 32, 32, 32, 32, 32, 32, 163, 32, 32, 32, 167, 32, 32, 170, 32, 32, 32, 174, 32, 32, 177, 32, 32, 32, 32, 32, 32, 184, 32, 32, 32, 188, 32, 32, 191, 32, 32, 32, 195, 32, 32, 198, 32, 32, 32, 32, 32, 32, 205, 32, 207, 208, 209, 210, 32, 32, 32, 214, 215, 216, 32, 32, 32, 220, 221, 222, 223, 32, 32, 32, 227, 228, 229, 230, 231, 32, 32, 32, 235, 236, 237, 238, 32, 32, 32, 242, 243, 244, 32, 32, 32, 248, 249, 250, 251, 252, 32, 32, 255](最后一个是任何语言中任何代码页的有效列表输出,您也可以使用任何合理的列表格式。)
这里是Python3 3代码,它显示不可用的ASCII字节。
*虽然印刷本身可能并没有那么漂亮!
发布于 2018-11-21 22:09:05
main(_){--_<88+80+88?printf((int[:>){77707-989908070??>,((int[:>){0xE8E8C79E^0xB0B0080,0xC07E0870^0xE0000C00,0xCC08099C^0xEE0C008E,0xE8888989^0xCC00808,0x9E088990^0x800C0000,0x990C8888^0x080ECC00,0xF9C7a088^0x080000C0,0x9F8C78F8^0x900000??>[_>>(0xC^0x9):>>>(_<<9+9+9>>9+9+9))<<(70^89)>>(70^89)?_:' '),main(_+9-7):0;??>这是一段旅程..。
不知怎么的,我们需要检查给定的整数是否是一个特殊的代码点。任何“裸”列表都会太长,所以我们使用支票列表。这个列表在“受限”的代码点上有一个非零值,在那些没有“限制”的代码点上有一个零值。
不幸的是,这仍然需要512个字节才能得到列表(它看起来像0,0,7,7,0,7,0,...)。这可以缩短与比特掩码。
为了利用位掩码,我们将每个字节分成两个部分。前3位将从数组中选择一个掩码,而最后5位将选择数组中的一位。我们不能进一步缩小数组,因为默认情况下使用的32位整数不支持2^5=32位。
使用参考实现,我写道:
int main() {
int i;
int vals[] = {1, 2, 3, 4, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 29, 30, 31, 36, 37, 38, 42, 49, 50, 51, 52, 53, 54, 61, 65, 68, 72, 75, 82, 89, 93, 96, 103, 104, 111, 115, 118, 122, 125, 126, 127, 132, 135, 136, 139, 143, 146, 153, 154, 155, 156, 163, 167, 170, 174, 177, 184, 188, 191, 195, 198, 205, 207, 208, 209, 210, 214, 215, 216, 220, 221, 222, 223, 227, 228, 229, 230, 231, 235, 236, 237, 238, 242, 243, 244, 248, 249, 250, 251, 252, 255, 0};
for (i = 0; i <= 0xFF; ++i) {
int j,f;
f = 0;
for (j = 0; vals[j]; ++j)
if (vals[j] == i)
f = 1;
if (f)
printf("1");
else
printf("0");
if (i%32 == 31)
printf("\n");
}
return 0;
}我能够使用命令echo "obase=16;ibase=2;$(./a.out | rev)" | bc为这个新数组生成适当的值。这将将上述程序(./a.out)的输出传递给rev程序,后者反转每一行。它将输出基设置为16,输入基设置为2。因此,bc将二进制数字转换为十六进制位掩码。
由此产生的数组可以在这个“beta”解决方案中看到:
f(){
int x;
int arr[] = {0xE3E3C71E, 0x207E0470, 0x22040912, 0xE4488181, 0x1E048990, 0x91024488, 0xF1C7A048, 0x9F1C78F8};
for (x=0; x<=0xFF; ++x) {
int mask = arr[x >> 5];
int bit = mask >> (x & 0x1F);
if (bit & 1)
printf("%c", x);
else
printf(" ");
}
}有许多约束需要放在上面的代码上。在这里,我逐一介绍其中的每一个。
其他语言也会感觉到这一点,如果没有C中的赋值,就很难将任何有保证的值输入变量。对于我们来说,最简单的方法就是把我们的函数写成一个完整的程序。main的第一个参数将传递argc的值,如果没有参数调用,该值将为1。
C中唯一的循环构造是for、while和goto,它们都包含受限字符。这就留给我们使用递归了。主函数将从1开始,然后递归,直到参数>256,同时它将在内部减少参数以使用0索引的值。
上述数组中的值为十六进制,即使转换为十进制,也包含一些限制符号,最显著的是123456 (AD可以小写)。要解决这个问题,每个常量都是XORed,并且有一个这样的限制字符被移除。1变成9^B,2变成C^E,3变成B^8,4变成8^C,5变成9^C,6变成9^F (有更多的方法,我选择了这种方式)。
这些限制没有留给我们太多的打印功能。putchar和puts都受到限制,离开了printf。不幸的是,我们必须向printf发送格式字符串,最好是"%c“。所有这些字符串都有我们希望删除的令人讨厌的百分比符号。幸运的是,我们假设了一个小小的终端机器(因为这显然是TIO所使用的,而且这是非常典型的)。通过构造内存中字节为0x25 (%)、0x63 (c)、0x00 (\0)的整数,任何东西(不重要,它在空终止符之后),我们就可以将它的地址传递给printf,它将假定它是一个字符串。其中一个可以工作的数字是-989830363 (0xC5006325)。这很容易在77707-989908070的限制下创建。
仍然存在一个问题,即我们不能引用任何值(因为我们不能分配它们,因为我们不能使用&),所以我们必须使用数组文字(int[]){.}。我们实际上也将此用于上面的位掩码数组。
我们不能使用“]”或“}”关闭数组或函数。幸运的是,C具有工作的有向图和三角图。:>将成为],??>将成为}。这就要求gcc采用-trigraphs开关,因为它默认情况下会忽略三张图(这违反了标准)。
我们不能使用&来掩盖索引中的比特,也不能使用%以老式的方式实现。因此,我们依赖于具体的执行行为。特别是,我们把32位整数移到左边足够远,然后返回到右边。例如,为了得到最后5位的数字,我们首先将其移除27位(离开abcde00000...),然后将其移回右边27位(离开...00000abcde)。
在整个代码中,我们需要更多的文字值--这些值取自Arnauld的JS答案,加上27 (出于上述原因)由我作为9+9+9添加。
组合在一起
下面是对源代码的描述,并将所有这些更改放在一起。
main(_){ // This is our main entry point
--_<88+80+88 // This subtracts 1 from the argument (_) and checks if it is less than 256
? // If it is less than 256 we 'continue'
printf( // first we call printf with...
(int[:>){ // An integer array that will be interpreted as a string
77707-989908070 // With the value we determined above, to represent "%c\0\xC5"
??>, // This is a trigraph for }, just as the :> above is a digraph for ]
((int[:>){ // We immediately create another integer array
0xE8E8C79E^0xB0B0080, // Each row is the bit-mask for 32 characters
0xC07E0870^0xE0000C00,
0xCC08099C^0xEE0C008E,
0xE8888989^0xCC00808,
0x9E088990^0x800C0000,
0x990C8888^0x080ECC00,
0xF9C7a088^0x080000C0,
0x9F8C78F8^0x900000??>
[_>>(0xC^0x9):> // This is {arr}[_>>5] just in a roundabout way
>>(_<<9+9+9>>9+9+9)) // Similarly this is (...)>>(_&0x1F)
<<(70^89)>>(70^89) // This is <<31>>31 or &1, to check the last bit
?_:' ') // If its 1, we print the character, otherwise we print a space
,main(_+9-7):0; // We recurse, the :0 is the other branch of the if, it terminates execution
??>发布于 2018-11-22 04:35:05
++++++++++++++++++++++++++++++++.>+.+.+.+.<...>++++.+.+.<...>++++.+.+.+.<...>++++.+.+.+.+.<...>++++.+.+.+....++++.+.+.<...>++++.<......>+++++++.+.+.+.+.+.<......>+++++++.<...>++++.<..>+++.<...>++++.<..>+++.<......>+++++++.<......>+++++++.<...>++++.<..>+++.<......>+++++++.+.<......>+++++++.<...>++++.<..>+++.<...>++++.<..>+++.+.+.<....>+++++.<..>+++.+.<..>+++.<...>++++.<..>+++.<......>+++++++.+.+.+.<......>+++++++.<...>++++.<..>+++.<...>++++.<..>+++.<......>+++++++.<...>++++.<..>+++.<...>++++.<..>+++.<......>+++++++.<.>++.+.+.+.<...>++++.+.+.<...>++++.+.+.+.<...>++++.+.+.+.+.<...>++++.+.+.+.<...>++++.+.+.<...>++++.+.+.+.+.<..>>-.作为对最终被Javascript击败的回应,我已经尽了我所能:
通过在单元格0中保存32个字节并递增单元格1来保存1字节(我最初使用它的唯一原因是OrjanJohansen指出我不能使用]时的快速修复)
减少第三个单元格(最初为0)以生成255 = -1所保存的1字节
在不使用<>的情况下打印字符31和36之间的空格所节省的2个字节,而只是在从31到33递增时在32停止从单元格0打印。
>++++++++++++++++++++++++++++++++.<+.+.+.+.>...<++++.+.+.>...<++++.+.+.+.>...<++++.+.+.+.+.>...<++++.+.+.>....<+++++.+.+.>...<++++.>......<+++++++.+.+.+.+.+.>......<+++++++.>...<++++.>..<+++.>...<++++.>..<+++.>......<+++++++.>......<+++++++.>...<++++.>..<+++.>......<+++++++.+.>......<+++++++.>...<++++.>..<+++.>...<++++.>..<+++.+.+.>....<+++++.>..<+++.+.>..<+++.>...<++++.>..<+++.>......<+++++++.+.+.+.>......<+++++++.>...<++++.>..<+++.>...<++++.>..<+++.>......<+++++++.>...<++++.>..<+++.>...<++++.>..<+++.>......<+++++++.>.<++.+.+.+.>...<++++.+.+.>...<++++.+.+.+.>...<++++.+.+.+.+.>...<++++.+.+.+.>...<++++.+.+.>...<++++.+.+.+.+.>..<+++.首先生成数字32。然后,我们只需要增加一个单元格,并在该单元格和包含32的单元格之间切换打印。稳步增长的人数是Brainfuck做得很好的事情。
这是很好的击败Javascript与Brainfuck,这是不经常发生!
发布于 2018-11-22 07:44:07
8XFact8-ΔTbl
seq(X and XX≤8+8 or 8≤X and X≤Xmax or 7+7≤X and X<9+9 or 7+7+7≤X and X<8π or 9πTI-Basic有一些奇怪的设计选择,比如将空格字符移到0x29,以便0x20可以成为它自己非常特别的“代码页”命令。
要想弄清楚如何获得TI-Basic来输出正确的对象是很棘手的。由于多种原因,字符串无法工作:如果不使用令牌,就无法引用令牌,而且也不允许使用"字符。我们不能仅仅写一个列表,因为{和}是被禁止的。我们允许矩阵的[和]字符,但是1×256个矩阵不工作,因为矩阵最多允许在99行和列上。我们不能使用→为变量赋值,也不能通过L₆获得列表变量ʟ或L₁。
在这里,我们用不等式写下了一个复杂的逻辑公式,表示字符是我们想要输出的字符之一。然后,我们使用seq(命令生成一个列表,其中1位于这些位置,0在其他位置。在那里,另一个seq(命令和一些算术完成了任务。
这是令人兴奋的部分,其余的是打高尔夫球常量,我可能还没有做到尽可能多。我使用的一个技巧是,默认情况下,Xmax为10,XFact为4,ΔTbl为1。
https://codegolf.stackexchange.com/questions/176327
复制相似问题