Vimを終了するにはどうすればよいですか?


42

VimはUNIXシステム用の優れたテキストエディターですが、終了するのが難しいことで有名です。

:qVimを終了するために出力する完全なプログラムを作成します。その後、bashプロンプト(終了の場合)またはエラー(未保存の変更がある場合)が表示されるため、1行の入力を読み取る必要があります。

bashプロンプトは次のようになります。

E37@vimmachine: /var/override)

エラーはこれになりますが:

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

bashプロンプトが与えられると、プログラムの作業は完了し、それ以上の出力は行われないはずです(空白を除く)。

エラーが発生すると、プログラムは、出力:q!(保存せずに終了する、または保存して終了する)をランダムに(つまり、それぞれの可能性が0以外の確率で選択される)出力:xする必要があります。

これはので、各言語で最少のバイト勝ちます!


26
私はそれ:xが何かだとは知りませんでした!私はいつも:wq:)
musicman523

3
私のbashプロンプトがE37: No write since last changeどうですか?つまり、アルゴリズムはプロンプトとエラーメッセージをどのように区別できますか?
アナトリグ

5
@anatolygはできませんが、そうする必要もありません。所与のプロンプト意志が常に上記いずれかであるE37@vimmachine: /var/override)
Skidsdev

2
指定されたプロンプトは、常に上記のプロンプトになります。これは、チャレンジ仕様に記載する必要があります。現状では、これは次のように見えると言われています
デニス

5
(このコメントのためにゴルフに参加しました、sheesh)@ musicman523 :xvimを終了するために決して使用しないでください。いつか、:X混乱したときに偶然ランダムなキーを押してしまいます。ようやく:wqファイルが表示されることはありません。
アーロンマクミリン

回答:


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()。そして、引用符で入力を受け取ることができます
Mr. Xcoder

@ Mr.Xcoderおかげで、実際に3バイト節約できました!
musicman523

はい、私はあなたが2つのprint文を持っていた見なかった
氏Xcoder

3
私はこのヒントを完全に人間に与えたので、あなたにもそれを公平に伝えるだけです。あなたは削除することができprint':q'、完全に、変更input()input(':q')
Skidsdev

@Mayubeすごいですね、ありがとう!
musicman523



5

パイソン276の 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
スティーブン

1
random()>.5バイトを保存するには
ロッド

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バイト削ります。(だれでも、どこでも同じではない番号を取得するためのもっと短い方法を考えることができますか?)

-c上記のスクリプトを実行し、-stdinから入力を読み取るためにVimを呼び出すために+3バイトを想定します。

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

@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.RandomRandom1バイトを保存し、
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文字を読み取って1バイトを獲得してから、[次のiii0[コマンドで新しいスタックの作業を開始できます。とにかく良いものです。追加の引用符を避けるために、開始時にすべての可能な出力を設定する方法が好きです
アーロン

@Aaronありがとう、これはとてもすてきなトリックです!なぜ許可されないのですか?
PidgeyUsedGust

生産につながる出力を印刷する前に入力を読んでいるので、挑戦の精神に反すると思います。Pythonは> <>コード(またはそのような何かを)実行する前に、入力のEOFをお待ちしておりますので、課題は現実的に公式> <>インタプリタで実装することができますようにしかしそうではありません
アーロン

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 最初の2つの間のランダムな整数

⊃⍨ それを使用して選択します

':q!' ':x' この2つの文字列のリスト

(... )/ それを複製します。つまり、その中の各要素の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スニペットについてはよくわかりません。現在のrubyプロセスのpidモジュロ2を使用して配列にインデックスを付けるランダムビットを生成するために使用していますが、これはかなり予測不可能です。.sample余分なバイトを追加します。

オンラインでお試しください!


1

JavaScript、76 71 50バイト

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

ArtyerとNeilのおかげで大量のバイトを節約できました。また、3進数を凝縮し、最初のアラートをプロンプト(duh)に移動しました。


2
なぜprompt()直接電話しないのですか?(また、許可されていprompt(":q")ますか?)
ニール

時刻を(としてではnew Date%2なくMath.random()>.5)乱数として使用でき、@ Neilが言ったように直接プロンプトを使用できます。prompt()[3]<
Artyer

@Neilなんで?私がやっていた.indexOf私はそれを行うための他の方法に気づいた前に、それに。元に戻すのを忘れた、ありがとう!
スティーブン

@Artyerおかげで、私はそのことを考えていて、それを忘れていました
スティーブン


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

Tclのシンプルでかなり長いソリューション...


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

ロゴ、37 36バイト

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

Anarchy Golf Performanceチェッカーでオンラインでお試しください。

説明:

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

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.