首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >科莫戈罗夫灵活性。A.K.A.出售!\38美元\$38\\$在股票最后一次出售的时候,所有的科德道夫!

科莫戈罗夫灵活性。A.K.A.出售!\38美元\$38\\$在股票最后一次出售的时候,所有的科德道夫!
EN

Code Golf用户
提问于 2018-11-21 11:37:02
回答 4查看 861关注 0票数 14

这是一个受限源kolmogorov-复杂性密码-高尔夫挑战,以产生没有输入的固定输出。

但是,输出格式是灵活的--它可以打印为标准输出、打印为标准错误、返回为字符列表、返回为字节列表或返回为整数列表。如果你认为其他的事情似乎是合理的,请在评论中问一问!

下面是一个简单的、大号字母的ASCII艺术CODEGOLF

代码语言:javascript
复制
 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个字符长:

代码语言:javascript
复制
 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)索引如下:

代码语言:javascript
复制
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个字节替换丢失的字节(在许多许多代码页中,一个空格字符)。

如果有帮助,您可以包括漂亮的打印*换行符(但行上没有尾随空格)。

例如,使用果冻代码-页,这个输出是可以接受的:

代码语言:javascript
复制
 ¢£¤¥   ®µ½   ÇÐÑ×   ßæçðı   øœþ    $%&   *      12345
6      =   A  D   H  K      R      Y   ]  `      g
h      o   s  v   z  }~¶    ⁴  ⁷⁸  ⁻   Ɓ  Ƒ      ƲȤɓ
ƈ      ɲ   ʂ  ȥ   Ẹ  Ḳ      Ṭ   Ỵ  Ḃ   Ḟ  İ      Ṡ
 ẆẊẎŻ   ẹḥị   ṇọṛṣ   ẉỵẓȧḃ   ḟġḣŀ   ṗṙṡ   ẏż«»‘  ”

...but也是如此:

代码语言:javascript
复制
 ¢£¤¥   ®µ½   ÇÐÑ×   ßæçðı   øœþ    $%&   *      123456      =   A  D   H  K      R      Y   ]  `      gh      o   s  v   z  }~¶    ⁴  ⁷⁸  ⁻   Ɓ  Ƒ      ƲȤɓƈ      ɲ   ʂ  ȥ   Ẹ  Ḳ      Ṭ   Ỵ  Ḃ   Ḟ  İ      Ṡ ẆẊẎŻ   ẹḥị   ṇọṛṣ   ẉỵẓȧḃ   ḟġḣŀ   ṗṙṡ   ẏż«»‘  ”

...and也是如此:

代码语言:javascript
复制
[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字节。

*虽然印刷本身可能并没有那么漂亮!

EN

回答 4

Code Golf用户

发布于 2018-11-21 22:09:05

C (gcc),318字节

代码语言:javascript
复制
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;??>

在网上试试!

这是一段旅程..。

1.压缩列表

不知怎么的,我们需要检查给定的整数是否是一个特殊的代码点。任何“裸”列表都会太长,所以我们使用支票列表。这个列表在“受限”的代码点上有一个非零值,在那些没有“限制”的代码点上有一个零值。

不幸的是,这仍然需要512个字节才能得到列表(它看起来像0,0,7,7,0,7,0,...)。这可以缩短与比特掩码。

为了利用位掩码,我们将每个字节分成两个部分。前3位将从数组中选择一个掩码,而最后5位将选择数组中的一位。我们不能进一步缩小数组,因为默认情况下使用的32位整数不支持2^5=32位。

使用参考实现,我写道:

代码语言:javascript
复制
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”解决方案中看到:

代码语言:javascript
复制
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(" ");
    }
}

2.处理约束

有许多约束需要放在上面的代码上。在这里,我逐一介绍其中的每一个。

  1. 无赋值

其他语言也会感觉到这一点,如果没有C中的赋值,就很难将任何有保证的值输入变量。对于我们来说,最简单的方法就是把我们的函数写成一个完整的程序。main的第一个参数将传递argc的值,如果没有参数调用,该值将为1。

  1. 无圈

C中唯一的循环构造是forwhilegoto,它们都包含受限字符。这就留给我们使用递归了。主函数将从1开始,然后递归,直到参数>256,同时它将在内部减少参数以使用0索引的值。

  1. 十六进制值

上述数组中的值为十六进制,即使转换为十进制,也包含一些限制符号,最显著的是123456 (AD可以小写)。要解决这个问题,每个常量都是XORed,并且有一个这样的限制字符被移除。1变成9^B,2变成C^E,3变成B^8,4变成8^C,5变成9^C,6变成9^F (有更多的方法,我选择了这种方式)。

  1. 打印

