Vim을 어떻게 종료합니까?


42

Vim은 유닉스 시스템을위한 훌륭한 텍스트 편집기이지만, 종료하기 어려운 것으로 유명합니다.

:qVim을 종료하기 위해 출력 할 전체 프로그램을 작성하십시오. 그런 다음, 한 줄의 입력을 읽어야합니다.이 경우 종료에 성공한 bash 프롬프트 나 변경 사항이 저장되지 않은 오류가 나타납니다.

bash 프롬프트는 다음과 같습니다.

E37@vimmachine: /var/override)

오류는 다음과 같습니다.

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

bash 프롬프트가 주어지면 프로그램 작업이 완료되고 더 이상 출력하지 않아야합니다 (공백 제외).

오류가 발생하면 프로그램은 무작위로 (즉, 각 가능성은 0이 아닌 확률이 선택됨) 출력 :q!, 저장하지 않고 종료 또는 :x, 저장 및 종료해야합니다.

이것은 이므로 각 언어에서 가장 적은 바이트 이깁니다!


26
나는 :x한 가지 몰랐다 ! 나는 항상 사용했다 :wq:)
musicman523

3
내 bash 프롬프트가 E37: No write since last change어떻습니까? 즉, 알고리즘이 프롬프트와 오류 메시지를 어떻게 구별 할 수 있습니까?
아나 톨릭

5
@anatolyg 할 수는 없지만 꼭 할 필요는 없습니다. 주어진 프롬프트는 항상 위의 것입니다E37@vimmachine: /var/override)
Skidsdev

2
주어진 프롬프트는 항상 위의 프롬프트 일 것 입니다. 그대로, 이것은 다음과 같이 보입니다. 이것은 여러 가지를 의미 할 수 있습니다.
Dennis

5
(이 코멘트를 위해 골프에 가입했습니다) @ musicman523 절대로 :xvim을 종료 하는 데 사용하지 마십시오 . 언젠가 :X혼란 스러울 때 실수 로 임의의 키를 누르십시오 . 마지막으로 :wq파일을 다시 볼 수 없습니다.
Aaron McMillin

답변:


16

파이썬 2 , 66 바이트

@ Mr.Xcoder 덕분에 3 바이트를 절약하고 @Mayube 덕분에 4 바이트를 절약했습니다!

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

온라인으로 사용해보십시오!


2
Python 2로 전환하면 print 대신을 사용하여 1 바이트를 절약 할 수 있습니다 print(). 그리고 당신은 따옴표로 입력을 취할 수 있습니다
Mr. Xcoder

@ Mr.Xcoder 감사합니다. 실제로 3 바이트를 절약했습니다!
musicman523

네, 당신이 2 개의 인쇄 진술을 보지 못했습니다
Mr. Xcoder

3
나는이 팁을 전적으로 인간에게 주었으므로 당신에게도 공평합니다. print':q'모두 제거 하고 다음 input()으로 변경할 수 있습니다input(':q')
Skidsdev

@Mayube 오, 그거 대단해, ​​고마워!
musicman523



5

파이썬 2 , 76 75 72 69 바이트

이 답변은 시간이 지났 습니다 .

Rod 덕분에 -1 바이트. Mayube 덕분에 -3 바이트 Artyer 덕분에 -3 바이트

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
Stephen

1
random()>.5바이트 저장
Rod

2
무작위성이 균일하게 분포되어야합니까? 그렇지 않다면, 당신은 할 수있는 random()>0매우 있기 때문에, 아주 작은 기회가 random()돌아갑니다가 0.
mbomb007 2012 년

1
@Artyer 당신은 무슨 [0, 1)뜻 인지 알지 ? 범위가 0을 포함 하므로 0이 포함됨을 의미 합니다. stackoverflow.com/a/4396303/2415524 ... 기억하기 쉬운 방법은 숫자 줄에는 닫힌 점이 포함되어 있고 열린 점은 포함되어 있지 않다는 것입니다. 괄호는 닫혀 있고 괄호는 열린 것처럼 보입니다.
mbomb007

5

Vimscript, 45 41 바이트

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

getpid()숫자를 얻기 위해을 사용하여 4 바이트 를 줄였습니다. (누구나 항상 동일하지 않은 숫자를 얻는 더 짧은 방법을 생각할 수 있습니까?)

-c위 스크립트를 실행하고 -stdin에서 입력을 읽기 위해 Vim을 호출하기 위해 +3 바이트를 가정합니다 .

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

3

자바 스크립트, 52 46 바이트

@ETHProductions 덕분에 6 바이트 절약

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

입력이 오류 인 경우 !이후 가 필요하지 :q않습니까?
얽히고 설킨

@Shaggy aww, 9 바이트가 있음을 알지 못했습니다
Downgoat

