¿Cómo salgo de Vim?

42

Vim es un excelente editor de texto para sistemas Unix, pero es conocido por ser difícil de salir.

Escriba un programa completo que :qsalga para salir de Vim. Luego, debe leer una sola línea de entrada, ya que se le dará un mensaje bash, en cuyo caso la salida fue exitosa o un error, en cuyo caso hay cambios sin guardar.

El indicador de bash será este:

E37@vimmachine: /var/override)

Si bien el error será este:

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

Al recibir el indicador bash, el trabajo del programa está terminado y no debería dar más resultados (excepto los espacios en blanco).

Al recibir el error, su programa debe emitir aleatoriamente (es decir, cada posibilidad tiene una probabilidad distinta de cero de ser elegido) :q!, salir sin guardar, o :x, guardar y salir.

Este es el por lo que gana menos bytes en cada idioma .

Skidsdev
fuente
26
¡No sabía que :xera una cosa! Siempre he usado :wq:)
musicman523
3
¿Qué pasa si mi aviso de bash es E37: No write since last change? Es decir, ¿cómo puede un algoritmo distinguir un mensaje de un mensaje de error?
anatolyg
55
@anatolyg no puede, pero tampoco tiene que hacerlo. El aviso dado siempre será el anterior, es decirE37@vimmachine: /var/override)
Skidsdev
2
El aviso dado siempre será el de arriba. Eso se debe indicar en la especificación de desafío. Como es, dice que se ve así , lo que puede significar cualquier cantidad de cosas.
Dennis
55
(se unió al golf por este comentario, sheesh) @ musicman523 NUNCA use :xpara salir de vim. Algún día accidentalmente presionarás :Xteclas aleatorias cuando estés confundido. Después de que finalmente :wqnunca volverás a ver tu archivo.
Aaron McMillin

Respuestas:

16

Python 2 , 66 bytes

¡Ahorré 3 bytes gracias a @ Mr.Xcoder y 4 gracias a @Mayube!

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

Pruébalo en línea!

musicman523
fuente
2
Si cambia a Python 2, puede guardar 1 bytes usando en print lugar de print(). Y puede tomar la entrada con citas
Sr. Xcoder
@ Mr.Xcoder Gracias, ¡en realidad me ahorró 3 bytes!
musicman523
Sí, no vi que tuvieras 2 declaraciones impresas
Sr. Xcoder,
3
Le di este consejo a totalmente humano, así que es justo que te lo dé también a ti. Puede eliminar por print':q'completo y cambiar input()ainput(':q')
Skidsdev
@Mayube oh, eso es genial, ¡gracias!
musicman523
7

Ruby , 35 bytes

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

Pruébalo en línea!

André Diego Piske
fuente
1
Puede afeitarse un byte eliminando el espacio entre py :q;)
ymbirtt
1
Impresionante y raro! No lo sabía, gracias @ymbirtt
André Diego Piske
6

05AB1E , 19 bytes

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

Pruébalo en línea!

„: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
fuente
5

Python 2 , 76 75 72 69 bytes

Esta respuesta ha sido superada .

-1 byte gracias a Rod. -3 bytes gracias a Mayube. -3 bytes gracias a Artyer.

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

Pruébalo en línea!

totalmente humano
fuente
Esto imprime una nueva línea adicional donde dice el desafíoit should not give any more output
musicman523
@Mayube May we output a newline upon terminating? @Adám sure, that's fine
Stephen
1
random()>.5guardar un byte
Rod
2
¿La aleatoriedad tiene que ser distribuida uniformemente? Si no, podría hacerlo random()>0, porque hay una muy pequeña posibilidad de que random()regrese 0.
mbomb007
1
@Artyer Sabes lo que [0, 1)significa, ¿verdad? Significa que se incluye cero porque el rango es cero inclusivo. stackoverflow.com/a/4396303/2415524 ... La forma fácil de recordarlo es que en una línea numérica, se incluyen puntos cerrados y puntos abiertos no. Los soportes parecen cerrados, y los parens parecen abiertos.
mbomb007
5

Vimscript, 45 41 bytes

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

Afeitó 4 bytes usando getpid()para obtener un número. (¿Alguien puede pensar en una forma más corta de obtener un número que no sea el mismo en todas partes, todo el tiempo?)

Suponiendo +3 bytes para invocar a Vim con -cpara ejecutar el script anterior y -leer la entrada de stdin:

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

JavaScript, 52 46 bytes

Guardado 6 bytes gracias a @ETHProductions

prompt(':q')[30]&&alert(new Date%2?':q!':':x')
Downgoat
fuente
¿No es necesario que haya un !después de :qsi la entrada es un error?
Shaggy
@ Shaggy aww, no lo noté, hay 9 bytes
Downgoat
Creo que puedes guardar algunos bytes con prompt(':q')[30]&&.... Además,new Date%2?':x':':q!'
ETHproductions
@ETHproductions oh si, gracias! no estoy seguro de cómo pasé por alto a un ternario
Downgoat
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!");}}

Pruébalo en línea!

  • ¡1 byte guardado gracias a LiefdeWen!
  • ¡1 byte guardado gracias a Mord Zuber!
