制作100个字符以内最有用的程序[关闭]


13

在此任务中,您可以制作一个有用的程序,以执行可以在100个字符内编写的任何事情。您可以使用更少的字符,但不能更多。

规则,只是为了防止不再有趣的标准漏洞:

  1. 除非确实需要,否则您的程序无法访问Internet。例如,在该网站上显示最高评分问题的程序可以使用Internet来检查该问题。但是,不允许浏览Internet来查找其真正来源并运行它。

  2. 您的程序不能是该语言的解释器。但是,使用非Brainfuck语言的Brainfuck解释器可以。

  3. 您的程序无法执行与您的程序完全相同的外部程序。例如,您不能运行vim,并声称您的程序是vim实现。

  4. 您的程序对于在其上运行的计算机和其他计算机不会造成危险。您不允许编写类似rmdir /的程序(此处的示例有意不起作用,请不要对其进行修复),并声称它是删除计算机上所有文件的有用程序。

  5. 您的程序可能会变慢,并且会使用所需的大量资源,只要您可以证明它能够完成预期的工作即可。

  6. 不允许您专门为此任务设计语言。但是,您可以使用其他某种编程语言来为自己的发明语言做翻译。


我可以为此竞赛发布多个答案吗?
TrungDQ 2014年

@TrungDQ:好的。
Konrad Borowski

1
这必须是迄今为止最好的问题之一;)
Timtech,2014年

13
即使对于像这样的网站,甚至对于人气竞赛来说,这种方式都太开放了。从字面上看,任何答案都是有效的,没有任何参考框架可用于比较它们。
2014年

3
这个问题吞噬了代码高尔夫。有趣的100个字符构想应该可以改写为伟大的代码金问题。我鼓励回答者多花一些时间将他们的答案变成新的问题。
gnibbler 2014年

Answers:


26

C-47个字节

下面的程序输出人类历史上曾经写过的每个文档,以及将要写出的每个文档和许多人类都不会想出的有趣的文本(以及之间的“一点点”垃圾)。给它一些时间。而且,每次您运行它时,它将首先输出不同的文本!如果没有用!(而且所有字符数限制在一半以内!)

main(){srand(time(0));while(1)putchar(rand());}

如果您不关心每次输出其他内容,则只需要41个字节即可

main(){srand(0);while(1)putchar(rand());}

不太符合C99标准,但可以使用顺利编译gcc.exe (GCC) 4.7.0 20111220

规则说明

您的程序可能会变慢,并且会使用所需的大量资源,只要您可以证明它能够完成预期的工作即可。

没问题。

有些东西,这个程序会输出:

  • 每个千禧年问题的解决方案
  • 明天的报纸文章
  • 莎士比亚全集(当然)
  • 你最黑暗的秘密
  • 该问题的所有其他答案

并非如此,因为(正如评论中正确提到的ace一样),rand()只是一个伪随机生成器,它会在某个时间点回绕-可能为时过早,无法生成许多有意义的文本。但是我怀疑从一个真实的(硬件)随机数生成器获取数据是否可以在100个字符之内实现。不过,我会把它留在这里玩。

如Dennis所述,通过使用rand()^rand()>>16代替,可以稍微改善算法的随机性(在字符限制内)rand()


10
不必要。rand()只是伪随机-在循环之前它可能不会产生任何有用的文本。
user12205 2014年

1
幸运的是,@ Dennis仍在此问题的规则范围内!:)
Martin Ender 2014年

1
@ m.buettner:使用GLIBC的rand(),程序输出字节之间存在一个简单的代数关系:将输出作为数组查看x,您有x[i] == (x[i - 3] + x[i - 31] + c[i]) % 256,其中c[i]0的概率为0.75,1的概率为0.25。这几乎意味着它无法生成您提到的任何内容。
丹尼斯

1
@ m.buettner:不会使PRNG更好,但是您可以使用rand()^rand()>>16代替plain 来删除线性rand()。如果您正在寻找节省字节数的方法,请删除int%256
丹尼斯


18

BBC BASIC,84个字符

