अंडरहैंड प्रतियोगिता: ओएस युद्ध [बंद]


29

हम सभी जानते हैं कि किस तरह की चर्चा सबसे अच्छा ऑपरेटिंग सिस्टम है, जिसने बहुत सारे लौ-युद्ध किए। आपका लक्ष्य अब यह है कि निर्णायक "प्रमाण" प्रदान करने के लिए कि आपका पसंदीदा ऑपरेटिंग सिस्टम बेहतर है ... आह, नहीं, बहुत बेहतर, निर्णायक "सबूत" प्रदान करने के लिए कि एक और ऑपरेटिंग सिस्टम खराब है।

कार्य: एक कार्यक्रम लिखें, जो कुछ गणना करता है, और यह कम से कम एक ओएस पर सही ढंग से काम करता है और गलत तरीके से कम से कम एक दूसरे पर।

  • कार्यक्रम करना चाहिए कम से कम कुछ गणना, तो यह कुछ सरल इनपुट को पढ़ने के लिए है (अगर आप चाहते हैं बेहतर मानक इनपुट पर, या फाइलों से है, लेकिन बहुत कम endian / बड़ा endian का दुरुपयोग ही सस्ते, लेकिन यह भी स्पष्ट नहीं होगा) , और इनपुट के आधार पर कुछ आउटपुट प्रदान करते हैं। गणना सार्थक और उचित होनी चाहिए, उदाहरण के लिए वास्तविक जीवन या गणितीय समस्या को हल करना।
  • आपको यह बताते हुए दोनों ऑपरेटिंग सिस्टम को निर्दिष्ट करना चाहिए, जिस पर यह सही ढंग से काम करेगा और जिस पर यह नहीं होगा। दोनों ऑपरेटिंग सिस्टम को अच्छी तरह से जाना जाना चाहिए, और लगभग उसी समय (इसलिए कोई डॉस 1.0 बनाम एक आधुनिक ओएस)। स्पॉइलर टैग में अंतर के कारण के बारे में एक संक्षिप्त विवरण प्रदान करने की सलाह दी जाती है (विशेषकर यदि आपको संदेह है कि बहुत से लोग इसे महसूस नहीं करेंगे)।

इस तरह

  • अंतर का कारण सूक्ष्म होना है, इसलिए कोई #ifdef _WIN32या समान नहीं, कृपया! याद रखें, आपका लक्ष्य "साबित" करना है कि यह विशिष्ट प्रणाली खराब है, इसलिए लोगों को आपकी चाल के लिए (तुरंत) सक्षम नहीं होना चाहिए!

  • यदि आपके कोड में कोई बहुत ही अजीब या बहुत ही असामान्य हिस्सा है, तो आपको इसे टिप्पणियों में औचित्य देना होगा कि यह वहां क्यों है। बेशक, यह "औचित्य" एक बड़ा झूठ हो सकता है।

स्कोरिंग:

यह एक गोल्फ नहीं है! कोड को अच्छी तरह से व्यवस्थित किया जाना चाहिए, और सरल रखा जाना चाहिए। याद रखें, आपका लक्ष्य इसमें एक बग छिपाना है ताकि लोगों को इस पर संदेह न हो। कोड जितना सरल होगा, उतना कम संदिग्ध होगा।

विजेता का फैसला वोटों से होगा। पहले वैध जमा करने के लगभग 10 दिनों के बाद सबसे अधिक वोट मिले। आम तौर पर, जवाब जहां कोड को पढ़ना और समझना आसान है, फिर भी बग अच्छी तरह से छिपा हुआ है, और यहां तक ​​कि अगर खोज की जाती है, तो दुर्भावना के बजाय गलती के लिए जिम्मेदार ठहराया जा सकता है, मतदान किया जाना चाहिए। इसी तरह, यह बहुत अधिक मूल्य का होना चाहिए अगर बग सिर्फ गलत परिणाम का कारण बनता है, बजाय इसके कि प्रोग्राम क्रैश हो जाए या कुछ भी न करें।

