आप मुझसे हैलो पर मिले थे


30

कार्य

एक संभावित रूप से अनंत पाठ स्ट्रीम या फ़ाइल में पढ़ें, जब तक शब्द helloका उत्पादन नहीं किया गया है, तब तक इसकी सामग्री का उत्पादन करना, निम्नलिखित नियमों का पालन करना।

  • एक बार helloआउटपुट हो जाने के बाद, आपके कोड को तुरंत छोड़ देना चाहिए। इसे उदाहरण के लिए किसी नई पंक्ति की प्रतीक्षा नहीं करनी चाहिए।

  • जैसे ही यह जाता है आपका कोड आउटपुट होना चाहिए। यही कारण है कि यह भारी मात्रा में इनपुट में नहीं पढ़ा जाना चाहिए और फिर आउटपुट करना शुरू करना चाहिए।

  • यदि स्ट्रीम / फ़ाइल सम्‍मिलित नहीं है hello, तो आपके कोड को इनपुट को हमेशा के लिए आउटपुट करना चाहिए या जब तक कि स्ट्रीम / फ़ाइल का अंत नहीं हो जाता है।

  • यह एक मामला संवेदनशील चुनौती है, इसलिए helloइसके बराबर नहीं है Hello

  • आप यह मान सकते हैं कि इनपुट में केवल मुद्रण योग्य ASCII वर्ण और newlines शामिल हैं।

  • आपका कोड यह उम्मीद नहीं कर सकता है कि पाठ को एक नई पंक्ति द्वारा समाप्त किया जाएगा या इनपुट में बिल्कुल भी कोई नया अंक होगा। इसके अलावा, आप यह नहीं मान सकते हैं कि यह मशीन पर एक अनंत मात्रा में मेमोरी के साथ चलेगा।

  • आप मान सकते हैं कि आपका कोड खाली निर्देशिका से बुलाया जाएगा।

उदाहरण इनपुट स्ट्रीम

I once had a horse called hellopina.

उत्पादन

I once had a horse called hello

टिप

yes | tr -d \\n | <your program>यह जाँचने के लिए चलाएँ कि क्या यह अनंत धाराओं के साथ काम करता है। यदि यह कुछ भी प्रिंट नहीं करता है और / या मेमोरी लीक करता है, तो प्रोग्राम कल्पना का पालन नहीं करता है। यह yyyyyyyyyyyyyyyyyyyyyy...हमेशा के लिए मुद्रित होना चाहिए जिसमें कोई नया अंक न हो।


1
क्या हमें "हैलो" के बाद कुछ भी पढ़ने की अनुमति है? यह प्रश्न किसी भी अतिरिक्त रीड को प्रतिबंधित करने के लिए लगता है, जो कि (स्टैंडर्ड) सी जैसी भाषाओं में समस्याग्रस्त हो सकता है, जो स्वचालित रीड-फ़ॉरवर्ड के साथ बफर इनपुट प्रदान करते हैं।
स्पाइट

आपको शायद विधानसभा स्वीकार किए गए उत्तर को एक बदल देना चाहिए, क्योंकि यह 2 बाइट छोटा है।
R '

@ रिकर यह बहुत अच्छा होगा अगर कोई इसे परख सकता है या कम से कम यह कह सकता है कि वे मानते हैं कि यह पहले काम करता है।

जवाबों:


2

जेली , 24 बाइट्स

“Ṣẉ»ẇ⁸Ṇȧ®
ṫ-3;ƈ©Ȯ¤µ⁺Ç¿ṛ“

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

स्पष्टीकरण:

ṫ-3;ƈ©Ȯ¤µ⁺Ç¿ṛ“ Main link. Arguments: 0
ṫ-3            Truncate the list to its 4 last elements.
   ;ƈ©Ȯ¤       Store a character from STDIN in the register, print it, and append it to the list (list is initially [0]).
        µ      Start a new monadic chain, everything to the left is a link.
          Ç    Execute the helper link with the existing list as its argument.
         ⁺ ¿   Do-while loop, left link is body, right link is condition.
            ṛ“ When the loop ends, replace the return value with [] (invisible on output).

“Ṣẉ»ẇ⁸Ṇȧ® Helper link. Arguments: string
“Ṣẉ»ẉ⁸Ṇ   Check if "hello" isn't in the string.
        ® Return the character we stored in the register.
       ȧ  Check if both of the above are truthy.

26

C (gcc) , 81 80 76 75 72 71 70 69 बाइट्स

main(n,c){while(~(c=getchar())&n-0xb33def<<7)n=n<<5^putchar(c)/96*c;}

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

यह काम किस प्रकार करता है

यह एक पूर्ण कार्यक्रम है। हम अपने उद्देश्यों के लिए एक फ़ंक्शन को परिभाषित करते हैं। बाइट्स को बचाने के लिए, यह दो तर्क के साथ घोषित किया गया है जो डिफ़ॉल्ट है int के लिए होता है । यह अपरिभाषित व्यवहार है, लेकिन व्यवहार में, एन को 1 के रूप में आरंभीकृत किया जाएगा जब अतिरिक्त तर्कों के बिना कार्यक्रम चला रहे हों, सी सूचक के निचले 32 बिट्स को तर्क वेक्टर में रखेगा।

जबकि हालत

~(c=getchar())&n-0xb33def<<7

रखती है, हम पर अमल करेंगे , जबकि पाश के शरीर:

n=n<<5^putchar(c)/96*c

स्थिति को पूरी तरह से समझने के लिए, हमें पहले शरीर की जांच करनी चाहिए। अभी के लिए, हम सभी मानते हैं कि c=getchar()STDIN (यदि संभव हो) से एक एकल बाइट पढ़ता है और इसे चर c में संग्रहीत करता है

बाइट क्रम हेलो विभिन्न अभ्यावेदन में निम्नानुसार दिखता है।

char     decimal     binary (8 bits)
'h'      104         0 1 1 0 1 0 0 0
'e'      101         0 1 1 0 0 1 0 1
'l'      108         0 1 1 0 1 1 0 0
'l'      108         0 1 1 0 1 1 0 0
'o'      111         0 1 1 0 1 1 1 1

