Учитывая прямоугольную матрицу высот, нарисуйте ее контуры.
задача
Два элемента x
и y
находятся на одном уровне контура, если floor(x/10) == floor(y/10)
. Например, 52
и 58
находятся на одном уровне контура, но 58
и 64
нет.
Акт рисования контуров определяется следующим образом: для каждого элемента e
замените его строкой из двух символов, выбранной следующим образом:
- первый символ -
" "
если элемент нижеe
находится на том же уровне контура, чтоe
и элемент ниже,e
и"_"
в противном случае - второй символ -
" "
если элемент справаe
находится на том же уровне контура, чтоe
или элемент справа от него,e
или"|"
нет
Элементы в строках соединяются вместе, затем строки соединяются вместе символами новой строки.
пример
Допустим, вход [[5,20],[3,6]]
, визуализируется как
5 20
3 6
Сначала посмотрим 5
. Поскольку 3
находится на том же уровне контура 5
, что и первый символ " "
. Поскольку 20
не находится на том же уровне контура 5
, что и второй символ "|"
.
Теперь мы посмотрим 20
. Поскольку 6
не находится на том же уровне контура 20
, что и первый символ "_"
. Поскольку справа нет элемента 20
, второй символ - " "
.
Теперь мы смотрим на 3
. Поскольку ниже нет элемента 3
, первый символ " "
. Поскольку 6
находится на том же уровне контура 3
, что и второй символ " "
.
Теперь мы посмотрим 6
. Поскольку ниже нет элемента 6
, первый символ " "
. Поскольку справа от элемента нет элемента 6
, второй символ" "
.
Основываясь на этих двухсимвольных строках, мы делаем замены, чтобы получить [[" |","_ "],[" "," "]]
. Объединяя их вместе, мы получаем вывод
|_
правила
- Входная матрица всегда будет прямоугольной и состоит из натуральных чисел.
- Конечные пробелы или переводы строки могут быть в любом количестве (включая 0) и не обязательно должны быть согласованы.
- Вам не нужно следовать одному и тому же алгоритму, если вы получаете одинаковые результаты.
- Ваша программа или функция может выводить строку, разделенную символом новой строки, список строк или эквивалентный текст.
- Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Тестовые случаи
input
output
[[1,5,8,9],[3,11,13,8],[7,14,10,9],[4,8,7,6]]
_ _
| |
|_ _|
[[0,10,20,30,40,50,60,70,80,90],[0,0,10,10,20,20,30,30,40,40],[0,0,0,10,10,10,20,20,20,30],[0,0,0,0,10,10,10,10,20,20],[0,0,0,0,0,10,10,10,10,10],[0,0,0,0,0,0,10,10,10,10],[0,0,0,0,0,0,0,10,10,10],[0,0,0,0,0,0,0,0,10,10],[0,0,0,0,0,0,0,0,0,10],[0,0,0,0,0,0,0,0,0,0]]
|_|_|_|_|_|_|_|_|_
|_ |_ _|_ _|_ _
|_ |_ _ |_
|_ |_ _
|_
|_
|_
|_
|_
[[5,5,5,5,5,5,5,5,5,5,5],[5,10,10,10,10,10,10,10,10,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,25,30,25,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,10,10,10,10,10,10,10,10,5],[5,5,5,5,5,5,5,5,5,5,5]]
_ _ _ _ _ _ _ _ _
| |
| _ _ _ _ _ |
| | | |
| | _ | |
| | |_| | |
| | | |
| |_ _ _ _ _| |
| |
|_ _ _ _ _ _ _ _ _|
[[35,32,29,26,25,25,25,26,29,32,35],[32,28,25,22,20,20,20,22,25,28,32],[29,25,21,18,15,15,15,18,21,25,29],[26,22,18,14,11,10,11,14,18,22,26],[25,20,15,11,7,5,7,11,15,20,25],[25,20,15,10,5,0,5,10,15,20,25],[25,20,15,11,7,5,7,11,15,20,25],[26,22,18,14,11,10,11,14,18,22,26],[29,25,21,18,15,15,15,18,21,25,29],[32,28,25,22,20,20,20,22,25,28,32],[35,32,29,26,25,25,25,26,29,32,35]]
_| |_
_| _ _ _ _ _ |_
_| |_
| _ _ _ |
| | | |
| | | |
| |_ _ _| |
|_ _|
_ |_ _ _ _ _| _
|_ _|
| |
Ответы:
Perl 6 , 135 байт (131 символ)
Попробуйте онлайн!
Слегка разгульный
Объяснение : Сначала мы определяем переменную
$n
(строка 2) и функциюw
(строка 3). Эта функция возвращает пробел, если два ее аргумента находятся на одной и той же «высоте», а содержимое переменной в$n
противном случае. Вместо того, чтобы делить на 10 и пол, мы злоупотребляем тем, чтоCool
(можно рассматривать как строки), и используемchop
для удаления последнего символа (= цифра). Затем мы спокойно вычитаем их, снова превращая их в числа :—).После этого (строка 4) составим функцию
q
которая принимает список и возвращает этот список с удаленным первым элементом и дублированным последним элементом.В следующих 3 строках мы собираемся сделать еще 2 матрицы из входной матрицы: в первой отсутствует первая строка, а в последней строке дублируется (это просто
.&q
- используя.&
, вы можете вызывать функцию для чего угодно, как если бы она была метод - то, что находится перед точкой, является первым аргументом), у другого отсутствует первый столбец и дублируется последний столбец (вот так.map(*.&q)
).Сначала (строка 4) мы берем исходную матрицу
$_
, «накладываем» ее на матрицу «сдвинутых строк» и используем функциюw
в качестве бинарного оператора (вот так[&w]
) на соответствующих элементах. Тот помещает туда,_
где совпадающие элементы находятся на разных отметках, инаоборот. Таким образом, мы получаем ½ результата (только «первые символы»).
В строке 6 мы делаем то же самое, но сначала мы изменяем
$n
на|
, и теперь мы «накладываем» исходную матрицу на матрицу со смещенными столбцами. Результат имеет|
разный ина одинаковых отметках. Это «вторые персонажи».
Теперь мы просто объединяем их вместе. Мы заархивируем массивы с помощью конкатата (да ...), в результате чего получается матрица исходной формы, каждый элемент которой представляет собой два совпадающих элемента сцепленных «полурешения». Наконец, мы просто отображаем эту матрицу (которая на самом деле представляет собой список списков). Каждый из этих списков сглаживается, а затем -
say
выводится (печатается с новой строки). Так какsay
может принимать любое количество аргументов и печатать их все без разделителей, делая новую строку только в конце, мы получаем желаемую картинку в stdout. (И блок возвращает списокTrue
s (каждыйsay
возвращает одинTrue
), но кого это волнует.)источник
but who cares
Желе ,
25 2322 байта-1 байт благодаря милям (
I
векторизациям)Полная программа печати результата. В качестве монадической ссылки он берет список списков чисел, возвышений и возвращает списки списков, однако эти «строки» состоят из списков двухсимвольных «пар» - если это нормально, то 1 байт может быть сохранен путем удаления
Y
.Попробуйте онлайн!
Как?
источник
⁵
сразу спасет вас ...:⁵I;€0ao⁶
а не в основной ссылкеZç”_Zż"ç”|$Y
I
что не будет векторизовать так.I
векторизация на глубине 1, и то и другое,a
иo
векторизация на глубине 0Python 2 ,
199186157155 байтовПопробуйте онлайн!
источник
Желе , 24 байта
Попробуйте онлайн!
объяснение
-2 байта благодаря Джонатану Аллану
источник
Y
- оно вернет список списков символов, который, я считаю, в порядке (в то время как у моего есть пары внутри «строк»).Python 2 , 226 байт
Попробуйте онлайн!
Уфф, это было глупо, чтобы выработать логику. Теперь я вижу, что Hyper Neutrino ниндзя дал мне более короткий ответ, но я потратил слишком много работы, чтобы не опубликовать его. :П
Кроме того, могу ли я просто сказать, что это отличный способ сделать ASCII-арт. Извините, пока я делаю лодку еще больше.
источник
enumerate
вместо того, чтобы использовать полное имя дважды.enumerate
(obs, я должен был удалить некоторые входные данные, чтобы иметь возможность связать его здесь)J, 58 байт
Попробуйте онлайн!
Анонимная функция, которая принимает матрицу и выводит контуры.
Здесь много возможностей для улучшения. У меня не было времени, чтобы попробовать все тестовые случаи, поэтому дайте мне знать, если есть какие-либо проблемы. Постараюсь больше в гольф и объясню позже.
(Быстрый) Объяснение
Вспомогательная функция: индексирует в строку длины 2 в зависимости от того, равен ли первый элемент массива длины 2 второму. Если он равен, он индексируется в нулевой элемент, если он неравен, он индексируется в первый. Массив 1 длины всегда индексируется в нулевой элемент строки.
Основная функция
1:+<.@%&10
этаж каждого элемента делится на 10 и добавляет 1 (поэтому мы никогда не получим 0 - это важно для вспомогательной функции).2 2((' _'f{."1),' |'f{.);.3
разрезает матрицу на 2 x 2 сегмента, если это возможно (в противном случае она даст 2 x 1, 1 x 2 или 1 x 1 сегмент вблизи краев) и применяет функцию, которая используетсяf
для сравнения верхнего левого элемента с верхним правый и левый верхний элемент слева внизу.(,/"2)
выравнивает результат до нужной формы. Я действительно чувствую, что должен быть в состоянии избежать использования этого (и многих других вещей, но я отвлекся).источник
J ,
4645 байтПопробуйте онлайн!
источник
JavaScript (ES6),
120118 байтГде
\n
представляет буквальный символ новой строки. Изменить: Сохранено 2 байта благодаря @ Bálint.источник
(a[i] || [])[j]
конструкции в(a[i] || 0)[j]
join`\n`
вы можете удалить\n
деталь и заменить ее на новуюa=>a.map(b=>b.map(c=>c/10|0)).map((b,i,a)=>b.map((c,j)=>" _"[(a[i+1]||0)[j]-c&1]+" |"[b[j+1]-c&1]).join``).join`<new line here>`
\n
; Я тестирую в REPL, чтобы мешали буквальные символы новой строки.Протон , 202 байта
Попробуйте онлайн!
-2 байта благодаря Джонатану Фреку
-15 байтов, переключившись на Proton вместо Python 2
источник
len
сL
и определенияL=len;
.Java 8,
200170169 байтОбъяснение:
Попробуй это здесь.
Обратите внимание, что целочисленное деление в Java автоматически перекрывает.
источник
R 159 байт
С переводом строки и отступами:
Делает ли целочисленное деление матрицы, измеряет различия по строкам и столбцам, и, если не ноль, заменить на
|
и_
соответственно, то вставляет как (безболезненно, благодаря векторизации R), так и выходные данные.Тестовые случаи:
источник
Perl 5 ,
130126 байтов124 байта кода + 2 для
-ap
флаговПопробуйте онлайн!
Формат ввода - двумерная сетка чисел, разделенных пробелами.
объяснение
Это из предыдущей итерации кода.
источник