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!


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!


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


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

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!


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

3

JavaScript, 52 46 Bytes

6 Bytes gespart dank @ETHProductions

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

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!

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)


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

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)


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!

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!


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.


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 , 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 .


1

Fass ,14 12 Bytes

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

Dadurch wird eine Zufallszahl verschoben und entsprechend der Zufallszahl ausgegeben.


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


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

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)


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
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.