После того, как @ MartinBüttner достиг ровно 10000 репутаций , мы теперь имеем три полных ряд 10k пользователей на странице пользователей ! Теперь, поскольку мы все здесь программисты, нам нравится автоматизировать вещи, а не делать это вручную. Ваша задача - написать программу для автоматического поздравления новых пользователей 10k.
Спецификация
вход
На входе будут n
строки разделенных пробелами чисел. (Если вы хотите, вы также можете взять один список разделенных запятыми чисел, если это делает ваш код короче.) Например:
10 20 30 40 50
15 25 35 45 55
20 30 40 50 60
Или:
10 20 30 40 50,15 25 35 45 55,20 30 40 50 60
Каждый список чисел представляет собой список значений репутации пользователей за один день.
Выход
На выходе будет одинаковое количество n
строк (или список через запятую одинаковой длины). Каждая строка / элемент списка будет:
:D
если бы был пользователь, чья репутация только что стала> = 10000.- Несколько разделенных пробелами
:D
s, если было несколько пользователей, которые встретили или прошли счет 10000 представителей. Например,:D :D :D
для 3 новых 10k пользователей.
- Несколько разделенных пробелами
:(
и затем остановите дальнейший вывод, если ввод неоднозначен или невозможен (подробнее об этом в следующем разделе).- ничего, если ни одно из этих условий не выполняется.
неоднозначность
Возможно, что ввод неоднозначен. Для целей этой задачи мы предполагаем, что:
- Предел репутации составляет 200 в день, игнорируя принятие и щедрости и тому подобное ради вызова.
- Пользователи не могут потерять репутацию (опять же за простоту и за вызов).
Ввод считается неоднозначным, когда невозможно определить, какие значения репутации соответствуют какому-либо пользователю. Например, во входных данных 10 20,30 40
вы не можете сказать, стал ли пользователь с 10 повторениями пользователем с 30 повторениями или пользователем с 40 повторениями.
Ввод считается невозможным, если пользователи одного дня не могли стать пользователями следующего дня. Например, во входных данных 10 20,310 320
эта ситуация явно невозможна, потому что пользователи не могли получить 300 репутации за день. Пользователям потерять репутацию тоже невозможно.
Краевые случаи
- Начальные значения репутации могут начинаться с чего угодно (то есть пользователь может начать с репутации 1337).
- Нет выхода для первой строки / элемента списка.
- Входные данные всегда будут синтаксически действительными, что означает, что значения репутации всегда будут положительными целыми числами, всегда будет одинаковое количество значений репутации на строку / элемент списка и т. Д.
- Значения репутации не сортируются; они могут быть в любом порядке.
Контрольные примеры
Вход: 9900,10000
Выход::D
Вход: 9900 9950 9910,10100 9950 9910,10300 10150 10110
Выход::D,:D :D
Вход: 10 20 30,42 10 20,10 242 20,442 42 10,0 0 0,442 42 10
Выход:,,,:(
Вход: 10 20,15 25,15 25
Выход:,,
Вход: 9999 9998 9997,10000 9998 9997,10000 10000 9997,10300 10000 10000
Выход::D,:D,:(
Вход: 100,90,80,70
Выход::(
Вход: 10000 10000 10000 9999,10000 10000 10000 10000,10010 10020 10030 10040
Выход::D,:(
Вход: 9999 9998 9997 9996,10196 10197 10198 10199,10399 10199 10197 10196
Выход::D :D :D :D,
(i.e. a user can start with 1337 reputation).
Мне понравился этот coz, который был моим представителем 5 минут назад, пока кто-то не проголосовал за один из моих ответов xDОтветы:
Рубин, 209 байт
Изменить: я перешел на Ruby, который сократил это примерно на 30%. Смотрите историю изменений для оригинальной версии Mathematica. Я полагаю, что основная экономия заключается в том, что Руби
permutation
не игнорирует переключение позиций одинаковых элементов (что мне пришлось обмануть Mathematica).Это использует формат новой строки.
Суть заключается в следующем:
:(
.:D
сколько появятся новых 10 000 пользователей.:(
.Меньше гольфа:
Я думаю, что это одна прекрасная цепочка счетчиков. :)
PS: странно ли, что я первый отправил ответ на этот вопрос?
источник
Хаскелл,
254 249 244 232228Небольшое объяснение: алгоритм очень похож на алгоритм, используемый MartinBüttner, за исключением того,
nub
что я немного подумал. Обратите внимание, что разница в списке используется для определения того, сколько значений репутации на 10000 или больше в день n + 1 по сравнению с днем n :t b\\t a
.Я также согласен с MartinBüttner в интерпретации спецификаций и в том, что некоторые из приведенных выше примеров неверны, даже до такой степени, что пример № 2 неверен (должен быть
:(
).источник
map
?z
инфикс и заменив егоreplicate (length l) x
наmap (const x) l
. Разве Хаскелл не фантастичен?(t b)\\(t a)
доt b\\t a
, играя в гольф еще 4 байта.