Конкурс з програмування на PHP: Поштові фільтри

Компанія Hola знову оголошує конкурс з програмування на PHP з солідним призовим фондом:

  1. Перше місце: 1500 USD
  2. Друге місце: 1000 USD
  3. Третє місце: 500 USD
  4. Можливо, ми вирішимо відзначити чиєсь надзвичайно оригінальне рішення спеціальним призом в 350 USD.
  5. Якщо Ви відправите комусь посилання на цей конкурс, поставивши наша адреса CC, і ця людина займе призове місце, Ви отримаєте таку ж суму, як і він.
Ми шукаємо талановитих програмістів, тому автори цікавих рішень будуть запрошені на співбесіди.



Правила

Деякі з тих, хто пам'ятає наші попередні конкурси, були незадоволені тим, що умови завдань були сформульовані нечітко, і від учасника вимагалося «вгадати», що ми мали на увазі. На цей раз умова сформульована гранично однозначно, а в розпорядженні учасників — еталонна реалізація рішення. Переможе той, чий код буде найшвидшим за умови проходження тестів на коректність.

Умови конкурсу на англійській мові розміщені на нашому сайті. Нижче — переклад на російську мову.

  • Надсилайте рішення на challengejs@hola.org.
  • Рішення приймаються до 25 грудня 2015, 23:59:59 UTC.
  • Переможці будуть оголошені 8 січня 2015.
  • Можна відправляти рішення багаторазово, але від кожного учасника буде розглянуто тільки останнє рішення, надіслане до закінчення терміну прийому робіт.
  • Для тестування ми будемо використовувати Node.js v5.0.0 (стабільна версія на момент публікації).
  • Ваше рішення повинно складатися з єдиного файлу на JS.
  • Рішення повинно бути на чистому JS. Якщо Ви віддаєте перевагу CoffeeScript або подібні мови, необхідно протранслювати рішення в JS перед відправкою. Ми вітаємо (але не вимагаємо) надсилання оригіналу разом з результатом трансляції (але не замість).
  • не Можна завантажувати ніяких модулів, навіть тих, що входять в стандартний комплект Node.js.
  • Ми будемо тестувати рішення на коректність і продуктивність. Тільки рішення, які пройшли тестування на коректність, будуть допущені до тестування на продуктивність. Переможе найшвидше з коректних рішень.
  • Всі роботи учасників, а також наші тести на коректність і продуктивність, будуть опубліковані при підведенні підсумків.
  • Підводячи підсумки, ми опублікуємо Ваше повне ім'я (або псевдонім, якщо Ви підпишетеся їм), але не адресу електронної пошти.
  • Забороняється публікація учасниками своїх рішень до закінчення конкурсу. Порушники будуть дискваліфіковані.
  • Якщо умова задачі здається Вам неоднозначним, перевірте своє розуміння умови з допомогою нашої еталонної реалізації (див. нижче), замість того, щоб задавати питання по умові. Якщо Ви виявите, що поведінка еталонної реалізації суперечить умові, будь ласка, повідомте нам.

Постановка завдання

Ви розробляєте систему застосування фільтрів для поштової системи. Вам потрібно написати модуль для Node.js, що експортує одну функцію:

filter(messages, rules)

  • messages
    — це об'єкт, що ставить у відповідність унікальним ідентифікаторів повідомлень об'єкти з двома властивостями:
    from
    та
    to
    . Кожен такий об'єкт описує одне електронний лист.
  • rules
    — це масив об'єктів з трьома властивостями:
    from
    (необов'язково),
    to
    (необов'язково) і
    action
    (обов'язково). Кожен з цих об'єктів описує одне правило фільтрування.
Всі рядкові значення у вхідних даних непорожні й містять лише символи ASCII в діапазоні від
0x20
0x7F
включно.

Вважається, що лист задовольняє правилу фільтрування, якщо обидва його властивості
from
та
to
задовольняють маскам, указаним у відповідних властивостях правила. Маски регистрозависимые; символу
*
в масці задовольняє будь-яке число (0 або більше) будь-яких символів, а символу
?
— один будь-який символ. Якщо властивості
from
або
to
відсутні в правилі фільтрування, то як значення за замовчуванням використовується
*
. Як наслідок, якщо у правилі відсутні обидва властивості
from
та
to
, то йому задовольняють всі листи.

До кожного листа необхідно застосувати всі правила, яким воно задовольняє, в правильному порядку. Функція
filter
має повернути об'єкт, що ставить у відповідність ідентифікаторів повідомлень масиви дій. Для кожного листа такий масив повинен містити значення властивостей
action
всіх правил, яким цей лист задовольняє, в порядку перерахування правил у масиві
rules
. Якщо лист не задовольняє ні одному з правил, порожній масив для цього листи все одно має бути в результаті.

Приклад

Нижче наведено типовий приклад коректного виклику функції
filter
:

filter({
msg1: {from: 'jack@example.com', to: 'jill@example.org'},
msg2: {from: 'noreply@spam.com', to: 'jill@example.org'},
msg3: {from: 'boss@work.com', to: 'jack@example.com'}
}, [
{from: '*@work.com', action: 'tag work'},
{from: '*@spam.com', action: 'tag spam'},
{from: 'jack@example.com', to: 'jill@example.org', action: 'folder jack'},
{to: 'jill@example.org', action: 'forward to jill@elsewhere.com'}
])


Правильна реалізація
filter
в цьому випадку поверне наступне:

{
msg1: ['folder jack', 'forward to jill@elsewhere.com'],
msg2: ['tag spam', 'forward to jill@elsewhere.com'],
msg3: ['tag work']
}


Еталонна реалізація

Ми підготували еталонну реалізацію функції
filter
за адресою http://hola.org/challenge_mail_filter/reference. Для заданих значень аргументів вона видає коректний результат. Ця реалізація також строго перевіряє коректність вхідних значень (від Вашого рішення перевірки вхідних даних не потрібно). У спірних випадках замість того, щоб задавати нам запитання за умовою завдання, користуйтеся еталонної реалізацією. Якщо Ви підозрюєте, що еталонна реалізація видає невірну відповідь для тих або інших вхідних даних, будь-ласка, повідомте нам.

Щоб не допустити перевантаження нашого сервера, ми обмежили обсяги вхідних даних 10 правил і 10 листами. Ваше рішення не повинно мати таких обмежень.

До еталонної реалізації за згаданим вище адресою можна робити HTTP-запити методом POST з тілом запиту типу
application/json
. Тіло повинно являти собою об'єкт з двома властивостями:
messages
та
rules
, що містять значення відповідних аргументів функції
filter
. Тіло відповіді, також у форматі JSON, буде містити значення, яке функція повинна повернути. При неприпустимих вхідних даних Ви отримаєте відповідь HTTP 400 з описом помилки у форматі
text/plain
.

Бажаємо удачі всім учасникам!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.