Wie verlasse ich Vim?

42

Vim ist ein großartiger Texteditor für Unix-Systeme, der jedoch bekanntermaßen schwer zu beenden ist.

Schreiben Sie ein vollständiges Programm, das ausgegeben wird :q, um Vim zu beenden. Es sollte dann eine einzelne Eingabezeile lesen, da es dann entweder eine Bash-Eingabeaufforderung erhält, in welchem ​​Fall der Exit erfolgreich war, oder einen Fehler, in welchem ​​Fall ungespeicherte Änderungen vorliegen.

Die Bash-Eingabeaufforderung lautet:

E37@vimmachine: /var/override)

Während der Fehler wird dies sein:

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

Mit der Bash-Eingabeaufforderung ist die Arbeit des Programms abgeschlossen und es sollte keine Ausgabe mehr erfolgen (mit Ausnahme von Leerzeichen).

Nach Erhalt des Fehlers sollte Ihr Programm nach dem Zufallsprinzip (dh jede Möglichkeit hat eine Wahrscheinlichkeit ungleich Null, ausgewählt zu werden) ausgegeben werden :q!, um den Vorgang ohne Speichern zu beenden oder :xum den Vorgang zu speichern und zu beenden.

Dies ist so dass die wenigsten Bytes in jeder Sprache gewinnen!

Skidsdev
quelle
26
Ich wusste nicht, :xwar eine Sache! Ich habe immer verwendet :wq:)
musicman523
3
Was ist, wenn meine Bash-Eingabeaufforderung lautet E37: No write since last change? Wie kann ein Algorithmus eine Eingabeaufforderung von einer Fehlermeldung unterscheiden?
Anatolyg
5
@anatolyg kann es nicht, muss es aber auch nicht. Die angegebene Eingabeaufforderung ist immer die oben angegebene, das heißtE37@vimmachine: /var/override)
Skidsdev 20.06.17
2
Die angegebene Eingabeaufforderung ist immer die oben angegebene. Dies sollte in der Herausforderungsspezifikation angegeben werden. Wie es heißt, sieht das so aus , was eine beliebige Anzahl von Dingen bedeuten kann.
Dennis
5
(trat Golf für diesen Kommentar, meine Güte) @ musicman523 nie verwenden :x, um vim zu beenden . Eines Tages werden Sie versehentlich :Xzufällige Tasten drücken, wenn Sie verwirrt sind. Nachdem Sie es endlich geschafft haben, werden :wqSie Ihre Datei nie wieder sehen.
Aaron McMillin

Antworten:

16

Python 2 , 66 Bytes

3 Bytes gespart dank @ Mr.Xcoder und 4 dank @Mayube!

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

Probieren Sie es online!

musicman523
quelle
2
Wenn Sie zu Python 2 wechseln, können Sie 1 Byte speichern, indem Sie print anstelle von verwenden print(). Und Sie können die Eingabe mit Anführungszeichen nehmen
Mr. Xcoder
@ Mr.Xcoder Danke, es hat mir tatsächlich 3 Bytes gespart!
musicman523
Ja, ich habe nicht gesehen, dass Sie zwei Druckaussagen haben
Mr. Xcoder,
3
Ich habe diesen Tipp totalhuman gegeben, also ist es nur fair, dass ich ihn auch dir gebe. Sie können print':q'input()input(':q')
alles
@ Mayube oh das ist super, danke!
musicman523
7

Ruby , 35 Bytes

p:q
p %i(q! x)[rand 2]if/\(/=~gets

Probieren Sie es online!

André Diego Piske
quelle
1
Sie können ein Byte rasieren, indem Sie das Leerzeichen zwischen pund entfernen :q;)
ymbirtt
1
genial und komisch! Ich wusste das nicht, danke @ymbirtt
André Diego Piske
6

05AB1E , 19 Bytes

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

Probieren Sie es online!

„: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
Riley
quelle
5

Python 2 , 76 75 72 69 Bytes

Diese Antwort wurde abgelehnt .

-1 Byte dank Rod. -3 Bytes dank Mayube. -3 Bytes dank Artyer.

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

Probieren Sie es online!

