Учитывая ввод «отеля» в искусстве ASCII с пометкой одной комнаты, выведите номер комнаты в соответствии с определенными правилами.
Вот пример отеля ASCII:
##
##
##### ##
##### ###### ##
##### ###### ##
##### ###### ##
Вот еще несколько вещей об отелях ASCII:
Каждое «здание» представлено прямоугольником
#
символов, где каждый#
представляет «комнату».Данный отель состоит из трех корпусов. Каждое здание разделено двумя колоннами пробелов, а самый нижний «этаж» всегда будет на последней строке.
Каждое здание всегда будет иметь от 1 до 9 «этажей» (рядов) и от 1 до 9 «комнат» на каждом этаже. Также всегда будет 1-9 зданий.
Номера пронумерованы следующим образом :
[building #][floor #][room on floor #]
. Например, давайте отметим несколько комнат на рисунке выше:## ## ##### ## ##### ####$# ## ##%## ###### ## ##### ###### #@
Помещение, обозначенное как
%
комната 123 (корпус 1, этаж 2, 3-й номер на этаже). Аналогично, комната, помеченная как$
комната 235, и@
комната 312.Здания, этажи и "n-й номер на этаже" всегда индексируются 1.
Вход будет состоять из отеля ASCII, в котором одна комната заменена звездочкой ( *
). Это комната, для которой вы должны вывести номер комнаты. Ввод должен быть взят как одна строка, но вы можете использовать запятые в качестве разделителей строк вместо новых строк (в случае, если выбранный вами язык не может принимать многострочный ввод или если он короче, чтобы вводить однострочный). При желании вам может потребоваться запятая / новая строка. Вы также можете дополнить строки пробелами, чтобы сделать ввод полным прямоугольником.
Поскольку это код-гольф , выигрывает самый короткий код в байтах.
Контрольные примеры (содержатся в одном блоке кода для сохранения вертикального пространства):
Input:
*
Output: 111
Input:
# # * # #
Output: 311
Input:
#####
#####
####*
#####
#####
Output: 135
Input:
#####
##### ######
##### ######
# # # ##### # # # ###### *
Output: 911
Input:
#
# #
# # ##
# # ## ###
# # ## ### #####
# # ## ### ##*## ########
# # ## ### ##### ########
Output: 523
Input:
#
*
#
#
#
#
#
#
######### # #
Output: 281
Input:
########*
#########
#########
#########
#########
#########
#########
#########
# # # # # # # # #########
Output: 999
Ответы:
CJam,
3431 байтЭто требует, чтобы ввод был дополнен прямоугольником с пробелами.
Попробуйте онлайн! Как вариант, запустите все контрольные примеры.
объяснение
источник
Pyth, 34 байта
демонстрация
Это использует трюк игры в гольф, который я никогда не использовал прежде: Назначение переменной (
K
) внутри функции (y
) для сохранения частичного результата от этой функции.Объяснение:
источник
JavaScript (ES6),
142136 байт6 байтов сохранено благодаря @nderscore !
объяснение
Тест
Показать фрагмент кода
источник
.map((t,i,l)=>
,slice(0,r=t.indexOf`*`+1)
,o=++b&&s+2
,[b]+f+r
[b]+f+r
совет!awk, 70
Пример:
источник
C
131130119113 байтовПринимает входные данные на stdin; ввод не должен заканчиваться переводом строки. Предполагается 2-х дополнений.
Ungolfed:
источник
Стек , 73 байта [не конкурирует]
Stackgoat - это стековый язык, который не имеет ничего общего с козами.
Это довольно новый язык, поэтому дайте мне знать, есть ли у него проблемы с ним. Я испытывал головную боль, разбираясь с этим, так что это примерно столько же, сколько я играю в гольф.
объяснение
Эта программа состоит из 3 частей на каждые 3 цифры номера комнаты
источник
Руби, 103
Неуправляемый в тестовой программе
источник
$`
в этом.JavaScript (ES6), 121
Менее гольф и объяснил
ТЕСТ
источник
Python 2.7,
153168 символовМне понравился этот вызов! Если список Python подходит для ввода (см. Тестовый набор для примеров), это решение работает.
Изменить 2016-01-05: добавлена одна строка (10 символов), чтобы разбить строку на несколько строк.
Краткое объяснение:
t
строка, в которой находится комната (отсчитывается от верхней строки как индекс массива = 0);i
индекс комнаты в ее ряду;i
;t
;i
начала до конца этажа с комнатой, к которому добавляется пробел, чтобы закрыть случай, когда комната находится в первом здании.Код:
Тестирование:
источник
Улитки , 32 байта
источник
C
142138137 байтов(
123119118 байт + 19 для#include
строки)Я украл идею слияния значений из ecatmur, но слил их совсем по-другому (
в итоге экономит 8 байт). Это также делает то же самое предположение, чтоEOF == -1
.Входные данные взяты из stdin и не должны иметь пробелов или новых строк после последнего построения в последней строке, поэтому пример ввода будет:
Сломать:
источник
&&(f=p,p=x)
на?f=p,p=x:0
- второй операнд троичного условия содержит неявные скобки.Haskell,
128125 байтовПример использования:
f "# # * # #"
->311
.Как это работает:
источник
Луа, 165 байт
Ungolfed
источник
CoffeeScript, 110 байт и JavaScript, 121 байт
Удобочитаемый
В основном то же самое в Javascript:
источник
Java, 231 байт
Де-Golfed
источник
Powershell, 154 байта
Менее гольф тестовый скрипт:
Выход:
источник
05AB1E , 34 байта
Zip со строковыми списками в настоящее время прослушивается.
€SζJ
мог быть толькоζ
в старой версии Python 05AB1E, но по какой-то причине больше не работает в перезаписываемой версии Elixir.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Дротик , 165 байт
Попробуйте онлайн!
источник