Як вийти з Vim?


42

Vim - чудовий текстовий редактор для Unix-систем, однак він відомий тим, що важко вийти.

Напишіть повну програму, яка виведе :qдля виходу з Vim. Потім він повинен прочитати один рядок введення, оскільки тоді йому буде надано підказку bash, і в цьому випадку вихід був успішним, або помилка, і в цьому випадку є незбережені зміни.

Підказка bash буде такою:

E37@vimmachine: /var/override)

Поки помилка буде такою:

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

Після введення bash-підказки робота програми виконується, і вона не повинна давати більше результатів (за винятком пробілів).

Після помилки ваша програма повинна випадковим чином (тобто кожна можливість має ненульову ймовірність бути обраним) :q!, вийти без збереження або :xзберегти та вийти.

Це тому виграє найменше байтів на кожній мові !


26
Я не знав, що :xце річ! Я завжди використовував :wq:)
musicman523

3
Що робити, якщо мій баш-рядок є E37: No write since last change? Тобто, як алгоритм може відрізнити запит від повідомлення про помилку?
anatolyg

5
@anatolyg це не може, але це також не повинно. Дане підказка завжди буде тим, що було вище, тобтоE37@vimmachine: /var/override)
Skidsdev

2
Дане підказка завжди буде тим, що вище, що повинно бути зазначено в специфікації виклику. Це означає, що це виглядає так , що може означати будь-яку кількість речей.
Денніс

5
(приєднався до гольфу для цього коментаря, sheesh) @ musicman523 НІКОЛИ не використовуй :xдля виходу з vim. Коли-небудь ви випадково потрапите, :Xа потім випадкові клавіші, коли заплутаєтесь. Після того як ви нарешті :wqбільше ніколи не побачите свій файл.
Аарон Макміллін

Відповіді:


16

Python 2 , 66 байт

Збережено 3 байти завдяки @ Mr.Xcoder та 4 завдяки @Mayube!

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

Спробуйте в Інтернеті!


2
Якщо перейти на Python 2, ви можете зберегти 1 байт, використовуючи print замість print(). І ви можете взяти дані з цитатами
Містер Xcoder

@ Mr.Xcoder Спасибі, це насправді врятувало мені 3 байти!
musicman523

Так, я не бачив у вас двох друкованих заяв
містер Xcoder

3
Я дав цю пораду абсолютно нелюдській, тому це справедливо, я даю її і вам. Ви можете print':q'повністю видалити та змінити input()наinput(':q')
Skidsdev

@Mayube о, це чудово, дякую!
музикант523



5

Python 2 , 76 75 72 69 байт

Ця відповідь була поза гольфу .

-1 байт завдяки Роду. -3 байти завдяки Mayube. -3 байти завдяки Artyer.

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

Спробуйте в Інтернеті!


Це друкує додатковий новий рядок, де йдеться про викликit should not give any more output
musicman523

@Mayube May we output a newline upon terminating? @Adám sure, that's fine
Стівен

1
random()>.5щоб зберегти байт
Rod

2
Чи має бути випадковість розподілена рівномірно? Якщо ні, ви могли б зробити random()>0, тому що є дуже маленький шанс, що random()повернеться 0.
mbomb007

1
@Artyer Ви знаєте, що [0, 1)означає, правда? Це означає, що нуль включений, тому що діапазон включає нуль. stackoverflow.com/a/4396303/2415524 ... Найпростіший спосіб запам'ятати це те, що в числовому рядку включені закриті точки, а відкриті точки - ні. Дужки виглядають закритими, а парени виглядають відкритими.
mbomb007

5

Вимскрипт, 45 41 байт

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

Поголив 4 байти за допомогою, getpid()щоб отримати число. (Чи може хтось придумати коротший спосіб отримати номер, який не буде повсюдно однаковим?)

Припускаючи +3 байт для виклику Vim -cдля запуску вищезазначеного сценарію та -зчитування вводу з stdin:

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

3

JavaScript, 52 46 байт

Збережено 6 байт завдяки @ETHProductions

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

Чи не повинно бути !після, :qякщо введення помилка?
Кудлатий

@Shaggy aww, не помітив цього, йде 9 байт
Downgoat

Я думаю, ви можете зберегти кілька байт за допомогою prompt(':q')[30]&&.... Також,new Date%2?':x':':q!'
ETHproductions

@ETHproductions о так, дякую! не впевнений, як я не
помітив терміналу

3

C # (.NET Core) , 140 139 138 байт

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

Спробуйте в Інтернеті!

  • 1 байт збережено завдяки LiefdeWen!
  • 1 байт збережено завдяки Морду Зуберу!

Якщо розмістити свою програму в Systemпросторі імен, ви зможете скоротити System.Randomїї Random, заощаджуючи 1 байт
LiefdeWen

