В спортивных соревнованиях часто бывает так, что победители представлены на подиумах, где первое место занимает самый высокий в середине, второе место - в среднем росте слева, а третье место - на самом низком и ниже. направо. Мы собираемся воссоздать это здесь с некоторыми специальными настройками.
Подиумы представлены ниже:
@---@
| @ |
@---@| | |
| @ || | |
| | || | |@---@
| | || | || @ |
Это станет основой для этой проблемы. Следующий шаг - сделать подиумы достаточно широкими, чтобы в них поместились люди (для печати ASCII-строки). Однако мы хотим обеспечить эстетическую красоту (потому что это фантастическая возможность фотографирования), поэтому каждый подиум должен быть одинаковой ширины, а ширина должна быть нечетной. Кроме того, люди (очевидно) захотят стоять в центре подиума, поэтому струны должны быть отцентрированы как можно лучше. (Вы можете выровнять по левому или правому краю, и это не обязательно должно быть согласованным.) Вышеупомянутые подиумы имеют минимальный размер и считаются 3
широкими.
Например, учитывая входные данные, ["Tom", "Ann", "Sue"]
представляющие первое, второе и третье места соответственно, выведите следующие подиумы:
Tom
@---@
Ann | @ |
@---@| | |
| @ || | | Sue
| | || | |@---@
| | || | || @ |
Однако, если Anne
вместо этого Ann
нам понадобится перейти к следующему размеру 5
и отцентрировать строки как можно лучше. Здесь я выровняю так, чтобы «лишняя» буква Anne
была слева от центра, но вы можете выбрать, на какую сторону выровнять.
Tom
@-----@
Anne | @ |
@-----@| | |
| @ || | | Sue
| | || | |@-----@
| | || | || @ |
Давайте перейдем к более длинным именам. Как насчет ["William", "Brad", "Eugene"]
:
William
@-------@
Brad | @ |
@-------@| | |
| @ || | | Eugene
| | || | |@-------@
| | || | || @ |
Здесь мы можем видеть, что Brad
имеет много пробелов, Eugene
меньше, и William
подходит как раз.
Для более длинного теста, как насчет ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]
:
A
@-----------------------@
BC | @ |
@-----------------------@| | |
| @ || | | DEFGHIJKLMNOPQRSTUVWXYZ
| | || | |@-----------------------@
| | || | || @ |
Наконец, у нас есть наименьшее возможное значение, например ["A", "B", "C"]
:
A
@---@
B | @ |
@---@| | |
| @ || | | C
| | || | |@---@
| | || | || @ |
- Вход и выход могут быть заданы любым удобным способом .
- Вход гарантированно не пустой (т. Е. Вы никогда не получите
""
в качестве имени). - Вы можете распечатать его в STDOUT или вернуть как результат функции.
- Допустимы либо полная программа, либо функция.
- Любое количество посторонних пробелов является приемлемым, при условии, что символы выстраиваются соответствующим образом.
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
Ответы:
JavaScript (ES8), 196 байт
Попробуйте онлайн!
источник
Groovy ,
187,176,156, 150 байтовПопробуйте онлайн!
(примечание: интерпретатор tio groovy не может обрабатывать списки индексирования с использованием значений Long, хотя groovy 2.5.6 может. Таким образом,
*.toShort()
вместо ответа tio используется*.toLong()
байт)Определяет замыкание,
f
которое может быть вызвано через:где
f
возвращает строку.Объяснение:
Разблокировав код, мы имеем:
f={n->
- определить замыкание f одним параметромn
m=n*.size().max()|1
- найти максимальное имя len, двоичное или нечетное числоh=' '*(m/2)
- h будет содержать напольные (м / 2) пространства, используемые позжеa=...
- создает список кодировки с элементами:@---@
шаблон, дополненный по длине| @ |
шаблон, дополненный к лен| | |
шаблон, дополненный к лен'307...'*.toLong().sum{a[it]}
- использовать индикаторы в списке кодирования для построения результата..sum
использует тот факт, что строка + строка в Groovy является действительным.'3073...'*.toLong()
использует*.
оператор распространения для вызоваtoLong()
каждого символа, возвращая список чисел.a
была вставлена, nelines удалены и т. д.источник
Холст , 45 байтов
Попробуй это здесь!
Объяснение:
Злоупотребления "и оно не должно быть последовательным", что делает его довольно непонятным.
источник
Python 2 ,
197190 байтПопробуйте онлайн!
-6 байт, благодаря Эндрю Дунай
источник
x,y,p='@| '
и используяp
вместо' '
Python 2 , 157 байт
Попробуйте онлайн!
источник
Древесный уголь , 63 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Подсчитайте количество мест в каждой половине подиума.
Зациклиться на каждом месте. Обратите внимание, что входные данные должны быть в порядке 2, 1, 3.
Положение в начале строки, которая будет иметь текст.
Выведите текст с достаточным левым отступом для центрирования.
Получить высоту подиума.
Нарисуйте подиум.
Альтернативный подход, также 63 байта:
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Подсчитайте количество мест в каждой половине подиума.
Зациклиться на каждом месте. Обратите внимание, что входные данные должны быть в порядке 2, 1, 3.
Положение в начале строки, которая будет иметь текст.
Выведите текст с достаточным левым отступом для центрирования.
Также выведите верхнюю часть подиума, вставив
-
s между символами строки,@-@
чтобы получить правильную ширину.Напечатайте оставшуюся часть подиума, вставив
|
соответствующие символы, за исключением того, что средний символ - это@
буква в первом ряду.источник
R
308302299-6 байт благодаря @JAD
-3 байт благодаря @Guiseppe, теперь мне меньше 300
Возможно, есть лучший способ создать макет; Я должен попробовать, какие варианты у меня есть для фреймов данных.
Попробуйте онлайн
источник
i=max(1,nchar(a)%/%2)
. Созданиеmatrix
и использованиеwrite
может быть короче (а неdata.frame
). Я предлагаю использоватьformat
с,j="c"
чтобы автоматически выровнять вещи, иstrrep
это полезно в этом случае. Может быть, попробовать чат в GolfR, чтобы отослать идеи?strrep
; Я должен разобраться в этом.Чистый , 209 байт
Попробуйте онлайн!
источник
Python 2 , 188 байт
Попробуйте онлайн!
-5 спасибо TFeld .
источник
PHP, 147 байт
Гольф на 93 байта от моей первоначальной идеи, прямой
<?=
:принимает имена из аргументов командной строки. Запустите
-nr
или попробуйте онлайн .Требуется PHP 7; выдает предупреждения в PHP 7.2 (и позже, предположительно). См. TiO для исправления +5 байт.
отображение:
сломать:
Прединкремент для
$i
спасает меня от любых хитростей для перевода строки.Бланк для
6
также может быть пустым; так я и сделал.Но использование
$argv[0]
для верхней границы строки-
было самым хорошим гольфом когда-либо. (и сохранил 9 байтов!)источник
Go, 436 байт
Го для гольфа ужасно. Но:
Сломано:
источник
Java 8,
399394373 байтаЭто решение, вероятно, слишком длинное, но это решение :)
Сохранено 5 байт путем прямой итерации по порядку (a = 1,0,2 вместо q = 0,1,2; a = f (q))Сохранено 21 байт благодаря @KevinCruijssen:Как предложил @KevinCruijssen, можно было бы использовать
var
вместоString
Java 10+ и сохранить несколько дополнительных байтов. Я не делаю этого по той простой причине, что у меня еще нет Java 10: D также можно использовать лямбды. Но это только уменьшит количество байтов, если мы не будем присваивать егоFunction<String[],String>
переменной.В развернутом виде:
Входные данные должны быть заданы как
String
-array длины 3. Пример выглядит так:Выход:
источник
var
вместоString
; заполнил массив длины циклом for-each; изменилосьif(m%2==0)m++;if(m==3)m=5;
вm+=m%2<1?m==2?3:1:0
течение того же самого эффекта; поменял все%nr==0
на%nr<1
; изменил%(m-1)
к%~-m
; поместите все внутри самой петли, чтобы{}
можно было снять скобки .m-l[a]>>1
вместо(m-l[a])/2
иi<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"
вместоi>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
C (GCC)
302293292289287 байт-6 байт благодаря потолку
Запустите это здесь
Разоблачено и объяснено (технически у вас не может быть комментариев после обратной косой черты в макросах, так что это не запустится)
Вот код вызова
и вывод
источник
for(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;
вместоfor(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
PowerShell для Windows,
231223 байтаПопробуйте онлайн!
Ввод массив
@('second','first','third')
. Развернутая версия:источник
Stax , 43 байта
Запустите и отладьте его
источник