ये सभी रेंज [96, 192) में आते हैं , इसलिए इनमें से प्रत्येक बाइट्स के लिए 1 काc/96 मूल्यांकन किया जाएगा , और शेष सभी ASCII वर्णों के लिए 0 पर । इस तरह, ( putchar प्रिंट और अपने तर्क देता है) के लिए मूल्यांकन करेंगे अगर है , एक छोटा अक्षर, में से एक , या डेल चरित्र; अन्य सभी ASCII वर्णों के लिए, इसका मूल्यांकन करेगाputchar(c)/96*c`{|}~ 0 का

n इसे पांच बिट्स को बाईं ओर शिफ्ट करके अपडेट किया जाता है, फिर पिछले पैराग्राफ से परिणाम के साथ XORing। चूंकि एक इंट 32 बिट्स चौड़ा है (या इसलिए हम इस उत्तर में मानते हैं), कुछ स्थानांतरित बिट्स "बाईं ओर गिर सकते हैं" (हस्ताक्षर किए गए पूर्णांक अतिप्रवाह अपरिभाषित व्यवहार है, लेकिन जीसीसी x64 निर्देश के रूप में व्यवहार करता है जो यहां उत्पन्न होता है)। N के एक अज्ञात मान से शुरू करके , इसे हैलो के सभी वर्णों के लिए अद्यतन करने के बाद , हमें निम्नलिखित परिणाम मिलते हैं।

 n  ?????????????????????????|???????
'h'                          |    01101000
'e'                          |         01100101
'l'                          |              01101100
'l'                          |                   01101100
'o'                          |                        01101111
-----------------------------+--------------------------------
    <------ discarded ------>|???????0101100110011110111101111

ध्यान दें कि निचले 25 बिट्स पूर्णांक 0xb33def बनाते हैं , जो कि स्थिति में जादू स्थिर है। जबकि दो आसन्न बाइट्स के बिट्स के बीच कुछ ओवरलैप है, 96 से नीचे बाइट्स मैपिंग से 0 के सुनिश्चित करता है कि कोई झूठी सकारात्मक नहीं हैं।

हालत दो भागों के होते हैं:

  • ~(getchar()) STDIN से एक बाइट पढ़ने (या पढ़ने का प्रयास) के परिणाम की बिटवाइज़ नहीं लेता है।

    यदि getchar सफल होता है, तो यह रीड बाइट का मान int के रूप में लौटाएगा । चूंकि इनपुट में पूरी तरह से ASCII वर्ण हैं, इसलिए रीड बाइट केवल इसके निचले 7 बिट्स सेट कर सकता है, इसलिए बिटवाइज़ में इस मामले में इसके उच्चतम 25 बिट सेट नहीं होंगे।

    यदि गेटचेयर विफल रहता है (अधिक इनपुट नहीं), तो यह -1 वापस आ जाएगा और बिटवाइज़ 0 नहीं होगा ।

  • n-0xb33def<<7n से पहले से जादू को लगातार घटाएं , फिर परिणाम को 7 इकाइयों को बाईं ओर शिफ्ट करें।

    यदि पिछले 5 रीड बाइट्स हैलो थे , तो n के 25 बिट्स 0xb33def के बराबर होंगे और घटाव उन्हें शून्य कर देगा। अंतर को शिफ्ट करने से 0 निकलेगा क्योंकि 7 उच्चतम बिट्स "बाईं ओर गिरेंगे"।

    दूसरी ओर, यदि पिछले 5 रीड बाइट्स हैलो नहीं थे , तो अंतर के सबसे कम 25 बिट्स में से एक सेट किया जाएगा; स्थानांतरण के बाद, उच्चतम 25 बिट्स में से एक होगा।

अंत में, अगर गेटचार सफल रहा और हमने अभी तक हैलो नहीं छापा , तो बिटवॉन्ड और बाएं ऑपरेंड के सभी उच्चतम 25 बिट्स और दाईं ओर के उच्चतम 25 बिट्स में से कम से कम एक सेट हो जाएगा। इस तरफ,& एक गैर-शून्य पूर्णांक निकलेगा और लूप जारी रहेगा।

दूसरी ओर, यदि इनपुट समाप्त हो गया है या हमने पहले से ही हेलो मुद्रित कर दिया है , तो बिटवाइंड और ऑपरेंड में से एक शून्य होगा, और इसलिए परिणाम होगा। इस मामले में, हम लूप से बाहर निकल जाते हैं और प्रोग्राम समाप्त हो जाता है।


आपको शायद यह उल्लेख करना चाहिए कि यह ASCII में दिए गए इनपुट पर निर्भर करता है, स्पष्टीकरण में देरी से पहले।
टोबी स्पाईट

2
@TobySpeight मुझे नहीं लगता कि इसे निर्दिष्ट करना सामान्य है। आप किस तरह के ASCII असंगत एन्कोडिंग का उपयोग करने के लिए C उत्तर की अपेक्षा करेंगे?
डेनिस

EBCDIC स्पष्ट एन्कोडिंग है जो ASCII नहीं है। C किसी विशेष वर्ण एन्कोडिंग को नहीं बताता है (केवल यह कि दशमलव अंकों को क्रम में, लगातार मूल्यों द्वारा दर्शाया जाना चाहिए)।
टॉबी स्पाइट

उपरोक्त कार्यक्रम बंद हो जाता है यदि धारा में एससीआई स्ट्रिंग नहीं है "« úá 1 o "1: o 111 6f 2: 2 246 f6 3: á 160 a0 4: ú 163 5:« 174
RosuuP

@RosLuP चुनौती की कल्पना इस बात की गारंटी देती है कि इनपुट में मुद्रण योग्य ASCII वर्ण और नए अंक शामिल होंगे।
डेनिस

19

बैश, 74 75 103 99 88 82 76 बाइट्स

-10 बाइट्स @DigitalTrauma को धन्यवाद!
-11 बाइट्स @manatwork की बदौलत!
-6 बाइट्स @ डेनिस को धन्यवाद!

IFS=
b=ppcg
while [ ${b/hello} ];do
read -rN1 a
b=${b: -4}$a
echo -n $a
done

स्पष्टीकरण:

IFS=    # making sure we can read whitespace properly
b=ppcg  # set the variable b to some arbitrary 4 letter string

while [ ${b/hello} ]; do  # while the variable b doesn't contain "hello", do the following
    read -rN1 a           # get input
    b=${b: -4}$a          # set b to its last 4 chars + the inputted char
    echo -n $a            # output the inputted char
done

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


2
यह भी खूब रही! मैं उम्मीद कर रहा था कि एक बैश जवाब होगा।

13

भूलभुलैया , 43 41 बाइट्स

2 बाइट बचाने के लिए Sp3000 के लिए धन्यवाद।

<_%-742302873844_::%*:*:420#+.:%):,*652_>

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

व्याख्या

मूल विचार एक आधारांक में अंतिम पांच वर्णों को आधार 256 में कूटबद्ध करना है। जब कोई नया वर्ण आता है, तो हम पूर्णांक को 256 से गुणा करके और नए कोड बिंदु को जोड़कर "जोड़" सकते हैं। यदि हम केवल अंतिम 5 वर्णों को देखना चाहते हैं, तो हम मापांक 256 5 = 2 40 लेते हैं = 1099511627776। तब हम केवल यह जांच सकते हैं कि क्या यह मान 448378203247 के बराबर है, जो कि हमें तब मिलता है जब हम कोड बिंदुओं का इलाज करते हैंhello बेस- 256 अंकों के रूप में।

कोड के लिए के रूप में ... <...>एक भूलभुलैया मुहावरे का एक सा है। यह आपको एक लाइन पर किसी भी सशर्त नियंत्रण प्रवाह के बिना अनंत लूप लिखने की अनुमति देता है, जिससे रिक्त स्थान और लाइनफीड पर बहुत सारे बाइट्स की बचत होती है। यह काम करने के लिए मुख्य शर्त यह है कि जब हम पहुंचते हैं तो स्टैक के शीर्ष पर दो डिस्पोजेबल मूल्य <होते हैं (हम सामान्य रूप से इसके लिए 0एस का उपयोग करते हैं, लेकिन वास्तविक मूल्य मनमाना है)।

बेशक, प्रोग्राम को समाप्त करने के लिए कुछ सशर्त तर्क की आवश्यकता होती है। लेकिन सशर्त रूप से कार्यक्रम को समाप्त करना एक मूल्य से विभाजित करके संभव है जो शून्य है जब हम चाहते हैं कि कार्यक्रम समाप्त हो जाए। <...>पूरी पंक्ति स्थानांतरण द्वारा निर्माण कार्य (चक्रीय) जब आईपी बाईं छोर पर है छोड़ दिया है, और फिर तुरंत यह स्थिति में वापस स्थानांतरण। इसका मतलब है कि कोड वास्तव में बाएं से दाएं निष्पादित किया गया है। चलो इसे उल्टा करते हैं:

_256*,:)%:.+#024:*:*%::_448378203247-%_

यह लूप की एक पुनरावृत्ति है जो एक चरित्र को पढ़ता है, समाप्त करता है यदि हम ईओएफ तक पहुंच गए हैं, तो चरित्र को प्रिंट करता है, इसे हमारे एन्कोडिंग में जोड़ता है, जो 5 वर्णों के साथ जोड़ता है, helloपुनरावृत्ति के साथ समानता की जांच करता है और दोहराता है। यहां बताया गया है कि यह कैसे काम करता है (याद रखें कि भूलभुलैया स्टैक-आधारित है):

_256*            Multiply the encoding by 256 in preparation for the next iteration.
,                Read one byte from STDIN.
:)%              Duplicate, increment, modulo. If we hit EOF, then , returns
                 -1, so incrementing and modulo terminates the program due to
                 the attempted division by zero. However, if we did read a
                 character, we've just compute n % (n+1), which is always n itself.
:.               Print a copy of the character we just read.
+                Add it to our encoding (we'll make sure to multiply the
                 encoding by 256 at the end of the iteration, so there's room
                 for our new character).
#024             Push 1024, using the stack depth to push the initial 1.
:*:*             Square it twice. That gives 2^40.
%                Take the encoding modulo 2^40 to truncate it to the last 5
                 characters.
::               Make two copies of the encoding.
_448378203247    Push the value that corresponds to "hello".
-                Subtract it from the encoding, giving zero iff the last 5
                 characters were "hello".
%                Take the other copy of the encoding modulo this value, again
                 terminating if we've reached "hello".
                 The actual value of this modulo - if it didn't terminate the
                 the program - is junk, but we don't really care, we just need
                 any disposable value here for the <...>
_                We push a zero as the second disposable value.

8

ब्रेनफक, 658 बाइट्स

+[>,.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[-<->]+<[>-<[-]]>[-<,.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[-<->]+<[>-<[-]]>[-<,.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[-<->]+<[>-<[-]]>[-<,.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[-<->]+<[>-<[-]]>[-<,.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[-<->]+<[>-<[-]]>[-<<->>]]]]]<<]

500 से अधिक बाइट्स स्थिरांक में हैं जिन्हें मुझे थोड़ा सा गोल्फ करने की आवश्यकता है।

यह अनिवार्य रूप से एक राज्य मशीन है, इसलिए अनंत इनपुट कोई समस्या नहीं है।

यह थोड़ा कमेंटेड वर्जन है

+
[
  >,.
  >h
  [-<->]
  +<
  [
    >-<[-][in input spot, not h]
  ]
  >
  [
    -
    <
    [in input spot, h has been read]
    ,.
    >e
    [-<->]
    +<
    [
      >-<[-][in input spot, not e]
    ]
    >
    [
      -
      <
      [in input spot, e has been read]
      ,.
      >l
      [-<->]
      +<
      [
        >-<[-][in input spot, not l]
      ]
      >
      [
        -
        <
        [in input spot, l has been read]
        ,.
        >l
        [-<->]
        +<
        [
          >-<[-][in input spot, not l]
        ]
        >
        [
          -
          <
          [in input spot, l has been read]
          ,.
          >o
          [-<->]
          +<
          [
            >-<[-][in input spot, not o]
          ]
          >
          [
            -
            <
            [in input spot, o has been read]
            <->>
          ]
        ]
      ]
    ]
  ]
  <<
]

यह मजेदार लग रहा है :)

प्रोग्रामिंग पहेलियाँ और कोड गोल्फ StackExchange में आपका स्वागत है!
betseg

1
इस कोड में कई समस्याएँ हैं, लेकिन सबसे बड़ा मुद्दा यह है कि इसमें ahehellobठीक तरह से मामलों को संभालने के लिए तर्क शामिल नहीं है; एक संभावित मैच के बीच में, यह केवल अगले अक्षर के लिए जाँच करता है helloऔर hशुरू होने के लिए नहीं दिखता है ।
मिच श्वार्ट्ज

8

बैश , 73 68 66 बाइट्स

IFS=
[[ $1 != olleh ]]&&read -rN1 c&&echo -n $c&&exec $0 $c${1::4}

कोई या केवल छुपी हुई फ़ाइलों के साथ एक निर्देशिका मानता है। के रूप में चलाया जाना चाहिए <path/to/script>

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

यह कैसे काम करता है (पुराना)

की शुरुआत में , जबकि पाश, हम पहले परीक्षण करता है, तो चर में स्ट्रिंग रों (शुरू में खाली) के बराबर होती है olleh ( हैलो पीछे की ओर, ओले), और वापस जाने के 0 (मैच) या 1 (नहीं एक मैच) तदनुसार। औपचारिक रूप से लूप की स्थिति का हिस्सा होते हुए, परिणाम अपने आप ही इसे प्रभावित नहीं करेगा, क्योंकि केवल यह doनिर्धारित करता है कि शर्त रखने से पहले अंतिम आदेश ।

अगला, हम आंतरिक क्षेत्र विभाजक को खाली स्ट्रिंग पर सेट करते हैं (इसलिए read व्हॉट्सएप पर चोक नहीं होगा), -rSTDIN से कच्चे बाइट्स पढ़ें ( और उन्हें स्टोर करें) c$?पिछली कमांड का एग्जिट कोड है, इसलिए यह -N1नॉन-मैच और जीरो बाइट्स ( -N0) के लिए बिल्कुल एक ( ) बाइट को पढ़ता है । शून्य बाइट पढ़ना, चाहे ईओएफ को मारने के कारण या -N0निर्दिष्ट किया गया था, readस्थिति 1 के साथ बाहर निकलने का कारण बनता है , इसलिए लूप समाप्त हो जाएगा; अन्यथा, शरीर निष्पादित होता है और हम शुरू करते हैं।

शरीर में, हम पहले बाइट हम पढ़ प्रिंट तो अद्यतन एस के साथ s=$c${s::4}। यह पहले जोड़ता है करने के लिए पढ़ने के लिए बाइट (अप करने के लिए) में पहले चार बाइट्स रों है, तो रों बराबर होगा olleh एक बार हैलो मुद्रित किया गया है।


वाकई बहूत बढिया!

8

ब्रेनफक, 117 बाइट्स

--->>>------>>>+>>>+>>>++++<,[.-----<-[>--<-----]<[<<<]>>>[<[<<<+>>>>->+<<-]>[>>
+>]<[+[-<<<]]>>[<+>-]>>]<[[-]<<<,<]>]

प्रारूपित:

--->>>------>>>+>>>+>>>++++
<,
[
  .-----<-[>--<-----]<[<<<]
  >>>
  [
    <[<<<+>>> >->+<<-]
    >[>>+>]
    <[+[-<<<]]
    >>[<+>-]
    >>
  ]
  <[[-]<<<,<]
  >
]

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

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


7

रूबी , 46 60 बाइट्स

a="";loop{q=$<.getc;~p if a[-5..-1]=="hello"||!q;a+=q;$><<q}

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

स्टड से वर्णों को अंतिम 5 तक पढ़ता है hello, फिर स्ट्रिंग को आउटपुट करता है (या जब तक कोई वर्ण स्टड में नहीं बचा है)। त्रुटि के साथ समाप्ति।

के बराबर:

a = ""
loop {
    q = $<.getc
    ~p if a[-5..-1] == "hello" || !q
    a += q
    $><< q
}

या, और अधिक अपढ़:

a = ""
loop do
    q = STDIN.getc
    break if a[-5..-1] == "hello" or not q
    a += q
    print q
end

1
aहर बार एक चर पढ़ा जाता है। यदि इनपुट अनंत है, तो क्या यह क्रैश होता है?
betseg

@ लेबसेग एचएम, हो सकता है। मुझे देखने दें कि क्या मैं इसे ठीक कर सकता हूं
कॉनर ओ'ब्रायन

7

अजगर 3, 120 116 104 बाइट्स

अनंत धाराओं के साथ काम करता है, पहली बार गोल्फ, किसी भी सुझाव की सराहना की है।

import sys
a=1
c=''
while(a):
    a=sys.stdin.read(1)
    if a:print(end=a)
    c=(c+a)[-5:]
    if c=='hello':break

धन्यवाद @DJMcMayhem कुछ बाइट्स बचाने के लिए :)


साइट पर आपका स्वागत है! c=[0,c+1]['hello'[c]==a]आपको कुछ बाइट्स बचानी चाहिए। साथ ही, a=1छोटी भी है।
DJMcMayhem

2
आपको whileपायथन में कोष्ठक की आवश्यकता नहीं है ।
पुरकाकूदरी

6

हास्केल, 41 47 43 बाइट्स

f l|w@"hello"<-take 5l=w|a:b<-l=a:f b|1<2=l

हास्केल का आलस्य अनंत इनपुट / आउटपुट को अच्छी तरह से छोड़ देता है।

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

संपादित करें: परिमित इनपुट को हैंडल नहीं किया गया - तय किया गया। शुक्रिया @Leo बाहर इशारा करने के लिए।

संपादित करें II: @ Johanrjan जोहानसन ने 4 बाइट्स बचाए। धन्यवाद!


2
इनपुट भी परिमित हो सकता है, इसलिए मुझे लगता है कि आपको मामले से निपटने की आवश्यकता है जब आप स्ट्रिंग के अंत तक पहुँचते हैं
लियो

@Leo: उफ़, पूरी तरह से याद किया। फिक्स्ड।
नीमी

2
पहले पहरे को छोटा किया जा सकता है |w@"hello"<-take 5l=w
अर्जन जोहान्सन

@ ArjanJohansen: ओह, यह एक अच्छी बात है। धन्यवाद!
निमि

6

Cubix, 94 83 82 79 63 56 बाइट्स

p>q'-?w.uh'e@U7.'hqi?oqB-!ul.-..$WWu_q<o'\;>....6t?.../!@

विस्तारित:

        p > q '
        - ? w .
        u h ' e
        @ U 7 .
' h q i ? o q B - ! u l . - . .
$ W W u _ q < o ' \ ; > . . . .
6 t ? . . . / ! @ . . . . . . .
. . . . . . . . . . . . . . . .
        . . . .
        . . . .
        . . . .
        . . . .

टिप्पणियाँ

  • प्रोग्राम शुरू होने पर दुभाषिया इनपुट फ़ील्ड को निष्क्रिय कर देता है। जैसे, इनपुट की एक अनंत धारा असंभव है। यह प्रोग्राम इनपुट कैरेक्टर-बाय-कैरेक्टर लेता है, इसलिए यदि यह इस सीमा के लिए नहीं था, तो यह ठीक से काम करेगा।
  • यह कार्यक्रम स्टैक को साफ नहीं करता है, और यह बहुत जल्दी गड़बड़ हो जाता है। चूँकि यह मशीन जाहिरा तौर पर अनंत इनपुट स्ट्रीम दे सकती है, इसलिए यह उचित है कि इसमें अनंत स्मृति भी हो।
  • किसी भी और सभी गोल्फ मदद की बहुत सराहना की है।

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

आप यहां कार्यक्रम की कोशिश कर सकते हैं

व्याख्या

सामान्य विचार

सामान्य विचार यह है कि हम एक चरित्र को पढ़ना चाहते हैं, और फिर इसे अलग-अलग वर्णों के खिलाफ जांचते हैं (पहले h, फिर e, फिरl आदि)। हमारे द्वारा याद किए गए चरित्र का ट्रैक रखने के लिए, हम इसे स्टैक के बहुत नीचे रखते हैं। जब हमें इसकी आवश्यकता होती है, हम इसे आसानी से फिर से शीर्ष पर ला सकते हैं।

पढ़ें / लिखें पाश

रीड-राइट लूप केवल 5 वीं पंक्ति है। उपयोग नहीं किए जाने वाले सभी वर्णों को प्रतिस्थापित नहीं किया जाता है ( .):

        . . . .
        . . . .
        . . . .
        @ . . .
' h q i ? o q B - ! u l . - . .
. . . . _ . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
        . . . .
        . . . .
        . . . .
        . . . .

इसे दो भागों में विभाजित किया जा सकता है: पढ़ना और (लिखना और जाँचना)। पहले भाग में प्रश्नचिह्न तक और सहित निर्देश हैं। दूसरा भाग ऊपर की शेष रेखा है। क्योंकि यह छोरों के आसपास है, हम मानते हैं कि हम एक ढेर के साथ शुरू करते हैं[...]

    @
'hqi?
    _

Explanation
'h          Push the character code of the h
            Stack: [..., 104]
  q         Send it to the bottom
            Stack: [104, ...]
   i        Read one character of the input (-1 for EOF)
            Stack: [104, ..., input]
    ?       Start of condition:
              if (input < 0):
    @           execute '@', ending the program
              if (input = 0):
                continue going right
              if (input > 0):
    _           turn to the right, reflect back ('_') and
                turn right again, effectively not changing 
                the direction at all

दूसरा भाग (लेखन और जाँच) फिर से रैखिक है। ढेर के रूप में शुरू होता है [next-char, ..., input]। हमने अगले चरित्र को अमूर्त किया, क्योंकि वह बाद में कार्यक्रम में बदल जाता है।

oqB-!ul.-  Explanation
o          Output the character at the top of the stack
 q         Send the input to the bottom of the stack
           Stack: [input, next-char, ...]
  B        Reverse the stack
           Stack: [..., next-char, input]
   -       Push the difference of the top two characters, which
           is 0 if both are equal, something else otherwise
           Stack: [..., next-char, input, diff]
    !      if (diff = 0):
     u       make a u-turn to the right
           else:
      l.     execute two no-ops
        -    push [input - next-char - input], which is disregarded
             later, so it effectively is a no-op as well.

अब, आईपी इस लूप की शुरुआत में फिर से शुरू होगा, जांच करने के लिए अगले चरित्र को रीसेट करना h

अगले चरित्र का मिलान

अगर आईपी ने एक यू-टर्न बनाया (यानी जो चरित्र हम पढ़ते हैं और मुद्रित अगले वर्ण से मेल खाते हैं 'hello'), हमें यह जांचने की आवश्यकता है कि इनपुट किस वर्ण का था और उसके आधार पर, अगले वर्ण को स्टैक के निचले भाग में धकेलें। उसके बाद, हमें पढ़ने / लिखने के पाश पर लौटने की जरूरत है, बिना धक्का दिएh स्टैक पर आवश्यकता है, इसलिए हमें वहां पहुंचने के लिए एक और रास्ता चाहिए।

पहली चीजें पहले: यह निर्धारित करें कि इनपुट किस वर्ण का था। स्टैक इस तरह दिखता है [..., prev-char, input, 0]:।

        . . . .
        - ? . .
        u h ' e
        . . . .
. . . . . . . . . ! u . . . . .
. . . . . . . . . \ ; . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
        . . . .
        . . . .
        . . . .
        . . . .

इनपुट की तुलना करने के लिए, हम hफिर से वर्ण कोड का उपयोग करते हैं । प्रारंभ में, यह इसलिए था क्योंकि मुझे वास्तव में नहीं पता था कि मैं इसे कैसे संभाल सकता हूं और hयह स्ट्रिंग में पहला चरित्र है, जिसकी जांच करने के लिए यह काफी सुविधाजनक है। यदि हम इनपुट से h के कैरेक्टर कोड को घटाते हैं, तो हमें यह मिलता -3है कि इनपुट है e, 0यदि इनपुट है h, 4यदि इनपुट है lऔर 7यदि इनपुट है o

यह उपयोगी है, क्योंकि ? कमांड हमें नकारात्मक मूल्यों को सकारात्मक मूल्यों और शून्य से आसानी से अलग करता है। जैसे, यदि आईपी छोड़ दिया जाता है, तो अंतर नकारात्मक था e, इसलिए इनपुट था , इसलिए अगला चरित्र ए होना चाहिए l। यदि आईपी सीधे चलता रहता है, तो अंतर था 0, इसलिए इनपुट था h, इसलिए अगला चरित्र ए होना चाहिए e। यदि इनपुट एक lया एक हैo , तो आईपी सही हो जाता है।

उपरोक्त प्रश्न चिह्न से पहले निष्पादित सभी निर्देश हैं:

;!e'h-     Explanation
;          Delete the top of the stack
           Stack: [..., prev-char, input]
 !         if (input = 0):
  e          execute 'e' (no-op)
   'h      Push the character code of h
           Stack: [..., prev-char, input, 104]
     -     Push the difference of the input and 104
           Stack: [..., prev-char, input, 104, diff]

अब आईपी ऊपर की दिशा में अपनी दिशा बदल देता है। चलो विभिन्न संभावनाओं पर चलते हैं।

इनपुट 'e'

पहले हम इनपुट पर विचार करेंगे e , जिसके कारण IP ऊपर की ओर बढ़ता है ?, क्योंकि अंतर 3 है। सभी अप्रासंगिक वर्णों को क्यूब से हटा दिया गया है।

        . > q '
        . ? . .
        . . . .
        . . . .
. . q . . . . . . . . l . . . .
$ W W . . . . . . . . > . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
        . . . .
        . . . .
        . . . .
        . . . .

इस क्रम में वर्ण निष्पादित किए जाते हैं (कुछ नियंत्रण-प्रवाह वर्णों को छोड़कर):

q'l$WWq
q           Save the difference (-3) to the bottom of the stack so
            we can tell whether the l on the bottom of the stack is
            the first or the second l in hello
            Stack: [-3, ...]
 'l         Push the character code of l to the stack
            Stack: [-3, ..., 108]
   $W       no-op
     W      Sidestep into the loop
      q     Send the character code to the bottom
            Stack: [108, -3, ...]

अब IP फिर से रीड / राइट लूप पर पहुंच गया है।

इनपुट 'h'

यदि इनपुट था 'h', तो अंतर 0 है, इसलिए आईपी अपनी दिशा नहीं बदलता है। यहाँ फिर से क्यूब है, सभी अप्रासंगिक पात्रों को हटा दिया गया है। चूँकि इस रास्ते में काफी कम ऑप्स शामिल हैं, इसके द्वारा पास किए गए सभी ऑप्स को बदल दिया गया है &। आईपी ​​प्रश्न चिह्न पर शुरू होता है।

        . . . .
        . ? w .
        . . ' e
        . . . .
. . . . . . . . . ! . . . . . .
. . . u _ q < . . \ . . . . . .
. . ? & & & / . . & . . . . . .
. . & . . . . . . & . . . . . .
        . . . .
        & & & &
        . . . .
        . . . .

निष्पादित निर्देश हैं:

'e!\?q_
'e          Push the character code of the e
            Stack: [..., 101]
  !         if (101 = 0):
   \          reflect away (effectively a no-op)
    ?       if (101 > 0):
              turn right (always happens)
     q      Move 101 to the bottom of the stack
            Stack: [101, ...]
      _     No-op

और अब हम रीड / राइट लूप में फिर से प्रवेश कर रहे हैं, इसलिए हम कर रहे हैं।

अन्य जानकारी

अन्य सभी इनपुटों में सकारात्मक अंतर होता है, इसलिए आईपी प्रश्न चिह्न पर सही हो जाता है। हमें अभी भी lऔर अलग करने की आवश्यकता हैo , इसलिए हम आगे क्या करेंगे।

अलग करना 'l'और'o'

ध्यान रखें कि अंतर 7 के लिए oऔर 4 के लिए है lऔर हमें प्रोग्राम को समाप्त करना होगा यदि इनपुट ए था o। यहाँ क्यू को फिर से अप्रासंगिक भागों के साथ बदल दिया गया है .और आईपी क्रॉस को नो-ऑप्स द्वारा बदल दिया गया है और इसे एम्परसेंड्स द्वारा बदल दिया गया है।

        . . q .
        . ? w .
        . h ' .
        . U 7 .
. . . . . . . . . . . . . - . .
. . . . . . . . . . . . . & . .
. . . . . . / ! @ . . . . & . .
. . . . . . & . . . . . . & . .
        . . & .
        . . & .
        . . & .
        . . & .

h7'wq-!@    
h           no-op
 7          Push 7 to the stack
            Stack: [..., diff, 7]
  'wq       Push w to the stack and send it to
            the bottom. We don't care about it,
            so it's now part of the ellipsis.
            Stack: [..., diff, 7]
     -!     if (diff = 7):
       @        End the program

दोनों के बीच भेदभाव 'l' रों

तो, अब हम जानते हैं कि इनपुट एक था l, लेकिन हम नहीं जानते कि कौन सा है l। यदि यह पहला है, तो हमें lस्टैक के नीचे एक और पुश करने की आवश्यकता है , लेकिन अगर यह दूसरा है, तो हमें ए को पुश करने की आवश्यकता है o। याद रखें -3कि हमने पहले धकेलने से ठीक पहले स्टैक के नीचे तक बचाया था l? हम इसका उपयोग दो शाखाओं को अलग करने के लिए कर सकते हैं।

        . . . .
        . . . .
        . . . .
        . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
6 t ? . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
        . . . .
        . . . . 
        . . . .
        . . . .

ढेर के रूप में शुरू होता है [..., -3 or 140, ...]

Explanation
6t?         
6t          Take the 6th item from the top and move
            it to the top (which is either -3 or 140)
  ?         If that's positive, turn right, otherwise,
            turn left

प्रथम 'l'

यदि यह पहला था 'l', तो हमें दूसरे को आगे बढ़ाने की जरूरत है 'l'। बाइट्स को बचाने के लिए, हम पहले जैसे ही वर्णों का उपयोग करते हैं 'l'। हम स्टैक को सरल बना सकते हैं [...]। यहां क्यूब का प्रासंगिक हिस्सा है, जिसमें एम्परसेंड द्वारा प्रतिस्थापित ओप्स नहीं है।

        p > q '
        . . . .
        . . . .
        . . . .
' . q . . . . . . . . l . . . .
$ W W . . . . . . . . > & & & &
. . ? . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
        . . . .
        . . . .
        . . . .
        . . . .

निम्नलिखित निर्देशों को निष्पादित किया जाता है:

$'pq'lq
$'          no-op
  pq        no-op
    'l      Push the character code of l
            Stack: [..., 108]
      q     Send it to the bottom
            Stack: [108, ...]

हम रीड / राइट लूप में प्रवेश करने वाले हैं, इसलिए हम इस शाखा के साथ काम कर रहे हैं।

दूसरा 'l'

यदि इनपुट दूसरा 'l'था 'hello', तो प्रश्न चिह्न पर IP सही निकला। एक बार फिर, हम स्टैक को सरल बना सकते हैं [...]और आईपी ?इस समय दक्षिण की ओर इशारा करते हुए शुरू होता है ।

        . . . .
        . . . .
        . . . .
        . . . .
. . . . . . . . . . . . . . . .
. . . u _ q < o ' \ . . . . . .
. . ? . . . . . . & . . . . . .
. . & . . . . . . & . . . . . .
        . . . .
        & & & &
        . . . .
        . . . .

निष्पादित निर्देश हैं:

'oq_
'o          Push the character code of 'o'
            Stack: [..., 111]
  q         Move the top item to the bottom
            Stack: [111, ...]
   _        No-op

और IP फिर से रीड / राइट लूप दर्ज करने वाला है, इसलिए हम इस शाखा के साथ भी काम कर रहे हैं।


एक वीर प्रयास!

5

सी ++, 142 141 बाइट्स

#import<iostream>
void f(std::istream&i){i>>std::noskipws;char c;for(std::string s="     ";s!="hello"&&i>>c;)s.erase(0,1),s+=c,std::cout<<c;}

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


क्या जीसीसी के साथ ऐसा संभव होगा? मैं #importGCC C ++ प्रोग्राम्स में नहीं देखता ...
ckjbgames

1
@ckjbgames #importएक पदावनत GCC विस्तार है।
स्टेडीबॉक्स

1
@ckjbgames यहाँ अधिक जानकारी: stackoverflow.com/questions/172262/…
iFreilicht

@iFreilicht यह प्रश्न वास्तव में मुझसे यह पूछ रहा था।
ckjbgames 19

1
@ckjbgames आप दूसरे उत्तर पर एक नज़र डालना चाहते हैं: stackoverflow.com/a/172264/2533467 "gcc में आयात कुलपति ++ में आयात से अलग है। यह केवल एक बार में एक हेडर को शामिल करने का एक सरल तरीका है। "
आइफिलिचट

3

नोड, 124 बाइट्स

with(process)with(stdin)on('data',d=>[...d].map(c=>(s=(stdout.write(c),s+c).slice(-5))=='hello'&&exit()),setEncoding(),s='')

यह मानकर नहीं कि उपलब्ध स्मृति में धारा फिट होगी।


3

सी #, 134 बाइट्स

using C=System.Console;class P{static void Main(){var s="";for(int c;(c=C.Read())>=0&!s.Contains("olleh");C.Write(s[0]))s=(char)c+s;}}

यह ऑनलाइन की कोशिश करो

एक चरित्र को पढ़ता है, यह -1 (EOS) की जाँच करता है और जिसे हमने अभी तक "हैलो" नहीं देखा है, फिर इसे एक स्ट्रिंग में प्रस्तुत करता है, और चरित्र को लिखता है। हम पहले से s[0]ही बहुत कम हैं क्योंकि हम आगे बढ़ते हैं(char)s । यह स्ट्रिंग की लंबाई में एक द्विघात लागत है, क्योंकि इसे हर बार पूरे इनपुट को आवंटित करना और स्कैन करना पड़ता है जब यह एक चरित्र पढ़ता है (सीएलआर में बाधाओं के कारण 2 जीबी इनपुट के बाद यह दुर्घटनाग्रस्त हो जाएगा, क्या इसकी अनुमति है?)

using C=System.Console;

class P
{
    static void Main()
    {
        var s="";
        for(int c;(c=C.Read())>=0&!s.Contains("olleh");C.Write(s[0]))
            s=(char)c+s;
    }
}

(लंबे समय तक: 142 बाइट्स) संस्करण के लिए जो नहीं होगा मेमोरी से बाहर चलेगा, और जिसकी निरंतर प्रति-वर्ण लागत है, नीचे देखें:

using C=System.Console;class P{static void Main(){var s="     ";for(int c;(c=C.Read())>=0&s!="hello";C.Write(s[4]))s=s.Substring(1)+(char)c;}}

यह अंतिम 5 वर्णों को 5-लंबाई वाले स्ट्रिंग में रखता है, जिसका अर्थ है छोटी तुलना, और सस्ता अंतिम-चार लुक, लेकिन अद्यतन करने के लिए काफी अधिक महंगा है।

using C=System.Console;

class P
{
    static void Main()
    {
        var s="     ";
        for(int c;(c=C.Read())>=0&s!="hello";C.Write(s[4]))
            s=s.Substring(1)+(char)c;
    }
}

3

PHP, 57 55 53 बाइट्स

while(hello!=$s=substr($s.$c,-5))echo$c=fgetc(STDIN);

चूंकि अनंत फाइलें नहीं हैं, इसलिए मैं एसटीडीआईएन से इनपुट लेता हूं। साथ दौड़ो-nr

इनपुट के माध्यम से लूप करें, वर्तमान वर्ण प्रिंट करें, इसे अंतिम 5 वर्णों में $sकाटें $s। तोड़ पाश जब $sहै hello


3

विम, 39 बाइट्स

:im hello hello:se noma
:map : i

i

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

:im hello                        "Remap 'hello' in insert mode to
          hello                "write hello, then hit escape
                 :se noma       "then set the buffer to not-modifiable
:map : i                        "THEN remap ':' to 'i' so that can't be changed

i                                "enter insert mode and await an infinite stream of input

क्या यह विम के लिए एक स्वीकृत इनपुट विधि है? मैंने सोचा कि विम प्रोग्राम आमतौर पर इनपुट की शुरुआत से पहले ही बफर में होने की उम्मीद करते हैं।
मार्टिन एंडर

ईमानदार होने के लिए मुझे नहीं पता? यह सच है, लेकिन शायद ही कभी एक अनंत धारा के लिए अनुमति देता है, इसलिए मैंने इसे वास्तव में बिना इस तरह से सोचने के बिना इस तरह से किया।
nmjcman101

यदि इनपुट स्ट्रीम में कोई एस्केप कैरेक्टर है तो क्या होगा?
मंद

@dim मैंने पूछा, और ओपी ने केवल मुद्रण योग्य ASCII और newlines निर्दिष्ट किया। ESC मुद्रण योग्य ASCII afaik
nmjcman101

3

पॉवरशेल, 111 बाइट्स

ऐसा करने का एक बेहतर तरीका है, लेकिन मैं इसे फिलहाल नहीं देख सकता।

while(($x=($x+$host.UI.RawUI.ReadKey("IncludeKeyDown").character+"     ").substring(1,5)).CompareTo("hello")){}

यह गूंज को दबाए बिना कुंजी स्ट्रोक पढ़ता है। चरित्र को $ x में जोड़ा जाता है जिसे अंतिम 5 वर्णों में ट्रिम किया जाता है और "हैलो" की तुलना में। यह तब तक किया जाता है जब तक कि तुलना सही न हो।

नोट: यह PowerShell ISE में काम नहीं करता है। ReadKey उस वातावरण में अक्षम है।


3

स्कीम 115 बाइट्स

(do((c(read-char)(read-char))(i 0(if(eqv? c(string-ref"hello"i))(+ i 1)0)))((or(eof-object? c)(= i 5)))(display c))

पठनीय संस्करण:

(do ((c (read-char) (read-char))                            ; read stdin
     (i 0 (if (eqv? c (string-ref "hello" i)) (+ i 1) 0)))  ; check target
    ((or (eof-object? c) (= i 5))) ; finish if end of stdin, or word found
  (display c))                     ; display each character

यह लूप के चारों ओर हर बार स्टड से एक व्यक्तिगत चार ले लेता है, और लक्ष्य शब्द पर अपनी स्थिति को चिह्नित करता है क्योंकि यह "हैलो" के पात्रों से मिलता है।

जब इनपुट बाहर निकलता है या "हैलो" देखा जाता है तो रुक जाता है। अनंत धारा पर कोई स्मृति का उपयोग नहीं किया।


अच्छा जवाब, साइट पर आपका स्वागत है!
DJMcMayhem

3

AWK, 95 बाइट्स

BEGIN{RS="(.)"
split("hello",h,"")}{for(j=0;++j<6;){c=RT
printf c
if(c!=h[j])next
getline}exit}

मेरे द्वारा सीखी गई 2 चीजें हैं:
1) वर्णों के उपयोग के रिकॉर्ड को विभाजित करने के लिए RS="(.)"और फिर 2 के RTबजाय इसका उपयोग किया जाना चाहिए $1
) ORSका उपयोग किया जाता है printऔर इसे "\n"
3 से डिफ़ॉल्ट किया जाता है ) मैं 2 तक नहीं गिन सकता और उपयोग printfकरना "असाइन करने की तुलना में" सस्ता है।ORS और का उपयोग करते हुएprint

उदाहरण उपयोग: FILE में कोड रखें

awk -f FILE some_data_file

या

some process | awk -f FILE

डेनिस के yes | ...सुझाव का उपयोग करके कोड का परीक्षण किया गया था और मैंने बहुत सारे और बहुत सारे देखे y

FYI करें, आप RS असाइनमेंट को एक विकल्प के रूप में कर सकते हैं और इसे BEGINब्लॉक से बाहर खींच सकते हैं :

awk -v RS='(.)'

वास्तव में मुश्किल समाधान! (हो सकता है क्योंकि यह शुक्रवार की दोपहर है, लेकिन मुझे इसे अच्छी चुनौती के लिए अच्छी प्रविष्टि मिल रही है।) हालांकि मैं अधिक अजीब दृष्टिकोण की कोशिश करूंगा BEGIN{RS="(.)"}{printf RT}"olleh"==a=RT substr(a,1,4){exit}:।
manatwork

ताज्जुब है कि मेरे पास लगभग एक घंटे पहले सबमिट करने के लिए तैयार जवाब है ... और इसे सबमिट करना भूल गया। : पी
रॉबर्ट बेन्सन

3

पायथन 3 (लिनक्स), 73 72 बाइट्स

s=c='_';I=open(0)
while'olleh'!=s>''<c:c=I.read(1);s=c+s[print(end=c):4]

1 बाइट को बंद करने के लिए @MitchSchwartz को धन्यवाद!

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


मुझे समझ नहीं आ रहा है। कैसे whileठीक से मूल्यांकन के लिए शर्त है? ऐसा लगता है कि आप एक बूलियन की तुलना एक खाली स्ट्रिंग से कर रहे हैं।
१५:०५ पर :07फ्रीलीच्ट

1
s[print(end=c):4]एक बाइट बचाता है
मिच श्वार्ट्ज

1
@iFreilicht पायथन ने गणित में एक ( उदाहरण के लिए <b> c ) सशर्त जंजीरों को जकड़ा हुआ है । हालत के लिए एक आशुलिपि है 'olleh'!=s and s>''and''<c)। मध्य परीक्षण की आवश्यकता नहीं है, लेकिन उनका पीछा करना सीधा से कम है 'olleh'!=s and''<c
डेनिस

@MitchSchwartz जो यह करता है। धन्यवाद!
डेनिस

3

8086 मशीन कोड, 22 बाइट्स

00000000  bf 11 01 b4 01 cd 21 ae  75 f6 81 ff 16 01 72 f3  |......!.u.....r.|
00000010  c3 68 65 6c 6c 6f                                 |.hello|
00000016

समतुल्य विधानसभा कोड:

org 0x100
use16
a:  mov di, msg
b:  mov ah, 1       ; read one byte from stdin with echo
    int 0x21        ; dos syscall -> result in AL
    scasb           ; if (DI++ == AL)
    jne a
    cmp di, msg+5
    jb b
    ret
msg db "hello"

यह कैसे काम करता है?

1
मैंने बराबर असेंबली कोड जोड़ा। यह मूल रूप से एक बहुत ही उपयोगी डॉस syscall पर निर्भर करता है, जो स्टड से एक बाइट पढ़ता है और एक ही समय में स्टडआउट करने के लिए वापस इको करता है। 8086 में एकल बाइट स्ट्रिंग तुलना निर्देश भी है जो यहाँ काम आता है।
user5434231

2

पायथ, 49 47 बाइट्स

Wn"hello"=>5+kp$__import__("sys").stdin.read(1)

Pyth इनपुट के एकल चरित्र को लेने में बहुत अच्छा नहीं है। में सब कुछ$__import__("sys").stdin.read(1) बस कर रहा है। इसके अलावा, इसका मतलब है कि यह केवल ऑफ़लाइन चलता है।

बाकी सब कुछ छोटा है ...

लूप करते समय प्रोग्राम एक बॉडीलेस होता है। हालत के अंदर, प्रोग्राम एक चरित्र पढ़ता है, इसे वापस प्रिंट करता है, उस चरित्र को जोड़ता है k(जो शुरू में खाली स्ट्रिंग है), सभी के अंतिम 5 वर्णों को ट्रिम kकरता है, और फिर जाँचता है कि परिणाम नहीं है "hello"

32 पात्रों को इनपुट के एक बाइट मिल रहे हैं, 15 अक्षर बाकी हैं।

लिनक्स पर परीक्षण किया गया, बिना किसी नई लाइन, अनंत इनपुट आदि के भी काम करता है।


2

लुआ, 68 64 बाइट्स

l=""while l~="hello"do c=io.read(1)io.write(c)l=l:sub(-4)..c end

1
स्लाइसिंग को बदलें l:sub(-4), तो आप के आरंभ को कम कर सकते हैं l=""
manatwork

@manatwork वह साफ-सुथरा है। पारितोषिक के लिए धन्यवाद।
21

2

रूबी, 59 49 48 43 बाइट्स

अब रैंट-फ्री, छोटा, और मेमोरी लीक के बिना।

s=''
s=$>.putc$<.getc+s[0,4]until'olleh'==s

कुछ कोष्ठकों से छुटकारा पाकर 5 बाइट्स बचाए और डेनिस को धन्यवाद दिया



1

रोड़ा , 49 47 बाइट्स

{a=[0]*5{|x|[x];a=a[1:]+x;z if[a&""="hello"]}_}

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

यह एक अनाम फ़ंक्शन है जो वर्णों को इसकी इनपुट स्ट्रीम से पढ़ता है और "हैलो" पाए जाने तक उन्हें आउटपुट करता है। यह सरणी का उपयोग करता हैa अंतिम वर्णों को ट्रैक करने के ।

यह कुछ जंक को STDERR को आउटपुट करता है, लेकिन मैं समझ गया कि इसकी अनुमति है

स्पष्टीकरण:

{
    a=[0]*5                /* Initialize the array with 5 zeroes. */
    {|x|                   /* For each x in the input stream: */
        [x];               /* Print x */
        a=a[1:]+x;         /* Add x and remove the sixth last character. */
        z if[a&""="hello"] /* If "hello" is found, crash the program */
                           /* with an undefined variable. */
    }_                     /* End for loop. */
}

रोड़ा दस्तावेज कहां है?
ckjbgames

@ckjbgames यहाँ। मैं नवीनतम संस्करण 0.12 का उपयोग करता हूं, जो कि जीथब में अपनी शाखा में है।
फर्ग्यूसक

1

जावा 7, 122 118 124 123 150 141 बाइट्स

void c()throws Exception{String a="aaaaa";for(int b;!a.equals("hello")&(b=System.in.read())>=0;a=a.substring(1)+(char)b)System.out.write(b);}

अब धारा के अंत तक पहुंचने पर रुक जाता है। अब स्मृति से बाहर चले बिना अनंत इनपुट को संभालता है।


मुझे यकीन है कि यह अनंत इनपुट को संभाल नहीं सकता है।
टाइटस

@Titus तय ...
प्रहार

मैं writeइसके बजाय इस्तेमाल किए बिना देखे जाने से बच गया print। मैं अपने पतन को पूर्ववत् नहीं कर सकता, इसके लिए खेद है :(
ओलिवियर ग्रेजायर

1

रूबी, 51 बाइट्स

x="";$><<x[-1]while/hello./!~x=x[/.{0,5}$/]+$<.getc
  • नए की उम्मीद नहीं है
  • अनंत इनपुट के साथ काम करता है

1

एएचके , 116 बाइट्स

Loop,Read,%1%
{a=%A_LoopReadLine%`n
Loop,Parse,a
{Send % c:=A_LoopField
If((f:=c SubStr(f,1,4))=="olleh")
ExitApp
}}