这些限制没有留给我们太多的打印功能。putcharputs都受到限制,离开了printf。不幸的是,我们必须向printf发送格式字符串,最好是"%c“。所有这些字符串都有我们希望删除的令人讨厌的百分比符号。幸运的是,我们假设了一个小小的终端机器(因为这显然是TIO所使用的,而且这是非常典型的)。通过构造内存中字节为0x25 (%)、0x63 (c)、0x00 (\0)的整数,任何东西(不重要,它在空终止符之后),我们就可以将它的地址传递给printf,它将假定它是一个字符串。其中一个可以工作的数字是-989830363 (0xC5006325)。这很容易在77707-989908070的限制下创建。

仍然存在一个问题,即我们不能引用任何值(因为我们不能分配它们,因为我们不能使用&),所以我们必须使用数组文字(int[]){.}。我们实际上也将此用于上面的位掩码数组。

  1. 闭锁括号

我们不能使用“]”或“}”关闭数组或函数。幸运的是,C具有工作的有向图和三角图。:>将成为]??>将成为}。这就要求gcc采用-trigraphs开关,因为它默认情况下会忽略三张图(这违反了标准)。

  1. 按位运算

我们不能使用&来掩盖索引中的比特,也不能使用%以老式的方式实现。因此,我们依赖于具体的执行行为。特别是,我们把32位整数移到左边足够远,然后返回到右边。例如,为了得到最后5位的数字,我们首先将其移除27位(离开abcde00000...),然后将其移回右边27位(离开...00000abcde)。

  1. 杂项价值

在整个代码中,我们需要更多的文字值--这些值取自Arnauld的JS答案,加上27 (出于上述原因)由我作为9+9+9添加。

3.将

组合在一起

下面是对源代码的描述,并将所有这些更改放在一起。

代码语言:javascript
复制
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
??>
票数 7
EN

Code Golf用户

发布于 2018-11-22 04:35:05

脑盘,635字节

代码语言:javascript
复制
++++++++++++++++++++++++++++++++.>+.+.+.+.<...>++++.+.+.<...>++++.+.+.+.<...>++++.+.+.+.+.<...>++++.+.+.+....++++.+.+.<...>++++.<......>+++++++.+.+.+.+.+.<......>+++++++.<...>++++.<..>+++.<...>++++.<..>+++.<......>+++++++.<......>+++++++.<...>++++.<..>+++.<......>+++++++.+.<......>+++++++.<...>++++.<..>+++.<...>++++.<..>+++.+.+.<....>+++++.<..>+++.+.<..>+++.<...>++++.<..>+++.<......>+++++++.+.+.+.<......>+++++++.<...>++++.<..>+++.<...>++++.<..>+++.<......>+++++++.<...>++++.<..>+++.<...>++++.<..>+++.<......>+++++++.<.>++.+.+.+.<...>++++.+.+.<...>++++.+.+.+.<...>++++.+.+.+.+.<...>++++.+.+.+.<...>++++.+.+.<...>++++.+.+.+.+.<..>>-.

在网上试试!

作为对最终被Javascript击败的回应,我已经尽了我所能:

通过在单元格0中保存32个字节并递增单元格1来保存1字节(我最初使用它的唯一原因是OrjanJohansen指出我不能使用]时的快速修复)

减少第三个单元格(最初为0)以生成255 = -1所保存的1字节

在不使用<>的情况下打印字符31和36之间的空格所节省的2个字节,而只是在从31到33递增时在32停止从单元格0打印。

脑盘,639字节

代码语言:javascript
复制
>++++++++++++++++++++++++++++++++.<+.+.+.+.>...<++++.+.+.>...<++++.+.+.+.>...<++++.+.+.+.+.>...<++++.+.+.>....<+++++.+.+.>...<++++.>......<+++++++.+.+.+.+.+.>......<+++++++.>...<++++.>..<+++.>...<++++.>..<+++.>......<+++++++.>......<+++++++.>...<++++.>..<+++.>......<+++++++.+.>......<+++++++.>...<++++.>..<+++.>...<++++.>..<+++.+.+.>....<+++++.>..<+++.+.>..<+++.>...<++++.>..<+++.>......<+++++++.+.+.+.>......<+++++++.>...<++++.>..<+++.>...<++++.>..<+++.>......<+++++++.>...<++++.>..<+++.>...<++++.>..<+++.>......<+++++++.>.<++.+.+.+.>...<++++.+.+.>...<++++.+.+.+.>...<++++.+.+.+.+.>...<++++.+.+.+.>...<++++.+.+.>...<++++.+.+.+.+.>..<+++.

在网上试试!

首先生成数字32。然后,我们只需要增加一个单元格,并在该单元格和包含32的单元格之间切换打印。稳步增长的人数是Brainfuck做得很好的事情。

这是很好的击败Javascript与Brainfuck,这是不经常发生!

票数 6
EN

Code Golf用户

发布于 2018-11-22 07:44:07

TI-Basic (83系列),578字节

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/176327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档