MODE 6:INPUT T,A,B,A$,B$:FOR X=0 TO 1279:A=A+EVAL(A$):B=B+EVAL(B$):DRAW X,A+500:NEXT

绘制一阶和二阶微分方程的解。

作为用户输入:

Title (does nothing)
Start value for A (plotted value)
Start value for B (not plotted)
Expression for dA/dX
Expression for dB/dX

受名为Polymath的微分方程求解软件的启发,我在学习化学工程师时就使用了该软件。我们将为反应物和产物输入不同的方程式,并查看整个反应系统如何随时间变化。一个非常简单的软件(没有比这复杂得多),但为此目的,它比Excel方便得多。不幸的是,我无法完全复制100个字符的Polymath。

在此处输入图片说明


10

Mathematica 76

此程序构造一个applet,该applet显示有关240个国家中的任何国家的各种属性的信息。首先打开有关阿富汗成年人口的信息。用户可以通过下拉列表更改国家和地区设置。

Mathematica与WolframAlpha可以流畅地互操作。
因此,我认为提交的内容满足挑战的要求#1:“您的程序无法访问Internet,除非确实需要 ”。

这个相当适度的applet只是利用Mathematica语言中的现有功能。一段简短的视频提供了有关applet的一些其他信息。

d = CountryData; Manipulate[WolframAlpha[p <> " " <> c], {p, d["Properties"]}, {c, d[]}]

α


以下是与国家有关的(在223个中)前20个属性的列表。通过额外的编程,您可以获取有关国家的其他信息,并在Mathematica中分析此信息。

CountryData["Properties"][[;; 20]]

{“成人人口”,“农产品”,“农业增值”,“机场”,“替代名称”,“替代标准名称”,“ AMRadioStations”,“年度出生”,“ AnnualDeaths”,“ AnnualHIVAIDSDeaths”,“ ArableLandArea”,“ ArableLandArea”,“区域”,“ BirthRateFraction”,“ BorderingCountries”,“ BordersLengths”,“ BoundaryLength”,“ CallingCode”,“ CapitalCity”,“ CapitalLocation”}


我看不到您的程序如何“访问”互联网。您提供的数据不会经常更改,而需要依靠外部资源。
shiona 2014年

1
消息来源是内部还是外部都存在争议。我正在考虑对WolframAlpha的信息请求(代码确实使)成为(必要)“访问互联网”的一种情况,即使该代码直接咨询Wolfram数据服务器并且不需要使用浏览器也是如此。就像FireFox。它确实需要拥有网络或WIFI连接
DavidC 2014年

1
如果可以的话,则返回-1 -这只是从现有服务中删减了一个数据结构。
l0b0

@ l0b0我想你可以那样看。或者您可能会说它利用了语言的功能。毕竟,WolframAlpha的设计完全是为了与Mathematica进行互操作。
DavidC

1
WolframAlpha中的信息是Mathematica的组成部分,而Wolfram语言 ”则是一种相当令人震惊的状况。那必须使它成为现有的最不稳定的编程语言。
彼得·泰勒

9

bash,100字节

head -c${1--1} /dev/zero |
openssl enc -aes-128-ctr -pass file:/dev/random 2>/dev/null |
tail -c+17

该脚本输出加密的字节安全流。它带有一个可选参数,用于指定应打印的字节数。默认情况下,输出将是无限的。

在读取/dev/urandom速度太慢的情况下很有用。

基准测试

$ time head -c 1G /dev/urandom > /dev/null
Real    59.75
User    0.03
Sys     59.68
$ time random 1G > /dev/null
Real    0.68
User    0.64
Sys     0.86

此脚本在我的i7-3770上每秒生成高达1.5 GiB的速度。

相比之下,读取操作每分钟/dev/urandom几乎不会产生1 GiB的数据。

怎么运行的

  • head -c${1--1} /dev/zero输出指定数量的零字节。如果未指定任何数量,则${1--1}等于-1,并且head输出无限数量。

  • openssl enc -aes-128-ctr -pass file:/dev/random在计数器模式下使用AES-128加密零字节,从中读取密码/dev/random

  • tail -c+17 摆脱输出的16字节标头。


