Резюме
Код гольф это хорошо. Пирог это хорошо . Когда вы соединяете их вместе, могут случиться только хорошие вещи.
Характеристики
В этом испытании вы будете управлять магазином пирогов. Пользователь будет иметь возможность вводить пять различных команд: list
, count
, buy
, sell
, и exit
. Вот спецификации для каждого:
list
Распечатайте список всех пирогов, принадлежащих и сколько. Разделяйте
|
и вставляйте пробел с обеих сторон.|
s должны быть выровнены. Количество пирогов может быть отрицательным (это означает, что вы должны кому-то пирог:(
). Например:| apple | 500 | | blueberry | 2 | | cherry | -30 |
count [type]
Напечатайте, сколько
{{type}}
там пирогов. Печать "Пирога нет{{type}}
!" если нет{{type}}
всегда будет соответствовать регулярному выражению\w+
(т. е. оно всегда будет одним словом). Например, если у меня было количество пирогов, показанных в приведенном выше списке примеров, то> count apple 500 > count peach There is no peach pie!
buy [n] [type]
Добавьте
{{n}}
к счетчику{{type}}
пирог и распечатайте его. Создать{{type}}
пирог, если он не существует.{{n}}
всегда будет соответствовать регулярному выражению[0-9]+
(то есть, это всегда будет число). Вот еще один пример (с тем же набором пирогов, что и в предыдущих примерах):> count blueberry 2 > buy 8 blueberry 10
sell [n] [type]
Вычтите
{{n}}
из счета{{type}}
пирог и распечатайте его. Создать{{type}}
пирог, если он не существует. Пирог может быть отрицательным (о нет, это означало бы, что вы должны кому-то пирог!).> sell 15 blueberry -5 > buy 5 blueberry 0
exit
Распечатать "Магазин пирогов закрыт!" и выйдите из программы.
> exit The pie store has closed!
Дальнейшие уточнения
- Если вызывается несуществующая функция (первое слово), выведите «Это недопустимая команда».
- Если существующая функция вызывается с недопустимыми аргументами (словами после первого слова), то, как ведет себя ваша программа, не имеет значения. «Недопустимые аргументы» включают в себя слишком много аргументов, слишком мало аргументов,
{{n}}
отсутствие числа и т. Д. - Пирог это хорошо.
- Ваш вклад должен отличаться от вашего вывода. Если вы запускаете программу из командной строки / терминала / оболочки / другого текстового объекта, вы должны ввести префикс «»
> "
(знак «больше») и пробел) или какой-либо другой префикс ввода оболочки. - Пирог это хорошо.
Если все эти пояснения недостаточно хороши, вот несколько примеров вывода:
> list > buy 10 apple 10 > sell 10 blueberry -10 > list | apple | 10 | | blueberry | -10 | > count apple 10 > count peach There is no peach pie! > exit The pie store has closed!
Если вы купить / продать пирог и чистый граф становится
0
, вы можете либо сохранить его вlist
или нет, и вы можете либо вернуться0
илиThere is no {{type}} pie!
когда выcount
его.- Это код-гольф ; самый короткий код выигрывает.
- Я упоминал, что пирог хорош?
buy 1 apple
иsell 1 apple
. И будет ли тогда правильнымcount apple
возвращение0
вместоThere is no apple pie!
?Ответы:
Рубин,
335330Некоторые хитрости здесь:
Идея Doorknob об использовании форматера - это шаг вперед, буквально. Во-первых, самая длинная строка в хэше среди всех ключей и значений форматируется с помощью
" %%%ds |"
создания строки, подобной" %6s |"
. Да, нет сжатия каждой колонки в отдельности. Там никогда не было требования к. Один размер подходит всем. Затем эта строка дублируется и используется в качестве строки форматирования для двухэлементного массива, содержащего текущую строку. Наконец,+
слово «начало» получает свое слово и добавляет одну ведущую трубу. О, иputs
имеет хорошую обработку массивов.В Ruby есть интерполяция в литералах регулярных выражений. Это жесткое сохранение, но немного спасает.
Руби требует точек с запятой после
when
выражения, но не перед ключевым словом. Это приводит к странному артефакту рендеринга, когда точка с запятой заменяется на новую строку.И, конечно же, перлизм, известный как магические глобалы и автоматическое сопоставление литералов регулярных выражений с ними.
Кроме того, большинство заявлений в том числе
case
являются выражениями.источник
Hash.new(0)
вместо{}
?nil
(что не разрешить добавление). Литерал используетnil
в качестве значения по умолчаниюh=Hash.new(0)
=>h=Hash.new 0
,print"> "
=>$><<'> '
, и я думаю, что[*h]
может быть простоh
. Я попытался собрать версию без оператора switch, поскольку весь этот шаблонный текст действительно складывается: gist.github.com/chron/6315218 . Я пытался заставить что-то работать,ruby -ap
но требование к подсказке усложняет: <$><<
напечатал новую строку. Что касается последнего предложения ... к сожалению, у хэшей нет метода "сглаживания".Рубин,
427384 символовБлагодаря Яну Двораку огромное улучшение с 427 до 384 (!)
источник
loop{...}
вместоwhile 1do...end
.split
без его аргумента. По умолчанию он разделяется на пробелы (или,$;
если это установлено)p.keys.group_by(&:size).max[0]
- ты ищешьp.keys.map(&:size).max
илиp.map{|x,_|x.size}.max
? Здесь:[(t=p.values).max.to_s.size,t.min.to_s.size].max
вы ищетеp.map{|_,x|x.to_s.size}.max
? Я собираюсь принять твою идею и злоупотреблять средством форматирования :-)p[t]=p[t]+m
эквивалентноp[t]+=m
(за исключением того,p[t]
что оценивается дважды, а не один раз) и дольше. Используйте последнее.+=
оператора; вот почему я не использовал его. Может быть, это только для++
. Я скоро отредактирую свой постпитонПирог -тон 437Я уверен, что во второй последней строке есть некоторая слабость, но требование выравнивания столбцов как для типа, так и для числа круговых диаграмм является слишком сложным.
Согласно комментарию Игби Ларгмана, правила неясно, что делать, если был пирог определенного типа, но
0
теперь есть. Поэтому я интерпретировал это в свою пользу.Пример вывода:
источник
> count potato
производитThat's not a valid command.
вместоThere is no potato pie!
pie.py
:: PC # -
571 568559Воспитывая тыл как обычно с безнадежно многословным C #.
Я взял на себя смелость с правилом о выводе списка. Чтобы сохранить некоторые символы, я жестко закодировал ширину столбца count до максимальной ширины целочисленного значения. (Правила не гласили, что лишние пробелы запрещены.)
отформатирован:
источник
Питон 3, 310
источник
Ява -
772751739713666619Я знаю, что это не победа в конкурсе, а просто для удовольствия!
С переносами строк и вкладками:
источник
if/else
быть менее дорогим, но из-за того, что мне нужно было сделатьs[0]=s[0].intern()
, чтобы сравнить с==
ним, всегда получалось больше . Я знаю, очень нелогично.