Сад програміста
Будучи професійним розробником програмного забезпечення, ви не можете ризикувати піддаватися суворому не штучному сонячному світлу, але у вас також є м'яке місце для квітів і хочете підтримувати свій сад у хорошій формі протягом цілого року.
З цією метою щомісяця наймають садівника, щоб прибирати клумбу біля підніжжя вашого будинку. Однак вам потрібно переконатися, що садівник виконує свою роботу належним чином, і відпрацюйте відповідну оплату працьовитим працівникам. Звичайно, найкраще програмне рішення.
Вхідні дані
Ваша програма буде введена вхідним описом клумби, коли вона виглядає актуальною, та деталями елементів, які потрібно видалити. Програма повинна виводити сад позбавлений безладу, і роздрукувати розбивку платників садівників. Вхід може бути або з STDIN, або як аргумент єдиного командного рядка.
Перший рядок введення має формат
width height unwanted_item_type_count
де widthширина клумби height- це висота клумби (обидва символи ASCII), і unwanted_item_type_countповідомляє, скільки рядків буде наступним, що містять опис типу предмета, який потрібно видалити з саду.
Кожен рядок для кожного небажаного типу елемента має формат
width height string_representation name fee_per_item
де widthширина елемента, heightвисота елемента (обидва символи ASCII), string_representationце рядкове подання елемента без розривів рядків, nameє ідентифікатором для типу елемента (пробіли будуть замінені підкресленнями), і fee_per_itemскільки коштує садівникові за вивезення кожного з предметів.
Наприклад
3 2 .R.\|/ rouge_flower 3
Представляє тип імені елемента rouge_flower, який коштує 3 видалити, і виглядає приблизно так:
.R.
\|/
Елементи не містять пробілів, і жоден елемент не може мати межу, що складається повністю з крапок, і рядкове представлення також буде точно описаним розміром. Таким чином, усі наведені нижче дані є недійсними введеннями:
3 1 ( ) space 0
1 1 . dot 0
2 1 .! bang 0
3 2 .@.\|/. plant 0
Зауважте, що 0 є дійсною комісією (комісія завжди буде цілими числами більше -1).
Зауважте також, що клумба переважно складається з крапок ( .), а не з пробілів, і ви можете сміливо використовувати пробіли як обмеження для всіх вхідних даних. Квітник завжди обмежений самими крапками.
Після того, як будуть перераховані небажані типи предметів, з'являється зображення ASCII клумби заданої ширини та висоти.
Вихідні дані
Вихід повинен бути STDOUT або підходящою альтернативою, якщо ваша мова не підтримує його.
Вихід починається з роздруківки клумби, але всі видалені непотрібні предмети (замінені крапками), тож ви можете побачити, як це має виглядати, і перевірити, чи виконав свою роботу садівник. Кожен предмет на клумбі буде оточений прямокутником з крапок і буде односхилим предметом (тобто не буде розділених точок всередині предмета). Наприклад
.....
.#.#.
.....
показано 2 окремих пункту
.....
.\@/.
.....
показує 1 пункт
......
.#....
....|.
....|.
.o--/.
......
недійсний, оскільки, хоча камінь (#) може бути узгоджений, змія (ви не могли сказати, що це змія?) не може, оскільки камінь заважає потрібному оточенню крапок.
...
\@.
...
Це також недійсно, оскільки равлик знаходиться на краю клумби, а край завжди повинен бути обмежений крапками у дійсному введенні.
Після цього має бути перелік кожного виду небажаного товару із зазначенням рахунку, вартості товару та витрат на всі товари (кількість * вартість товару) у форматі:
<count> <name> at <cost_per_item> costs <cost>
Після цього повинен бути єдиний рядок, що дає загальну вартість (сума витрат на непотрібні товари):
total cost <total_cost>
Приклад
Для цього даний вхід
25 18 3
4 2 .\/.\\// weeds 5
2 1 \@ snails 2
1 1 # stones 1
.........................
.\@/.................\@..
............\/...........
......O....\\//..^|^.....
.#...\|/.........^|^.....
..................|......
.................\|/.....
..\@.....\/...........#..
........\\//....#........
....*....................
...\|/......\/......\@/..
...........\\//..........
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
.......#...\|/....\@.....
.........................
Програма повинна отримати цей результат
.........................
.\@/.....................
.........................
......O..........^|^.....
.....\|/.........^|^.....
..................|......
.................\|/.....
.........................
.........................
....*....................
...\|/..............\@/..
.........................
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
...........\|/...........
.........................
3 weeds at 5 costs 15
3 snails at 2 costs 6
4 stones at 1 costs 4
total cost 25
Вихід повинен бути припинений переривкою рядків.
Це код-гольф, можливо, найкоротший код виграє.
Додатковий тестовий випадок
Редагувати: тут містився Unicode, який не дозволений на клумбі, занадто сучасний. Це було виправлено, вибачте за це.
25 15 5
5 3 ..@..\\|//.\|/. overgrown_plants 3
5 3 @-o....|...\|/. semi-articulated_plant 4
3 2 .|.\@/ mutant_plants 5
1 1 $ dollars 0
1 1 # stones 1
.........................
........@................
....$..\|/...........@...
............|.......\|/..
...#.......\@/...........
.........................
.........................
......@.......@......@...
.....\|/....\\|//...\|/..
.............\|/.........
.#....................#..
.........$.......|.......
...\/.......\/..\@/..\/..
..\\//.....\\//.....\\//.
.........................
Очікуваний вихід:
.........................
........@................
.......\|/...........@...
....................\|/..
.........................
.........................
.........................
......@..............@...
.....\|/............\|/..
.........................
.........................
.........................
...\/.......\/.......\/..
..\\//.....\\//.....\\//.
.........................
1 overgrown_plants at 3 costs 3
0 semi-articulated_plants at 4 costs 0
2 mutant_plants at 5 costs 10
2 dollars at 0 costs 0
3 stones at 1 costs 3
total cost 16
\@і @/наприклад .. Або вони вічно вказують на захід?