दोष-सहिष्णु नमस्ते विश्व (साक्षात्कार) उर्फ


66

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

क्या आप गारंटी दे सकते हैं कि आपको काम मिलेगा?

काम

एक प्रोग्राम लिखें Hello, world!जो फ़ाइल में किसी भी स्थिति से एकल वर्ण हटाए जाने के बाद भी मानक आउटपुट पर प्रिंट करेगा । या जितना संभव हो उतना करीब आएं।

नियम

नो एक्सट्रांसस आउटपुट - Hello, world!मानक आउटपुट के लिए मुद्रित एकमात्र मूल चीज़ होनी चाहिए। अन्य पात्रों को शामिल करना ठीक है अगर वे स्वाभाविक रूप से आपकी पसंद की भाषा द्वारा निर्मित होते हैं - जैसे कि एक अनुगामी न्यूलाइन या यहां तक ​​कि कुछ ऐसा [1] "Hello, world!"(उदाहरण के लिए यदि आप आर का उपयोग कर रहे थे), लेकिन इसे हर बार सटीक एक ही प्रिंट करना होगा। उदाहरण के लिए, यह प्रिंट Hello, world!Hello, world!या Hello world!" && x==1कुछ समय नहीं कर सकता है । हालाँकि, चेतावनियों की अनुमति है।

परीक्षण अपने स्कोर को निर्धारित करने के लिए परीक्षण करने के लिए, आपको कार्यक्रम के प्रत्येक संभावित क्रमांकन का परीक्षण करना होगा: हटाए गए प्रत्येक चरित्र के साथ परीक्षण करें, और देखें कि क्या यह सही आउटपुट का उत्पादन करता है। मैंने नीचे इस उद्देश्य के लिए एक सरल पर्ल प्रोग्राम शामिल किया है, जिसे कई भाषाओं के लिए काम करना चाहिए। यदि यह आपके लिए काम नहीं करता है, तो कृपया एक परीक्षण कार्यक्रम बनाएं और इसे अपने उत्तर में शामिल करें।

स्कोरिंग आपका स्कोर आपके कार्यक्रम के विफल होने की संख्या है । दूसरे शब्दों में, आपकी फ़ाइल में अलग-अलग पदों की संख्या जहां एक चरित्र को हटाना आपके प्रोग्राम को काम करने से रोकता है। सबसे कम स्कोर जीतता है। एक टाई होने की स्थिति में, सबसे छोटा कोड जीत जाता है।

तुच्छ समाधान जैसे "Hello, world!"कई भाषाओं में (स्कोर 15) स्वीकार्य हैं, लेकिन वे जीतने नहीं जा रहे हैं। मुझे कम से कम 4 के स्कोर के साथ एक पर्ल समाधान मिला है, जिसे मैं अंततः पोस्ट करूंगा।

अद्यतन: आधिकारिक विजेता ट्यूरिंग-पूर्ण प्रोग्रामिंग भाषा का उपयोग करेगा और प्रिंट करने वाले किसी भी पूर्वनिर्धारित तंत्र का उपयोग नहीं करेगा Hello, world!। किसी भी बाहरी संसाधन (आपकी भाषा के लिए मानक पुस्तकालयों के अलावा) का उपयोग किया जाता है जो आपके प्रोग्राम का हिस्सा माना जाता है और उसी 1-वर्ण विलोपन के अधीन होता है। ये आवश्यकताएं पोस्ट-इट नोट पर डेस्क से चिपकी हुई थीं। क्षमा याचना यदि आपने उन्हें पहले नहीं देखा था।

अपडेट 2: हां, आपके कार्यक्रम को वास्तव में एक अंक प्राप्त करने के लिए ऊपर वर्णित कार्य को पूरा करना है! मतलब इसे Hello, world!कम से कम एक बार सफलतापूर्वक प्रिंट करना चाहिए । यह स्पष्ट होना चाहिए था। कमांड-लाइन स्विच और अन्य सेटिंग्स जो कार्यक्षमता को जोड़ते हैं, आपके प्रोग्राम के हिस्से के रूप में भी गिने जाते हैं और एकल वर्ण विलोपन के अधीन हैं। कार्यक्रम को किसी भी उपयोगकर्ता इनपुट के बिना अपने कार्य को पूरा करना होगा। आपकी विफलता की गणना में विफलता का संकलन।

खुश प्रोग्रामिंग, और आपको काम मिल सकता है। लेकिन अगर आप असफल होते हैं, तो आप शायद वैसे भी उस बुरे मालिक के लिए काम नहीं करना चाहते।

