Bagaimana cara saya keluar dari Vim?

42

Vim adalah editor teks yang bagus untuk sistem unix, tetapi terkenal sulit untuk keluar.

Tulis program lengkap yang akan ditampilkan :quntuk keluar dari Vim. Kemudian harus membaca satu baris input, karena kemudian akan diberikan bash prompt, dalam hal ini keluar berhasil, atau kesalahan, dalam hal ini ada perubahan yang belum disimpan.

Bash prompt akan menjadi ini:

E37@vimmachine: /var/override)

Sementara kesalahannya adalah ini:

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

Setelah diberi bash prompt, pekerjaan program selesai, dan seharusnya tidak memberikan output lagi (kecuali untuk spasi putih).

Setelah diberi kesalahan, program Anda harus secara acak (yaitu setiap kemungkinan memiliki probabilitas yang tidak nol untuk dipilih) :q!, untuk keluar tanpa menyimpan, atau :x, untuk menyimpan dan keluar.

Ini adalah sehingga byte paling sedikit di setiap bahasa menang!

Skidsdev
sumber
26
Saya tidak tahu :xapa-apa! Saya selalu menggunakan :wq:)
musicman523
3
Bagaimana jika bash prompt saya E37: No write since last change? Artinya, bagaimana suatu algoritma dapat membedakan prompt dari pesan kesalahan?
anatolyg
5
@anatolyg tidak bisa, tetapi juga tidak harus. Prompt yang diberikan akan selalu menjadi yang di atas, yaituE37@vimmachine: /var/override)
Skidsdev
2
Prompt yang diberikan akan selalu menjadi yang di atas. Itu harus dinyatakan dalam spec tantangan. Seperti, katanya seperti ini , yang dapat berarti banyak hal.
Dennis
5
(bergabung dengan golf untuk komentar ini, sheesh) @ musicman523 TIDAK PERNAH gunakan :xuntuk keluar dari vim. Suatu hari Anda secara tidak sengaja akan menekan :Xtombol acak ketika Anda bingung. Setelah Anda akhirnya, :wqAnda tidak akan pernah melihat file Anda lagi.
Aaron McMillin

Jawaban:

16

Python 2 , 66 byte

Disimpan 3 byte berkat @ Mr.Xcoder dan 4 terima kasih ke @Mayube!

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

Cobalah online!

musicman523
sumber
2
Jika Anda beralih ke Python 2, Anda dapat menyimpan 1 byte dengan menggunakan print bukan print(). Dan Anda dapat mengambil input dengan tanda kutip
Tn. Xcoder
@ Mr.Xcoder Terima kasih, ini sebenarnya menyelamatkan saya 3 byte!
musicman523
Ya, saya tidak melihat Anda memiliki 2 pernyataan cetak
Tn. Xcoder
3
Saya memberikan tip ini untuk benar-benar manusia sehingga hanya adil saya memberikannya kepada Anda juga. Anda dapat menghapus print':q'semuanya dan mengubah input()keinput(':q')
Skidsdev
@ Mayube oh itu luar biasa, terima kasih!
musicman523
7

Ruby , 35 byte

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

Cobalah online!

André Diego Piske
sumber
1
Anda dapat mencukur byte dengan menghapus spasi di antara pdan :q;)
ymbirtt
1
luar biasa dan aneh! Saya tidak tahu itu, terima kasih @ymbirtt
André Diego Piske
6

05AB1E , 19 byte

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

Cobalah 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
sumber
5

Python 2 , 76 75 72 69 byte

Jawaban ini sudah di luar golf .

-1 byte terima kasih kepada Rod. -3 byte terima kasih kepada Mayube. -3 byte terima kasih kepada Artyer.

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

Cobalah online!

