Введение и кредит
Предположим, вы бармен. Чаще всего в вашем баре много счастливых людей, но многие пьют только один и тот же напиток, и слишком мало на ваш вкус, и вы хотите это изменить. Таким образом, вы вводите систему, в которой цена напитка является переменной, в зависимости от того, сколько уже продано, но никогда не более или менее дорого, чем определенные пороги. По какой-то странной причине вы всегда забываете правильно следить за всеми проданными напитками и ценами, и поэтому вам нужно подумать о коротком (= запоминающемся!) Коде, который подсчитывает для вас, учитывая количество выпитых напитков.
Эта проблема уже появилась на промежуточном экзамене в 2012 году на курсе по функциональному программированию в моем университете, и у моего профессора все в порядке, чтобы опубликовать его здесь. Нам предоставили пример решения на языке экзамена.
вход
Ваш ввод будет список строк, которые не содержат пробелов - это названия проданных напитков. Возьмите ввод, используя ваш предпочтительный, общепринятый метод ввода.
Выход
Ваш вывод будет одним числом - это доход, который вы получили этим вечером. Дайте вывод, используя предпочитаемый, общепринятый метод вывода.
Что делать?
Это относится к каждому напитку в отдельности:
- Начальная цена 10.
- Каждый раз, когда напиток покупается, его цена увеличивается на 1 для следующего покупателя.
- Максимальная цена 50. Если напиток был куплен за 50, новая цена снова будет 10.
Ваша задача - найти общий доход, сгенерированный входным списком напитков с учетом приведенных выше правил.
Если вам интересно: «50 баксов - это чертовски дорого для напитка!», Это 50 баксов на деци, то есть 50 * 0,1 * за единицу, но я выбрал 10-50, чтобы не исключать языки без арифметика с плавающей точкой.
Кто выигрывает?
Это код-гольф , поэтому выигрывает самый короткий код в байтах! Стандартные правила применяются.
Потенциальные Угловые Случаи
Если входной список пуст, выходное значение должно быть 0.
Предполагается, что входной список не отсортирован по напиткам.
Примеры
[] -> 0
["A"] -> 10
["A","B"] -> 20
["A","A","B"] -> 31
["A","B","A"] -> 31
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"] -> 1240
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D"] -> 1304
["D","A","A","C","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","C"] -> 1304
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"] -> 1304
Ответы:
JavaScript (ES6), 50 байт
источник
d[x]
до 10?d[x]
не было установлено, этоundefined
; это делаетd[x]<50
возврат ложным, поэтомуd[x]=d[x]<50?d[x]+1:10
устанавливаетd[x]
в10
.undefined
. :)Python 2,
79745448 байтМассовое увеличение количества байтов путем переосмысления проблемы.
Я хотел бы избавиться от. Использование,int
актеров, но мой мозг не работаетl.pop()
чтобы избежать сокращения списка дважды и некоторой старой доброй лямбда-рекурсии :)спасибо Джонатану Аллану за сохранение 6 байтов :)
Моя старая 54-байтовая версия, которой я очень гордился :)
источник
...l>[]and 1*~...
чтобы сохранить те 3 байта, которые вы знали, что могли.f=lambda l:l and~-l.count(l[0])%41+10+f(l[1:])or 0
f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0
Pyth, 15 байт
Программа, которая принимает ввод списка и печатает результат.
Набор тестов (Первая строка, чтобы разрешить множественный ввод)
Как это устроено
источник
Желе ,
14 1110 байтTryItOnline!
Как?
источник
05AB1E ,
1615 байтСпасибо Emigna за сохранение байта!
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
ÎÙv¹y¢L<41%T+OO
должен работать на 1 сохраненный байтPerl 41 байт
Включает +1 для
-p
Принимает участие в переводе строк.
Увеличивает значение хеша на:
10
если этоundef
,-40
если это> 49
то есть50
, или1
иначе. Затем он добавляется к$\
выходному разделителю, который-p
печатает.Пример:
источник
05AB1E , 13 байтов
объяснение
["A","B","A"]
используется в качестве примера.источник
C ++ 14, 105 байт
Как общая неназванная лямбда, возвращаемая через ссылочный параметр. Требует, чтобы вход был контейнером
string
который имеетpush_back
, какvector<string>
.Используя
%41+10
трюк из ответа Kade's Python .Создает пустой контейнер
P
как память, которая уже была обслужена. Цена рассчитывается путем подсчетаx
вP
.Ungolfed и использование:
источник
Mathematica, 64 байта
По ощущениям должно быть короче.
Length/@Gather@#
считает повторы каждого напитка.//.z_/;z>41:>Sequence[41,z-41]
разбивает любое целое число,z
превышающее 41, на41
иz-41
, чтобы отразить падение цены. Затем каждый из подсчетов включается в формулу(19+#)#/2
, которая представляет собой общую стоимость#
напитков,#
не превышающую 41. Наконец,Tr
суммируем эти затраты.источник
k, 22 байта
Аргументом может быть любой список - строки, цифры и т. Д.
q
Перевод легче читать:источник
C #, 193 байта + 33
Дополнительные 33 байта для
using System.Collections.Generic;
Я уверен, что это может быть забвением, словари - определенно не лучший способ сделать это, и я мог бы, вероятно, использовать троичный в своем if. Кроме того, я думаю, что все в порядке!
Примеры:
Ungolfed
источник
Clojure, 79 байт
Подсчитывает частоты напитков, затем рассчитывает базовую цену как
10 + (i % 41)
.mapcat
объединяет их иapply +
вычисляет сумму.источник
PHP, 47 байт
принимает входные данные из аргументов командной строки; беги с
-r
.источник