请注意,可以通过查看前2 ^ 68个输出字节将此流与“实际”随机流区分开(实际随机流应在其中具有重复的块,而不会)。
圣保罗Ebermann

@PaŭloEbermann:你显然是对的。再说一次,要在我的机器上生成那么多字节将需要6000多年的时间……
丹尼斯

7

Java脚本

解任何方程式(不是所有方程式,但应与通用函数一起使用...)

r=s=>{for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

没有ES6(105个字符):

function r(s){for(x=e=a=1e-7;a;x-=e*a/(eval(s.replace(/x/g,x+e))-a))a=eval(s.replace(/x/g,x));return x}

假设右边为零,只需给出方程式的左边即可。

范例:

  • r("x*x-9") 退货 3
  • r("Math.sin(x)-1")返回1.5707963394347828(pi / 2)
  • r("Math.pow(2,x)-512") 退货 9

警告:可能在某些功能上有所不同(或者如果没有解决方案),并冻结浏览器选项卡,或返回NaN。


6

C-99个字符

i;main(int c,char**a){for(a+=2;1+(c=getchar());)putchar(c+(**(a-1)-69?1:-1)**(*a+i++%strlen(*a)));}

该程序允许对任何类型的数据进行加密和解密。

用法

首先...编译!

gcc crypto.c crypto

如果您想mypreciousdata.txt使用密钥加密的内容mysecretkey,并将结果存储在myprotecteddata.txt

cat mypreciousdata.txt | ./crypto E mysecretkey > myprotecteddata.txt

现在,如果您要检索的解码内容myprotecteddata.txt

cat myprotecteddata.txt | ./crypto D mysecretkey > mypreciousdata.txt

钥匙越长,越安全!

说明

请在下面找到展开和注释的代码:

int main(int argc, char** argv)
{   
    // retrieve the first argument passed to the program (action)
    char action = argv[1][0];

    // retrieve the second argument passed to the program (key)
    char* key = argv[2];

    // initialize character position in the key
    int i = 0;

    // initialize the current input character
    char c = 0;

    // loop until we reach the end of input
    while (c != -1){
        // get a character from stdin
        c = getchar();
        if (action == 'E'){
            // encode the current character
            putchar(c + key[i]);
        } else{
            // decode the current character
            putchar(c - key[i]);
        }
        // increment the position in the key, without overflow
        i = (i + 1) % strlen(key);
    }
}

这是Vigenère密码的一种变体,适用于您所用大小的字母char(通常为256)。
圣保罗Ebermann

5

高尔夫脚本

我设法将其压缩为100个字符!

{{}/]{97-}%}:b~:|;"etaoinshrdlcumwfgypbvkjxqz"b:f,:&,{:x[|{&x-+&%f?}%{+}*\]}%$0=1=:x|{&x-+&%97+}%''+

它接受ROT-n加密文本的输入,并输出解码后的文本。(取自此处。)例如,给定输入时pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom,输出为8hellopeopleofprogrammingpuzzlescodegolfstackexchange


5

的JavaScript

在javascript中生成唯一ID
Math.random().toString(30).slice(2);

产生类似: 'h9d2f4aniimma7h1d3pbffi0foi8d3mf'

30-32个字母数字字符的字符串

Math.random().toString(36).slice(2)

产生类似: 'uq2sze67hsacq5mi'

长度为14-16的字符串。



3

Fortran-85字节

l=0;read(*,*)n;do while(n>0);i=mod(n,10);l=l+i;n=n/10;enddo;print*,"digit sum=",l;end

读取数字并打印出数字总和。对于欧拉计划问题很有用。


这对项目Euler问题有什么帮助?
圣保罗Ebermann

@PaŭloEbermann:也许我应该在Euler项目之前添加“一些”字样。我肯定知道问题16、20和119使用的数字总和,不确定其他数字,但是他们的许多问题都不需要这一数字。
Kyle
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.