Jak wyjść z Vima?


42

Vim to świetny edytor tekstowy dla systemów uniksowych, ale notorycznie jest trudny do wyjścia.

Napisz pełny program, który wyświetli :qwyjście z Vima. Następnie powinien odczytać pojedynczy wiersz danych wejściowych, ponieważ albo zostanie wyświetlony monit bash, w którym to przypadku wyjście zakończyło się powodzeniem, albo błąd, w którym to przypadku nastąpią niezapisane zmiany.

Bash będzie następujący:

E37@vimmachine: /var/override)

Podczas gdy błąd będzie następujący:

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

Po otrzymaniu monitu bash praca programu jest zakończona i nie powinna dawać więcej wyników (z wyjątkiem białych znaków).

Po otrzymaniu błędu, twój program powinien losowo (tj. Każda możliwość ma niezerowe prawdopodobieństwo wybrania) wyjście :q!, aby wyjść bez zapisywania lub :x, aby zapisać i wyjść.

To jest więc wygrywa najmniej bajtów w każdym języku !


26
Nie wiedziałem, że to :xbyła rzecz! Zawsze używałem :wq:)
musicman523,

3
Co jeśli mój monit bash jest E37: No write since last change? To znaczy, w jaki sposób algorytm może odróżnić monit od komunikatu o błędzie?
anatolyg

5
@anatolyg nie może, ale też nie musi. E37@vimmachine: /var/override)
Podanym monitem

2
Podana zachęta będzie zawsze powyższa. To powinno być określone w specyfikacji wyzwania. Mówi się, że tak to wygląda , co może oznaczać dowolną liczbę rzeczy.
Dennis

5
(dołączył do golfa dla tego komentarza, sheesh) @ musicman523 NIGDY nie należy używać :xdo wyjścia z vima. Pewnego dnia, :Xgdy się zdezorientujesz, przypadkowo uderzysz w losowe klawisze. Po tym, jak w końcu :wqjuż nigdy nie zobaczysz swojego pliku.
Aaron McMillin

Odpowiedzi:


16

Python 2 , 66 bajtów

Zaoszczędź 3 bajty dzięki @ Mr.Xcoder i 4 dzięki @Mayube!

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

Wypróbuj online!


2
Jeśli przełączysz się na Python 2, możesz zapisać 1 bajt, używając print zamiast print(). I możesz wziąć dane wejściowe z cytatami
Mr. Xcoder,

@ Mr.Xcoder Dzięki, faktycznie zaoszczędziłem mi 3 bajty!
musicman523,

Tak, nie widziałem, żebyś miał 2 drukowane wyciągi
Mr. Xcoder,

3
Dałem tę wskazówkę całkowicie ludzkiemu, więc to sprawiedliwe, że ci ją daję. Możesz print':q'całkowicie usunąć i zmienić input()nainput(':q')
Skidsdev

@Mayube, och, to niesamowite, dziękuję!
musicman523,


6

05AB1E , 19 bajtów

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

Wypróbuj 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 bajtów

Ta odpowiedź została pominięta .

-1 bajt dzięki Rod. -3 bajty dzięki Mayube. -3 bajty dzięki Artyerowi.

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

Wypróbuj online!


To drukuje dodatkowy nowy wiersz, w którym mówi wyzwanieit should not give any more output
musicman523,

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

1
random()>.5by uratować bajt
Rod

2
Czy losowość musi być równomiernie rozłożona? Jeśli nie, możesz to zrobić random()>0, ponieważ istnieje bardzo niewielka szansa na random()powrót 0.
mbomb007

1
@Artyer Wiesz, co to [0, 1)znaczy, prawda? Oznacza to, że zero jest uwzględnione, ponieważ zakres obejmuje zero. stackoverflow.com/a/4396303/2415524 ... Łatwym sposobem na zapamiętanie jest to, że na linii liczbowej znajdują się zamknięte kropki, a otwartych kropek nie. Nawiasy wyglądają na zamknięte, a pareny na otwarte.
mbomb007

5

Vimscript, 45 41 bajtów

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

Ogolono 4 bajty za pomocą, getpid()aby uzyskać numer. (Czy ktoś może wymyślić krótszy sposób na uzyskanie numeru, który nie zawsze będzie taki sam wszędzie?)

Zakładając +3 bajty za wywołanie Vima za -cpomocą powyższego skryptu i -odczytanie danych wejściowych ze standardowego wejścia:

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

3

JavaScript, 52 46 bajtów

Zaoszczędź 6 bajtów dzięki @ETHProductions

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

Czy nie trzeba wstawiać !po, :qjeśli wejście jest błędem?
Kudłaty

@Shaggy aww, nie zauważyłem, że idzie 9 bajtów
Downgoat

Myślę, że możesz zaoszczędzić kilka bajtów prompt(':q')[30]&&.... Ponadto,new Date%2?':x':':q!'
ETHproductions

@ETHproductions o tak, dzięki! Nie jestem pewien, jak przeoczyłem trójskładnik
Downgoat

3

C # (.NET Core) , 140 139 138 bajtów

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

Wypróbuj online!

  • 1 bajt zapisany dzięki LiefdeWen!
  • 1 bajt zapisany dzięki Mordowi Zuberowi!

Umieszczenie programu w Systemprzestrzeni nazw umożliwia skrócenie System.Randomdo Random, oszczędzając 1 bajt
LiefdeWen

@CarlosAlejo działa dla mnie w TIO, jednak q!nie :q!
działa

