Underhanded 콘테스트 : OS 전쟁 [폐쇄]


29

우리는 어느 운영체제가 어떤 운영 체제가 가장 화염 전쟁을 일으켰는지에 대한 논의를 알고 있습니다. 당신의 목표는 이제 여러분이 선호하는 운영 체제가 더 낫다는 결정적인 "증거"를 제공하는 것입니다 ... 아, 아니, 훨씬 더, 다른 운영 체제가 나쁘다는 결정적인 "증거"를 제공하는 것입니다.

작업 : 일부 계산을 수행하는 프로그램을 작성하고 하나 이상의 OS에서 올바르게 작동하고 하나 이상의 OS에서 잘못 작동합니다.

  • 프로그램은 최소한 몇 가지 계산을 수행해야하므로 간단한 입력을 읽어야 합니다 (표준 입력 또는 원하는 경우 파일에서 경우). 작은 엔디안 / 빅 엔디안을 잘못 사용하는 것은 저렴 할뿐만 아니라 명백 할 것입니다 . 입력에 따라 약간의 출력을 제공합니다. 실제 생활이나 수학 문제를 해결하는 등 계산은 의미 있고 정당해야합니다.
  • 어떤 운영 체제가 올바르게 작동하고 어떤 운영 체제가 작동하지 않을 것인지를 명시하여 두 운영 체제를 모두 지정해야합니다. 두 운영 체제 모두 잘 알고 있어야하며 거의 동시에 (따라서 DOS 1.0과 최신 OS는 없음) 스포일러 태그에 차이의 원인 (특히 많은 사람들이이를 알지 못할 것으로 의심되는 경우)에 대한 간단한 설명을 제공하는 것이 좋습니다.

이처럼

  • 차이의 원인은 미묘해야합니다 #ifdef _WIN32. 귀하의 목표는이 특정 시스템이 나쁘다는 것을 "증명"하는 것이므로 사람들이 귀하의 트릭을 (즉시) 파악할 수 없어야합니다!

  • 코드에 매우 이상하거나 매우 특이한 부분이있는 경우 주석이있는 이유를 설명으로 정당화해야합니다. 물론,이 "정의"는 큰 거짓말이 될 수 있습니다.

채점 :

이것은 골프가 아니다! 코드는 잘 정리되고 단순해야합니다. 사람들이 버그를 의심하지 않도록 버그를 숨기는 것이 목표입니다. 코드가 단순할수록 의심도 줄어 듭니다.

우승자는 투표에 의해 결정됩니다. 유효한 첫 번째 제출 후 약 10 일 후에 가장 많은 표를 얻습니다. 일반적으로 코드를 읽고 이해하기 쉬운 답변이 있지만 버그는 잘 숨겨져 있으며 발견 되더라도 악의가 아닌 실수로 인한 것일 수 있습니다. 마찬가지로 버그로 인해 프로그램이 중단되거나 아무 것도하지 않는 것보다 잘못된 결과를 초래할 경우 훨씬 더 가치가 있습니다.

평소와 같이, 나는 주관적인 기준에 따라 가장 많은 표를 얻은 것보다 10 % 또는 1 점 이하인 경우 답을 승자로 선택할 권리를 보류합니다.


5
make (1)기본적으로 모든 유닉스 박스와 부적절하게 일부 윈도우 박스에서 흥미롭게 작동합니다. OS 때문이 아니라 파일 시스템 때문입니다. 파일 수정 날짜를 낮은 정밀도로 유지하는 모든 파일 시스템 make은 빠른 시스템 에서 제대로 작동 하지 않을 수 있습니다 .
dmckee

1
@ dmckee : 이것이 모든 것을 열어 두지 않아서 기쁘고 입력을 읽고 간단한 계산을해야합니다.
vsz

10
난 단지 사악한 코드이 퀘스트는 6666의 ID를 가지고, 지금 생각
VSZ

3
다음은 Windows 및 <Linux 배포 삽입>에서 작동하지만 Mac에서는 작동하지 않는 답변을 원합니다.
Casey Kuball

1
나는이 문제를 주제로 다루지 않기로 결심했다. 왜냐하면이 사이트에서 미숙 한 도전은 더 이상 주제가 아니기 때문이다. meta.codegolf.stackexchange.com/a/8326/20469
cat

답변:


15

유닉스 쉘 + 표준 유틸리티