Charlie
fuente
La colocación de su programa en el Systemespacio de nombres le hace capaz de acortar System.Randoma Random, el ahorro de 1 byte
LiefdeWen
@CarlosAlejo funciona para mí en TIO, sin embargo, q!no :q!
sale
1
@CarlosAlejo Ahh, ni siquiera me di cuenta de que no usaste un espacio de nombres, la pregunta tampoco dice uniformemente al azar, solo todas las posibilidades deberían tener una probabilidad distinta de cero, así que cambias .Next(2)>0a .Next()>9, deja un poco mal sabor en la boca pero sigue siendo legal.
LiefdeWen
44
using static System.Consolete permite abandonar todas las C.llamadas y te ahorra un byte
Mord Zuber
1
@MordZuber, ¿qué ...? ¡Ni siquiera sabía que eso era posible! ¡Gracias!
Charlie
3

> <> , 32 30 29 bytes

  • Tenía un redundante !o.
  • -1 byte gracias a Aaron.

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

Pruébalo en línea!

Explicación (antigua)

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

(se actualizará pronto)

PidgeyUsedGust
fuente
No estoy seguro de que esto esté permitido, pero puede ganar un byte leyendo primero los 3 caracteres para descartar, luego comience a trabajar en una nueva pila con [: lo iii0[dejará con una pila vacía; bueno de todos modos, me gusta cómo pueblas todas tus salidas posibles al principio para evitar citas adicionales
Aaron
@ Aaron Gracias, ¡es un truco muy bueno! ¿Por qué no se permitiría?
PidgeyUsedGust
Porque estarías leyendo la entrada antes de haber impreso la salida que conduce a su producción, lo que supongo va en contra del espíritu del desafío. Sin embargo, no es como si el desafío se pudiera implementar de manera realista con el intérprete oficial> <> ya que Python esperará el EOF de la entrada antes de ejecutar el código> <> (o algo así)
Aaron
2

En realidad , 27 bytes

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

Pruébalo en línea! (Nota: como TIO no funciona bien con stdin, he reemplazado el ,(leer de stdin) con la cadena literal, que puede cambiar para probarlo. Además, deberá deshabilitar la caché de salida para obtener una respuesta diferente con la salida aleatoria)

Explicación:

":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
dispersión
fuente
1

APL (Dyalog) , 27 bytes

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

Pruébalo en línea!

':q' imprime esto

 luego

?2 entero aleatorio entre los dos primeros

⊃⍨ use eso para seleccionar

':q!' ':x' esta lista de dos cadenas

()/ Replica eso con, es decir, haz n copias de cada elemento en ese, donde n es

'!'∊⍞ ¿Es el signo de exclamación un miembro de la entrada de texto? (Booleano, es decir, 0 o 1)

Adán
fuente
1

Lote, 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
fuente
1

Ruby , 33 bytes (código 32, +1 para el indicador -n)

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

No estoy muy seguro sobre el $$%2fragmento. Lo estoy usando para generar un bit aleatorio para indexar mi matriz tomando el módulo pid 2 del proceso de ruby ​​actual, y será bastante impredecible. .sampleagrega un byte extra.

Pruébalo en línea!

ymbirtt
fuente
1

JavaScript, 76 71 50 bytes

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

Ahorré un montón de bytes gracias a Artyer y Neil, así como condensé mis ternaries y moví la primera alerta a prompt (duh).

Stephen
fuente
2
¿Por qué no solo llamar prompt()directamente? (Además, ¿está permitido prompt(":q")?)
Neil
Puede usar el tiempo como un número aleatorio (en new Date%2lugar de Math.random()>.5), y puede usar el aviso directamente como @Neil dijo:prompt()[3]<
Artyer
@Neil ¿Por qué? Había estado haciendo algo .indexOfal respecto, antes de notar la otra forma de hacerlo. Olvidé volver, gracias!
Stephen
@Artyer gracias, había pensado en eso y luego lo olvidé
Stephen
1

Python 2 , 64 bytes

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

Pruébalo en línea!

Puesto que esto es sólo una aglomeración de ambas de estas respuestas Python, he marcado esto como wiki de la comunidad.

Artyer
fuente
1

Python 2 , 47 bytes

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

Pruébalo en línea

Explicación:

La fuente de aleatoriedad es id(0)%3<2. La función iddevuelve la ubicación de la memoria del parámetro. Pasar cualquier cosa dará una dirección de memoria no determinista. El resultado siempre será uniforme, pero a veces solo será divisible por 3. Los resultados del módulo 3 varían. Entonces, esto puede ser una fuente de aleatoriedad. Usar <2significa que aproximadamente 2/3 de las veces, el booleano resultante es True.

El resto de la respuesta está inspirada en esta .

mbomb007
fuente
1

Barril ,14 12 bytes

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

Esto empuja un número aleatorio y sale correspondientemente al número aleatorio.

UNA _
fuente
0

TCL, 95 bytes

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

Una solución simple y bastante larga en tcl ...

hdrz
fuente
0

Asamblea 86Bytes Linux System Calls

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

LOGOTIPO, 37 36 bytes

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

Pruébelo en línea en el corrector de rendimiento Anarchy Golf .

Explicación:

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]

(porque E37@vimmachine: /var/override)tiene 2 palabras, mientras que E37: No write since last change (add ! to override)tiene 10 palabras)

usuario202729
fuente
Una explicación sería genial.
pajonk
0

Perl 5 (con bandera -E), 35 bytes

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

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

Pruébalo en línea!

Sin golf:

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
fuente