劣悪なコンテスト:OS戦争[終了]


29

どのオペレーティングシステムが最適なオペレーティングシステムであるかについての議論がどのように多くの火炎戦争を引き起こしたかは誰もが知っています。あなたの目標は、お気に入りのオペレーティングシステムが優れていることの決定的な「証拠」を提供することです...別のオペレーティングシステムが悪いことの決定的な「証拠」を提供することです。

タスク:いくつかの計算を行うプログラムを作成します。少なくとも1つのOSでは正しく動作し、少なくとも別のOSでは正しく動作しません。

  • プログラムが何をすべき少なくともいくつかの計算、それはいくつかの簡単な入力を読み取ることがあるので、(あなたがしたい場合、または場合は、ファイルから、好ましくは、標準入力ではなく、リトルエンディアン/ビッグエンディアンを悪用すると、安いだけでなく、明白ではありません)、入力に応じて出力を提供します。計算は意味があり、正当化されている必要があります。たとえば、現実の生活や数学の問題を解決します。
  • どちらが正しく動作するか、どちらが動作しないかを指定して、両方のオペレーティングシステムを指定する必要があります。両方のオペレーティングシステムがよく知られている必要があり、ほぼ同時に(つまり、DOS 1.0と最新のOSの違いはありません)。スポイラータグで、違いの原因に関する短い説明を提供することをお勧めします(特に多くの人が気づかないと思われる場合)。

このような

  • 違いの原因は微妙でなければならないので、そうでない#ifdef _WIN32か類似してください!覚えておいて、あなたの目標は、この特定のシステムが悪いことを「証明」することなので、人々はあなたのトリックを(すぐに)見つけることができないはずです!

  • コードに非常に奇妙なまたは非常に珍しい部分がある場合は、コメントの中でそれが存在する理由を正当化する必要があります。もちろん、この「正当化」は大きな嘘になる可能性があります。

得点:

これはゴルフではありません!コードはよく整理され、シンプルに保たれるべきです。覚えておいてください、あなたの目標は、人々がそれを疑わないようにバグを隠すことです。コードが単純であるほど、疑いは少なくなります。

勝者は投票によって決定されます。最初の有効な提出が勝った後、約10日後に最も投票します。一般に、コードは読みやすく、理解しやすいが、バグは十分に隠されており、発見されたとしても、悪意ではなく間違いに起因する回答は、投票する必要があります。同様に、プログラムがクラッシュしたり、何もしないだけでなく、バ​​グが間違った結果を引き起こすだけの場合は、さらに価値があるはずです。

いつものように、主観的な基準で、投票数が10%以下または投票数が1ポイント以下の場合、勝者として回答を選択する権利を保留します。


5
おもしろいmake (1)ことに、本質的にすべてのUNIXボックスと一部のWindowsボックスで正しく動作します。OSのせいではなく、ファイルシステムのせいです。ファイルの変更日を低精度に保つファイルシステムmakeは、高速マシンでは適切に失敗する可能性があります。
dmckee

1
@dmckee:これが、私がすべてを開いたままにしていないことを嬉しく思っている理由です。入力を読んで、簡単な計算をする必要があります。
-vsz

10
この悪のコードの探求のIDは6666
vsz

3
ここでは、Windowsと<Linuxディストリビューションの挿入>で機能するが、Macでは機能しない回答を期待しています。
ケーシークーボール

1
このサイトでは、人手不足の課題がトピックではなくなったため、この質問をトピック外として終了することに投票しています。meta.codegolf.stackexchange.com/a/8326/20469
cat

回答:


15

Unixシェル+標準ユーティリティ

CPU時間を最も多く使用したプロセス(任意のユーザーが所有)を検出し、同じ名前のすべてのプロセスを強制終了するシェルスクリプトを作成しましょう。私はそれが(システムからの)データの読み込みと計算の実行としてカウントされると思います。(この動作は、フォーク爆弾やGoogle Chromiumなど、多くのプロセスを分岐するプロセスに役立つ可能性があります。)

