Как часть проекта городского планирования, вы получили задание на создание программы или функции, которая будет отображать городской горизонт, учитывая некоторую информацию от архитекторов. Проект находится на стадии запуска, поэтому достаточно грубого наброска. Конечно, самый простой подход - просто нарисовать горизонт в ASCII-искусстве.
Все здания будут у реки, поэтому все они выровнены. Архитекторы в качестве входных данных будут указывать высоту каждого здания, а ваш код должен отображать горизонт.
Вклад от архитекторов будет либо целым, либо полуцелым. Если число является целым числом, здание будет иметь плоскую крышу, а полуцелое - скатную крышу. Ноль будет просто плоской землей. Стены здания разделены на 3 символа, а ноль - один символ шириной. Смежные здания разделяют стены.
Для получения подробной информации и разъяснений относительно результатов, пожалуйста, посмотрите на примеры ниже:
N = 3
___
| |
| |
|___|
N = 3.5
_
/ \
| |
| |
|___|
N = 6
___
| |
| |
| |
| |
| |
|___|
n = 0
_
Пример ввода: 3 3.5 0 2
_
___ / \
| | | ___
| | | | |
|___|___|_|___|
Пример ввода: 0 0 2.5 3 0 4 1
___
_ ___ | |
/ \| | | |
| | | | |___
__|___|___|_|___|___|
Луисвилл ,0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1
___ ___
| | | | ___
_ ___ ___ ___| | | | | |
/ \ | | | | | | | | | | |
___ | | | |___| |___| | | | | | |
| |___| | | | | | | | |___| | | |___
_|___|___|___|_|___|___|___|___|___|___|___|___|_|___|___|
Используемые символы ASCII: новая строка, пробел и /\_|
(кодовые точки 10, 32, 47, 92, 95, 124).
Правила:
- Необязательно делать программу, которая принимает в качестве входных данных только целые числа, умножая все числа на два. Таким образом, вместо того, чтобы брать
3 3.5 2
, ваша программа может взять6 7 4
. Если выбран второй входной формат, ввод 6 должен привести к 3-этажному зданию, 7 - 3-этажному зданию с скатными крышами и т. Д. - Вывод должен быть точно таким, как описано выше, но завершающие пробелы и переводы строки в порядке.
- Точный формат ввода не является обязательным. Что бы ни было лучше на вашем языке.
- Результат должен отображаться на экране, чтобы архитекторы могли взглянуть на него.
- Вы можете предположить, что будет дано хотя бы одно целое число, и будет дан только верный ввод.
Это codegolf, поэтому выигрывает самый короткий код в байтах.
Ответы:
Python 2,
199193188185 байтЭто полная программа, которая принимает целые числа в качестве входных данных. Пример ввода .
источник
MATLAB,
219 209203 байтаК сожалению, это не работает в Октаве . Не совсем уверен, почему, похоже, что-то связано с битом disp / flipud, который ломается.
Кроме того, в настоящее время нет определения того, как выглядит здание высотой 0,5, и нет никакого упоминания о них, поэтому в этом коде я предполагаю, что они запрещены.
Ниже приведен код в несколько более удобочитаемой форме:
Сначала мы берем входные данные как массив и выполняем некоторую инициализацию переменной.
Поскольку здания нулевой высоты - это боль - они в основном имеют ширину, которая зависит от того, к чему они приближаются (хотя то, что напечатано, не изменяется), мы упрощаем вещи, рисуя достаточно земли для всех зданий. Мы предполагаем, что каждое здание будет иметь ширину 4 символа (потому что соседние здания объединяются), а объекты нулевой высоты - нет, но избыток будет урезан позже.
Теперь мы рисуем каждое здание по очереди.
Сначала мы получаем целую часть высоты, так как это определит, сколько '|' нам нужно.
Теперь нарисуйте стену для этого здания - если есть два соседних здания, стена для этого нового будет в той же колонке, что и стена из последнего.
Проверьте, является ли это здание половинной высоты. Если это так, то крыша будет другой. Для половин высоты высота крыши будет такой же,
/ \
как и для потолков полной высоты___
(Matlab будет неявно копировать это с одного подчеркивания, поэтому сохраните там пару байтов). Для зданий половинной высоты есть дополнительная часть крыши на один ряд выше, так что это также добавляется.Рисовать на крыше
Теперь перейдите к началу следующего здания и нарисуйте общую стену (если стена в этот момент слишком короткая, она будет увеличена при прорисовке следующего здания). Обратите внимание, что здания нулевой высоты имеют ширину 1, обычные здания имеют ширину 4, поэтому мы упростим то, что в противном случае было бы условием if-else, рассматривая (a> 0) как десятичное число, а не как логическое значение.
Далее следует немного хакерства для работы со зданиями нулевой высоты. По сути, это говорит о том, что если это здание было нулевой высоты, а предыдущее - нет, это означает, что место следующего здания нужно увеличивать на 1, потому что здание нулевой высоты, расположенное между двумя другими зданиями, эффективно в два раза шире - это учитывает дополнительную стену, которая обычно разделяется с соседним зданием. Мы также отслеживаем эту высоту здания для следующей проверки.
Когда закончите, переверните строительную матрицу, чтобы она была правильной, и отобразите ее. Обратите внимание, что здесь мы также отсекаем лишнюю почву.
Итак, когда мы запускаем этот скрипт, нас спрашивают о наших входных данных, например:
Затем он генерирует здание и отображает результат. Для вышеуказанного ввода генерируется следующее:
источник
Котлин,
447442 байтаБезголовая версия:
источник
Python 2,
357306299294287281276 байтПри этом используется «двойная» кодировка, которая передается функции в виде списка. Редактировать: побрить байты, переделав часть большого условия как селектор массива и переключившись на удвоенную кодировку. Побрит больше байтов, переставляя условные выражения еще больше и преобразовывая больше логики в арифметику.
РЕДАКТИРОВАТЬ: XSOT лучше
Объяснение:
d
на 1 больше, чем длина массива, потому что мы собираемся добавлять нули на каждом конце списка от второго элемента до нуля, который мы добавили в конце.h
высота чертежа. (Мы должны делить на 2 в этом расчете, потому что мы используем удвоенное представление, которое мы используем специально, чтобы избежать необходимости разводить поплавки в целые по всему месту. Мы также добавляем 1 перед делением таких странных высот - заостренных зданий - получить немного больше клиренса, чем обычный вид.)o
является выходной строкой.Стандартный прием для сложения двойного цикла for в один цикл for. Как только мы сделаем:
теперь мы достигли того же, что и:
но таким образом, что нам удалось сохранить десять байтов (включая пробелы в следующих строках).
Прикрепите стену в любое время, когда высота текущего здания или предыдущего здания будет выше, чем текущая линия, при условии, что здесь есть хотя бы одна граница здания. Это эквивалент следующего условия:
где b - текущая высота сканирования, a - текущая высота здания, а c - предыдущая высота здания. Последняя часть условно препятствует укладке стен между наземными пространствами.
Это та часть, которая рисует правильную крышу, выбирая части крыши, сравнивая высоту здания с текущей высотой сканирования. Если крыша не идет сюда, она печатает соответствующее количество пробелов (3, когда это фактическое здание, например,> 0, иначе 1). Обратите внимание, что когда мы находимся на уровне земли, он никогда не пытается нарисовать крышу, что означает, что здания размером 0,5 не имеют заостренных крыш. Ну что ж.
Когда мы на уровне земли, мы хотим подчеркивания вместо пробелов. Мы просто заменим их всех сразу.
Непосредственно перед тем, как мы начнем обрабатывать следующую строку, напечатайте текущую и очистите строку вывода. Мы отсекаем последний символ, потому что это «_», соответствующее наземному пространству, которое мы добавили, добавив ноль в начале функции. (Мы добавили этот ноль, поэтому нам не нужно было бы добавлять специальный случай для вставки правой стены, если она существует, что добавило бы гораздо больше кода, чем мы добавили бы 0 и обрезание "_".)
источник
Python 3
725 байт608 байт
Гольф-код:
Вот незагрязненный код. Есть некоторые комментарии, но основная идея состоит в том, чтобы создавать здания с двойными стенами, поэтому нижняя строка выглядит так:
Затем, чтобы получить индексы этих двойных стенок и удалить эти столбцы, мы получим:
Код:
Время заняться гольфом!
источник
ru(n):return math.ceil(n)
как игра в гольф, но все же ... Пожалуйста, не принимайте это негативно, я не Я хорошо играю в гольф и, черт возьми, не очень хороший программист. Я предлагаю вам немного его улучшить ... На самом деле, это забавно, когда вы понимаете, что вам удается его сократить. Я прошел путь от многих к 120 до 55 несколько дней назад. Так что это возможно, даже если вы новичок в этом.PHP,
307297293 байтаПринимает аргументы * 2 из командной строки. сохранить в файл, запустить с
php <filename> <parameters>
.сломать
источник
C ++, не в гольф
(или, может быть, не в гольф)
Предполагается, что есть менее 100 элементов, а каждый элемент менее 100.
s
Это количество зданий (требуется при вводе).источник