वहाँ वास्तव में चालाक या जादुई कुछ भी नहीं है। चर %1%पहला पारित तर्क है और धारा के साथ एक फ़ाइल पथ होना चाहिए। फ़ाइल को सहेजा जाना चाहिए क्योंकि यह अपडेट है लेकिन कोड अंत तक पढ़ेगा भले ही वह रीडिंग शुरू होने के बाद फैल जाए।


1

गणितज्ञ, 107 बाइट्स

i="";EventHandler[Dynamic@i,"KeyDown":>(i=i<>CurrentValue@"EventKey";If[StringTake[i,-5]=="hello",Exit[]])]

आउटपुट एक ऐसा क्षेत्र बन जाता है, जहाँ अंतिम 5 वर्णों के बराबर होने तक उपयोगकर्ता अनन्त रूप से पाठ (newlines सहित) टाइप कर सकता है "hello"; उस बिंदु पर, यह बाहर निकलता है।


1

ब्रेनफक , 281 बाइट्स

>++++++++[<+++++++++++++>-]>++++++++++[<++++++++++>-]<+>>+++++++++[<++++++++++++>-]>++++++++++[<+++++++++++>-]<+>+[[[[[,.<<<<[->>>>->+<<<<<]>>>>>[-<<<<<+>>>>>]<],.<<<[->>>->+<<<<]>>>>[-<<<<+>>>>]<],.<<[->>->+<<<]>>>[-<<<+>>>]<],.<<[->>->+<<<]>>>[-<<<+>>>]<],.<[->->+<<]>>[-<<+>>]<]

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

