Como saio do Vim?


42

O Vim é um ótimo editor de texto para sistemas unix, mas é notório por ser difícil sair.

Escreva um programa completo que será exibido :qpara sair do Vim. Ele deve ler uma única linha de entrada, pois receberá um prompt do bash; nesse caso, a saída foi bem-sucedida ou um erro; nesse caso, há alterações não salvas.

O prompt do bash será este:

E37@vimmachine: /var/override)

Enquanto o erro será este:

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

Ao receber o prompt do bash, o trabalho do programa é concluído e não deve fornecer mais saída (exceto espaços em branco).

Após receber o erro, seu programa deve aleatoriamente (ou seja, cada possibilidade tem uma probabilidade diferente de zero de ser escolhido) sair :q!, para sair sem salvar, ou :xpara salvar e sair.

Isso é e o menor número de bytes em cada idioma vence!


26
Eu não sabia que :xera uma coisa! Eu sempre usei :wq:)
musicman523

3
E se o meu prompt do bash for E37: No write since last change? Ou seja, como um algoritmo pode distinguir um prompt de uma mensagem de erro?
anatolyg

5
@anatolyg não pode, mas também não precisa. O prompt fornecido sempre será o acima, isto é #E37@vimmachine: /var/override)
Skidsdev 20/06

2
O prompt fornecido será sempre o acima. Isso deve ser declarado na especificação do desafio. Como está, ele se parece com isso , o que pode significar várias coisas.
Dennis

5
(juntou-se ao golfe para este comentário, sheesh) @ musicman523 NUNCA use :xpara sair do vim. Algum dia você acidentalmente pressionará :Xteclas aleatórias quando estiver confuso. Depois de finalmente, :wqvocê nunca mais verá seu arquivo.
Aaron McMillin

Respostas:


16

Python 2 , 66 bytes

Economizou 3 bytes graças a @ Mr.Xcoder e 4 graças a @Mayube!

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

Experimente online!


2
Se você alternar para Python 2, poderá salvar 1 bytes usando em print vez de print(). E você pode tirar a entrada com citações
Mr. Xcoder

@ Mr.Xcoder Obrigado, ele realmente me salvou 3 bytes!
musicman523

Sim, eu não vi duas declarações impressas.
Sr. Xcoder 20/17

3
Eu dei essa dica para totalmente humano, então é justo que eu também a dê. Você pode remover print':q'completamente e mudar input()para #input(':q')
Skidsdev

@ Mayube oh isso é incrível, obrigado!
precisa


6

05AB1E , 19 bytes

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

Experimente 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

Esta resposta está fora do campo de golfe .

-1 byte graças a Rod. -3 bytes graças ao Mayube. -3 bytes graças a Artyer.

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

Experimente online!


Isso imprime uma nova linha extra, onde o desafio dizit should not give any more output
musicman523

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

1
random()>.5salvar um byte
Rod

2
A aleatoriedade precisa ser distribuída uniformemente? Caso contrário, você poderia fazê-lo random()>0, porque há uma chance muito pequena que random()retornará 0.
mbomb007

1
@Artyer Você sabe o que [0, 1)significa, certo? Isso significa que zero é incluído porque o intervalo é inclusivo em zero. stackoverflow.com/a/4396303/2415524 ... A maneira mais fácil de lembrar é que em uma linha numérica, pontos fechados são incluídos e pontos abertos não. Os colchetes parecem fechados e os parênteses parecem abertos.
mbomb007

5

Vimscript, 45 41 bytes

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

Raspou 4 bytes usando getpid()para obter um número. (Alguém pode pensar em uma maneira mais curta de obter um número que não será o mesmo em todos os lugares, o tempo todo?)

Supondo +3 bytes para chamar o Vim -cpara executar o script acima e -ler a entrada de stdin:

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

3

JavaScript, 52 46 bytes

Guardado 6 bytes graças a @ETHProductions

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

Não precisa haver um !após o :qse a entrada for um erro?
Salsicha

@Shaggy aww, não percebeu que, lá se vai a 9 bytes
Downgoat

Eu acho que você pode salvar alguns bytes com prompt(':q')[30]&&.... Além disso,new Date%2?':x':':q!'
ETHproductions

@ETHproductions oh sim, obrigado! não sei como eu dava para um ternário
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!");}}

Experimente online!

  • 1 byte salvo graças ao LiefdeWen!
  • 1 byte economizado graças a Mord Zuber!

Colocar o programa no Systemnamespace torna capaz de encurtar System.Randoma Random, economizando 1 byte
LiefdeWen

