मैं विम से कैसे बाहर निकलूं?


42

विम यूनिक्स सिस्टम के लिए एक महान टेक्स्ट एडिटर है, लेकिन इसे बाहर निकलना मुश्किल है।

एक पूरा प्रोग्राम लिखें जो आउटपुट देगा :q वीम से बाहर निकलने के लिए । इसके बाद इनपुट की एक पंक्ति पढ़नी चाहिए, क्योंकि तब इसे या तो बैश प्रॉम्प्ट दिया जाएगा, जिस स्थिति में निकास सफल रहा, या एक त्रुटि, जिस मामले में सहेजे नहीं गए परिवर्तन हैं।

बैश प्रॉम्प्ट यह होगा:

E37@vimmachine: /var/override)

जबकि त्रुटि यह होगी:

E37: No write since last change (add ! to override)

बैश प्रॉम्प्ट दिए जाने पर, प्रोग्राम का काम पूरा हो जाता है, और इसे कोई और आउटपुट नहीं देना चाहिए (व्हॉट्सएप को छोड़कर)।

त्रुटि दिए जाने पर, आपके प्रोग्राम को बेतरतीब ढंग से होना चाहिए (अर्थात प्रत्येक संभावना को चुने जाने की गैर-शून्य संभावना है) आउटपुट :q!, बिना बचत के बाहर निकलने के लिए, या :x, बचाने और बाहर निकलने के लिए।

यह प्रत्येक भाषा की जीत में इतना कम बाइट्स है !


26
मुझे नहीं पता :xथा कि यह एक चीज़ है! मैंने हमेशा इस्तेमाल किया है :wq:)
musicman523

3
क्या होगा अगर मेरा बैश प्रॉम्प्ट है E37: No write since last change? यही है, एक एल्गोरिथ्म एक त्रुटि संदेश से एक संकेत को कैसे अलग कर सकता है?
अनातोली

5
@anatolyg यह नहीं कर सकता, लेकिन यह भी नहीं है। दिए गए प्रॉम्प्ट हमेशा ऊपर एक होगा, वह हैE37@vimmachine: /var/override)
स्किड्सदेव

2
दिए गए संकेत हमेशा ऊपर दिए गए होंगे , जिन्हें चुनौती की युक्ति में बताया जाना चाहिए। जैसा है, यह कहता है कि ऐसा दिखता है , जिसका अर्थ किसी भी संख्या में हो सकता है।
डेनिस

5
(इस टिप्पणी के लिए गोल्फ में शामिल हुए, शीश) @ musicman523 कभी भी :xबाहर निकलने के लिए उपयोग नहीं करते । किसी दिन :Xजब आप भ्रमित होते हैं, तो आप गलती से हिट करेंगे । आखिरकार आप :wqअपनी फाइल को फिर कभी नहीं देख पाएंगे।
आरोन मैकमिलिन

जवाबों:


16

पायथन 2 , 66 बाइट्स

सहेजे गए 3 बाइट्स @ MrXcoder और 4 धन्यवाद @Mayube!

from random import*
if'('in input(':q'):print choice([':x',':q!'])

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


2
यदि आप पायथन 2 पर जाते हैं, तो आप print इसके बजाय का उपयोग करके 1 बाइट बचा सकते हैं print()। और आप उद्धरण के साथ इनपुट ले सकते हैं
श्री एक्सकोडर

@ Mr.Xcoder धन्यवाद, यह वास्तव में मुझे 3 बाइट्स बचा लिया!
संगीतज्ञ ५२३

हां, मैंने नहीं देखा कि आपके पास 2 प्रिंट स्टेटमेंट थे
मिस्टर एक्सकोडर

3
मैंने यह टिप पूरी तरह से दे दी है, इसलिए यह उचित है कि मैं इसे आपको भी दे दूं। आप निकाल सकते हैं print':q'पूरी तरह और बदलने input()के लिएinput(':q')
Skidsdev

@ माय ओह ओह कमाल है, शुक्रिया!
संगीतज्ञ ५२३



5

पायथन 2 , 76 75 72 69 बाइट्स

इस जवाब को बाहर रखा गया है

-1 बाइट रॉड के लिए धन्यवाद। -3 बाइट्स मेयूब के लिए धन्यवाद। -3 बाइट्स के लिए धन्यवाद Artyer।

from random import*
print'::qx!'[random()>.5:('N'in input(':q'))*5:2]

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


