(Вдохновлено ранним проектом проблемы фрактальной линии PhiNotPi .)
Вам даны ширина W > 1
, высота H > 1
и строка, состоящая из 2(W+H-2)
печатных символов ASCII. Задача состоит в том, чтобы напечатать эту строку, обернутую вокруг прямоугольника заданной ширины и высоты, начиная с верхнего левого угла, по часовой стрелке. Внутри прямоугольника есть пробелы. Надеемся, что тестовые случаи должны прояснить это.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции, и либо печатая результат в STDOUT (или ближайшую альтернативу), либо возвращая его в виде строки.
Не должно быть начальных или конечных пробелов (кроме тех, которые могут быть во входной строке). При желании вы можете вывести один завершающий символ новой строки.
Это код гольф, поэтому выигрывает самое короткое представление (в байтах).
Тестовые случаи
Каждый тестовый пример "String" W H
сопровождается ожидаемым результатом.
"Hello, World! "
5 4
Hello
,
!
dlroW
"+--+|||+--+|||"
4 5
+--+
| |
| |
| |
+--+
">v<^"
2 2
>v
^<
"rock beats scissors beats paper beats "
11 10
rock beats
s
s c
t i
a s
e s
b o
r
r s
epap staeb
Note that the following string contains an escaped '"'.
"!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
46 3
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN
~ O
}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQP
Leaderboards
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=47710;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
Ответы:
CJam, 27 байт
Я на самом деле не CJam, но я думаю, что это лучше, чем Мартин. Основное отличие состоит в том, что мы нажимаем новую строку перед чтением ввода и сразу печатаем первую строку, что исключает необходимость сохранения высоты.
Вводит заказ в порядке
Попробуйте онлайн.
источник
Python 2, 95 байт
Печатает первую строку, затем две вертикальные линии, а затем последнюю строку.
Должно быть что-то короче, чем писать
print
три раза, но все, что я до сих пор пробовал с сохранением в переменную'\n'.join
, было дольше.источник
eval
на входе и заключить в скобки операторы печати.eval
учел! Скобка не должна быть слишком большой проблемой, так какprint
в Python 2 после нее нужен пробел. Переход отprint blah
доp(blah)
все еще сохраняет 3 символа.CJam,
3130 байтПо настоянию Оптимизатора, вот моя собственная попытка. Я не фанат победы в собственных соревнованиях, поэтому я считаю, что семья APL (или кто-то лучше в CJam) победит это. ;)
Принимает ввод в том же порядке, как указано в вопросе:
Проверьте это здесь.
Один байт сохранен благодаря оптимизатору.
объяснение
Первоначально у меня была действительно хорошая идея начать с прямоугольника пробелов, а затем буквально обернуть строку вокруг него, вращая всю сетку четыре раза. Тем не менее, я не мог заставить это работать в случае, когда ширина или высота или оба
2
. Поэтому я попробовал наивный подход (печатать сверху, зацикливать стороны, печатать снизу), и на удивление он оказался очень коротким.источник
l~;:V/(N@s{)V2-S*@(N@_,V-}gW%
экономит 1 символPyth,
474645403736 байтЭто очевидный подход, реализованный в Pyth. Он печатает первую строку путем индексации,
0:width
а затем в середине, а затем в конце.Спасибо @Jakube за подсказку с использованием
z
иQ
за два ввода и использованияp
.Принимает ввод из stdin в виде строки и кортежа измерений, разделенных новой строкой:
и пишет в стандартный вывод.
Попробуй это здесь .
источник
z
для чтения строки экономит довольно много символов. Иt_N
тоже самое-_N1
.++
использованияp
и переключитеzt_N
с*d-k2
.J 61 байт
Метод:
Начиная с
(height-2)*(width-2)
блока пробелов, мы берем необходимое количество символов в конце строки и добавляем его в текущий блок. Мы повторяем это 4 раза. Всего 5 состояний, показанных в'Hello, World! ' 5 4
примере (пробелы заменены наX
s для удобства чтения):Код:
Явное определение функции. Функция с двумя операндами принимает строку в качестве левого аргумента и список из двух целых чисел в качестве правого аргумента.
Пример использования:
Попробуйте это онлайн здесь.
источник
Пиф,
3837Изначально у меня было другое решение, но это было в основном решение от Мальтисена. Поэтому я решил пойти немного по-другому.
Попробуйте онлайн .
источник
_>z_ttH
эквивалентно<_zttH
.JavaScript (ES6), 110
115Функция с 3 параметрами, возвращающая строку
Chrome версии 119 : нет короткого формата для функций, нет параметров по умолчанию. Нет смысла использовать,
for(of)
даже если он поддерживаетсяES5 версия 126 : нет для (из), нет string.repeat
Ungolfed
Тест в консоли Firefox / FireBug
Выход
источник
Python 2, 97 байт
Принимая прямой подход.
источник
Haskell,
164156 байтФункция
p
не печатает вывод, но возвращает его в виде строки, напримерp 4 5 "+--+|||+--+|||"
->"+--+\n| |\n| |\n| |\n+--+\n"
. Для лучшего отображения используйтеputStr
:Как это работает: я создаю блок
w
xh
пробелов и заменяю первую строку началом входной строки. Затем я поворачиваю блок против часовой стрелки и повторяю замену первой строки еще три раза.Чтобы предотвратить повторение первого символа после поворота № 4, я добавляю его во входную строку перед началом.
Редактировать: нашел лучший способ решить проблему «обрезать первый символ после поворота # 4».
источник
Постскриптум, 62 байта
Это, конечно, использует двоичные токены, но это эквивалентно:
Вот hexdump файла (
xxd round.ps
):Беги как:
Вывод очень маленький (из-за того, что шрифт вообще не масштабируется), поэтому вам нужно немного увеличить его, чтобы увидеть.
Это позволяет
xyshow
оператору записать строку с использованием пользовательских интервалов символов. В этом случае я использую отрицательное вертикальное расстояние для записи, затем отрицательное горизонтальное пространство для записи назад, затем положительное вертикальное пространство для записи вверх. Из-за этого мне не нужно использовать какие-либо манипуляции со строками.источник
> <>,
8280 + 3 = 83 байтаСтраница Esolang для> <> (Рыба)
Это оказалось короче, чем я ожидал. Он использует простой подход печати первой строки, затем столбцов, дополненных центральными пробелами, а затем последней строки.
Введите строку через STDIN, а высоту и ширину через командную строку с
-v
флагом, например:объяснение
источник
Bash + coreutils, 124
Сценарий оболочки, чтобы вы начали:
Передайте ввод как аргументы командной строки:
источник
JavaScript,
161160158 байтМетод, который я придумала, оказался слишком длинным, но, ну, это была практика. (Кроме того, я получил это разобрать
r+o[u]+'\n':d
.)Для ввода, который не имеет смысла, вывод не определен (буквально и несколько раз), но он работает для всех тестовых случаев.
источник
slice
корочеsubstr
, это не совсем то же самое, но в этом случае вы можете использовать егоGroovy, 140
вызов:
выход:
источник
К,
5554 байтаИспользование того же подхода, что и в реализации J от Randomra; Начните с блока пробелов и добавьте от конца строки к краю, вращая четыре раза:
И несколько примеров:
Разбить его немного для удобства чтения,
Создайте блок NxM:
Повернуть на 90 градусов с помощью transpose (
+
) и reverse-each (|:'
):Поэтому, если у нас есть блок пробелов
t
и строкаs
, мы можем добавить часть хвостаs
кt
:Мы используем форму
4 {[x] ... }/( ... )
для многократного применения функции к кортежу, состоящему из строки и матрицы, которую мы строим. Каждый раз, когда мы делаем этот шаг поворота и объединения, мы также вырубаем строку.редактировать:
Другая идея состоит в том, чтобы попытаться разбить входную строку на фрагменты, которые мы хотим при каждом повороте, что упрощает основную часть программы. К сожалению, получается 56 длиннее: 56 байт:
Если есть лучший способ рассчитать эти точки разделения, я открыт для предложений.
edit2:
Небольшая перестановка позволяет мне убрать пару скобок. 54 байта!
источник
К,
8068 байтУкорочено с 80 благодаря @JohnE.
Оригинал:
Я даже не знаю, как это работает.
Пример использования:
Есть несколько возможных оптимизаций, но я продолжаю делать Kona Segfault ...
источник
f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}
. 68 символов по моим подсчетам.R 178
Это безымянная функция, принимающая в
s, w, h
качестве параметров. Хотелось бы, чтобы был более хороший способ разбить нить.Ungolfed
Тестовый забег
источник
T-SQL, 307
Хотя все еще ужасно долго, это оказалось немного проще (и короче), чем я думал в запросе. Реализовано как встроенная табличная функция для T-SQL.
Это повторяется через строку @h раз. Первая рекурсия обрезает символы @W из строки. Средние рекурсии берут последнюю и первую из оставшейся строки с отступом между ними. Последняя рекурсия меняет то, что осталось. Есть несколько потерянных символов, связанных с тем, как SQL Server обрабатывает конечные пробелы в VARCHARS.
Тестовый забег
источник
Pyth, 33 байта
Демонстрация.
источник
MATLAB, 101
источник
C ++, 398 байт
Используемый компилятор - GCC 4.9.2 с
-std=c++14
флагомПроверьте это здесь.
объяснение
источник
char[][]
вместо этого?vector<vector<char>> M;M.resize(h,vector<char>(w,0));
немного корочеchar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Perl, 193
195байтЯ уверен, что это может быть значительно улучшено. Я нуб. >, <
источник
Java 11, 180 байт
Попробуйте это онлайн (ПРИМЕЧАНИЕ:
String.repeat(int)
эмулируется какrepeat(String,int)
для того же подсчета байтов, потому что Java 11 еще не на TIO.)Объяснение:
источник
Древесный уголь , 4 байта
Попробуйте онлайн (подробно) или онлайн (чисто) .
Объяснение:
В основном встроенный для этого вызова. Возьмите первые два целочисленных ввода в качестве ширины и высоты и напечатайте поле с третьей строкой ввода в качестве границы:
источник