Làm thế nào để tôi thoát Vim?


42

Vim là một trình soạn thảo văn bản tuyệt vời cho các hệ thống unix, nhưng nó nổi tiếng là khó thoát.

Viết một chương trình đầy đủ sẽ xuất ra :qđể thoát Vim. Sau đó, nó sẽ đọc một dòng đầu vào, vì sau đó nó sẽ được cung cấp một dấu nhắc bash, trong trường hợp đó lối ra thành công hoặc lỗi, trong trường hợp đó có những thay đổi chưa được lưu.

Dấu nhắc bash sẽ là:

E37@vimmachine: /var/override)

Trong khi lỗi sẽ là:

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

Khi được đưa ra dấu nhắc bash, công việc của chương trình được thực hiện và nó sẽ không cung cấp thêm bất kỳ đầu ra nào (ngoại trừ khoảng trắng).

Khi bị lỗi, chương trình của bạn sẽ ngẫu nhiên (tức là mỗi khả năng có xác suất được chọn bằng không) :q!, để thoát mà không lưu, hoặc :x, để lưu và thoát.

Đây là để có ít byte nhất trong mỗi ngôn ngữ !


26
Tôi không biết :xlà một điều! Tôi đã luôn sử dụng :wq:)
Musicman523

3
Điều gì xảy ra nếu dấu nhắc của tôi là E37: No write since last change? Đó là, làm thế nào một thuật toán có thể phân biệt một dấu nhắc với một thông báo lỗi?
anatolyg

5
@anatolyg thì không thể, nhưng cũng không phải. Dấu nhắc đã cho sẽ luôn là câu hỏi ở trên, đó làE37@vimmachine: /var/override)
Skidsdev

2
Dấu nhắc đã cho sẽ luôn là một ở trên Điều đó cần được nêu trong thông số thử thách. Như nó nói, nó trông như thế này , có thể có nghĩa là bất kỳ số lượng của sự vật.
Dennis

5
(đã tham gia golf cho nhận xét này, sheesh) @ musicman523 KHÔNG BAO GIỜ sử dụng :xđể thoát vim. Một ngày nào đó bạn sẽ vô tình nhấn :Xphím ngẫu nhiên khi bạn bối rối. Sau khi bạn cuối cùng :wqbạn sẽ không bao giờ nhìn thấy tập tin của bạn nữa.
Aaron McMillin

Câu trả lời:


16

Python 2 , 66 byte

Đã lưu 3 byte nhờ @ Mr.Xcoder và 4 nhờ @Mayube!

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

Hãy thử trực tuyến!


2
Nếu bạn chuyển sang Python 2, bạn có thể lưu 1 byte bằng cách sử dụng print thay vì print(). Và bạn có thể lấy đầu vào bằng dấu ngoặc kép
Ông Xcoder

@ Mr.Xcoder Cảm ơn, nó thực sự đã tiết kiệm cho tôi 3 byte!
sĩ523

Có, tôi không thấy bạn có 2 bản in
Ông Xcoder

3
Tôi đã đưa ra lời khuyên này cho người hoàn toàn vì vậy thật công bằng khi tôi đưa nó cho bạn. Bạn có thể xóa print':q'hoàn toàn và thay đổi input()thànhinput(':q')
Skidsdev

@Mayube oh thật tuyệt vời, cảm ơn bạn!
sĩ523


6

05AB1E , 19 byte

„:q,'Nåi„:x…:q!‚.R,

Hãy thử trực tuyến!

„:q,                # Print the string ":q"
    'Nåi            # If N is in the input
        „:x         #   Push the string ":x"
           …:q!     #   Push the string ":q!"
               ‚    #   Wrap them into an array
                .R, #   Randomly print one of them

5

Python 2 , 76 75 72 69 byte

Câu trả lời này đã được đưa ra ngoài .

-1 byte nhờ Rod. -3 byte nhờ Mayube. -3 byte nhờ Artyer.

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

Hãy thử trực tuyến!


Điều này in thêm một dòng mới trong đó thách thức nóiit should not give any more output
Musicman523

@Mayube May we output a newline upon terminating? @Adám sure, that's fine
Stephen