हमेशा की तरह, मैं विजेता के रूप में एक जवाब चुनने के अधिकार को रोक देता हूं यदि यह किसी भी व्यक्तिपरक मानदंडों पर सबसे अधिक मतों के साथ 10% या 1 अंक से अधिक नहीं है।


5
दिलचस्प make (1)रूप से अनिवार्य रूप से हर यूनिक्स बॉक्स पर ठीक से काम करता है और अनुचित रूप से कुछ विंडोज़ बॉक्स। OSes के कारण नहीं, बल्कि फाइल सिस्टम के कारण। कोई भी फाइलसिस्टम जो फाइल मॉडिफिकेशन की तारीखों को कम सटीकता के साथ रखता makeहै, तेजी से मशीन पर ठीक से विफल हो सकता है ।
dmckee

1
@ डमकी: यही कारण है कि मुझे खुशी है कि मैंने सब कुछ खुला नहीं छोड़ा, और आपको कुछ इनपुट में पढ़ना होगा और कुछ सरल गणनाएँ करनी होंगी।

10
मुझे केवल अब यह पता चला है, कि बुराई कोड की इस खोज में 6666 की आईडी है
vsz

3
यहां एक जवाब की उम्मीद है जो विंडोज और <सम्मिलित लिनक्स वितरण> पर काम करता है, लेकिन मैक पर नहीं।
केसी कुबूल

1
मैं इस प्रश्न को ऑफ-टॉपिक के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि इस साइट पर अंडरहैंड चुनौतियां अब विषय पर नहीं हैं। meta.codegolf.stackexchange.com/a/8326/20469
बिल्ली

जवाबों:


15

यूनिक्स खोल + मानक उपयोगिताओं

आइए एक शेल स्क्रिप्ट लिखते हैं जो प्रक्रिया (किसी भी उपयोगकर्ता के स्वामित्व में) को ढूंढती है जिसने सबसे अधिक सीपीयू समय का उपयोग किया है, और एक ही नाम से सभी प्रक्रियाओं को मारता है। मुझे लगता है कि डेटा (सिस्टम से) में पढ़ने और गणना करने के रूप में गिना जाता है। (यह व्यवहार उन प्रक्रियाओं के लिए उपयोगी हो सकता है जो कई प्रक्रियाओं को बंद कर देती हैं, जैसे कि कांटा बम और Google क्रोमियम।)