benar-benar manusiawi
sumber
Ini mencetak baris baru tambahan di mana tantangannya mengatakanit should not give any more output
musicman523
@Mayube May we output a newline upon terminating? @Adám sure, that's fine
Stephen
1
random()>.5untuk menyimpan byte
Batang
2
Apakah keacakan harus didistribusikan secara seragam? Jika tidak, Anda bisa melakukannya random()>0, karena ada peluang sangat kecil yang random()akan kembali 0.
mbomb007
1
@Artyer Anda tahu apa [0, 1)artinya, bukan? Ini berarti bahwa nol dimasukkan karena kisaran termasuk nol. stackoverflow.com/a/4396303/2415524 ... Cara mudah untuk mengingatnya adalah bahwa pada garis bilangan, titik-titik tertutup disertakan, dan titik-titik terbuka tidak. Kurung terlihat tertutup, dan parens terlihat terbuka.
mbomb007
5

Vimscript, 45 41 byte

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

Memotong 4 byte dengan menggunakan getpid()untuk mendapatkan nomor. (Adakah yang bisa memikirkan cara yang lebih pendek untuk mendapatkan nomor yang tidak akan sama di mana-mana, sepanjang waktu?)

Dengan asumsi +3 byte untuk menjalankan Vim dengan -cmenjalankan skrip di atas dan -membaca input dari stdin:

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

JavaScript, 52 46 byte

Disimpan 6 byte berkat @ETHProductions

prompt(':q')[30]&&alert(new Date%2?':q!':':x')
Downgoat
sumber
Tidak perlu !setelah setelah :qjika input adalah kesalahan?
Shaggy
@Shaggy aww, tidak menyadari bahwa, ada 9 byte
Downgoat
Saya pikir Anda dapat menyimpan beberapa byte dengan prompt(':q')[30]&&.... Juga,new Date%2?':x':':q!'
ETHproduksi
@ ETHproduksi oh yeah, terima kasih! tidak yakin bagaimana saya mengabaikan terner
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!");}}

Cobalah online!

  • 1 byte disimpan berkat LiefdeWen!
  • 1 byte disimpan berkat Mord Zuber!
Charlie
sumber
Menempatkan program anda dalam Systemnamespace membuat Anda dapat mempersingkat System.Randomuntuk Random, menyimpan 1 byte
LiefdeWen
@CarlosAlejo bekerja untuk saya di TIO, namun hasilnya q!tidak:q!
Skidsdev
1
@CarlosAlejo Ahh, aku bahkan tidak menyadari bahwa Anda tidak menggunakan namespace, pertanyaannya juga tidak mengatakan seragam acak, hanya semua kemungkinan harus memiliki non-nol kesempatan sehingga Anda mengubah .Next(2)>0ke .Next()>9, ia meninggalkan sedikit buruk rasa di mulut tetapi masih legal.
LiefdeWen
4
using static System.Consolememungkinkan Anda menjatuhkan semua C.panggilan, dan menghemat satu byte
Mord Zuber
1
@MordZuber apa ...? Aku bahkan tidak tahu itu mungkin! Terima kasih!
Charlie
3

> <> , 32 30 29 byte

  • Sudah mubazir !o.
  • -1 byte terima kasih kepada Aaron.

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

Cobalah online!

Penjelasan (lama)

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

(akan segera diperbarui)