total menschlich
quelle
Dies gibt eine zusätzliche Zeile aus, in der die Herausforderung lautetit should not give any more output
musicman523
@Mayube May we output a newline upon terminating? @Adám sure, that's fine
Stephen
1
random()>.5um ein Byte zu speichern
Rod
2
Muss die Zufälligkeit gleichmäßig verteilt sein? Falls nicht, könnten Sie tun random()>0, weil es eine sehr sehr kleine Chance , dass random()zurückkehren wird 0.
mbomb007
1
@Artyer Weißt du was das [0, 1)bedeutet? Dies bedeutet, dass Null enthalten ist, da der Bereich Null enthält. stackoverflow.com/a/4396303/2415524 ... Der einfache Weg, sich daran zu erinnern, ist, dass in einer Zahlenreihe geschlossene Punkte enthalten sind und offene Punkte nicht. Die Klammern sehen geschlossen aus und die Klammern offen.
mbomb007
5

Vimscript, 45 41 Bytes

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

4 Bytes mit rasiert getpid(), um eine Zahl zu erhalten. (Kann sich jemand einen kürzeren Weg vorstellen, um eine Nummer zu erhalten, die nicht überall gleich ist?)

Angenommen, Sie rufen Vim mit +3 Byte auf -c, um das obige Skript auszuführen und -Eingaben von stdin zu lesen:

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

JavaScript, 52 46 Bytes

6 Bytes gespart dank @ETHProductions

prompt(':q')[30]&&alert(new Date%2?':q!':':x')
Downgoat
quelle
Muss es nicht ein !nach dem sein, :qwenn die Eingabe ein Fehler ist?
Shaggy
@ Shaggy aww, habe das nicht bemerkt, es geht 9 Bytes
Downgoat
Ich denke man kann mit ein paar Bytes sparen prompt(':q')[30]&&.... Also,new Date%2?':x':':q!'
ETHproductions
@ETHproductions oh yeah, danke! Ich bin mir nicht sicher, wie ich einen
Dreiköpfigen
3

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

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

Probieren Sie es online!

  • Dank LiefdeWen 1 Byte gespart!
  • 1 Byte gespart dank Mord Zuber!
Charlie
quelle
Platzieren Sie Ihr Programm in dem SystemNamespace macht Sie in der Lage zu verkürzen , System.Randomum Randomdas Speichern von 1 Byte
LiefdeWen
@CarlosAlejo funktioniert für mich in TIO, gibt jedoch q!nicht aus:q!
Skidsdev
1
@CarlosAlejo Ahh, ich war gar nicht bewusst , dass Sie nicht einen Namespace verwendet haben, die Frage auch nicht gleichmäßig zufällig nicht sagen, nur alle Möglichkeiten nicht-Null Chance haben sollte , so dass Sie ändern .Next(2)>0zu .Next()>9, lässt es ein bisschen ein schlechtes Geschmack im Mund, aber es ist immer noch legal.
LiefdeWen
4
using static System.ConsoleMit dieser Option können Sie alle C.Anrufe beenden und ein Byte speichern
Mord Zuber
1
@MordZuber was zum ...? Ich wusste nicht einmal, dass das möglich ist! Danke!
Charlie
3

> <> , 32 30 29 Bytes

  • Hatte einen überflüssigen !o.
  • -1 Byte danke an Aaron.

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

Probieren Sie es online!

Erklärung (alt)

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

(wird bald aktualisiert)

