Детское вступление
Всякий раз, когда я беру своих детей в парк развлечений, дети становятся все более нервными, когда мы ближе к парку, с нервным пиковым моментом, когда мы на стоянке и не можем найти место для парковки. Поэтому я решил, что мне нужен метод, чтобы найти ближайшее свободное парковочное место, чтобы минимизировать время, затрачиваемое на парковку.
Техническое вступление
Вообразите представление парковки как этот:
*****************
* *
* ··CC··C··CC·· *
* ************* *
* ··CCCCCCCCC·· *
* *
**********E******
В этом представлении *
означает стену, ·
бесплатное парковочное место, E
точку входа и C
уже припаркованную машину. Каждый пробел - это место, которое автомобиль может использовать для парковки. Теперь давайте расширим эту концепцию до 3D, чтобы создать многоуровневую парковку:
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * 2 * 3 * *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 1 * 2 * 3
**********E****** ***************** ***************** *****************
Числа 1
, 2
и 3
представляют собой связь между уровнями. 1
С первым этажом соединяется с 1
на втором этаже , так автомобиль степпинг в 1
положение на первом этаже появляется в 1
положении на втором этаже.
Вызов
Предоставляя схему парковки, как показано выше, напишите кратчайшую программу, которая рассчитывает расстояние до ближайшей бесплатной парковки, согласно следующему
правила
- В качестве входных данных будет использоваться массив трехмерных символов или двумерный строковый массив или его эквивалент, а выходными данными будет одно целое число, представляющее количество шагов, которые автомобиль должен предпринять, чтобы добраться до ближайшей бесплатной парковки. Если вы получаете массив трехмерных символов, первый индекс может представлять номер этажа, а второй и третий индексы - позицию (x, y) для каждого этажа, но это зависит от вас.
- Там будет не более 9 рамп, представленных
[1-9]
. - Автомобиль начинает движение с этой
E
позиции (на карте будет только одна точка входа) и каждый раз будет двигаться с использованием пробелов в одном из четырех направлений: вверх, вниз, влево, вправо. Автомобиль также может вступать в·
позиции и[1-9]
позиции. - Каждое изменение положения (шага) считается за 1, и каждый раз, когда автомобиль переходит с одного этажа на другой, считается за 3, так как автомобиль должен съехать с рампы. В этом случае движение из пробельных рядом с
1
к1
себе то , что считается 3 шагом, так как в результате этого движения появляется значок автомобиля в1
положении на другом этаже. - Машина не может выйти за пределы матрицы.
- Подсчет закончится, когда автомобиль для парковки будет в том же положении, что и
·
. Если нет доступных свободных парковочных мест, вы можете вернуть ноль, отрицательное целое число, нулевое значение или ошибку.
Примеры
В приведенном выше примере результат будет равен 32, так как дешевле идти на четвертый этаж и парковаться в ближайшем парковочном месте рядом с 3
. Ближайшие бесплатные парковочные места на третьем этаже находятся на расстоянии 33 и 34.
Другие примеры:
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * 2 * 3 * *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * ·CCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 1 * 2 * 3
**********E****** ***************** ***************** *****************
Answer: 28 (now the parking space in the 2nd floor is closer)
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 4 2 5 3 6 *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
4 * 5 1 6 2 * 3
**********E****** ***************** ***************** *****************
Answer: 24 (now it's better to go to ramp 4 and then to ramp 5 to the third floor)
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * * * 3 * 2
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * ·CCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 3 * 2 * 1
**********E****** ***************** ***************** *****************
Answer: 16 (now the parking space in the 4th floor is closer)
1st floor 2nd floor 3rd floor 4th floor 5th floor
************ ************ ************ ************ ************
*CCCCCCCCC 1 *CCCCCCCCC 2 *CCCCCCCCC 3 *·CCCCCCCC 4 *········C *
* * * * * * * * * *
*CCCCCCCCC E *CCCCCCCCC 1 *CCCCCCCCC 2 *··CCCCCCC 3 *·······CC 4
************ ************ ************ ************ ************
Answer: 29 (both the nearest parking spaces at the 4th and 5th floors are at the same distance)
1st floor 2nd floor 3rd floor
************ ************ ************
*CCCCCCCCC 1 *CCCCCCCCC 2 *CCCCCCCCC *
* * * * * *
*CCCCCCCCC E *CCCCCCCCC 1 *CCCCCCCCC 2
************ ************ ************
Answer: -1 (no free parking space)
1st floor
************
* *
* *
* E*
************
Answer: -1 (no parking space at all)
1st floor
************
* ····· *
*· ****
* ····· * E
*********
Answer: -1 (the parking lot designer was a genius)
альтернативы
- Вы можете использовать любые символы, которые вы хотите представить на карте парковки, просто укажите в своем ответе, какие символы выбраны и что они значат.
Это код-гольф , поэтому может победить самая короткая программа / метод / лямбда / что угодно для каждого языка!
Если вам нужна помощь с алгоритмом, пожалуйста, проверьте мою (ungolfed) реализацию в C # .
Ответы:
JavaScript (ES6), 199 байт
Принимает ввод как массив массивов массивов символов, используя символы, описанные в задании. Возвращает0 если нет бесплатной парковки.
Попробуйте онлайн!
Как?
Рекурсивная функция g () принимает в качестве входных данных:
Если е определен, мы просто скопировать его на текущий этаж F . В противном случае нам нужно искать новый этаж и новые координаты, итерируя по каждому этажу и по каждой строке, пока мы не найдем точку входа c :
Мы определяем r как текущую строку в текущем этаже:
Следующий шаг - убедиться, что текущая ячейка c в точке (x, y) определена:
Если это так, мы помечаем его как посещенный, устанавливая его в значение g , которое не запускает ни один из предстоящих тестов:
Если c - бесплатная парковка, мы прекращаем рекурсию. И если общее количество ходов меньше нашего предыдущего лучшего результата, мы обновляем m соответственно:
Если мы только что достигли нового этажа ( f не определено ) или c является пробелом, мы обрабатываем рекурсивный вызов для каждой окружающей ячейки:
В противном случае, если c является маркером линейного изменения (то есть ненулевой цифрой), мы обрабатываем один рекурсивный вызов для достижения нового этажа:
Наконец, мы возвращаем текущую ячейку к ее начальному значению, чтобы ее можно было снова посетить по другим путям рекурсии:
источник
Котлин , 768 байт
использованный период. вместо того ·. Хотелось бы, чтобы я понял ответ Арно, потому что было бы неплохо потерять 500 байт.
Попробуйте онлайн!
источник
Powershell,
299292 байтаПредполагается, что карта является прямоугольником .
Он использует
x
вместо этого·
. Чтобы получить·
, вам нужно сохранить скрипт как ASCII (не UTF-8) и заменитьx
на·
.Разоблаченный и тестовый скрипт:
Выход:
Расширенный выход для парковки с 16 ступенями:
объяснение
Это своего рода алгоритм поиска путей Ли . Только одна умная вещь: 3 шага на рампе реализованы как фиктивные состояния
H->G->F->E
Powershell для гениального дизайнера парковки,
377369 байтДизайн парковки
2D string array
. Нет предположений относительно карты: любые длины строк, полы без стен, парковка без точки входа, пандусы с несколькими этажами и несколькими выходами. Стоимость рода составляет + 26%.Разоблаченный и тестовый скрипт:
источник