1
random()>.5để lưu một byte
Rod

2
Có phải sự ngẫu nhiên phải được phân phối đồng đều? Nếu không, bạn có thể làm random()>0, bởi vì có một cơ hội rất nhỏ random()sẽ quay trở lại 0.
mbomb007

1
@Artyer Bạn biết [0, 1)nghĩa là gì , phải không? Nó có nghĩa là số 0 được bao gồm bởi vì phạm vi là không bao gồm. stackoverflow.com/a/4394303/2415524 ... Cách dễ nhớ nhất là trên một dòng số, các dấu chấm kín được bao gồm và các dấu chấm mở không có. Chân đế trông đóng, và parens trông mở.
mbomb007

5

Vimscript, 45 41 byte

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

Cạo 4 byte bằng cách sử dụng getpid()để lấy số. (Có ai có thể nghĩ ra một cách ngắn hơn để có được một số không giống nhau ở mọi nơi không?)

Giả sử +3 byte để gọi Vim -cđể chạy tập lệnh trên và -đọc đầu vào từ stdin:

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

3

JavaScript, 52 46 byte

Đã lưu 6 byte nhờ @ETH sản phẩm

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

Không cần phải có !sau khi :qđầu vào là một lỗi?
Xù xì

@Shaggy aww, không nhận thấy rằng, có 9 byte
Downgoat

Tôi nghĩ bạn có thể lưu một vài byte với prompt(':q')[30]&&.... Ngoài ra,new Date%2?':x':':q!'
Sản phẩm ETH

@ETHproductions oh yeah, cảm ơn! không chắc chắn làm thế nào tôi bỏ qua một con
chim nhạn

3

C # (.NET Core) , 140 139 138 byte

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

Hãy thử trực tuyến!

  • Lưu 1 byte nhờ LiefdeWen!
  • Lưu 1 byte nhờ Mord Zuber!

Đặt chương trình của bạn trong Systemkhông gian tên làm cho bạn có thể rút ngắn System.Randomđể Randomtiết kiệm 1 byte
LiefdeWen

@CarlosAlejo hoạt động với tôi trong TIO, tuy nhiên nó q!không cho kết quả:q!
Skidsdev

1
@CarlosAlejo Ahh, tôi thậm chí không nhận ra rằng bạn đã không sử dụng một không gian tên, câu hỏi cũng không nói ngẫu nhiên, chỉ là tất cả các khả năng nên có cơ hội khác không nên bạn đổi .Next(2)>0sang .Next()>9, nó có một chút xấu nếm trong miệng nhưng nó vẫn hợp pháp.
LiefdeWen

4
using static System.Consolecho phép bạn bỏ tất cả các C.cuộc gọi và tiết kiệm cho bạn một byte
Mord Zuber

1
@MordZuber cái gì ...? Tôi thậm chí không biết điều đó là có thể! Cảm ơn bạn!
Charlie

3

> <> , 32 30 29 byte

  • Có một dư thừa !o.
  • -1 byte nhờ Aaron.

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

Hãy thử trực tuyến!

Giải thích (cũ)

"@!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.

(sẽ cập nhật sớm)


