人手不足的竞赛:操作系统之战[关闭]


29

我们都知道关于哪种操作系统是最佳操作系统的讨论是如何引起大量争论的。您现在的目标是为您最喜欢的操作系统提供更好的决定性“证明” ...啊,不,要好得多,为另一个操作系统不好提供决定性的“证明”。

任务:编写一个程序,进行一些计算,并且该程序在至少一个操作系统上正确运行,而在至少一个操作系统上错误运行。

  • 程序应该至少进行一些计算,因此它必须读取一些简单的输入(最好是在标准输入上,或者如果需要的话,从文件中读取,但是滥用little endian / big endian不仅便宜,而且很明显),并根据输入提供一些输出。计算应该有意义且合理,例如解决现实生活或数学问题。
  • 您应该指定两个操作系统,说明在哪个操作系统上可以正常工作,在哪个操作系统上不能正常工作。两种操作系统都应该是众所周知的,并且应该是大致相同的时间(因此,没有DOS 1.0与现代OS)。建议在扰流板标签中提供引起差异的原因的简短说明(尤其是如果您怀疑很多人不会意识到这一点)。

像这样

  • 造成差异的原因必须是微妙的,所以#ifdef _WIN32请不要或相似!请记住,您的目标是“证明”该特定系统不好,因此人们不应(立即)发现您的把戏!

  • 如果您的代码中有一个非常奇怪或非常不寻常的部分,则必须在注释中说明原因。当然,这种“合理性”可以是/将是一个大谎言。

得分:

这不是高尔夫!该代码应井井有条,并保持简单。请记住,您的目标是将错误隐藏在其中,以使人们不会怀疑它。代码越简单,可疑程度就越小。

获胜者将由投票决定。第一次有效提交后约10天后,得票最多。通常,应该对答案易于理解和理解的代码进行表决,这些答案应该易于阅读和理解,而漏洞却被很好地隐藏,即使被发现,也可以将其归因于错误而不是恶意。同样,如果该错误仅导致错误的结果,而不是仅导致程序崩溃或不执行任何操作,那么它的价值应该更高。

与往常一样,如果在任何主观标准上,我的答案都没有选择,则该答案应不超过最多投票者的答案低10%或1点。


5
有趣的make (1)是,基本上每个unix框都正确运行,而某些Windows框则不正确。不是因为操作系统,而是因为文件系统。任何使文件修改日期保持较低精度的文件系统都可能无法make在快速计算机上正常运行。
dmckee 2012年

1
@dmckee:这就是为什么我很高兴我没有将所有内容都打开的原因,而您必须阅读一些输入并进行一些简单的计算。
vsz 2012年

10
我现在才知道,这个寻求邪恶代码的ID为6666
vsz 2012年

3
这是希望找到一个适用于Windows和<Insert Linux Distribution>而不适用​​于Mac的答案。
凯西·库伯

1
我投票结束这个问题是不合时宜的,因为在这个网站上,不熟练的挑战已不再是正题。meta.codegolf.stackexchange.com/a/8326/20469

Answers:


15

Unix Shell +标准实用程序

让我们编写一个Shell脚本,该脚本查找占用CPU时间最多的进程(任何用户所拥有的进程),并杀死具有相同名称的所有进程。我想这算作是从系统中读取数据并进行计算。(这种行为对于派生许多进程的进程(例如派生炸弹和Google Chromium)很有用。)

以下方法应该是一种可移植的方法,以便以最大的CPU时间获得进程的名称(我试图避免明显的Linuxism,但尚未在Solaris上对其进行测试):

ps -A -o time= -o comm= | sort | tail -n 1 | cut -d ' ' -f 2

所以我们的脚本很简单

killall `ps -A -o time= -o comm= | sort | tail -n 1 | cut -d ' ' -f 2`

以root身份运行以获得最佳结果,以便它可以杀死其他用户的进程。

Linux和BSD

这可以在Linux上运行,并且应该在BSD上运行,因为会killall arg杀死名为arg

的Solaris

但是,在Solaris上,如果用户恰巧正在运行9无限循环中命名的程序,则脚本将关闭系统。这是因为:

在Solaris上,killall arg意味着用信号杀死所有进程arg。因此,命令行变为killall 9。正如9Solaris上SIGKILL的编号一样,这将终止所有进程,从而导致系统瘫痪。

NB

此外壳程序注入问题在Linux上不适用,因为即使恶意用户可以提供一些特殊的参数(例如-KILL进程名),它们killall -KILL也会无害地打印用法消息。


3
killall不是一个例子。只是两个不同的程序具有相同的名称。每个版本均正常运行。
dmckee,2012年

7
是的,但是shell脚本无法正常工作。
机械蜗牛

12
您是否注意到铬炸弹和叉子炸弹的可比性?;)
kaoD

7
@kaoD:关键区别在于前叉炸弹使用的内存更少。
机械蜗牛

1
只是指出,有作为“谷歌铬”没有这样的事:在谷歌的Chrome浏览器基于开源的Chromium浏览器,但只有前者包含谷歌特有的代码,并有谷歌的名字命名。
Anko 2014年

18

蟒蛇

该程序将打开在命令行上指定的图像并显示它。

import Image
import sys

with open(sys.argv[1]) as f:
    im = Image.open(f)
    im.show()

在Linux上有效,在Windows上无效。

这是由于Windows打开文件的方式引起的。必须指定二进制模式才能在所有操作系统上正常工作。