पर्ल परीक्षण स्क्रिप्ट:

use warnings;
use strict;

my $program   = 'test.pl';
my $temp_file = 'corrupt.pl';
my $command = "perl -X $temp_file"; #Disabled warnings for cleaner output.
my $expected_result = "Hello, world!";

open my $in,'<',$program or die $!;
local $/;           #Undef the line separator   
my $code = <$in>;   #Read the entire file in.

my $fails = 0;
for my $omit_pos (0..length($code)-1)
{
    my $corrupt = $code;
    $corrupt =~ s/^.{$omit_pos}\K.//s;  #Delete a single character

    open my $out,'>',$temp_file or die $!;
    print {$out} $corrupt;  #Write the corrupt program to a file
    close $out;

    my $result = `$command`;    #Execute system command.
    if ($result ne $expected_result)
    { 
        $fails++;
        print "Failure $fails:\nResult: ($result)\n$corrupt";
    }
}

print "\n$fails failed out of " . length $code;

1
क्या हटाए गए चरित्र का परिणाम कार्यक्रम में संकलन नहीं हो सकता है? क्या यह अभी भी काम नहीं कर रहा है?
लोचोक

@lochok, हाँ, यह विफलता के रूप में गिना जाएगा। किसी भी हटाए गए चरित्र जो Hello, World!मुद्रित नहीं होने की ओर जाता है वह एक विफलता है।

2
इसी तरह के सवाल: codegolf.stackexchange.com/questions/4486/…
mowwwalker

@Walkerneo, धन्यवाद! मैंने ऐसे ही सवालों की तलाश की और वह नहीं मिला। मुझे लगता है कि यह काफी अलग है, हालांकि। विशेष रूप से, यह सवाल गारंटी देता है कि केवल संशोधन के परिणामस्वरूप वाक्यविन्यास मान्य कोड को संभालना होगा।

क्या आप "कमांड-लाइन स्विच और कार्यक्षमता जोड़ने वाली अन्य सेटिंग्स" का उदाहरण दे सकते हैं? क्या आप प्रोग्राम के लिए दिए गए स्विच और सेटिंग्स का मतलब है, या बिल्ड वातावरण के भीतर स्विच और सेटिंग्स का उपयोग कर रहे हैं?
कासाडेयोबिसन

जवाबों:


129

बेगुंज, स्कोर ०

मुझे लगता है कि मैंने इसे क्रैक किया - कोई भी एकल वर्ण विलोपन आउटपुट को नहीं बदलेगा।
लाइन 1 से किसी भी वर्ण को हटाने से कुछ भी नहीं बदलता है - यह अभी भी उसी स्थान पर नीचे जाता है।
लाइनें 2 और 3 निरर्थक हैं। आम तौर पर लाइन 2 को निष्पादित किया जाता है, लेकिन यदि आप इसमें से एक चरित्र को हटाते हैं, तो <चूक हो जाती है, और पंक्ति 3 चार्ज लेती है।
नए सिरे से हटाने से यह या तो टूटता नहीं है (यह मेरे पिछले संस्करण को तोड़ता है)।
कोई परीक्षा कार्यक्रम नहीं, क्षमा करें।

संपादित करें : बहुत सरल।

                              vv
@,,,,,,,,,,,,,"Hello, world!"<<
@,,,,,,,,,,,,,"Hello, world!"<<

प्रवाह की एक छोटी व्याख्या:

  1. Befunge ऊपर-बाएँ से चलना शुरू करता है, दाएं घूमता है। रिक्त स्थान कुछ नहीं करते हैं।
  2. v निष्पादन प्रवाह को नीचे की ओर मोड़ता है, इसलिए यह एक रेखा से नीचे चला जाता है।
  3. < निष्पादन प्रवाह को छोड़ दिया जाता है, इसलिए यह उलट क्रम में पंक्ति 2 को पढ़ता है।
  4. "Hello, world!"स्ट्रिंग को स्टैक पर धकेलता है। यह उलटा क्रम में धकेल दिया जाता है, क्योंकि हम बाएं से दाएं निष्पादित कर रहे हैं।
  5. ,एक चरित्र को पॉप करता है और उसे प्रिंट करता है। धक्का दिया गया अंतिम पात्र पहले मुद्रित होता है, जो एक बार फिर स्ट्रिंग को उलट देता है।
  6. @ कार्यक्रम को समाप्त करता है।

2
+1, बढ़िया समाधान। मुझे नहीं लगता कि परीक्षण कार्यक्रम की आवश्यकता है, क्योंकि यह स्पष्ट है कि संभावित रूप से महत्वपूर्ण विलोपन की एक छोटी संख्या है।