यह एक अतिरिक्त न्यूलाइन को प्रिंट करता है जहां चुनौती कहती हैit should not give any more output
Musicman523

@Mayube May we output a newline upon terminating? @Adám sure, that's fine
स्टीफन

1
random()>.5एक बाइट बचाने के लिए
रॉड

2
क्या यादृच्छिकता को समान रूप से वितरित किया जाना है? यदि नहीं, तो आप कर सकते हैं random()>0, क्योंकि बहुत कम मौका है जो random()वापस आ जाएगा 0
mbomb007

1
@Artyer तुम्हें पता है क्या [0, 1)मतलब है, है ना? इसका मतलब है कि शून्य को शामिल किया गया है क्योंकि सीमा शून्य-समावेशी है। stackoverflow.com/a/4396303/2415524 ... इसे याद रखने का आसान तरीका यह है कि एक नंबर लाइन पर, बंद डॉट्स शामिल हैं, और खुले डॉट्स नहीं हैं। ब्रैकेट बंद दिखते हैं, और पैरेंस खुले दिखते हैं।
mbomb007

5

विम्सस्क्रिप्ट, 45 41 बाइट्स

ec"q"|exe"/("|ec["q!","x"][getpid()%2]

4 बाइट्स का उपयोग करके शेव किया getpid()एक नंबर प्राप्त करने के लिए । (क्या कोई ऐसा नंबर पाने के लिए छोटे तरीके के बारे में सोच सकता है जो हर समय, हर समय एक जैसा न हो?)

-cउपरोक्त स्क्रिप्ट चलाने और -स्टड से इनपुट पढ़ने के लिए विम को आमंत्रित करने के लिए +3 बाइट्स मानकर :

vim -c 'ec"q"|exe"/("|ec["q!","x"][reltime()[1]%2]' -

3

जावास्क्रिप्ट, 52 46 बाइट्स

सहेजे गए 6 बाइट्स @ETHProductions की बदौलत

prompt(':q')[30]&&alert(new Date%2?':q!':':x')

यदि इनपुट में कोई त्रुटि है !, :qतो क्या इसके बाद होने की आवश्यकता नहीं है ?
झबरा

@ शैगी आह, ध्यान नहीं दिया, वहाँ 9 बाइट्स
डाउन

मुझे लगता है कि आप कुछ बाइट्स बचा सकते हैं prompt(':q')[30]&&...। इसके अलावा,new Date%2?':x':':q!'
ETHproductions

@ETHproductions ओह हाँ, धन्यवाद! यकीन नहीं होता कि मैंने एक त्रिगुट को कैसे नजरअंदाज कर दिया है
डाउन

3

सी # (.NET कोर) , 140 139 138 बाइट्स

using static System.Console;class P{static void Main(){Write(":q");if(ReadLine()[3]==':')Write(new System.Random().Next()>9?":x":":q!");}}

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

  • 1 बाइट LiefdeWen के लिए धन्यवाद बचा लिया!
  • 1 बाइट मोर्ड ज़ुबेर के लिए धन्यवाद बचा लिया!

में अपने कार्यक्रम रखने Systemनाम स्थान आप को छोटा करने में सक्षम बनाता है System.Randomके लिए Random, 1 बाइट बचत
LiefdeWen

@CarlosAlejo TIO में मेरे लिए काम करता है, हालाँकि यह आउटपुट q!नहीं है:q!
Skidsdev

1
@CarlosAlejo आह, मुझे यह भी एहसास नहीं हुआ कि आपने एक नाम स्थान का उपयोग नहीं किया है, यह सवाल भी समान रूप से यादृच्छिक नहीं कहता है, बस सभी संभावनाओं के लिए गैर-शून्य मौका होना चाहिए ताकि आप बदल .Next(2)>0जाएं .Next()>9, यह थोड़ा खराब हो जाता है मुंह में स्वाद लेकिन यह अभी भी कानूनी है।
LiefdeWen

4
using static System.Consoleआपको सभी C.कॉल ड्रॉप करने देता है , और एक बाइट बचाता है
Mord Zuber

1
@MordZuber क्या ...? मुझे पता भी नहीं था कि यह संभव था! धन्यवाद!
चार्ली

3

> <> , 32 30 29 बाइट्स

  • बेमानी थी !o
  • -1 बाइट आरोन का धन्यवाद।