以下は、最大のCPU時間でプロセスの名前を取得するための移植可能な方法である必要があります(明らかなLinux主義を避けようとしましたが、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`

最良の結果を得るにはルートとして実行し、他のユーザーからのプロセスを強制終了できるようにします。

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例ではありません。同じ名前の2つの異なるプログラム。各バージョンは正常に動作しています。
dmckee

7
はい。ただし、シェルスクリプトは正常に動作していません。
機械式カタツムリ

12
Chromiumとフォークの爆弾がどのように匹敵するかに気づきましたか?;)
kaoD

7
@kaoD:主な違いは、フォーク爆弾が使用するメモリが少ないことです。
機械式カタツムリ14年

1
「Google Chromium」のようなものがないことに注意してください:Google ChromeブラウザーオープンソースのChromiumブラウザーに基づいていますが、前者のみがGoogle固有のコードを含み、Googleの名前が添付されています。
アンコ

18

Python

このプログラムは、コマンドラインで指定されたイメージを開き、表示します。

import Image
import sys

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

Linuxでは動作しますが、Windowsでは動作しません。

これは、Windowsがファイルを開く方法が原因です。これをすべてのオペレーティングシステムで正常に動作させるには、バイナリモードを指定する必要があります。


4
プログラムはいくつかの計算を行い、結果を表示する必要があります。特定のオペレーティングシステムでは、いくつかの結果が表示されるはずですが、誤った結果が表示されます。はい、いくつかの巧妙な言葉遣いで、これはまさにあなたのプログラムがしていることだと主張することができますが、私はそれが規則の意図的な誤解だと思います。ただし、最終的には、投票者が決定します。
-vsz

5

リトルエンディアン(Intel x86)とビッグエンディアン(IBM Power7)

ホスト以外の順序でマルチバイトのバイナリ量があるファイル形式は、誤解されるリスクがあります。これは、WAVファイル(Microsoftリトルエンディアンファイル形式)から抽出された生のオーディオを取り、振幅を半分にして、減衰したオーディオを出力する関数です。

#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をオーバーフローさせることはできません。


それは何をするためのものか?
イルマリカロネン14年

質問にはネタバレ(黄色のボックス)があり、マウスをかざすと非表示のテキストが表示されます。
ティムテック14年

4
はい、しかしRAM オーバーフローしないことは何をしますか?質問が求めるように、実際に「何らかの計算を行う」のですか?
イルマリカロネン14年

@IlmariKaronen文字列を連結するだけです。(もちろん指定できます)
ティムテック14年

4

C

問題100(コラッツシーケンスについて)のこの解決策は、UVaオンラインジャッジによって受け入れられています。

ただし、タイプは64ビット符号付き整数として実装されているため、このコードは* nixプラットフォームでのみ正しく機能しlongます。上でWindowsのため、コード呼び出すは、動作は未定義longで中間値のいずれながらタイプは、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

Python

入力タイムアウトを探しているときに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をサポートしていないためだと思いますか?それは、両方のOSに機能を公開するPythonの標準ライブラリの問題です。私はそれが挑戦の精神に従うとは思わない(例えば、Pythonのフォークは明白な理由でも機能しない)が、それはPythonの欠陥(および解釈されるという事実)であり、Windowsではない。たとえばconio.h、インクルードは同じ効果がありますが、Cはコンパイルしません。
kaoD

@kaoD:正直なところ、なぜWindowsでも動作しないのかわかりません。LinuxにはWindowsにはない機能がいくつかあるので、これはWindowsではなくLinuxに実装できます。
beary605

それは私が推測したものです:あなたはPythonによって公開されたPOSIX機能を使用しています。私見これは前述の理由のために答えとしては適合しませんが、ちょっと、私はコロニーの別のアリです;)あなたが見るのは、WindowsではなくPythonの「欠陥」です。これを参照してください:docs.python.org/library/signal.html#signal.signal
kaoD

Windows APIは、スレッド内からのパイプでキャンセル可能な読み取りを提供しません。
ジョシュア

0

Linux + bash + GNU coreutils

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

これにより、Windows用のbashをインストールした場合でも、ルートフォルダーと、Windowsに存在しないルートフォルダー内のすべてが消去されます。


Windows上のこの作品は、現在のWindowsはLinuxのサブシステムが組み込まれたことを(私が思うに、それをしようとしません)。
パベル

@Pavel開いてcmd.exe入力rmするのは非常に簡単で、機能しないことがわかります。
MD XF
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.