निम्न 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`

सर्वोत्तम परिणामों के लिए रूट के रूप में चलाएं, ताकि यह अन्य उपयोगकर्ताओं से प्रक्रियाओं को मार सके।

लिनक्स और बीएसडी

यह लिनक्स पर काम करता है और बीएसडी पर काम करना चाहिए, क्योंकि killall argनामित प्रक्रियाओं को मारता है arg

सोलारिस

हालांकि, सोलारिस पर, यदि कोई उपयोगकर्ता 9अनंत लूप में नाम से एक प्रोग्राम चला रहा है , तो स्क्रिप्ट सिस्टम को नीचे लाएगा । यह है क्योंकि:

सोलारिस पर, संकेत के साथ सभी प्रक्रियाओंkillall arg को मारने का मतलब है arg। तो कमांड लाइन बन जाती है killall 9। जैसा कि 9सोलारिस पर SIGKILL के लिए संख्या है , यह सभी प्रक्रियाओं को मार देगा और इस तरह सिस्टम को नीचे लाएगा।

एनबी

यह शेल इंजेक्शन मुद्दा लिनक्स पर लागू नहीं होता है, क्योंकि भले ही दुर्भावनापूर्ण उपयोगकर्ता कुछ विशेष तर्क जैसे -KILLकि एक प्रक्रिया नाम के रूप में आपूर्ति कर सकता है , killall -KILLहानिरहित रूप से एक उपयोग संदेश प्रिंट कर सकता है।


3
killallहै एक उदाहरण। कि सिर्फ दो अलग-अलग कार्यक्रम एक ही नाम के साथ। प्रत्येक संस्करण ठीक से काम कर रहा है।
dmckee

7
हां, लेकिन शेल स्क्रिप्ट ठीक से काम नहीं कर रही है।
मेकैनिकल घोंघा

12
क्या आपने देखा कि क्रोमियम और फोर्क बम कैसे तुलनीय हैं? ;)
काओड

7
@kaoD: महत्वपूर्ण अंतर यह है कि कांटा बम कम मेमोरी का उपयोग करते हैं।
मैकेनिकल घोंघा

1
बस ध्यान देने योग्य बात ऐसी कोई बात के रूप में "गूगल क्रोमियम" बात यह है कि: गूगल क्रोम ब्राउज़र है खुला स्रोत के आधार पर क्रोमियम ब्राउज़र है, लेकिन केवल पूर्व गूगल विशिष्ट कोड होता है और गूगल के नाम संलग्न है।
एको

18

अजगर

यह प्रोग्राम कमांड लाइन पर निर्दिष्ट छवि को खोलता है और इसे प्रदर्शित करता है।

import Image
import sys

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

लिनक्स पर काम करता है, खिड़कियों पर काम नहीं करता है।

यह खिड़कियों के खुलने के तरीके के कारण है। सभी ऑपरेटिंग सिस्टम पर ठीक से काम करने के लिए बाइनरी मोड को निर्दिष्ट किया जाना चाहिए।


4
कार्यक्रम को कुछ गणना करना चाहिए और परिणाम प्रदर्शित करना चाहिए। एक विशिष्ट ऑपरेटिंग सिस्टम पर इसे कुछ परिणाम प्रदर्शित करने चाहिए, लेकिन गलत हैं। हां, कुछ चालाक वर्डप्ले के साथ आप यह तर्क दे सकते हैं कि यह वही है जो आपका कार्यक्रम कर रहा है, लेकिन मुझे लगता है कि यह नियमों की जानबूझकर गलत व्याख्या है। हालांकि, आखिरकार, मतदाता निर्णय लेते हैं।
vsz

5

लिटिल एंडियन (इंटेल x86) बनाम बिग एंडियन (आईबीएम पावर 7)

कोई भी फ़ाइल प्रारूप जहां गैर-होस्ट क्रम में बहु-बाइट मात्रा में बाइनरी हैं, गलत व्याख्या किए जाने का जोखिम है। यहां एक फ़ंक्शन है जो कच्चे ऑडियो लेता है, एक 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)

ध्यान दें कि कुछ नीबूं सही हैं! वास्तव में, यह एक 50:50 मौका है कि आउटपुट सही होगा, यह इस बात पर निर्भर करता है कि ध्वनि नमूना का कम से कम महत्वपूर्ण बिट 0 या 1 है!

इसलिए जब आप इस ऑडियो को सुनते हैं, तो यह आधे आयाम की तरह होता है, लेकिन कुछ ऊंचे ऊंचे खंबे वाले शोर से घिरे होने के साथ। यदि आप इसके लिए तैयार नहीं हैं तो काफी चौंकाने वाली बात है!


5

GTB

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

कंप्यूटर पर यह काम करता है, लेकिन मेरे TI-84 कैलकुलेटर पर यह नहीं है। क्यूं कर?

कैलकुलेटर पर रैम अधिक हो जाती है और संभावित रूप से साफ हो जाती है, जबकि विंडोज के लिए एमुलेटर पर, सीमित आवंटन के कारण रैम को एमुलेटर से ओवरफ्लो नहीं किया जा सकता है।


यह क्या करता है?
इल्मरी करोनें २४'१४ 16:14

प्रश्न में एक स्पॉइलर (पीला बॉक्स) है जिसे आप छिपे हुए पाठ को देखने के लिए माउस कर सकते हैं।
टिमटेक

4
हाँ, लेकिन यह क्या करता है जो RAM अतिप्रवाह नहीं करता है ? क्या यह वास्तव में "कुछ गणना करता है", जैसे प्रश्न पूछता है, और यदि हां, तो क्या?
इल्मरी करोनें

@ इल्मारिकारोनन यह सिर्फ तार को समेटता है। (आप, निश्चित रूप से निर्दिष्ट कर सकते हैं)
टिमटेक २४'१४ को

4

सी

समस्या 100 (Collatz अनुक्रम के बारे में) का यह समाधान यूवीए ऑनलाइन न्यायाधीश द्वारा स्वीकार किया जाता है।

हालाँकि, यह कोड केवल * nix प्लेटफ़ॉर्म पर सही ढंग से काम करता है क्योंकि longटाइप 64-बिट हस्ताक्षरित पूर्णांक के रूप में कार्यान्वित किया जाता है। पर विंडोज , कोड का आह्वान, व्यवहार अपरिभाषित के बाद से 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()फ़ंक्शन के अनुरूप परिवर्तन किए जाएं । चूंकि निष्पादन योग्य विंडोज पर डिफ़ॉल्ट रूप से 2 एमबी स्टैक के लिए अनुरोध करने के लिए सेट किया गया है, इसलिए प्रोग्राम तुरंत क्रैश हो जाता है।


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 POSIX SIG का समर्थन नहीं करता है? फिर यह केवल दोनों ओएस के लिए कार्यक्षमता को उजागर करने वाले पायथन के मानक पुस्तकालयों की बात है। मुझे नहीं लगता कि यह चुनौती की भावना का अनुसरण करता है (जैसे कि पायथन का कांटा या तो स्पष्ट कारणों से काम नहीं करेगा) लेकिन यह पायथन का दोष है (इसके अलावा यह तथ्य कि इसकी व्याख्या की गई है), विंडोज नहीं '। जैसे: सहित conio.hसमान प्रभाव होगा, लेकिन सी भी संकलन नहीं करेगा।
काओ जूल 19'12

@kaoD: ईमानदारी से, मुझे यकीन नहीं है कि यह विंडोज में भी काम नहीं करता है। हो सकता है कि लिनक्स में कुछ विशेषताएं हैं जो विंडोज नहीं करता है, इसलिए यह लिनक्स में लागू किया जा सकता है, न कि विंडोज में।
beary605

फिर यह मैंने अनुमान लगाया है: आप पाइथन द्वारा उजागर की गई POSIX कार्यक्षमता का उपयोग कर रहे हैं। IMHO यह पहले बताए गए कारण के कारण उत्तर के रूप में फिट नहीं है, लेकिन हे, मैं कॉलोनी में सिर्फ एक और चींटी हूं;) आप जो देख रहे हैं वह विंडोज नहीं, बल्कि पायथन की "गलती" है। इसे देखें: docs.python.org/library/signal.html#signal.signal
kaoD

विंडोज एपीआई धागे के भीतर से एक पाइप पर रद्द करने योग्य रीड प्रदान नहीं करता है।
जोशुआ

0

लिनक्स + बैश + GNU कोरुटिल्स

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

यह रूट फ़ोल्डर और उसमें मौजूद हर चीज को मिटा देगा जो कि विंडोज में मौजूद नहीं है, भले ही आप विंडोज के लिए बैश स्थापित करें :)


यह अब विंडोज पर काम करता है कि विंडोज में लिनक्स सबसिस्टम बनाया गया है (मुझे लगता है, यह कोशिश नहीं करेगा)
Pavel

@ पावेल को खोलने के लिए बहुत आसान है cmd.exeऔर rmयह देखने के लिए टाइप करें कि यह काम नहीं करता है।
एमडी एक्सएफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.