1
@CarlosAlejo Ahh, nawet nie zdawałem sobie sprawy, że nie używałeś przestrzeni nazw, pytanie również nie mówi jednoznacznie losowe, tylko wszystkie możliwości powinny mieć niezerową szansę, więc zmieniaj się .Next(2)>0na .Next()>9, to pozostawia trochę zła smakuje w ustach, ale nadal jest legalny.
LiefdeWen

4
using static System.Consolepozwala porzucić wszystkie C.połączenia i oszczędza bajt
Mord Zuber,

1
@MordZuber what the ...? Nawet nie wiedziałem, że to możliwe! Dziękuję Ci!
Charlie,

3

> <> , 32 30 29 bajtów

  • Miałem zbędne !o.
  • -1 bajt dzięki Aaronowi.

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

Wypróbuj online!

Objaśnienie (stare)

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

(wkrótce się zaktualizuje)


Nie jestem pewien, czy byłoby to dozwolone, ale możesz wygrać jeden bajt, czytając najpierw 3 postacie, które chcesz odrzucić, a następnie zacznij pracę nad nowym stosem z [: iii0[pozostawi cię z pustym stosem; w każdym razie fajne, podoba mi się to, jak wypełniasz wszystkie możliwe wyniki na początku, aby uniknąć dodatkowych cytatów
Aaron

@Aaron Dzięki, to bardzo fajna sztuczka! Dlaczego to nie było dozwolone?
PidgeyUsedGust

Ponieważ czytałbyś dane wejściowe przed wydrukowaniem wyników, które prowadzą do ich produkcji, co, jak sądzę, jest sprzeczne z duchem wyzwania. Jednak nie jest tak, że wyzwanie może zostać realistycznie zaimplementowane przy użyciu oficjalnego interpretera> <>, ponieważ Python będzie czekał na EOF danych wejściowych przed wykonaniem kodu> <> (lub coś w tym rodzaju)
Aaron

2

Właściwie 27 bajtów

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

Wypróbuj online! (Uwaga: Ponieważ TIO nie gra ładnie ze standardowym wejściem, zastąpiłem ,(czytany ze standardowego) ciągiem literalnym, który możesz zmienić, aby go przetestować. Musisz także wyłączyć bufor wyjściowy, aby uzyskać inna odpowiedź z losowym wyjściem).

Wyjaśnienie:

":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 bajtów

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

Wypróbuj online!

':q' wydrukuj to

 następnie

?2 losowa liczba całkowita wśród pierwszych dwóch

⊃⍨ użyj tego, aby wybrać

':q!' ':x' ta lista dwóch ciągów

()/ Powiel to za pomocą, tj. Wykonaj n kopii każdego elementu w tym, gdzie n jest

'!'∊⍞ czy wykrzyknik jest członkiem wprowadzania tekstu? (Boolean, tj. 0 lub 1)


1

Partia, 98 bajtów

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

1

Rubinowy , 33 bajty (kod 32, +1 dla flagi -n)

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

Nie jestem zbyt pewny co do $$%2fragmentu. Używam go do generowania losowego bitu do indeksowania mojej tablicy, biorąc pid modulo 2 bieżącego procesu Ruby, i będzie to dość nieprzewidywalne. .sampledodaje dodatkowy bajt.

Wypróbuj online!


1

JavaScript, 76 71 50 bajtów

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

Zaoszczędziłem sporo bajtów dzięki Artyerowi i Neilowi, a także kondensując moje trójskładniki i przenosząc pierwszy alert na monit (duh).


2
Dlaczego nie zadzwonić prompt()bezpośrednio? (Ponadto, czy masz pozwolenie prompt(":q")?)
Neil,

Możesz użyć czasu jako liczby losowej ( new Date%2zamiast Math.random()>.5) i możesz użyć znaku zachęty bezpośrednio, jak @Neil powiedział:prompt()[3]<
Artyer

@Neil Dlaczego? Robiłem .indexOfto, zanim zauważyłem inny sposób na zrobienie tego. Zapomniałem wrócić, dzięki!
Stephen

@Artyer dzięki, myślałem o tym, a potem zapomniałem o tym
Stephen


1

Python 2 , 47 bajtów

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

Wypróbuj online

Wyjaśnienie:

Źródłem losowości jest id(0)%3<2. Funkcja idzwraca lokalizację pamięci parametru. Przekazanie czegokolwiek da niedeterministyczny adres pamięci. Wynik zawsze będzie parzysty, ale tylko czasami będzie podzielny przez 3. Wyniki modulo 3 są różne. Może to być źródło losowości. Użycie <2oznacza, że ​​mniej więcej w 2/3 czasu otrzymujemy wartość logiczną True.

Reszta odpowiedzi jest zainspirowana tym .


1

Beczka ,14 12 bajtów

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

To wypycha liczbę losową i wyprowadza odpowiednio do liczby losowej.


0

TCL, 95 bajtów

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

Proste i dość długie rozwiązanie w tcl ...


0

Montaż 86Bytes Linux Wywołania systemowe

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 bajtów

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

Wypróbuj online w Anarchy Golf Performance Checker .

Wyjaśnienie:

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]

(ponieważ E37@vimmachine: /var/override)ma 2 słowa, a E37: No write since last change (add ! to override)10 słów)


Wyjaśnienie byłoby świetne.
pajonk

0

Perl 5 (z flagą -E), 35 bajtów

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

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

Wypróbuj online!

Nie golfowany:

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
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.