@CarlosAlejo працює для мене в TIO, однак виходить q!не:q!
Skidsdev

1
@CarlosAlejo Аааа, я навіть не розумію , що ви не використали простір імен, питання також не говорить , рівномірно випадкові, просто всі можливості повинні мати ненульовий шанс , щоб ви змінити , .Next(2)>0щоб .Next()>9вона залишає трохи поганий смак у роті, але він все ще легальний.
LiefdeWen

4
using static System.Consoleдозволяє відмовитись від усіх C.дзвінків і заощадить вам байт
Mord Zuber

1
@MordZuber що ...? Я навіть не знав, що це можливо! Дякую!
Чарлі

3

> <> , 32 30 29 байт

  • Мав зайве !o.
  • -1 байт завдяки Аарону.

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

Спробуйте в Інтернеті!

Пояснення (стара)

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

(оновиться незабаром)


Я не впевнений, що це буде дозволено, але ви можете виграти один байт, прочитавши спочатку 3 символи, щоб відкинути, а потім почати працювати над новим стеком з [: iii0[wil will you with the empty stack; все одно приємно, мені подобається, як ти заповнюєш усі свої можливі результати на початку, щоб уникнути додаткових котирувань
Аарон,

@Aaron Дякую, це дуже акуратний трюк! Чому б це не було дозволено?
PidgeyUsedGust

Тому що ви читали б вхід, перш ніж надрукувати вихід, який веде до його виробництва, що, напевно, суперечить духу виклику. Однак це не так, як виклик може реально реалізуватися з офіційним інтерпретатором, оскільки python буде чекати EOF введення, перш ніж виконати код <<> (або щось подібне)
Аарон,

2

Власне , 27 байт

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

Спробуйте в Інтернеті! (Примітка. Оскільки TIO не грає добре зі stdin, я замінив ,(читати з stdin) буквальним рядком, який ви можете змінити, щоб перевірити його. Також вам потрібно буде відключити кеш виводу, щоб отримати інша відповідь на випадковий вихід.)

Пояснення:

":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 байт

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

Спробуйте в Інтернеті!

':q' роздрукувати це

 тоді

?2 випадкове ціле число серед перших двох

⊃⍨ використовувати це для вибору

':q!' ':x' цей список з двох рядків

()/ Повторіть це, тобто зробіть n копій кожного елемента в тому, де n є

'!'∊⍞ чи знак оклику є членом введення тексту? (Булева, тобто 0 або 1)


1

Пакетна, 98 байт

@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 байти (32 код, +1 для -n прапор)

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

Я не надто впевнений у $$%2фрагменті. Я використовую його для генерування випадкового біта для індексації мого масиву, беручи поточну модуль 2 pid-процесу рубіну, і це буде досить непередбачувано. .sampleдодає додатковий байт.

Спробуйте в Інтернеті!


1

JavaScript, 76 71 50 байт

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

Зберегли купу байтів завдяки Artyer та Neil, а також конденсували мої тернарії та перенесли сповіщення сповіщення (duh).


2
Чому б просто не зателефонувати prompt()безпосередньо? (Також вам дозволено prompt(":q")?)
Ніл

Ви можете використовувати час як випадкове число ( new Date%2замість Math.random()>.5), а ви можете використовувати підказку безпосередньо, як сказав @Neil:prompt()[3]<
Artyer

@Neil Чому? Я займався .indexOfцим, перш ніж помітив інший спосіб зробити це. Забули переключитися назад, дякую!
Стівен

@Artyer дякую, я подумав про це, а потім забув про це
Стівен


1

Python 2 , 47 байт

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

Спробуйте в Інтернеті

Пояснення:

Джерело випадковості id(0)%3<2. Функція idповертає місце в пам'яті параметра. Якщо передавати що-небудь, це дасть недетерміновану адресу пам'яті. Результат завжди буде рівномірним, але він лише іноді буде розділений на 3. Модуль результатів 3 варіюється. Отже, це може бути джерелом випадковості. Використання <2означає, що приблизно 2/3 часу, отримане булеве значення True.

Решта відповіді натхненна цим .


1

Кег ,14 12 байт

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

Це виштовхує випадкове число і виводить відповідно до випадкового числа.


0

TCL, 95 байт

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

Просте і досить довге рішення в Tcl ...


0

Асамблея Системні дзвінки 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 байт

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

Спробуйте його в Інтернеті за допомогою перевірки продуктивності Golf Anarchy .

Пояснення:

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]

(тому що E37@vimmachine: /var/override)має 2 слова, тоді як E37: No write since last change (add ! to override)має 10 слів)


Пояснення було б чудово.
pajonk

0

Perl 5 (з прапором -E), 35 байт

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

Виконати це за допомогою perl -E 'say":q";<>=~l&&say qw(:q! :x)[$$%2]'.

Спробуйте в Інтернеті!

Безголівки:

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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.