PidgeyDigunakanGust
sumber
Saya tidak yakin ini akan diizinkan, tetapi Anda bisa memenangkan satu byte dengan membaca 3 karakter untuk dibuang terlebih dahulu, kemudian mulai bekerja pada tumpukan baru dengan [: iii0[wil meninggalkan Anda dengan tumpukan kosong; tetap bagus, saya suka bagaimana Anda mengisi semua kemungkinan output Anda di awal untuk menghindari penawaran tambahan
Aaron
@ Harun Terima kasih, itu trik yang sangat rapi! Mengapa itu tidak diizinkan?
PidgeyDigunakanGust
Karena Anda akan membaca input sebelum mencetak output yang mengarah ke produksinya, yang saya kira bertentangan dengan semangat tantangan. Namun itu tidak seperti tantangan yang dapat diimplementasikan secara realistis dengan penerjemah resmi> <> karena python akan menunggu input EOF sebelum menjalankan kode> <> (atau sesuatu seperti itu)
Aaron
2

Sebenarnya , 27 byte

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

Cobalah online! (Catatan: Karena TIO tidak bermain bagus dengan stdin, saya telah mengganti ,(baca dari stdin) dengan string literal, yang dapat Anda ubah untuk mengujinya. Selain itu, Anda harus menonaktifkan cache output untuk mendapatkan respon yang berbeda dengan output acak.)

Penjelasan:

":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
menyebarkan
sumber
1

APL (Dyalog) , 27 byte

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

Cobalah online!

':q' cetak ini

 kemudian

?2 bilangan bulat acak di antara dua yang pertama

⊃⍨ gunakan itu untuk memilih dari

':q!' ':x' daftar dua string ini

(... )/ meniru itu dengan, yaitu membuat n salinan dari setiap elemen di dalamnya, di mana n adalah

'!'∊⍞ Apakah tanda seru anggota input teks? (Boolean, yaitu 0 atau 1)

Adm
sumber
1

Batch, 98 byte

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

Ruby , 33 byte (32 kode, +1 untuk -n bendera)

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

Saya tidak terlalu yakin pada $$%2cuplikannya. Saya menggunakannya untuk menghasilkan bit acak untuk mengindeks array saya dengan mengambil modul pid 2 proses ruby ​​saat ini, dan itu akan cukup tak terduga. .samplemenambahkan byte tambahan.

Cobalah online!

ymbirtt
sumber
1

JavaScript, 76 71 50 byte

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

Menyelamatkan banyak byte berkat Artyer dan Neil, dan juga kondensasi terner saya dan memindahkan peringatan pertama ke prompt (duh).

Stephen
sumber
2
Kenapa tidak prompt()langsung saja menelepon ? (Juga, apakah Anda diizinkan prompt(":q")?)
Neil
Anda dapat menggunakan waktu sebagai angka acak ( new Date%2bukan Math.random()>.5), dan Anda dapat menggunakan prompt langsung seperti prompt()[3]<
@Neil
@Neil Kenapa? Saya telah melakukan .indexOfitu, sebelum saya perhatikan cara lain untuk melakukannya. Lupa beralih kembali, terima kasih!
Stephen
@Artyer terima kasih, saya telah memikirkan hal itu dan kemudian melupakannya
Stephen
1

Python 2 , 64 byte

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

Cobalah online!

Karena ini hanya sebuah aglomerasi kedua dari ini jawaban Python, yang sudah ditandai ini sebagai komunitas wiki.

Artyer
sumber
1

Python 2 , 47 byte

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

Cobalah online

Penjelasan:

Sumber keacakan adalah id(0)%3<2. Fungsi idmengembalikan lokasi memori parameter. Melewati apa pun akan memberikan alamat memori yang non-deterministik. Hasilnya akan selalu genap, tetapi kadang-kadang hanya akan habis dibagi 3. Hasilnya modulo 3 bervariasi. Jadi, ini bisa menjadi sumber keacakan. Menggunakan <2berarti kira-kira 2/3 dari waktu, boolean yang dihasilkan adalah True.

Jawaban sisanya terinspirasi oleh yang satu ini .

mbomb007
sumber
1

Tong ,14 12 byte

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

Ini mendorong angka acak dan menghasilkan sesuai dengan angka acak.

SEBUAH _
sumber
0

TCL, 95 byte

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

Solusi sederhana dan agak panjang di ...

hdrz
sumber
0

Majelis 86Bytes Panggilan Sistem Linux

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

LOGO, 37 36 byte

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

Cobalah online di pemeriksa Anarchy Golf Performance .

Penjelasan:

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]

(karena E37@vimmachine: /var/override)memiliki 2 kata, sedangkan E37: No write since last change (add ! to override)memiliki 10 kata)

pengguna202729
sumber
Penjelasan akan sangat bagus.
pajonk
0

Perl 5 (dengan flag -E), 35 byte

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

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

Cobalah online!

Tidak Disatukan:

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
}
pengguna4098326
sumber