PidgeyUsedGust
quelle
Ich bin mir nicht sicher, ob dies zulässig ist, aber Sie könnten ein Byte gewinnen, indem Sie die 3 Zeichen lesen, die zuerst verworfen werden sollen, und dann mit einem neuen Stapel arbeiten [: iii0[Lassen Sie einen leeren Stapel übrig; Wie auch immer, ich mag es, wie Sie alle möglichen Ausgaben zu Beginn bevölkern, um zusätzliche Anführungszeichen zu vermeiden
Aaron
@ Aaron Danke, das ist ein sehr ordentlicher Trick! Warum sollte es nicht erlaubt sein?
PidgeyUsedGust
Weil Sie die Eingabe lesen würden, bevor Sie die Ausgabe gedruckt haben, die zu ihrer Produktion führt, was vermutlich dem Geist der Herausforderung zuwiderläuft. Es ist jedoch nicht so, dass die Herausforderung mit dem offiziellen Interpreter realistisch umgesetzt werden kann, da Python auf die EOF der Eingabe wartet, bevor der Code> <> (oder so ähnlich) ausgeführt wird
Aaron
2

Eigentlich 27 Bytes

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

Probieren Sie es online! (Hinweis: Da TIO mit stdin nicht gut funktioniert, habe ich die ,(von stdin gelesene) Zeichenfolge durch die Literalzeichenfolge ersetzt, die Sie ändern können, um sie zu testen. Außerdem müssen Sie den Ausgabe-Cache deaktivieren, um sie abzurufen eine andere Antwort mit der zufälligen Ausgabe.)

Erläuterung:

":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
streuen
quelle
1

APL (Dyalog) , 27 Bytes

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

Probieren Sie es online!

':q' drucke das aus

 dann

?2 zufällige ganze Zahl unter den ersten beiden

⊃⍨ Verwenden Sie das, um aus auszuwählen

':q!' ':x' Diese Liste von zwei Zeichenfolgen

()/ Repliziere das mit, dh mache n Kopien von jedem Element darin, wo n ist

'!'∊⍞ Ist das Ausrufezeichen ein Element der Texteingabe? (Boolean, dh 0 oder 1)

Adam
quelle
1

Batch, 98 Bytes

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

Ruby , 33 Bytes (32 Code, +1 für -n Flag)

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

Ich bin mir nicht sicher, was das $$%2Snippet angeht. Ich benutze es, um ein zufälliges Bit zu generieren, um mein Array zu indizieren, indem ich das pid modulo 2 des aktuellen Ruby-Prozesses nehme, und es wird ziemlich unvorhersehbar sein. .sampleFügt ein zusätzliches Byte hinzu.

Probieren Sie es online!

ymbirtt
quelle
1

JavaScript, 76 71 50 Bytes

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

Dank Artyer und Neil konnte ich eine Menge Bytes sparen, meine Ternaries verdichten und den ersten Alarm auslösen, um (duh) aufzufordern.

Stephen
quelle
2
Warum nicht einfach prompt()direkt anrufen ? (Auch sind Sie erlaubt prompt(":q")?)
Neil
Sie können die Zeit als Zufallszahl verwenden ( new Date%2anstelle von Math.random()>.5), und Sie können die Eingabeaufforderung direkt verwenden, wie @Neil sagte:prompt()[3]<
Artyer
@Neil Warum? Ich hatte einen .indexOfdrauf gemacht, bevor mir der andere Weg aufgefallen ist. Ich habe vergessen zurück zu schalten, danke!
Stephen
@Artyer danke, ich hatte darüber nachgedacht und es dann vergessen
Stephen
1

Python 2 , 64 Bytes

import time
if'w'in input(':q'):print'::qx!'[time.time()%2>1::2]

Probieren Sie es online!

Da dies nur eine Ansammlung von ist sowohl von diesen Python Antworten, habe ich dies als Community Wiki markiert.

Artyer
quelle
1

Python 2 , 47 Bytes

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

Probieren Sie es online aus

Erläuterung:

Die Quelle der Zufälligkeit ist id(0)%3<2. Die Funktion idgibt den Speicherort des Parameters zurück. Wenn Sie irgendetwas übergeben, erhalten Sie eine nicht deterministische Speicheradresse. Das Ergebnis wird immer gerade sein, aber es wird nur manchmal durch 3 teilbar sein. Die Ergebnisse modulo 3 variieren. Dies kann also eine Quelle der Zufälligkeit sein. Using <2bedeutet, dass ungefähr 2/3 der Zeit der resultierende Boolesche Wert ist True.

Der Rest der Antwort ist von dieser inspiriert .

mbomb007
quelle
1

Fass ,14 12 Bytes

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

Dadurch wird eine Zufallszahl verschoben und entsprechend der Zufallszahl ausgegeben.

EIN _
quelle
0

TCL, 95 Bytes

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

Eine einfache und ziemlich lange Lösung in tcl ...

hdrz
quelle
0

Assembly 86Bytes Linux Systemaufrufe

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

LOGO, 37 36 Bytes

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

Probieren Sie es online bei Anarchy Golf Performance Checker .

Erläuterung:

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]

(weil E37@vimmachine: /var/override)2 Wörter hat, während E37: No write since last change (add ! to override)10 Wörter hat)

user202729
quelle
Eine Erklärung wäre toll.
Pajonk
0

Perl 5 (mit -E Flag), 35 Bytes

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

Führen Sie dies mit perl -E 'say":q";<>=~l&&say qw(:q! :x)[$$%2]'.

Probieren Sie es online!

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
}
user4098326
quelle