@CarlosAlejo funciona para mim no TIO, no entanto ele produz q!não:q!
Skidsdev

1
@CarlosAlejo Ahh, eu nem percebi que você não usava um espaço para nome, a pergunta também não diz uniformemente aleatória, todas as possibilidades deveriam ter uma chance diferente de zero, então você muda .Next(2)>0para .Next()>9, deixa um pouco ruim gosto na boca, mas ainda é legal.
LiefdeWen

4
using static System.Consolepermite que você soltar todas C.as chamadas, e você economiza um byte
Mord Zuber

1
@MordZuber what the ...? Eu nem sabia que isso era possível! Obrigado!
30617 Charlie

3

> <> , 32 30 29 bytes

  • Teve um redundante !o.
  • -1 byte graças a Aaron.

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

Experimente online!

Explicação (antiga)

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

(será atualizado em breve)


Não tenho certeza se isso seria permitido, mas você pode ganhar um byte lendo os três caracteres a serem descartados primeiro e começar a trabalhar em uma nova pilha com [: iii0[você deixará uma pilha vazia; agradável de qualquer maneira, eu gosto de como você preencher todos os seus possíveis saídas no início para evitar citações adicionais
Aaron

@ Aaron Obrigado, esse é um truque muito legal! Por que não seria permitido?
PidgeyUsedGust

Porque você estaria lendo a entrada antes de imprimir a saída que leva à sua produção, o que, suponho, vai contra o espírito do desafio. No entanto, não é como o desafio pode realisticamente implementado com o oficial> <> intérprete desde python vai esperar por EOF da entrada antes de executar a> <> Código (ou algo parecido)
Aaron

2

Na verdade , 27 bytes

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

Experimente online! (Nota: Como o TIO não funciona bem com o stdin, substituí o ,(read from stdin) pela string literal, que você pode alterar para testá-lo. Além disso, será necessário desativar o cache de saída para obter uma resposta diferente com a saída aleatória.)

Explicação:

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

Experimente online!

':q' imprima isto

 então

?2 número inteiro aleatório entre os dois primeiros

⊃⍨ use isso para selecionar

':q!' ':x' esta lista de duas cordas

()/ Replique isso com, ou seja, faça n cópias de cada elemento, onde n é

'!'∊⍞ o ponto de exclamação é um membro da entrada de texto? (Booleano, ou seja, 0 ou 1)


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!

1

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

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

Não tenho muita certeza do $$%2trecho. Estou usando-o para gerar um bit aleatório para indexar minha matriz, usando o módulo pid 2 do processo ruby ​​atual, e será bastante imprevisível. .sampleadiciona um byte extra.

Experimente online!


1

JavaScript, 76 71 50 bytes

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

Economizei um monte de bytes graças a Artyer e Neil, além de condensar meus ternários e mover o primeiro alerta para solicitar (duh).


2
Por que não apenas ligar prompt()diretamente? (Além disso, vocês estão autorizados prompt(":q")?)
Neil

Você pode usar o tempo como um número aleatório ( new Date%2em vez de Math.random()>.5), e você pode usar o prompt diretamente como @Neil disse:prompt()[3]<
Artyer

@Neil Why? Eu estava fazendo .indexOfisso antes de perceber a outra maneira de fazê-lo. Esqueceu de voltar, obrigado!
Stephen

@Artyer obrigado, eu tinha pensado nisso e depois esqueceu
Stephen


1

Python 2 , 47 bytes

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

Experimente online

Explicação:

A fonte da aleatoriedade é id(0)%3<2. A função idretorna a localização da memória do parâmetro. Passar qualquer coisa fornecerá um endereço de memória não determinístico. O resultado será sempre uniforme, mas às vezes será divisível por 3. Os resultados do módulo 3 variam. Portanto, isso pode ser uma fonte de aleatoriedade. Usar <2significa que aproximadamente 2/3 das vezes, o booleano resultante é True.

O restante da resposta é inspirado por esta .


1

Barril ,14 12 bytes

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

Isso envia um número aleatório e gera uma correspondência correspondente ao número aleatório.


0

TCL, 95 bytes

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

Uma solução simples e bastante longa em tcl ...


0

Chamadas de sistema do Assembly 86Bytes 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 bytes

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

Experimente online no verificador Anarchy Golf Performance .

Explicação:

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)tem 2 palavras, enquanto E37: No write since last change (add ! to override)tem 10 palavras)


Uma explicação seria ótima.
Pajonk

0

Perl 5 (com sinalizador -E), 35 bytes

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

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

Experimente 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
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.