Come posso uscire da Vim?


42

Vim è un ottimo editor di testo per sistemi unix, ma è noto per essere difficile da uscire.

Scrivi un programma completo che verrà emesso :qper uscire da Vim. Dovrebbe quindi leggere una singola riga di input, in quanto verrà visualizzato un prompt bash, nel qual caso l'uscita ha avuto esito positivo o un errore, nel qual caso ci sono modifiche non salvate.

Il prompt di bash sarà questo:

E37@vimmachine: /var/override)

Mentre l'errore sarà questo:

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

Dopo aver ricevuto il prompt di bash, il lavoro del programma è terminato e non dovrebbe fornire più output (ad eccezione degli spazi bianchi).

Dopo aver ricevuto l'errore, il tuo programma dovrebbe casualmente (cioè ogni possibilità ha una probabilità diversa da zero di essere scelto) :q!, per uscire senza salvare, o :x, per salvare ed uscire.

Si tratta di quindi vince il minor numero di byte in ogni lingua !


26
Non sapevo :xfosse una cosa! L'ho sempre usato :wq:)
musicman523

3
Cosa succede se il mio prompt di bash è E37: No write since last change? Cioè, come può un algoritmo distinguere un prompt da un messaggio di errore?
Anatolyg,

5
@anatolyg non può, ma non è necessario. Il prompt dato sarà sempre quello sopra, ovveroE37@vimmachine: /var/override)
Skidsdev,

2
Il prompt dato sarà sempre quello sopra indicato nella specifica della sfida. Così com'è, dice così , che può significare qualsiasi numero di cose.
Dennis,

5
(si è unito al golf per questo commento, sheesh) @ musicman523 MAI utilizzare :xper uscire da vim. Un giorno colpirai accidentalmente i :Xtasti casuali quando sarai confuso. Dopo che finalmente :wqnon vedrai mai più il tuo file.
Aaron McMillin,

Risposte:


16

Python 2 , 66 byte

Salvato 3 byte grazie a @ Mr.Xcoder e 4 grazie a @Mayube!

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

Provalo online!


2
Se passi a Python 2, puoi salvare 1 byte usando print invece di print(). E puoi prendere l'input con le virgolette
Mr. Xcoder,

@ Mr.Xcoder Grazie, in realtà mi ha salvato 3 byte!
musicman523

Sì, non ho visto che avevi 2 dichiarazioni stampate
Mr. Xcoder,

3
Ho dato questo suggerimento a totalmente umano, quindi è giusto che lo do anche a te. Puoi rimuovere del print':q'tutto e passare input()ainput(':q')
Skidsdev il

@Mayube oh è fantastico, grazie!
musicman523


6

05AB1E , 19 byte

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

Provalo 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 byte

Questa risposta è stata superata .

-1 byte grazie a Rod. -3 byte grazie a Mayube. -3 byte grazie ad Artyer.

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

Provalo online!


Questo stampa una nuova riga in più dove dice la sfidait should not give any more output
musicman523

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

1
random()>.5per salvare un byte
Rod

2
La casualità deve essere distribuita uniformemente? Altrimenti, potresti farlo random()>0, perché c'è una possibilità molto piccola che random()tornerà 0.
mbomb007,

1
@Artyer Sai cosa [0, 1)significa, vero? Significa che lo zero è incluso perché l'intervallo è inclusivo dello zero. stackoverflow.com/a/4396303/2415524 ... Il modo più semplice per ricordare è che su una linea numerica sono inclusi punti chiusi e punti aperti no. Le parentesi sembrano chiuse e le parentesi sembrano aperte.
mbomb007,

5

Vimscript, 45 41 byte

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

Rasato 4 byte usando getpid()per ottenere un numero. (Qualcuno può pensare a un modo più breve per ottenere un numero che non sarà lo stesso ovunque, sempre?)

Supponendo +3 byte per invocare Vim con -cper eseguire lo script sopra e -leggere l'input da stdin:

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

3

JavaScript, 52 46 byte

6 byte salvati grazie a @ETHProductions

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

Non c'è bisogno di essere un !dopo il :qse l'ingresso è un errore?
Shaggy,

@Shaggy aww, non l'ho notato, ci sono 9 byte
Downgoat,

Penso che puoi salvare qualche byte con prompt(':q')[30]&&.... Inoltre,new Date%2?':x':':q!'
ETHproductions

@ETHproductions oh sì, grazie! non sono sicuro di come ho trascurato un ternario
Downgoat,

3

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

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

Provalo online!

  • 1 byte salvato grazie a LiefdeWen!
  • 1 byte salvato grazie a Mord Zuber!

Posizionando il programma nel Systemnamespace rende in grado di ridurre System.Randomal Random, risparmiando 1 byte
LiefdeWen

@CarlosAlejo funziona per me in TIO, tuttavia non q!viene :q!
emesso

