Вы можете написать программу или функцию, которая получает нечетное положительное целое число n
, где n >= 3
в качестве аргумента функции, аргументов командной строки или STDIN (или аналога для вашей системы), и печатает в STDOUT (или эквивалент в системе) спираль ASCII это вращается вовнутрь по часовой стрелке, где верхний край точно в n
длину символов. Первый правый край должен быть n+1
длиной символов, очевидно. Например,
Входные данные:
11
Выход:
***********
*
********* *
* * *
* ***** * *
* * * * *
* * * * * *
* * *** * *
* * * *
* ******* *
* *
***********
Уловы:
- Ваша программа должна использовать не больше, чем
O(log n)
память . - Ваша программа может печатать только символы
*
(ASCII 42),(ASCII 32),
<CR>
(ASCII 13) и<LF>
(ASCII 10). - Ваша программа должна печатать строку, а не возвращать ее из функции.
- Ограничение Большого-вывод только по памяти , нет нет ограничений на время выполнения .
- Завершающий перевод строки не является обязательным.
- Если ваш язык не поддерживает большие целочисленные типы, вам не обязательно поддерживать более высокий уровень, чем тот, который он поддерживает, но вы не можете использовать это как трюк, чтобы сказать: «О, ну, мне не нужно поддерживать выше X, поэтому я можно просто сделать огромный массив максимального размера каждый раз
Стандартные лазейки, как обычно, запрещены.
n
в O (1) памяти.n
занимаетlog n
биты. Какn
становится все больше, так что делает пространство , необходимое для ее хранения. Возможно, вы говорите сделать это с ограниченным числом переменных?n
?Ответы:
C
125121 байтВерсия для гольфа Это не имеет переменной
k
. Переменнаяk
используется в версии без заглядывания просто для удобства чтения. Такжеfor
переупорядочены условия цикла и{}
удален один набор ненужных . Другой набор{}
может быть удален путем миграцииputs("")
внутри скобокj
цикла в позиции инициализации, но это будет означать перевод строки в начале вывода, поэтому я этого не сделал.Печатает
n
широко поn+1
высокой спирали, как в примере.объяснение
В основном я вдвое значения
n
(округление вниз) и запустить две петли: внешний одинi
из-n/2-1
кn/2+1
для печати строк (i=0
подавлено таким образом мы получаемn+1
строку) и внутренние одинj
из (-n/2
вn/2
Мы используем для печати символов.)expression & 1
Печатать полосы и условие,j*j<i*i
чтобы решить, печатать ли вертикальные или горизонтальные полосы (вертикальные по бокам, где абсолютная величинаi
больше, и горизонтальные сверху и снизу.) Требуется корректировка,+n
чтобы помочь с правильным завершением в зависимости от того,n/2
является ли нечетным или четный.k
обычно равен 1 и обеспечивает корректировку того факта, что абсолютные значенияi
находятся в диапазоне от 1 до,n/2+1
а абсолютные значенияj
находятся в диапазоне от 0 доn/2
. Если быk
всегда было 1, мы бы получили концентрические прямоугольники, но оно инвертируется в 0, когдаi==j&i<=0
диагональный ряд ячеек инвертируется, создавая спираль.разряженный в тестовой программе
Выход
источник
C 118 байт
Код перед финальной игрой в гольф:
Ключевое наблюдение заключается в том, что шаблон представляет собой почти серию концентрических квадратов. С парой небольших морщин:
y = x + 1
диагонали необходимо инвертировать до середины фигуры.В остальном код просто зацикливается на всех позициях, вычисляет расстояние Чебышева от центра для каждой позиции и выдает один из двух символов в зависимости от того, является ли расстояние четным или нечетным. И выпуск новой строки для последней позиции каждой строки.
Поскольку существует только несколько скалярных переменных и символы выводятся одна за другой, использование памяти, очевидно, постоянно.
источник
p
я думаю, что вы не справитесь с meta.codegolf.stackexchange.com/q/4939/15599 . Я также не уверен в объявлении глобальных переменных при отправке функции. Очевидно, мой ответ был бы на 4 байта короче, если бы я сделал это. Я начал мета-публикацию meta.codegolf.stackexchange.com/q/5532/15599p
.C ++, 926 байт
Это не элегантно, но не занимает много памяти для больших n. Кроме того, есть (почти наверняка) около 20 персонажей, которых можно в дальнейшем играть в гольф, но я не могу больше смотреть на это.
Краткое объяснение:
Это разбивает линии в спиралях на два типа: те, которые имеют ****** в середине, и те, которые имеют \ s \ s \ s \ s \ s в середине. Тогда ясно, что каждая строка состоит из нескольких «*», середины и некоторого «*». Выяснить, сколько из каждой вещи просто, если вы посмотрите на шаблон достаточно долго. Сложно было напечатать центр спирали, который я в основном жестко запрограммировал, используя условное выражение. Это оказалось полезным, потому что строки *** и \ s \ s \ s переключаются там нечетно / четно.
тесты:
Вход:
55
(я думаю, что большие выглядят круто)Выход:
Входные данные:
3
Выход:
Примечание: я не учёный-компьютерщик / студент CS, и я не знаю, как доказать, что это использует O (log n) памяти. Я могу только решить, что делать, основываясь на ссылках в вопросе. Я был бы признателен, если кто-то может подтвердить / опровергнуть, если этот ответ является действительным. Моя логика для правильности этого ответа состоит в том, что он никогда не хранит переменную размера, основанную на n, кроме самого ввода. Вместо этого цикл for, который выполняется n раз, вычисляет целочисленные значения на основе n. Количество этих значений одинаковое, независимо от ввода.
Примечание 2: Это не работает для n = 1 из-за моего метода работы с серединой. Это было бы легко исправить с помощью условных выражений, поэтому, если кто-то находится в пределах нескольких символов от моего ответа, я исправлю это;)
Поиграй с этим на ideone.
источник
n
. Типичным примером, который не удовлетворяет требованию, была бы какая-то строка / буфер / массив, который содержит полную строку вывода.n=1
, поскольку я не считаю такой особый случай интересным.Haskell, 151 байт
Пример использования:
Благодаря лени Хаскелла, это работает в постоянной памяти. Он использует очевидный подход, то есть цикл над
y
и ,x
и выбор между*
и, в зависимости от
x
соответственноy
четный или нечетныйn/2
четный или нечетныйисточник
Common Lisp - 346
Итеративное решение с постоянным использованием памяти. Вышесказанное интенсивно использует переменные
#n=
и функции#n#
чтения. Несмотря на то, что есть более прямые подходы, здесь я начал с рекурсивной функции и изменил ее, чтобы имитировать рекурсию с помощьюgoto
операторов: это, вероятно, нечитаемо.Выход для всех входных значений от 0 до 59 .
Оригинальная рекурсивная версия с отладочной информацией
(примечание:
terpri
означаетnewline
)Например:
Смотрите также эту пасту со всеми результатами от 0 до 59 (не так, как выше, эта более многословна).
Итеративная версия с отладочной информацией
источник
n
и стек вызовов соответственно увеличивается, но в этом случае мы можем смоделировать рекурсию с двумя циклами: один сn
уменьшением иd
увеличением (пока n <= 3 ) и еще один сd
уменьшением до нуля. У меня не так много времени, чтобы поработать над этим прямо сейчас, но я постараюсь соответственно обновить ответ. Кстати, есть более прямые способы печати спирали, но было интересно попытаться определить ее рекурсивно.CJam, 72 байта
Это довольно прямое преобразование моего C-решения в CJam. Не такой короткий, как вы обычно ожидаете от решения CJam, но этот действительно страдает от ограничения памяти. Общие преимущества построения результатов в стеке, который автоматически сбрасывается в конце, и использование необычных операций со списком / строкой - все это выходит за пределы окна. Это генерирует и выводит решение по одному символу за раз. Стек содержит только несколько целых чисел во время выполнения и пуст в конце.
Несмотря на то, что это не очень хороший способ использования языка игры в гольф, он все равно значительно короче, чем код на С, только потому, что нотация более компактная.
Объяснение:
источник