व्याख्या की

Set up the buffers with helo
This is done Naively; sue me
>++++++++[<+++++++++++++>-]     h
>++++++++++[<++++++++++>-]<+>   e
>+++++++++[<++++++++++++>-]     l
>++++++++++[<+++++++++++>-]<+>  o

THE MAIN LOOP
+
[ matches o
    [ matches l
        [ matches l
            [ matches e
                [ matches h
                    ,. Read a character and immediently write it
                    <<<<[->>>>->+<<<<<] Subtract it from h
                    >>>>>[-<<<<<+>>>>>] Correct the h
                    < Terminate this part of the loop if it matches h
                ]
                ,. Same as above
                <<<[->>>->+<<<<] Subtract it from e
                >>>>[-<<<<+>>>>] Correct the e
                < Terminate this part of the loop if it matches e
            ]
            ,. Same as above
            <<[->>->+<<<] Subtract it from l
            >>>[-<<<+>>>] Correct the l
            < Terminate this part of the loop if it matches l
        ]
        ,. Same as above
        <<[->>->+<<<] Subtract it from l
        >>>[-<<<+>>>] Correct the l
        < Terminate this part of the loop if it matches l
    ]
    ,. Same as above
    <[->->+<<] Subtract it from o
    >>[-<<+>>] Correct the o
    < Terminate this part of the loop if it matches o
]

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


मैं इसे इस तरह से करने जा रहा था, लेकिन फिर मुझे एहसास हुआ कि यह इनपुट के लिए शून्य बाइट को अनन्त रूप से आउटपुट करता है जिसमें "हैलो" नहीं है: tio.run/nexus/…
KarlKastor

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