Как мне выйти из 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
Что если моя подсказка bash будет E37: No write since last change? То есть, как алгоритм может отличить подсказку от сообщения об ошибке?
Анатолий

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

Да, я не видел, чтобы у вас было 2 печатных заявления
г-н Xcoder,

3
Я дал этот совет полностью человеческому, так что это справедливо, что я даю его и вам. Вы можете удалить print':q'полностью и изменить input()наinput(':q')
Skidsdev

@Mayube О, это круто, спасибо!
musicman523



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
строку,

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

1
random()>.5чтобы сохранить байт
Род

2
Должна ли случайность быть равномерно распределена? Если нет, вы могли бы сделать random()>0, потому что есть очень маленький шанс, random()который вернется 0.
mbomb007

1
@Artyer Вы знаете, что [0, 1)значит, верно? Это означает, что ноль включен, потому что диапазон включает ноль. stackoverflow.com/a/4396303/2415524 ... Самый простой способ запомнить это то, что в числовой строке включены закрытые точки, а в открытых нет. Скобки выглядят закрытыми, а парены - открытыми.
mbomb007

5

Vimscript, 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 Ой, не заметил, что идет 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до Random1 байта
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[оставим вас с пустым стеком; В любом случае, мне нравится, как вы заполняете все возможные результаты в начале, чтобы избежать дополнительных цитат
Аарон

@ Аарон Спасибо, это очень изящный трюк! Почему бы этого не допустить?
PidgeyUsedGust

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

2

На самом деле , 27 байтов

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

Попробуйте онлайн! (Примечание: поскольку TIO плохо работает со стандартным вводом данных, я заменил ,(чтение из стандартного ввода) на буквальную строку, которую вы можете изменить, чтобы проверить ее. Кроме того, вам нужно отключить кэш вывода, чтобы получить другой ответ со случайным выводом.)

Объяснение:

":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' этот список из двух строк

(... )/ повторность , что с, т.е. сделать п копию каждого элемента в том , что, где п есть

'!'∊⍞ восклицательный знак является элементом ввода текста? (Булево, то есть 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фрагменте. Я использую его для генерации случайного бита для индексации моего массива, взяв pid текущего модуля ruby ​​по модулю 2, и это будет довольно непредсказуемо. .sampleдобавляет дополнительный байт.

Попробуйте онлайн!


1

JavaScript, 76 71 50 байт

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

Благодаря Artyer и Neil удалось сэкономить кучу байтов, а также сжать мои троицы и перенести первое предупреждение в подсказку (да).


2
Почему бы просто не позвонить prompt()напрямую? (Кроме того, вам разрешено prompt(":q")?)
Нил

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

@Nil Почему? Я делал .indexOfэто, прежде чем заметил другой способ сделать это. Забыл переключиться обратно, спасибо!
Стивен

@ Спасибо, я подумала об этом, а потом забыла об этом
Стивен


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]]

Попробуйте онлайн на Anarchy Golf Performance Checker .

Объяснение:

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]'.

Попробуйте онлайн!

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
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.