4
इसलिए सत्यापित करना आसान है और इसमें कोई चर्चा शामिल नहीं है। प्रतिभाशाली!
कर्मा फुसेबॉक्स

एक उत्कृष्ट समाधान के लिए बधाई।

2
मुझे पता है कि यह कोड-गोल्फ नहीं है , लेकिन यहां 66 बाइट्स में एक संस्करण है ।
एमडी एक्सएफ

42

पर्ल, स्कोर 0

(147 अक्षर)

यहाँ मेरा समाधान है, जिसे मैं 4 से 0 तक लाने में कामयाब रहा:

eval +qq(;\$_="Hello, world!";;*a=print()if length==13or!m/./#)||
+eval +qq(;\$_="Hello, world!";;print()if*a!~/1/||!m/./#)##)||
print"Hello, world!"

यह काम करने के लिए एक पंक्ति में दिखाई देना चाहिए; लाइन ब्रेक केवल "पठनीयता" के लिए हैं।

यह पर्ल के पैथोलॉजिकल रूप से अनुमेय सिंटैक्स से लाभान्वित होता है। कुछ मुख्य बातें:

  • जिन पासवर्डों को नहीं पहचाना जाता है, उन्हें स्ट्रिंग्स के रूप में माना जाता है। तो जब evalबन जाता है evl, तो यह एक त्रुटि नहीं है यदि उस बिंदु पर एक स्ट्रिंग अनुमेय है।
  • यूनीरी +ऑपरेटर, जो कुछ स्थितियों में वाक्यविन्यास को भंग करने के अलावा और कुछ नहीं करता है। यह उपरोक्त के साथ उपयोगी है, क्योंकि function +argument(जहां + एकात्मक है string + argument) तब (जोड़) बन जाता है जब कोई फ़ंक्शन नाम मंगली हो जाता है और एक स्ट्रिंग बन जाता है।
  • स्ट्रिंग घोषित करने के कई तरीके: एक डबल उद्धृत स्ट्रिंग qq( )एकल-उद्धृत स्ट्रिंग बन सकती है q(); कोष्ठक द्वारा सीमांकित qq(; ... )एक स्ट्रिंग अर्धविराम द्वारा सीमांकित एक स्ट्रिंग बन सकती है qq; ... ;#अंदर के तार चीजों को टिप्पणियों में परिवर्तित करके संतुलन के मुद्दों को समाप्त कर सकते हैं।

इस की लंबाई को शायद कुछ हद तक कम किया जा सकता है, हालांकि मुझे संदेह है कि कुरकुरा के घोल को पीटा जा सकता है।


13
+1 लाइन विराम केवल पठनीयता के लिए हैं ...
बकुरीउ

40

HQ9 +

यह कभी भी इच्छित परिणाम उत्पन्न करने में विफल नहीं होगा जब एक चरित्र को हटा दिया जाता है तो शून्य का स्कोर प्राप्त होता है।

HH

मैं कब शुरू करूँ?


1
यह "हैलो, वर्ल्ड" पैदा करता है, न कि "हैलो, वर्ल्ड!" जैसा बताया गया।
पॉल आर।

16
बकवास, भाषा सिर्फ गलत तरीके से एसोलैंग विकी पर निर्दिष्ट की गई थी;)
स्काईवे

11
आपके लिए अच्छा है अगर उनके पास साक्षात्कार कंप्यूटर पर HQ9 + संकलक है ... :)

आप अपने खुद के छोटी गाड़ी संकलक लिख सकते हैं।
PyRulez

2
@ mbomb007 यह दुभाषिया कमांड के Hello, world!लिए प्रिंट करता है H
डेनिस

12

Befunge-98 , स्कोर 0, 45 बाइट्स

20020xx""!!ddllrrooww  ,,oolllleeHH""cckk,,@@

इसे ऑनलाइन आज़माएं!

हालांकि एक इष्टतम समाधान पहले से ही पाया गया है (और कोई टाई ब्रेकर नहीं है), मैंने सोचा कि मैं दिखाऊंगा कि यह Befunge 98 के साथ काफी सरल हो सकता है।

व्याख्या

20020xxमज़बूती से डेल्टा (टिक के बीच अनुदेश सूचक के कदम) करने के लिए सेट (2,0)इतना है कि पहले से शुरू x, केवल हर दूसरे आदेश निष्पादित किया जाता है। यह क्यों काम करता है की एक विस्तृत विवरण के लिए इस उत्तर को देखें । बाद में, कोड केवल है:

"!dlrow ,olleH"ck,@

हम सबसे पहले स्टैक के साथ सभी संबंधित कैरेक्टर कोड को आगे बढ़ाते हैं "!dlrow ,olleH"। फिर ck,स्टैक के शीर्ष ( ,), 13 ( cप्लस 1) बार ( k) प्रिंट करें । @कार्यक्रम को समाप्त करता है।


11

जे, 7 अंक

विषम स्थिति वाले हर अक्षर का चयन:

   _2{.\'HHeellllo,,  wwoorrlldd!!'
Hello, world!

5
गोल्स्टस्क्रिप्ट में एक ही बात 4 अंक की होगी:'HHeelllloo,, wwoorrlldd!!'2%
कार्डबोर्ड_बॉक्स

@cardboard_box इसे प्रस्तुत करने के लिए स्वतंत्र महसूस करें। :)
रैंडमरा

Upvoting क्योंकि मैं इसे समझता हूं, और यह धोखा महसूस नहीं करता है।
माइकल स्टर्न

3

Befunge-93, स्कोर 0 (63 बाइट्स)

मुझे पता है कि यह एक कोड-गोल्फ चुनौती नहीं है, लेकिन मुझे लगा कि यह देखना दिलचस्प होगा कि क्या मौजूदा Befunge-93 समाधान को आकार के मामले में बेहतर बनाया जा सकता है। मैंने मूल रूप से इसी तरह की त्रुटि 404 चुनौती में उपयोग के लिए इस तकनीक को विकसित किया था , लेकिन उस मामले में रैपिंग पेलोड की आवश्यकता ने 3 लाइन समाधान को अधिक इष्टतम बना दिया।

यह मार्टिन के बेफुंज -98 के उत्तर के रूप में काफी अच्छा नहीं है, लेकिन यह अभी भी जीतने वाले बेफुज -93 समाधान पर काफी महत्वपूर्ण कमी है।

<>>  "!dlrow ,olleH">:#,_@  vv
  ^^@_,#!>#:<"Hello, world!"<<>#

इसे ऑनलाइन आज़माएं!

व्याख्या

पेलोड के दो संस्करण हैं। एक अनछुए प्रोग्राम के लिए, पहला <प्रोग्राम प्रोग्राम को लाइन के अंत तक चारों ओर लपेटते हुए, बाएं से दाएं निष्पादित करने का कारण बनता है, जब तक कि यह vदूसरी पंक्ति के नीचे एक निर्देशन तक नहीं पहुंच जाता है , और एक <निर्देशन इसे बाएं से दाएं संस्करण में छोड़ देता है पेलोड का।

दूसरी पंक्ति में एक त्रुटि के कारण अंतिम <को बाईं ओर स्थानांतरित किया जाता है और >इसके बजाय प्रवाह को सीधे निर्देशन के साथ बदल दिया जाता है। #(पुल) आदेश के ऊपर से छलांग लेना देना नहीं है, इसलिए जब तक यह इर्द-गिर्द घूमती है और एक तक पहुँच जाता है कोड सिर्फ जारी है ^लाइन के शुरू में, पहली पंक्ति के लिए इसे निर्देशन, और फिर एक >सही राइट हैं- में निर्देशन बचा हुआ पेलोड।

पहली पंक्ति की अधिकांश त्रुटियां अंतिम vआदेशों को एक-एक करके पार करने का कारण बनती हैं , लेकिन यह कोड के मुख्य प्रवाह को नहीं बदलता है। पहले <को हटाना थोड़ा अलग है, हालांकि - उस स्थिति में निष्पादन पथ केवल पहली पंक्ति पर सीधे बाएं से दाएं पेलोड में बहता है।

अन्य विशेष मामला लाइन ब्रेक को हटाने का है। जब कोड पंक्ति के अंत में घूमता है, तो इस मामले में अब दूसरी पंक्ति का उपयोग करने का अंत है। जब यह #दाईं ओर से कमांड का सामना करता है , तो यह ऊपर कूदता है >और इस तरह सीधे दाएं-से-बाएं पेलोड में जारी रहता है।

यदि कोई संदेह है, तो मैंने पर्ल स्क्रिप्ट के साथ भी परीक्षण किया है और यह पुष्टि की है कि "0 63 में से विफल रहा है"।


0

गोल> <> , स्कोर 0, 38 बाइट्स

<<H"Hello, world!"/
H"Hello, world!" <

चुनौती के बाद भाषा जारी की जाती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.