Vim'den nasıl çıkarım?


42

Vim, unix sistemleri için harika bir metin editörüdür, ancak çıkması zor olduğu için ünlüdür.

:qVim'den çıkmak için çıkacak tam bir program yazın . Daha sonra, bir bash komut istemi verileceği için tek bir giriş satırı okumalıdır, bu durumda çıkış başarılı olmuş veya bir hata, bu durumda kaydedilmemiş değişiklikler vardır.

Bash bilgi istemi şöyle olacaktır:

E37@vimmachine: /var/override)

Hata bu olacak olsa da:

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

Bash istemi verildikten sonra, programın işi yapılır ve daha fazla çıktı vermemelidir (boşluk hariç).

Hata verildikten sonra, programınız rasgele (yani, her ihtimalde sıfır olma olasılığı bulunmaz) çıktı :q!, :xkaydetmeden çıkma, kaydetme ve çıkma.

Bu yani her dilde en az bayt kazanıyor!


26
:xBir şey olduğunu bilmiyordum ! Her zaman kullandım :wq:)
musicman523

3
Bash komut istemim ne olacak E37: No write since last change? Yani, bir algoritma bir istemi bir hata mesajından nasıl ayırt edebilir?
anatolyg

5
@anatolyg yapamaz, ama yapmak zorunda da değildir. Verilen bilgi istemi daima yukarıda olacak, yaniE37@vimmachine: /var/override)
Skidsdev

2
Verilen bilgi her zaman yukarıda belirtilenlerden biri olacaktır . Olduğu gibi , herhangi bir şey ifade edebilir, bu gibi görünüyor diyor .
Dennis,

5
(Bu yorum için golf katıldı, sheesh) @ musicman523 ASLA :xvim çıkmak için kullanmayın . Bir gün :Xkafanız karıştığında yanlışlıkla rasgele tuşlara basacaksınız. Sonunda nihayet :wqdosyanızı tekrar görmeyeceksiniz.
Aaron McMillin

Yanıtlar:


16

Python 2 , 66 bayt

@ Mr.Xcoder ve 4 @Mayube sayesinde 4 bayt kaydedildi!

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

Çevrimiçi deneyin!


2
Python 2'ye geçerseniz print yerine 1 bayt kaydedebilirsiniz print(). Ve girişi tırnak işaretleri altına alabilirsiniz
Mr. Xcoder

@ Mr.Xcoder Teşekkürler, aslında 3 bayt kurtardı!
musicman523

Evet, 2 baskı
ifadeniz

3
Bu ipucunu tamamen insanlığa verdim, bu yüzden sana da verdiğim tek şey adil. Sen kaldırabilirsiniz print':q'tamamen ve değiştirmek input()içininput(':q')
Skidsdev

@ Mayube oh bu harika, teşekkür ederim!
musicman523


6

05AB1E , 19 bayt

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

Çevrimiçi deneyin!

„: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 bayt

Bu cevap dışarıda bırakılmıştır .

Rod sayesinde -1 bayt. Mayube sayesinde -3 bayt. Artyer sayesinde -3 bayt.

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

Çevrimiçi deneyin!


Bu meydan okuma diyor ek bir yeni hat basarit should not give any more output
musicman523

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

1
random()>.5Bir bayt kurtarmak için
Rod

2
Rastgele dağılıma mı sahip olmak gerekiyor? Olmazsa, yapabilirsin random()>0, çünkü geri dönüş için çok küçük bir şans var . random()0
mbomb007

1
@Artyer Ne [0, 1)anlama geldiğini biliyorsunuz , değil mi? Sıfır içerdiği anlamına gelir çünkü aralık sıfır kapsayıcıdır. stackoverflow.com/a/4396303/2415524 ... Bunu hatırlamanın kolay yolu, bir sayı satırında, kapalı noktaların dahil edildiği ve açık noktaların bulunmadığıdır. Parantezler kapalı, parensler açık görünüyor.
mbomb007

5

Vimscript, 45 41 bayt

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

getpid()Bir sayı almak için kullanarak 4 bayt kapalı . (Herkes her yerde, her zaman aynı olmayacak bir sayı almanın daha kısa bir yolunu düşünebilir mi?)

-cYukarıdaki komut dosyasını çalıştırmak ve -stdin'den girdi okumak için Vim'i çağırmak için +3 bayt varsayarak :

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

3

JavaScript, 52 46 bayt

@ETHProductions sayesinde 6 bayt kurtardı

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

Giriş bir hata ise bir !sonra olması gerekmez :qmi?
Shaggy

@Shaggy aww, fark etmedi, 9 bayt gitti
Downgoat

Sanırım bir kaç bayt kurtarabilirsin prompt(':q')[30]&&.... Ayrıca,new Date%2?':x':':q!'
ETHproductions

@ETHproductions oh evet, teşekkürler! nasıl bir üçlü gözden kaçan emin değilim
Downgoat

3

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

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

Çevrimiçi deneyin!

  • LiefdeWen sayesinde 1 bayt kurtarıldı!
  • Mord Zuber sayesinde 1 bayt kurtarıldı!

Programınızı Systemad alanına yerleştirmek, kısaltmanızı System.Randomve Random1 byte tasarruf
etmenizi sağlar

@CarlosAlejo TIO'da benim için çalışıyor, ancak sonuçta q!çıkmıyor:q!
Skidsdev

