В уже удаленном вопросе stackoverflow кто-то опубликовал следующее:
Напишите программу или функцию для печати чередующихся шаблонов *
и #
на основе заданного целого числа n
. Несколько примеров:
Вход: n=1
Выход:
*
Входной n=5
Выход:
*####
###**
***##
###**
*####
Вход: n=8
Выход:
*#######
######**
***#####
####****
****####
#####***
**######
#######*
Так как это выглядело довольно крутой задачей для игры в гольф, вот оно.
Как строятся эти шаблоны?
Первая строка начинается с единственного *
, сопровождаемого n-1
количеством трейлинга #
.
Вторая строка содержит две *
, с n-2
количеством ведущих #
.
Третья строка начинается с трех *
, за которыми следует n-3
количество трейлингов #
.
и т.п.
Как только мы достигли середины ( n/2
), мы производим обратный отсчет с количеством *
, которое можно увидеть в приведенных выше примерах.
ОБРАТИТЕ ВНИМАНИЕ, что для нечетных входных чисел обратная пара строк (первая и последняя; вторая и следующая за последней; и т. Д.) Абсолютно одинакова. В n=5
примере первые и последние строки являются *####
; вторая и следующая за последней строки ###**
.
Однако для четных входных чисел обратная пара линий перевернута. В n=8
примере первая и последняя строки - это *#######
и #######*
; вторая и следующая за последней строки являются ######**
и **######
; и т.п.
Правила вызова:
- Вы можете использовать любые два различных печатаемых символа вместо
*
и#
. Вы можете использоватьA
иB
;3
и7
;<
и>
; и т.д. Пожалуйста, укажите в ваших ответах, что вы использовали. - Вы можете предположить,
n
что будет положительным целым числом (>= 1
) - Вам разрешено выводить список / массив строк для каждой строки или двумерную матрицу символов вместо печати их в STDOUT.
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.
Контрольные примеры (сначала n=1
через n=10
)
*
*#
#*
*##
#**
*##
*###
##**
**##
###*
*####
###**
***##
###**
*####
*#####
####**
***###
###***
**####
#####*
*######
#####**
***####
###****
***####
#####**
*######
*#######
######**
***#####
####****
****####
#####***
**######
#######*
*########
#######**
***######
#####****
*****####
#####****
***######
#######**
*########
*#########
########**
***#######
######****
*****#####
#####*****
****######
#######***
**########
#########*
Ответы:
Желе , 9 байт
Попробуйте онлайн!
объяснение
источник
Python 2 , 62 байта
Попробуйте онлайн!
Использование
x
и пространство.Строки вычисляются так:
Используя
%*s
спецификатор для выбора междуn
и-n
.источник
Perl 6 , 57 байт
Попробуйте онлайн!
Использует тот же метод, что и ответ Линн на Python . Выходы использующие
*
и пробел.источник
MATL,
343118 байтПопробуйте это на MATL Online
Использует 0 для * и 1 для #. Основано на ответе желе Линн .
Старый ответ, 31 байт:
Попробуйте это на MATL Online
Использует 1 для * и 0 для #.
источник
APL (Dyalog Classic) , 18 байт
Попробуйте онлайн!
выходы
AB
вместо*#
⎕
оценил вход n⍳⎕
вектор0 1 ... n-1
⊢⌊⌽
min (⌊
) между собой (⊢
) и обратным (⌽
) - см. поезда⊂>⊢⌊⌽
где⍳
вектор в целом (⊂
) меньше каждого его⊢⌊⌽
- возвращает вектор логических (0/1) векторов⊢∘⌽\
поменять местами любой другой вектор↑
смешать в матрицу⎕a
прописные буквы английского алфавита,'AB
...Z'
⎕a[
]
заменить0
1
на'A'
'B'
источник
⎕a[...}
преобразование их вA
иB
без пробелов короче, чем сохранение их как0
и1
без пробелов, учитывая, что вы использовали это, но просто любопытно, есть ли большая разница в байтах, если вы оставляете их как0
и1
.⎕d[
...]
или⊃¨⍕¨
... В последнем выражении⍕¨
"формат каждого" - он превращает каждое число во вложенный символ вектора , поэтому нам нужно "сначала каждый "(⊃¨
) чтобы получить только символ msgstr скаляры (и, следовательно, нет пробелов при печати).Древесный уголь , 21 байт
Попробуйте онлайн! Пользы
0
и1
. Ссылка на подробный вариант кода и включает в себя,§*#
который переводит вывод в*
и#
в вопросе. Объяснение:источник
Желе ,
1215 байт+3 исправление
n=1
ошибки в крайнем случае :(Полная программа, принимающая целое число, которое печатает выходные данные, как определено в OP, используя
0
и1
для*
и#
соответственно.Попробуйте онлайн!
Как?
источник
Желе , 15 байт
Попробуйте онлайн!
Полная программа.
*
=1
#
=0
источник
Java 10, 145 байт
Все троицы делают его немного грязным, но работает нормально. Я попытался сгладить вложенный цикл и другие разные вещи, но они только увеличили количество байтов. Попробуйте онлайн здесь .
Ungolfed:
Java
811,179127 байтПопробуйте это онлайн здесь (TIO еще не имеет Java 11, поэтому он использует собственный метод, который приводит к тому же количеству байтов, что и
String#repeat()
).Спасибо Кевину Круйссену за то, что он сыграл в гольф 52 байта!
Ungolfed:
источник
"*".repeat(...)
и"#".repeat(...)
(а также возвращая строку вместо прямой печати и игрыn-j-1
в гольфn+~j
):n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}
repeat()
метод действительно хорош для игры в гольф.Луа ,
148133 байтаПопробуйте онлайн!
-15 байт благодаря @KevinCruijssen и @JoKing.
источник
(n+1)/2
to-~n/2
;or n-i+1
кor-~n-i
;i%2==0
кi%2<1
; иreverse() or
кreverse()or
. Кроме того, ваша версия TIO и счетчик байтов содержат конечную точку с запятой, которая, по-видимому, не нужна. Хороший первый ответ, хотя. +1 от меня. И добро пожаловать в PPCG! :)-~n
делает в ваших предложениях? Это определенно работает, но я не понимаю почему.~
является унарным побитовым оператором отрицания. Что важно для Codegolfing, однако, это то~i
же самое значение, что и-i-1
. Поэтому мы можем использовать-~i
вместоi+1
и~-i
вместоi-1
. Это полезно в двух случаях, которые я мог бы использовать в вашем ответе: избавиться от круглых скобок, поскольку-
и~
иметь приоритет оператора над другими математическими операциями, поэтому(n+1)/2
может быть так-~n/2
. И другая полезная часть - избавиться от пробелов в некоторых случаях, как я сделал сor-~n-i
.~
дляx+1
иx-1
и Использовать унарный~
дляa-b-1
иa+b+1
. Все общие советы, а также советы по конкретным языкам ( в данном случае советы по игре в гольф на Lua ) могут быть интересными для чтения. :)Котлин , 86 байт
Попробуйте онлайн!
Использует
x
и пробел в качестве выходных символов. Производные от Линн Ответисточник
Perl 5+
-pa -MPOSIX -M5.010
, 58 байтПопробуйте онлайн!
источник
C (gcc) ,
10499 байтовПопробуйте онлайн!
источник
C (gcc) ,
118108 байтовЭтот не выиграет, но это другой подход (или, по крайней мере, я так думаю!) Вместо того, чтобы манипулировать строками, я использую тот факт, что10Икс- 1 над [ 1 .. п ] = { 9 , 99 , 999 , . , , } , который затем можно умножить, чтобы получить соответствующий шаблон;
printf()
затем выполняет заполнение нулями для выравнивания по правому краю.К сожалению,
int
только имеет достаточный диапазон, чтобы сделать до 9 цифр (на 32-битных платформах), поэтому вам нужно перейти кlong
более крупным шаблонам; язык, который изначально использует арифметику MP, мог бы использовать это для чего-то.Благодарю потолочный кот за предложение.
Попробуйте онлайн!
Подтверждение того, что это работает с арифметикой MP:
C # (Mono C # компилятор) ,
187165 байт(143 байта + 22 байта для
using System.Numerics;
заголовка)Попробуйте онлайн!
источник
Vim, 99 нажатий клавиш
Всегда интересно попробовать сделать vim с входными аргументами. Это очень неестественно, поэтому не будет удивительно коротким. Вероятно, есть и другие хорошие подходы к этому.
Предполагается, что ввод сам по себе находится в буфере. Регистры считаются пустыми. Предполагается, что редактор достаточно высокий, чтобы содержать результат без прокрутки (этого технически можно избежать за счет некоторых нажатий клавиш).
объяснение
И в base64, с реальными символами (ввод
input
и ввод клавишkeys
и запуск с использованиемvim -u NONE -s keys input
)источник
R 75 байт
Попробуйте онлайн!
n
качестве параметра и возвращает матрицу,0/1
где0
соответствует'*'
и1
соответствует'#'
источник
К (нгн / к) , 22 байта
Попробуйте онлайн!
{
}
функция с аргументомx
!x
список(0;1;
...;x-1)
i:
назначить вi
i&|i
минимумы (&
)i
и обратные (|
)i>/:
сравнить с более чем (>
) дляi
каждого элемента из списка справа (/:
) - вернуть логическую матрицу (список списков)i|:/'
для каждого ('
) j ini
, reverse (|:
- нам нужно,:
чтобы заставить|
быть унарным) соответствующий элемент j раз (n f/ x
применяетсяf
n
разx
). По сути, переверните все остальные строки."*#"
использовать матричные элементы в качестве индексов в строке"*#"
источник