Tôi không chắc điều này sẽ được cho phép, nhưng bạn có thể giành được một byte bằng cách đọc 3 ký tự để loại bỏ trước, sau đó bắt đầu làm việc với một ngăn xếp mới với [: iii0[wil để lại cho bạn một ngăn xếp trống; dù sao đi nữa, tôi thích cách bạn điền vào tất cả các kết quả đầu ra có thể của bạn khi bắt đầu để tránh các trích dẫn bổ sung
Aaron

@Aaron Cảm ơn, đó là một mẹo rất gọn gàng! Tại sao nó không được phép?
PidgeyUsedGust

Bởi vì bạn đang đọc đầu vào trước khi in đầu ra dẫn đến sản xuất của nó, mà tôi cho rằng đi ngược lại với tinh thần của thách thức. Tuy nhiên, không giống như thử thách có thể được triển khai thực tế với trình thông dịch> <> chính thức vì python sẽ đợi EOF của đầu vào trước khi thực thi mã> <> (hoặc đại loại như thế)
Aaron

2

Trên thực tế , 27 byte

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

Hãy thử trực tuyến! (Lưu ý: Vì TIO không chơi tốt với stdin, tôi đã thay thế ,(đọc từ stdin) bằng chuỗi ký tự, bạn có thể thay đổi để kiểm tra nó. Ngoài ra, bạn sẽ cần phải tắt bộ đệm đầu ra để có được một phản ứng khác nhau với đầu ra ngẫu nhiên.)

Giải trình:

":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 byte

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

Hãy thử trực tuyến!

':q' in cái này

 sau đó

?2 số nguyên ngẫu nhiên giữa hai số đầu

⊃⍨ sử dụng để chọn từ

':q!' ':x' danh sách hai chuỗi này

(... )/ lặp lại điều đó với, tức là làm cho n bản sao của mỗi phần tử trong đó, nơi n

'!'∊⍞ dấu chấm than là một thành viên của văn bản nhập? (Boolean, tức là 0 hoặc 1)


1

Mẻ, 98 byte

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

1

Ruby , 33 byte (mã 32, +1 cho cờ -n)

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

Tôi không chắc lắm về $$%2đoạn trích. Tôi đang sử dụng nó để tạo ra một bit ngẫu nhiên để lập chỉ mục cho mảng của mình bằng cách lấy pid modulo 2 của quy trình ruby ​​hiện tại, và nó sẽ khá khó đoán. .samplethêm một byte phụ.

Hãy thử trực tuyến!


1

JavaScript, 76 71 50 byte

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

Đã lưu một loạt byte nhờ Artyer và Neil, cũng như cô đọng những chú chim nhạn của tôi và chuyển cảnh báo đầu tiên sang dấu nhắc (duh).


2
Tại sao không gọi prompt()trực tiếp? (Ngoài ra, bạn có được phép prompt(":q")không?)
Neil

Bạn có thể sử dụng thời gian như một số ngẫu nhiên ( new Date%2thay vì Math.random()>.5) và bạn có thể sử dụng lời nhắc trực tiếp như @Neil nói:prompt()[3]<
Artyer

@Neil Tại sao? Tôi đã làm một .indexOfviệc về nó, trước khi tôi nhận thấy cách khác để làm điều đó. Quên chuyển lại, cảm ơn!
Stephen

@Artyer cảm ơn, tôi đã nghĩ về điều đó và sau đó quên nó đi
Stephen


1

Python 2 , 47 byte

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

Dùng thử trực tuyến

Giải trình:

Nguồn gốc của sự ngẫu nhiên là id(0)%3<2. Hàm idtrả về vị trí bộ nhớ của tham số. Vượt qua bất cứ điều gì sẽ cung cấp một địa chỉ bộ nhớ không xác định. Kết quả sẽ luôn là số chẵn, nhưng đôi khi sẽ chỉ chia hết cho 3. Kết quả modulo 3 khác nhau. Vì vậy, đây có thể là một nguồn ngẫu nhiên. Sử dụng <2có nghĩa là khoảng 2/3 thời gian, boolean kết quả là True.

Phần còn lại của câu trả lời được lấy cảm hứng từ điều này .


1

keg ,14 12 byte

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

Điều này đẩy một số ngẫu nhiên và đầu ra chính xác đến số ngẫu nhiên.


0

TCL, 95 byte

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

Một giải pháp đơn giản và khá dài trong ...


0

Hội nghị cuộc gọi hệ thống Linux 86Bytes

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

0

LOGO, 37 36 byte

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

Hãy thử trực tuyến tại Anarchy Golf Performance checker .

Giải trình:

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]

(vì E37@vimmachine: /var/override)có 2 từ, trong khi E37: No write since last change (add ! to override)có 10 từ)


Một lời giải thích sẽ là tuyệt vời.
pyjama

0

Perl 5 (với cờ -E), 35 byte

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

Chạy cái này với perl -E 'say":q";<>=~l&&say qw(:q! :x)[$$%2]'.

Hãy thử trực tuyến!

Ung dung:

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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.