Сад программистов
Будучи профессиональным разработчиком программного обеспечения, вы не можете рисковать, подвергаясь резкому неискусственному солнечному свету, но у вас также есть мягкое место для цветов, и вы хотите поддерживать свой сад в хорошем состоянии круглый год.
Для этого каждый месяц нанимают садовника, чтобы привести в порядок клумбу у подножия вашего дома. Однако вы должны убедиться, что садовник выполняет свою работу должным образом, и найти подходящую оплату для трудолюбивого сотрудника. Естественно, программное решение лучше.
вход
Ваша программа будет снабжена вводом, описывающим клумбу, как она выглядит текущей, и сведениями об элементах, которые необходимо удалить. Программа должна выводить сад, лишенный беспорядка, и распечатывать разбивку заработной платы садоводов. Ввод может быть либо из 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
Представляет тип элемента name 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
Вывод должен быть завершен переводом строки.
Это код-гольф, пусть победит самый короткий код.
Дополнительный контрольный пример
Редактировать: раньше он содержал Юникод, который не разрешен на клумбе, слишком современный. Это было исправлено, извините за это.
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
\@
и@/
например .. Или они должны вечно указывать на запад?Ответы:
Perl - 636
Определенно есть еще кое-что, что можно сделать. И, вероятно, лучшие способы сделать это тоже.
635 символов + 1 для
-C
флага для обработки евро.Если у вас есть входные данные,
input.txt
вы можете запустить их с помощью:Вот ушедшая версия. Я прошел и добавил несколько комментариев, чтобы помочь объяснить вещи. Может быть, я когда-нибудь сделаю имена переменных более читабельными. Могут быть некоторые крайние случаи, с которыми это не работает, но это работает по крайней мере с примерами.
Не стесняйтесь предлагать улучшения!
источник
-C
флаге до этого. Я оставлю это там, чтобы быть совместимым в любом случае, так как разница только в 1 символ.Python 3, 459 байт
Предполагается, что входные данные будут представлены в виде списка строк.
источник
~H
трюк; Я не могу проверить это сейчас, но постараюсь сделать это позже сегодня.ValueError: not enough values to unpack (expected 3, got 1)
Python 3.6.6); Можете ли вы предоставить ссылку TIO или описание того, как его запустить. Я думаю, что это может нарушать правила, если предположить, что все вводится в одну строку, но я не совсем понял это в вопросе, поэтому не буду жаловаться.