1
@CarlosAlejo Ahh, bir ad alanı kullanmadığınızı bile anlamadım, soru aynı zamanda eşit bir şekilde rastgele demiyor, sadece tüm olasılıkların sıfır olmayan bir şansa sahip olması .Next(2)>0gerekiyor .Next()>9, bu yüzden değiştirirseniz , biraz kötü kalıyor ağızda tadı ama yine de yasal.
LiefdeWen

4
using static System.Consoletüm C.çağrıları bırakmanıza izin verir ve size bir bayt kazandırır
Mord Zuber

1
@MordZuber ne ...? Bunun mümkün olduğunu bile bilmiyordum! Teşekkür ederim!
Charlie

3

> <> , 32 30 29 bayt

  • Fazlalık vardı !o.
  • Aaron sayesinde -1 bayt.

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

Çevrimiçi deneyin!

Açıklama (eski)

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

(yakında güncellenecek)


Buna izin verileceğinden emin değilim, ancak önce atılacak 3 karakteri okuyarak bir bayt kazanabilir ve ardından yeni bir yığında çalışmaya başlayabilirsiniz [: iii0[wil sizi boş bir yığında bırakır; Yine de güzel, ek alıntılardan kaçınmak için başlangıçta olası tüm çıktılarınızı nasıl doldurduğunuzu beğendim
Aaron

@Aaron Teşekkürler, bu çok düzgün bir numara! Neden izin verilmiyor?
PidgeyUsedGust

Çünkü üretimine yol açan çıktının basılmasından önce girdiyi okuyorsunuz, ki sanırım bu mücadelenin ruhuna aykırı. Ancak,>> tercüman ile gerçekçi bir şekilde mücadele etmek zor değil, çünkü python> <> kodunu (veya benzeri bir şey) çalıştırmadan önce girişin EOF'sini bekleyecektir
Aaron

2

Aslında , 27 bayt

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

Çevrimiçi deneyin! (Not: TIO stdin ile hoş görünmediğinden, ,(stdin'den okunan) yerine test etmek için değiştirebileceğiniz değişmez dizgiyi değiştirdim. Ayrıca, elde etmek için çıkış önbelleğini devre dışı bırakmanız gerekir. rastgele çıktı ile farklı bir cevap.)

Açıklama:

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

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

Çevrimiçi deneyin!

':q' bunu yazdır

 sonra

?2 ilk ikisi arasında rastgele tamsayı

⊃⍨ seçmek için kullanın

':q!' ':x' bu iki dizenin listesi

()/ Bunu, yani her bir elemanın n kopyasını, n'nin olduğu yerde kopyalayın.

'!'∊⍞ ünlem işareti metin girişinin bir üyesi mi? (Boolean, yani 0 veya 1)


1

Toplu iş, 98 bayt

@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 bayt (32 kod, -n bayrağı için +1)

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

$$%2Snippet'ten pek emin değilim . Geçerli yakut sürecinin pid modulo 2'sini alarak dizimi endekslemek için rastgele bir bit üretmek için kullanıyorum ve bu oldukça tahmin edilemez. .samplefazladan bir bayt ekler.

Çevrimiçi deneyin!


1

JavaScript, 76 71 50 bayt

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

Artyer ve Neil sayesinde bir sürü bayt kurtardı, ayrıca üçlülerimi yoğunlaştırıp ilk uyarıyı harekete geçirmek (duh).


2
Neden sadece prompt()doğrudan aramıyorsun ? (Ayrıca izin verilir prompt(":q")mi?)
Neil

Zamanı ( new Date%2yerine Math.random()>.5) rasgele bir sayı olarak kullanabilir ve @Neil'in söylediği gibi doğrudan bilgi istemi kullanabilirsiniz:prompt()[3]<
Artyer

@Neil Neden? Bunu yapmanın .indexOfbaşka yolunu fark etmeden önce üzerinde yapıyordum . Geri dönmeyi unuttun, teşekkürler!
Stephen

@Artyer teşekkürler, bunu düşündüm ve sonra unuttum
Stephen

1

Python 2,64 bayt

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

Çevrimiçi deneyin!

Bu sadece bir aglomerasyon olduğundan hem arasında bu Python cevaplar, ben topluluk wiki olarak bu işaretledim.


1

Python 2 , 47 bayt

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

Çevrimiçi deneyin

Açıklama:

Rastgeleğin kaynağı id(0)%3<2. Fonksiyon idparametrenin hafıza konumunu döndürür. Herhangi bir şeyi iletmek deterministik olmayan bir hafıza adresi verecektir. Sonuç her zaman eşit olacaktır, ancak yalnızca bazen 3 ile bölünebilir. Sonuçlar modulo 3 değişebilir. Yani, bu bir rastgelelik kaynağı olabilir. Kullanılması <2kabaca 2/3 zamanın o araçlar, çıkan boolean True.

Cevabın kalan esinlenerek bu bir .


1

Fıçı ,14 12 bayt

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

Bu, rastgele bir sayıyı iter ve rastgele sayıya karşılık gelen çıktılar verir.


0

TCL, 95 bayt

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

Tcl'de basit ve oldukça uzun bir çözüm ...


0

Montaj 86Bytes Linux Sistem Çağrıları

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 bayt

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

Anarchy Golf Performance checker'da çevrimiçi deneyin .

Açıklama:

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]

(çünkü E37@vimmachine: /var/override)2 kelime, E37: No write since last change (add ! to override)10 kelime ise)


Bir açıklama çok iyi olurdu.
pajonk

0

Perl 5 (-E bayrağı ile), 35 bayt

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

Bunu çalıştır perl -E 'say":q";<>=~l&&say qw(:q! :x)[$$%2]'.

Çevrimiçi deneyin!

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.