1
@CarlosAlejo Ahh, non ho nemmeno rendersi conto che non è stato utilizzato uno spazio dei nomi, la questione, inoltre, non dire uniformemente casuale, solo tutte le possibilità dovrebbero avere non-zero possibilità così si cambia .Next(2)>0a .Next()>9, lascia un po 'di una cattiva gusto in bocca ma è ancora legale.
Liefde:

4
using static System.Consoleconsente di eliminare tutte le C.chiamate e di risparmiare un byte
Mord Zuber,

1
@MordZuber what the ...? Non sapevo nemmeno che fosse possibile! Grazie!
Charlie,

3

> <> , 32 30 29 byte

  • Aveva un ridondante !o.
  • -1 byte grazie ad Aaron.

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

Provalo online!

Spiegazione (vecchia)

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

(aggiornerà presto)


Non sono sicuro che questo sarebbe permesso, ma potresti vincere un byte leggendo prima i 3 caratteri da scartare, quindi inizia a lavorare su un nuovo stack con [: iii0[ti lascerà con uno stack vuoto; bello comunque, mi piace il modo in cui popolerai tutte le tue possibili uscite all'inizio per evitare citazioni aggiuntive
Aaron

@Aaron Grazie, è un trucco molto pulito! Perché non dovrebbe essere permesso?
PidgeyUsedGust

Perché leggeresti l'input prima di aver stampato l'output che porta alla sua produzione, che suppongo vada contro lo spirito della sfida. Tuttavia non è come se la sfida potesse realisticamente essere implementata con l'interprete ufficiale> <> poiché Python attenderà l'EOF dell'input prima di eseguire il codice> <> (o qualcosa del genere)
Aaron,

2

In realtà , 27 byte

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

Provalo online! (Nota: poiché TIO non funziona bene con stdin, ho sostituito ,(read from stdin) con la stringa letterale, che è possibile modificare per testarla. Inoltre, è necessario disabilitare la cache di output per ottenere una risposta diversa con l'output casuale.)

Spiegazione:

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

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

Provalo online!

':q' stampa questo

 poi

?2 numero intero casuale tra i primi due

⊃⍨ usalo per selezionare

':q!' ':x' questo elenco di due stringhe

(... )/ replicalo con, cioè crea n copie di ogni elemento in quello, dove n è

'!'∊⍞ il punto esclamativo è un membro dell'input di testo? (Booleano, ovvero 0 o 1)


1

Lotto, 98 byte

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

1

Rubino , 33 byte (32 codice, +1 per -n flag)

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

Non sono troppo sicuro sullo $$%2snippet. Lo sto usando per generare un bit casuale per indicizzare il mio array prendendo l'attuale modulo ruby ​​pid modulo 2, e sarà abbastanza imprevedibile. .sampleaggiunge un byte extra.

Provalo online!


1

JavaScript, 76 71 50 byte

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

Ho salvato un sacco di byte grazie ad Artyer e Neil, oltre a condensare i miei ternari e spostare il primo avviso al prompt (duh).


2
Perché non chiamare semplicemente prompt()? (Inoltre, sei autorizzato prompt(":q")?)
Neil,

Puoi usare l'ora come un numero casuale ( new Date%2invece di Math.random()>.5), e puoi usare il prompt direttamente come @Neil ha detto:prompt()[3]<
Artyer,

@Neil Why? Ci avevo provato .indexOf, prima di notare l'altro modo di farlo. Hai dimenticato di tornare indietro, grazie!
Stephen,

@Artyer grazie, ci avevo pensato e poi me ne sono dimenticato
Stephen,


1

Python 2 , 47 byte

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

Provalo online

Spiegazione:

La fonte della casualità è id(0)%3<2. La funzione idrestituisce la posizione di memoria del parametro. Passare qualsiasi cosa darà un indirizzo di memoria non deterministico. Il risultato sarà sempre pari, ma a volte sarà divisibile solo per 3. I risultati modulo 3 variano. Quindi, questo può essere una fonte di casualità. Utilizzando <2significa che circa i 2/3 delle volte, il booleano risultante è True.

Il resto della risposta è ispirato da questo .


1

Keg ,14 12 byte

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

Questo spinge un numero casuale e genera in modo corrispondente al numero casuale.


0

TCL, 95 byte

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

Una soluzione semplice e piuttosto lunga in tcl ...


0

Assembly 86Bytes Chiamate di sistema 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 byte

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

Provalo online su Anarchy Golf Performance checker .

Spiegazione:

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]

(perché E37@vimmachine: /var/override)ha 2 parole, mentre E37: No write since last change (add ! to override)ha 10 parole)


Una spiegazione sarebbe fantastica.
pajonk,

0

Perl 5 (con -E flag), 35 byte

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

Esegui questo con perl -E 'say":q";<>=~l&&say qw(:q! :x)[$$%2]'.

Provalo 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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.