4
该程序应进行一些计算并显示结果。在特定的操作系统上,它还应该显示一些结果,但结果不正确。是的,通过一些巧妙的文字游戏,您可能会争辩说这正是您的程序正在执行的操作,但是我认为这是对规则的故意误解。但是,最终由选民决定。
vsz 2012年

5

小端(Intel x86)与大端(IBM Power7)

具有非主机顺序的多字节二进制数量的任何文件格式都有被误解的风险。这是一个获取原始音频的函数,例如从WAV文件(Microsoft Little Endian文件格式)中提取的原始音频,将振幅减半并输出衰减的音频。

#include <stdio.h>

int main()
{
    short audio;
    while (fread(&audio, sizeof(short), 1, stdin))
    {
        audio >>= 1;
        fwrite(&audio, sizeof(short), 1, stdout);
    }
    return 0;
}

在小型字节序计算机中,这很好用,但是在大型字节序计算机中,这是一场灾难。例如

01001101 11001110 -> CE4D (little endian format)

在小尾数上向右移动:

00100110 01100111 -> 8726 (correct)

在大字节序上右移:

00100110 11100111 -> E726 (not correct)

请注意,某些节是正确的!实际上,根据声音样本的最低有效位是0还是1,输出正确的几率是50:50!

因此,当您收听此音频时,它就像是半振幅,但有些刺耳的高音调噪声叠加了。如果您不为此做好准备,那将是非常惊人的!


5

GTB

:"-→_[_+_→_]

在计算机上可以使用,但在我的TI-84计算器上则不能。为什么?

在计算器上,RAM溢出并可能被清除,而在Windows仿真器上,由于分配有限,RAM无法被仿真器溢出。


它有什么作用?
Ilmari Karonen 2014年

问题中有一个扰流板(黄色框),您可以将鼠标悬停在上面以查看隐藏的文本。
Timtech,2014年

4
是的,但是RAM 没有溢出怎么办?它实际上是否像问题所要求的那样“进行了一些计算”,如果需要,是什么?
Ilmari Karonen 2014年

@IlmariKaronen它只是连接字符串。(您可以指定,当然)
Timtech

4

C

UVa在线法官接受了问题100(关于Collat​​z序列)的解决方案。

但是,此代码仅在* nix平台上正确运行,因为longtype被实现为64位带符号整数。在Windows上,该代码调用未定义的行为,因为longtype是用32位带符号整数实现的,而cyc()函数中的中间值之一至少需要32位才能表示。

#include <stdio.h>

#define swap(a, b, t) t __tmp__ = a; a = b; b = __tmp__;
#define M 1000000

short l[M] = {0, 1};

int cyc(long n) { // HERE
    if (n < M && l[n]) return l[n];
    n = n & 0x1 ? 3 * n + 1 : n >> 1;
    return n < M ? (l[n] = cyc(n)) + 1 : cyc(n) + 1;
}

int max(int a, int b) { return a > b ? a : b; }

int main() {
    #ifndef ONLINE_JUDGE
    // freopen("input.txt", "r", stdin);
    #endif
    int i, j, m;
    while (scanf("%d %d", &i, &j) == 2) {
          printf("%d %d ", i, j);
          if (i > j) { swap(i, j, int); }
          for (m = 0; i <= j; i++)
              m = max(m, cyc(i));
          printf("%d\n", m);
    }

    return 0;
}

使这种情况进一​​步不兼容的另一种方法是将数组l放入内部main()并对cyc()函数进行相应的更改。由于在Windows上默认情况下将可执行文件设置为请求2 MB堆栈,因此该程序立即崩溃。


2

蟒蛇

寻找输入超时时,我在StackOverflow上遇到了这个问题。

 import signal 
 TIMEOUT = 5

 def interrupted(signum, frame): 
     print 'interrupted!' 
 signal.signal(signal.SIGALRM, interrupted) 

 def input(): 
     try: 
         print 'You have 5 seconds to type in your stuff...' 
         foo = raw_input() 
         return foo 
     except: 
         return

 signal.alarm(TIMEOUT) 
 s = input()
 signal.alarm(0) 
 print 'You typed', s 

这不适用于Windows。


为什么这在Windows中不起作用?我猜对了是因为Windows不支持POSIX SIG吗?然后,只需将Python的标准库向两个操作系统公开功能即可。我不认为这符合挑战的精神(例如,出于明显的原因,Python的fork不能使用),但这是Python的缺陷(加上被解释的事实),而不是Windows。例如:包含conio.h将具有相同的效果,但是C甚至不会编译。
kaoD 2012年

@kaoD:老实说,我不确定为什么它在Windows中也不起作用。也许Linux具有Windows所没有的一些功能,因此可以在Linux中而不是Windows中实现。
beary605

这就是我的猜测:您正在使用Python公开的POSIX功能。恕我直言,由于前面提到的原因,这不适合作为答案,但是,嘿,我只是该殖民地的另一只蚂蚁;)您看到的是Python的“故障”,而不是Windows。看到这个:docs.python.org/library/signal.html#signal.signal
kaoD 2012年

Windows API不提供从线程内对管道的可取消读取。
约书亚

0

Linux + bash + GNU coreutils

rm --no-preserve-root -R -dir /

即使您为Windows安装bash,这也会清除根文件夹以及Windows中不存在的所有内容:)


由于Windows内置了Linux子系统,因此可以在Windows上运行。(我想,请不要尝试)
Pavel

@Pavel打开起来很简单,cmd.exe然后键入rm以查看它是否无效。
MD XF
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.