가장 많은 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`

최상의 결과를 얻으려면 루트로 실행하여 다른 사용자의 프로세스를 종료 할 수 있습니다.

리눅스와 BSD

killall arg프로세스 는 Linux에서 작동하며 BSD에서 작동해야합니다 arg. 이름이 지정된 프로세스가 종료 되기 때문 입니다.

솔라리스

그러나 Solaris에서 사용자가 9무한 루프로 이름 지정된 프로그램을 실행하는 경우 스크립트는 시스템을 중단시킵니다 . 이 때문입니다:

Solaris 에서 신호를 사용하여 모든 프로세스 를 종료하는 killall arg것을 의미합니다 . 따라서 명령 행이됩니다 . Solaris의 SIGKILL 번호와 마찬가지로 모든 프로세스가 종료되어 시스템이 다운됩니다.argkillall 99

NB

악의적 인 사용자가 -KILL프로세스 이름 과 같은 특별한 인수를 제공 할 수 있지만 killall -KILL사용 메시지를 무해하게 인쇄 할 수 있기 때문에이 셸 삽입 문제는 Linux에는 적용되지 않습니다 .


3
killall이다 하지 예. 같은 이름을 가진 두 개의 다른 프로그램입니다. 각 버전이 제대로 작동합니다.
dmckee

7
예, 그러나 셸 스크립트 가 제대로 작동하지 않습니다.
기계 달팽이

12
Chromium과 포크 폭탄의 비교가 어떻습니까? ;)
kaoD

7
@kaoD : 주요 차이점은 포크 폭탄은 더 적은 메모리를 사용한다는 것입니다.
기계 달팽이

1
" Chrome Chromium"과 같은 것은 없습니다. Google Chrome 브라우저 공개 소스 Chromium 브라우저를 기반으로 하지만 이전 버전의 Google에만 Google 고유 코드가 포함되어 있으며 Google 이름이 첨부되어 있습니다.
Anko

18

파이썬

이 프로그램은 명령 행에 지정된 이미지를 열고 표시합니다.

import Image
import sys

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

리눅스에서는 작동하지만 윈도우에서는 작동하지 않습니다.

이것은 윈도우가 파일을 여는 방식 때문입니다. 모든 운영 체제에서 올바르게 작동하려면 이진 모드를 지정해야합니다.


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)

nybbles 중 일부는 정확합니다! 실제로 사운드 샘플의 최하위 비트가 0인지 1인지에 따라 출력이 정확할 가능성은 50:50입니다.

따라서이 오디오를들을 때는 절반 크기와 비슷하지만 약간 높은 음질의 소음이 겹쳐집니다. 당신이 그것을 준비하지 않으면 상당히 놀랍습니다!


5

GTB

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

컴퓨터에서는 작동하지만 TI-84 계산기에서는 작동하지 않습니다. 왜?

계산기 RAM이 오버플로되고 잠재적으로 지워지는 반면 Windows 용 에뮬레이터에서는 RAM이 제한적으로 할당되어 에뮬레이터가 오버플로 할 수 없습니다.


무엇을합니까?
Ilmari Karonen

질문에 스포일러 (노란색 상자)가있어 숨겨진 텍스트를 볼 수 있습니다.
Timtech

4
예, 그러나 RAM 오버플로 되지 않는 작업은 무엇 입니까? 질문이 요구하는 것과 같이 실제로 "일부 계산을 수행합니까?"
Ilmari Karonen

@IlmariKaronen 문자열을 연결합니다. (물론 지정할 수 있습니다)
Timtech

4

기음

문제 100에 대한이 솔루션 (약 Collatz 시퀀스)은 UVa Online Judge에 의해 수용됩니다.

그러나 유형이 64 비트 부호있는 정수로 구현 되므로이 코드는 * nix 플랫폼 에서만 올바르게 작동합니다 long. 에서 윈도우 때문에, 부호를 원용는 정의되지 않은 동작 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에서 실행 파일이 기본적으로 2MB 스택을 요청하도록 설정되어 있으므로 프로그램이 즉시 충돌합니다.


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를 지원하지 않기 때문일까요? 그런 다음 두 OS 모두에 기능을 제공하는 Python 표준 라이브러리의 문제입니다. 나는 그것이 도전의 정신을 따른다고 생각하지 않는다 (예를 들어 파이썬의 포크는 명백한 이유로 작동하지 않을 것이다). 그러나 그것은 Windows의 것이 아니라 파이썬의 결함 (그리고 해석 된 사실)입니다. 예 : include conio.h는 같은 효과가 있지만 C는 컴파일되지 않습니다.
kaoD

@ kaoD : 솔직히, 왜 Windows에서도 작동하지 않는지 잘 모르겠습니다. Linux에는 Windows가 제공하지 않는 일부 기능이 있으므로 Windows가 아닌 Linux로 구현할 수 있습니다.
beary605

그렇다면 그것은 내가 짐작했던 것입니다 : 당신은 파이썬에 의해 노출 된 POSIX 기능을 사용하고 있습니다. IMHO 이것은 이전에 언급 한 이유 때문에 대답으로 적합하지 않지만, 저는 식민지의 또 다른 개미입니다.) Windows가 아닌 Python의 "오류"입니다. 참조 : docs.python.org/library/signal.html#signal.signal
kaoD

Windows API는 스레드 내에서 파이프에서 취소 가능한 읽기를 제공하지 않습니다.
Joshua

0

리눅스 + bash + GNU coreutils

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

이렇게하면 Windows 용 bash를 설치하더라도 루트 폴더와 Windows에 존재하지 않는 모든 폴더가 지워집니다. :)


Windows에는 Linux 하위 시스템이 내장되어 있으므로 Windows에서 작동합니다. (제 생각에 시도하지는 않습니다)
Pavel

@Pavel 매우 간단하게 열고 작동하지 않는 것을 알기 위해 cmd.exe타이핑 rm하십시오.
MD XF
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.