如何退出Vim?


42

Vim是用于Unix系统的出色文本编辑器,但因退出困难而臭名昭著。

编写一个完整的程序,输出该程序:q以退出Vim。然后,它应该读取一行输入,因为将给它一个bash提示(在这种情况下是成功的退出),或者是一个错误(在这种情况下有未保存的更改)。

bash提示将是这样的:

E37@vimmachine: /var/override)

虽然错误是这样的:

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

收到bash提示后,程序的工作就完成了,并且不应再提供任何输出(空格除外)。

收到错误消息后,您的程序应随机输出(即,每种可能性均被选择为非零概率)输出:q!,不保存即退出,或:x,保存并退出。

这是因此每种语言中最少的字节会获胜!


26
我不知道:x是一件事!我一直用:wq:)
musicman523

3
如果我的bash提示是E37: No write since last change怎么办?也就是说,算法如何区分提示和错误消息?
anatolyg

5
@anatolyg不能,但是也不必。给定的提示将始终是上面的提示,即E37@vimmachine: /var/override)
Skidsdev

2
给定的提示将始终是上面的提示。应在挑战说明中说明。照原样,它看起来像这样,它可以表示任何数量的东西。
丹尼斯,

5
(加入高尔夫以发表评论,请见实)@ musicman523绝对不要:x退出vim。总有一天,:X当您感到困惑时,会不小心按下随机键。最终,:wq您将再也看不到您的文件。
亚伦·麦克米林

Answers:


16

Python 2,66字节

@ Mr.Xcoder节省了3个字节,@ Mayube节省了4个字节!

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

在线尝试!


2
如果您切换到Python 2,则可以使用print 代替来节省1个字节print()。你可以带着引号的输入
Xcoder先生

@ Mr.Xcoder谢谢,它实际上为我节省了3个字节!
musicman523

是的,我没有看到你有2个print语句
Xcoder先生

3
我将此提示给了全人类,因此我也给您也很公平。您可以将其print':q'全部删除,然后更改input()input(':q')
Skidsdev,2015年

@Mayube哦,太棒了,谢谢!
musicman523


6

05AB1E,19个字节

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

在线尝试!

„: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字节

这个答案已不合实际

-1字节感谢Rod。-3个字节,感谢Mayube。-3个字节,感谢Artyer。

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

在线尝试!


这会打印出一个新的换行符,挑战所在:it should not give any more output
musicman523 '17

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

1
random()>.5保存一个字节
Rod Rod

2
随机性是否必须均匀分布?如果没有,你可以这样做random()>0,因为有一个非常非常小的机会,random()将返回0
mbomb007

1
@Artyer你知道这[0, 1)是什么意思吧?这意味着包含零,因为范围包括零。stackoverflow.com/a/4396303/2415524 ...最容易记住的方法是,在数字行上包括封闭的点,而没有开放的点。括号看起来是封闭的,括号看起来是开放的。
mbomb007

5

Vimscript,45 41字节

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

通过使用getpid()数字减少了4个字节。(有人能想到一种更短的方法来获得一个始终无处不在的数字的方法吗?)

假设使用+3个字节来调用Vim -c来运行上述脚本并-从stdin读取输入:

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

3

JavaScript,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 '17

@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名称空间中可以使您缩短System.RandomRandom,节省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个字节感谢Aaron。

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[西港岛线留下一个空栈; 无论如何,还是很不错的一个,我喜欢您一开始如何填充所有可能的输出以避免出现
Aaron

@Aaron谢谢,这是一个非常巧妙的把戏!为什么不准?
PidgeyUsedGust

因为您会在打印输出导致其生产之前先阅读输入,所以我认为这与挑战的精神背道而驰。但是,这并不像用正式的> <>解释器可以现实地实现这一挑战,因为python将在执行> <>代码(或类似的代码)之前等待输入的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

'!'∊⍞ 感叹号是文本输入的成员吗?(布尔值,即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

JavaScript,76 71 50字节

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

多亏了Artyer和Neil的帮助,节省了很多字节,以及浓缩了我的三元并把第一个警报移动到了提示(duh)。


2
为什么不直接打电话prompt()呢?(您也可以prompt(":q")吗?)
尼尔(Neil

您可以将时间用作随机数(new Date%2而不是Math.random()>.5),并且可以直接使用提示,例如@Neil说:prompt()[3]<
Artyer

@尼尔为什么?.indexOf在注意到另一种方法之前,我一直在进行此操作。忘记切换回去,谢谢!
斯蒂芬

@Artyer谢谢,我想到了这个,然后就忘了
Stephen


1

Python 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())]]}]

一个简单而相当长的解决方案


0

汇编86Bytes Linux系统调用

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字节

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

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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.