iii0["@!qx:q:"ooi{=?;o!ox~oo;

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

स्पष्टीकरण (पुराना)

"@!qx:q:"ooi~i~i~i{=?;o!ox~oo;
"@!qx:q:"                        Push @!qx:q: on the stack (in reverse)
         oo                      Print :q [stack: @!qx:]
           i~i~i~                Remove first 3 input characters
                 i               Load @ or : from the input (= i)
                  {              Shift stack to the left [stack: !qx:i@]
                   =?            If 4th character was @
                     ;              Exit
                                 Else
                      o             Print :
                       !o           Jump to
                         x          Random direction (left or right because
                                    up and down retrigger x)
                                       Left:
                     ;o!o                 Print x and exit.
                                       Right:
                          ~oo;            Remove x, print q! and exit.

(जल्द ही अपडेट होगा)


मुझे यकीन नहीं है कि यह अनुमति दी जाएगी, लेकिन आप पहले त्यागने के लिए 3 अक्षरों को पढ़कर एक बाइट जीत सकते हैं, फिर एक नए स्टैक पर काम करना शुरू कर देंगे [: iii0[wil आपको एक खाली स्टैक के साथ छोड़ देगा; वैसे भी अच्छा है, मुझे पसंद है कि आप अतिरिक्त उद्धरण से बचने के लिए शुरुआत में अपने सभी संभावित आउटपुट को कैसे आबाद करेंगे
हारून

@ एरॉन थैंक्स, वह बहुत साफ-सुथरी चाल है! इसकी अनुमति क्यों नहीं दी जाएगी?
पीजयूयूडगस्ट

क्योंकि आप आउटपुट को प्रिंट करने से पहले इनपुट पढ़ रहे होंगे जो इसके उत्पादन की ओर ले जाता है, जो मुझे लगता है कि चुनौती की भावना के खिलाफ है। हालाँकि, यह चुनौती की तरह वास्तविक रूप से आधिकारिक> <> के साथ लागू की गई चुनौती नहीं है, क्योंकि अजगर <> कोड (या ऐसा कुछ) निष्पादित करने से पहले इनपुट के ईओएफ की प्रतीक्षा करेगा
हारून

2

दरअसल , 27 बाइट्स

":q"ü[":x",":q!"]`⌂`J'!,cIƒ

इसे ऑनलाइन आज़माएं! (नोट: चूंकि TIO स्टडिन के साथ अच्छा नहीं खेलता है, मैंने ,शाब्दिक स्ट्रिंग के साथ (स्टड से पढ़ें) को बदल दिया है , जिसे आप इसे परीक्षण करने के लिए बदल सकते हैं। इसके अलावा, आपको प्राप्त करने के लिए आउटपुट कैश को अक्षम करना होगा। यादृच्छिक उत्पादन के साथ एक अलग प्रतिक्रिया।)

स्पष्टीकरण:

":q"ü[":x",":q!"]`⌂`J'!,cIƒ
":q"ü                       - Push the literal :q and print
     [":x",":q!"]           - Push the list of literals :x and :q!
                 `⌂`J       - Push function literals ⌂ (terminate) and J (choose random element from list)
                     '!     - Push the literal !
                       ,    - Read from stdin
                        c   - Pop top two values a,b and return "a".count(b)
                         I  - Pop top three values a,b,c and return b if a is truthy and c if a is falsy
                          ƒ - Pop a function from the stack and call it

1

APL (Dyalog) , 27 बाइट्स

':q'⋄('!'∊⍞)/':q!' ':x'⊃⍨?2

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

':q' इसे प्रिंट करें

 फिर

?2 पहले दो के बीच यादृच्छिक पूर्णांक

⊃⍨ से चयन करने के लिए उपयोग करें

':q!' ':x' दो तारों की यह सूची

(... कि, जहां n है में प्रत्येक तत्व की n प्रतियां )/ बनाने के साथ नकल

'!'∊⍞ विस्मयादिबोधक बिंदु पाठ इनपुट का एक सदस्य है? (बूलियन, यानी 0 या 1)


1

बैच, 98 बाइट्स

@echo :q
@set/ps=
@if %s:~3,1%==@ exit/b
@set/an=%random%%%2
@if %n%==0 (echo :x)else echo :q!

1

रूबी , 33 बाइट्स (32 कोड, +1 फ़ॉर-एन फ्लैग)

p:q;$_[?!]? p([:q!,:x][$$%2]): p

मुझे $$%2स्निपेट पर भी यकीन नहीं है । मैं इसका उपयोग वर्तमान रूबी प्रक्रिया के पीआईडी ​​मोडुलो 2 को ले कर अपने सरणी को अनुक्रमित करने के लिए एक यादृच्छिक बिट उत्पन्न करने के लिए कर रहा हूं, और यह काफी अप्रत्याशित होगा। .sampleएक अतिरिक्त बाइट जोड़ता है।

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


1

जावास्क्रिप्ट, 76 71 50 बाइट्स

prompt(":q")[3]<"@"?alert(new Date%2?":q!":":x"):0

Artyer और Neil को धन्यवाद बाइट्स का एक गुच्छा सहेजा, साथ ही साथ मेरी ternaries को संघनित करके और शीघ्र (duh) को पहला अलर्ट जारी किया।


2
सिर्फ prompt()सीधे फोन क्यों नहीं ? (इसके अलावा, क्या आपको अनुमति है prompt(":q")?)
नील

आप समय का उपयोग रैंडम नंबर (के new Date%2बजाय Math.random()>.5) के रूप में कर सकते हैं, और आप प्रॉम्प्ट का उपयोग सीधे कर सकते हैं जैसे @Neil ने कहा:prompt()[3]<
Artyer

@ नील क्यों? मैं उस .indexOfपर काम कर रहा था , इससे पहले कि मैं इसे करने का दूसरा तरीका देखूं। वापस स्विच करना भूल गया, धन्यवाद!
स्टीफन

@Artyer धन्यवाद, मैंने इसके बारे में सोचा था और फिर इसके बारे में भूल गया था
स्टीफन


1

पायथन 2 , 47 बाइट्स

print'::qx!'[id(0)%3<2:('N'in input(':q'))*5:2]

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

स्पष्टीकरण:

यादृच्छिकता का स्रोत है id(0)%3<2। फ़ंक्शन idपैरामीटर की स्मृति स्थान देता है। कुछ भी पास करने पर एक गैर-नियतात्मक स्मृति पता दिया जाएगा। परिणाम हमेशा भी होगा, लेकिन यह केवल 3 से कभी-कभी विभाज्य होगा। परिणाम 3 मोड भिन्न होते हैं। तो, यह यादृच्छिकता का एक स्रोत हो सकता है। उपयोग करने का <2मतलब है कि समय के लगभग 2/3, जिसके परिणामस्वरूप बूलियन है True

जवाब के बाकी से प्रेरित है यह एक


1

केग ,14 12 बाइट्स

\:~2%[q\!|x]

यह एक यादृच्छिक संख्या को धक्का देता है और यादृच्छिक संख्या में समरूपता से आउटपुट करता है।


0

बंधन, 95 बाइट्स

puts :q;puts [if [string match *!* [gets stdin]] {puts [lindex ":q! :x" [expr round(rand())]]}]

Tcl में एक सरल और लंबे समाधान ...


0

विधानसभा 86Bytes लिनक्स सिस्टम कॉल

global _start
_start:
mov edx,4
mov ecx,g 
mov ebx,1
mov eax,4
int 0x80
g db ':q!',10

0

लोगो, 37 36 बाइट्स

pr[:q]if 4<count rl[pr pick[:q! :x]]

यह अराजकता गोल्फ प्रदर्शन परीक्षक पर ऑनलाइन प्रयास करें ।

स्पष्टीकरण:

pr[:q]if 4<count rl[pr pick[:q! :x]]   Main program.
pr                                     Print
  [:q]                                 the list `[:q]` without delimiter `[]`
      if           [              ]    If...
         4<                            4 is less than...
           count                       the number of word in the...
                 rl                    ReadLine (from stdin),
                    pr                 print
                       pick            a random word picked from the list...
                           [:q! :x]    [:q! :x]

(क्योंकि E37@vimmachine: /var/override)2 शब्द हैं, जबकि E37: No write since last change (add ! to override)10 शब्द हैं)


एक स्पष्टीकरण बहुत अच्छा होगा।
पजाकों

0

पर्ल 5 (-ई झंडे के साथ), 35 बाइट्स

say":q";<>=~l&&say qw(:q! :x)[$$%2]

इसके साथ चलाएं perl -E 'say":q";<>=~l&&say qw(:q! :x)[$$%2]'

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

Ungolfed:

say(":q");
if(<> =~ /l/){ #read a line and check if it contains 'l'
    @a=(":q!",":x");
    say($a[$$ % 2]); #print one element from array based on PID
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.