나는 당신이 몇 바이트를 절약 할 수 있다고 생각한다 prompt(':q')[30]&&.... 또한new Date%2?':x':':q!'
ETHproductions

@ETHproductions 오 예, 감사합니다! 내가 어떻게 삼항을 간과했는지 잘 모르겠다
Downgoat

3

C # (.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!");}}

온라인으로 사용해보십시오!

  • LiefdeWen 덕분에 1 바이트가 절약되었습니다!
  • Mord Zuber 덕분에 1 바이트가 절약되었습니다!

System네임 스페이스에 프로그램을 배치 하면 1 바이트 를 단축 System.Random하여 단축 할 수 있습니다.Random
LiefdeWen

@CarlosAlejo는 TIO에서 나를 위해 일하지만 출력 q!하지 않습니다.:q!
Skidsdev

1
@CarlosAlejo 아, 나는 심지어 질문도 변경할 수 있도록 균일하게 무작위, 다만 모든 가능성 제로가 아닌 기회를해야한다고하지 않는 네임 스페이스를 사용하지 않은 몰랐어요 .Next(2)>0.Next()>9, 그것은 나쁜 약간의 잎 입안의 맛이지만 여전히 합법적입니다.
LiefdeWen

4
using static System.Console모든 C.통화를
끊고

1
@MordZuber 무슨 ...? 나는 그것이 가능하다는 것을 몰랐다! 감사합니다!
Charlie

3

> <> , 32 30 29 바이트

  • 중복이 !o있었습니다.
  • Aaron 덕분에 -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 문자를 읽음으로써 1 바이트를 이길 수 있으며 다음과 [같이 새 스택에서 작업을 시작하십시오 iii0[. 어쨌든 좋은 점은 추가 견적을 피하기 위해 처음에 가능한 모든 출력을 채우는 방법을 좋아합니다.
Aaron

@Aaron 고마워, 그것은 매우 깔끔한 트릭입니다! 왜 허용되지 않습니까?
PidgeyUsedGust

생산을 이끌어내는 출력물을 인쇄하기 전에 입력 값을 읽을 것이기 때문에 도전의 정신에 위배된다고 생각합니다. 그러나 파이썬이> <> 코드 (또는 이와 유사한 것)를 실행하기 전에 입력의 EOF를 기다릴 것이므로 공식> <> 인터프리터로 현실적으로 구현할 수있는 도전과 같지 않습니다.
Aaron

2

실제로 27 바이트

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

온라인으로 사용해보십시오! (참고 : TIO는 stdin과 잘 어울리지 않기 때문에 ,(stdin에서 읽은)을 리터럴 문자열로 바꾸어 테스트하도록 변경할 수 있습니다. 또한 출력 캐시를 비활성화해야합니다. 무작위 출력에 대한 다른 응답.)

설명:

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

Ruby , 33 바이트 (32 코드, -n 플래그의 경우 +1)

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

$$%2스 니펫 에 대해 잘 모르겠습니다 . 현재 루비 프로세스의 pid 모듈로 2를 가져 와서 배열을 색인하기 위해 임의의 비트를 생성하는 데 사용하고 있으며 상당히 예측할 수 없습니다. .sample여분의 바이트를 추가합니다.

온라인으로 사용해보십시오!


1

자바 스크립트, 76 71 50 바이트

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

Artyer와 Neil 덕분에 많은 3 바이트를 절약 할 수 있었으며 제 삼항을 정리하고 첫 번째 경고를 프롬프트 (duh)로 이동했습니다.


2
prompt()직접 전화하지 않습니까? (또한 허용 prompt(":q")됩니까?)
Neil

시간을 임의의 숫자 ( new Date%2대신 Math.random()>.5)로 사용할 수 있으며 prompt()[3]<
@Neil이

@ 닐 왜? 나는 .indexOf그것을하는 다른 방법을 알아 차리기 전에 그것을 하고있었습니다 . 다시 전환하는 것을 잊었습니다. 감사합니다!
Stephen

@ 아 티어 감사합니다, 나는 그것에 대해 생각하고 잊어 버렸습니다
Stephen


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

TCL, 95 바이트

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

tcl의 간단하고 다소 긴 솔루션 ...


0

어셈블리 86 바이트 리눅스 시스템 호출

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]]

Anarchy Golf Performance checker 에서 온라인으로 사용해보십시오 .

설명:

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 개)


설명이 좋을 것입니다.
pajonk 2016 년

0

Perl 5 (-E 플래그 사용), 35 바이트

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

로 이것을 실행하십시오 perl -E 'say":q";<>=~l&&say qw(:q! :x)[$$%2]'.

온라인으로 사용해보십시오!

언 골프 드 :

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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.