Соревнование
Ваша цель - написать самую короткую из возможных программ, которая будет принимать список событий (например, upvote, downvote и т. Д.) И возвращать репутацию пользователя и заработанные им привилегии.
Какие события?
Вот диаграмма событий, перечисленных в порядке заработанной репутации:
-15 answer unaccepted
-10 answer unupvoted
-5 question unupvoted
-2 answer downvoted
-2 question downvoted
-2 unaccept answer
-1 downvote answer
+1 join website
+1 undownvote answer
+2 accept answer
+2 question undownvoted
+2 answer undownvoted
+5 question upvoted
+10 answer upvoted
+15 answer accepted
+100 association bonus
Какие привилегии?
Вот список привилегий, в порядке требуемой репутации.
1 create posts
5 participate in meta
10 remove new user restrictions
10 create wiki posts
15 vote up
15 flag posts
20 talk in chat
50 comment everywhere
75 set bounties
100 edit community wiki
100 create chat rooms
125 vote down
150 create tags
200 retag questions
250 view close votes
500 cast close and reopen votes
750 established user
1000 edit questions and answers
1000 create gallery chat rooms
1250 create tag synonyms
1500 approve tag wiki edits
2000 access to moderator tools
3500 protect questions
4000 trusted user
вход
Ввод (в STDIN) будет список событий, по одному на строку, в точности, как они появляются на первом графике (за исключением количества репутации). Пустая строка представляет конец ввода. Вот пример (в конце должна быть пустая строка):
join website
association bonus
answer upvoted
answer upvoted
question upvoted
answer accepted
answer upvoted
accept answer
unaccept answer
question unupvoted
accept answer
question upvoted
Выход
В первой строке вывода (в STDOUT) следует указать количество накопленных повторений. В каждой строке после этого должна быть указана одна заработанная привилегия, в точности так, как они отображаются, и в том же порядке, что и вторая диаграмма. Ожидаемый результат для вышеуказанного ввода:
153 reputation
1 create posts
5 participate in meta
10 remove new user restrictions
10 create wiki posts
15 vote up
15 flag posts
20 talk in chat
50 comment everywhere
75 set bounties
100 edit community wiki
100 create chat rooms
125 vote down
150 create tags
Правила, ограничения и примечания
Это код гольф. Применяются стандартные правила игры в гольф.
(РЕДАКТИРОВАТЬ: так как у меня было две записи для доступа к файлам, я хотел бы отметить, что длина файла должна быть добавлена к длине кода как часть стандартных правил для кода гольф)
источник
Ответы:
GolfScript (
569 568 475473 символов)Здесь используются непечатаемые символы для сжатия требуемых строк, поэтому в формате xxd:
По модулю сжатия строк программа
Довольно тривиально во многих отношениях, но есть две точки интереса.
Первая - это хеш-функция для входных строк. Я был удивлен тем, как простая хеш-функция выдает уникальные результаты для каждой из 9 (однажды
un
удаленных) разных строк, и в качестве бонуса она также дает другой результат для пустой строки, что позволяет убрать последнюю пустую строку из вход.Расчет рэпа для отдельной строки
Сначала он удаляет
un
из строки и отмечает, был ли он найден. Затем применяется супер-простая хеш-функцияh(s) = ( sum over i: (-1)^i s[i] ) % 11
. (Вы можете понять, почему я удивился, когда нашел его). Струнаявляется справочной таблицей, которая отображает значение хеш-функции на изменение в rep (вычтите 110 из значения ASCII), а затем, если оно найдено
un
в начале, оно отменяет изменение.Вторая достопримечательность - это фильтр привилегий. Я попробовал немного проще:
который оценивает строку (неопределенные слова ничего не делают), чтобы получить ее оценку для сравнения с репутацией (хранится в
^
). Это почти работает. Его нарушает то, чтоand
встречается в некоторых строках и является предопределенной функцией. Решение: искажите линии достаточно, чтобыand
больше не происходило. (Необходимо сделать так, чтобы удаление пробелов было бы лучше, чем удаление буквыa
, но это не имеет значения для длины).источник
Ruby 1.9.3,
514467459 (507460452 + 7 для флагов)Беги с
ruby -rzlib <program>
.Если двоичные строковые литералы не вставлены должным образом (что они, вероятно, не сделали), вот шестнадцатеричный дамп:
источник
Haskell, 787 знаков
источник
C #
127112081206источник
С -
10831069Я понимаю, что немного опаздываю к игре, но Си не представлен, поэтому я решил, что я попробую.
Вот немного менее гольф-версия:
Я думаю, что основная идея похожа на подходы многих других людей. Я использую небольшой домашний хэш, чтобы разобраться с распознаванием входных данных. Хеш удобно дает ноль для пустой строки, делая строку чтения-ввода очень компактной. Я уверен, что хэш может быть значительно улучшен. Некоторая хорошая экономия для персонажа может быть достигнута, если разрешить некоторые стратегические коллизии хэшей для вещей с одинаковой репутацией.
У меня также было какое-то извращенное веселье, когда я пряталgoto
внутри макроса (я первый раз использую agoto
, я с гордостью говорю).Единственное место, где я уверен, что у меня есть много возможностей для улучшения, находится в разделе вывода. Я даже не пытался сжать фактическую логику печати, поэтому я уверен, что смог бы также сохранить некоторые символы там.
источник
puts
вместоprintf
.goto E
наreturn
(исключив метку) и удалить!=0
хэш-функцию (она избыточна).С (
765737 символов)Или немного более читабельным с добавлением переносов строк и отступов:
Приведенные выше коды предполагают одну новую строку в конце файла. Если их два, то нужно написать
s+=*l?e[…]:0
вместоs+=e[…]
, за дополнительную плату в 5 символов . Записьwhile(*gets(l))
будет короче, но не будет работать, так как я не включаю заголовки, поэтому компилятор предполагает, чтоgets
возвратыint
нетchar*
.Выражение хеширования
(l[11]%8^l[7])-97
было найдено путем проб со всеми выражениями следующих форм, ища выражение с наименьшей длиной результирующего кода:Подходящее печатное представление символов ASCII было найдено с использованием подобного поиска методом грубой силы.
Питон 3 (
743715 символов)В том же духе, что и выше. Это зависит от второй новой строки в конце ввода, хотя.
источник
Ява - 1519 символов
Чтобы найти репутацию, он добавляет все символы во входную строку (например, «присоединиться к веб-сайту» добавляет в форму 1219), а когда b == 1219, r = r + 1.
источник
c
делаетif
проверку , чтобы решить лиtrue
илиfalse
должны быть возвращены , где , как этоboolean
отif
непосредственно может быть возвращен , чтобы довести размер до 1470 ;) Я предложил улучшение для вашего ответа. Это ожидает экспертной оценки :)Scala 1089
Переписал с нуля, почти. Если мне нужно рассчитать данные, дешевле (хотя и некрасиво) включить данные напрямую.
Первый подход, чтение цены событий и вкладки привилегий из файлов:
чтение данных из файла: 405
источник
J (704)
Программа состоит из четырех частей:
следующий скрипт декодера ( 277 байт)
файл двоичных слов, называемый
w
также 277 байтами (скачать здесь ).Формат файла следующий: каждое слово кодируется как группа пятибитовых «байтов». Каждая группа из пяти бит может иметь значение от
1
до27
представляющих буквы, или0
быть разделителем. Каждое уникальное слово в описании событий и привилегий хранится здесь.файл двоичных событий,
e
который называется 54 байта (скачать здесь ).Каждое событие состоит из 12-байтовой репутации и одного или нескольких 6-байтовых слов. Например,
accept answer
кодируется следующим образом:бинарная привилегия файл, называемый
p
, который 96 байт (скачать здесь ).Формат файла такой же, как
e
, напримерaccess to moderator tools
, кодируется следующим образом:источник
Perl,
+856849 символовпросто добавление разрывов строки после нескольких точек с запятой для удобства чтения;):
источник
Ява (1470 символов)
Примечание: это модификация ответа Aman ZeeK Verma но поскольку мое изменение не было принято, а мой ответ значительно короче его, я публикую его здесь.
Читаемая версия:
Минимизированная версия:
источник
PHP: 676 символов
Он не выиграет никаких призов, но черт возьми, я просто не могу понять, как сделать это немного меньше, поэтому я просто опубликую это:
Так как часть, которая вызывает повтор, очень сложна для чтения, здесь это с дополнительным форматированием. Он использует неопределенные константы и использует @, чтобы закрыть их:
источник
APL (549)
Этот упаковывает данные в символы Unicode.
источник
Python 3.x (801 символ)
Лучшее, что я могу сделать до сих пор, просто нужно разработать лучшую кодировку, чем base64 (подсказка: кто-нибудь может помочь?).
источник