(Примечание: это мой первый в истории вопрос игры в гольф, но, насколько я могу судить, никто другой не сделал именно этого, поэтому я должен быть хорошим.)
Ваша задача - создать программу или функцию, которая принимает строку s
и целое число n
и возвращает или выводит этот текст, заключенный в несколько строк. Каждое слово должно быть целиком в строке; т.е. нет слов, разделенных в середине. Каждая строка не может быть длиннее n
символов, и вы должны поместить как можно больше слов в каждой строке.
Пример:
s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus. Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non commodo nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue. Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu, aliquam quis velit aliquam, dictum varius erat."
n = 50
output:
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Sed eget erat lectus. Morbi mi mi, fringilla
sed suscipit ullamcorper, tristique at mauris.
Morbi non commodo nibh. Pellentesque habitant
morbi tristique senectus et netus et malesuada
fames ac turpis egestas. Sed at iaculis mauris.
Praesent a sem augue. Nulla lectus sapien, auctor
nec pharetra eu, tincidunt ac diam. Sed ligula
arcu, aliquam quis velit aliquam, dictum varius
erat.
Ваш вывод может быть массивом строк или единственной строкой с переносами строк. Кроме того, вы можете предположить, что никакие слова не будут длиннее n
, поэтому не беспокойтесь о странных случаях.
Применяются стандартные правила ввода / вывода, а стандартные лазейки запрещены. Промежуточные пробелы разрешены.
Поскольку это код-гольф , выигрывает решение сокращений в байтах.
Вот пример программы на Python, которая будет работать.
источник
n
максимальная длина строки, извините, что это не ясно. Я уточню. Кроме того, правила были обновлены, поэтому простое разделение не работает.Ответы:
Python 2 , 26 байт
Попробуйте онлайн!
Мех ... встроенные модули скучны ... вместо этого, есть хорошее 87-байтовое решение здесь:
Попробуйте онлайн!
Выводит конечные пробелы.
источник
PHP , 8 байт
По общему признанию не самое оригинальное решение, но PHP имеет встроенную функцию, которая идеально соответствует вашим требованиям!
wordwrap
:Используйте вот так:
Или попробуйте онлайн!
источник
JavaScript (ES6),
75 7372 байтаПринимает вход как
(string)(n)
.Попробуйте онлайн!
переменные
Форматированный вывод сохраняется во (зеленым цветом ниже).
Обновленная строкаU определяется как объединение:
Нам нужно вставлять разрыв строки всякий раз, когда установленN символ U (0-indexed, красным цветом внизу).
пример
Добавление "LOREM":00L01О02р03Е04M050607080910111213141516
Добавление "IPSUM":00L01О02р03Е04M05∙06я07п08S09U10M111213141516
Добавление "DOLOR":00L01О02р03Е04M05∙06я07п08S09U10M11∙12D13О14L15О16р
источник
r+w+' '
?Perl 6 ,
4629 байтПопробуйте онлайн!
Решение на основе регулярных выражений, которое принимает входные данные карри, как
f(n)(s)
и возвращает список строк. Каждая строка, кроме последней, имеет пробел в концеОбъяснение:
источник
Vim, 15 байт / нажатий клавиш
Вопрос форматирования текста? Я знаю только инструмент для работы! И это даже имеет мое имя в первых двух нажатиях клавиш: D
<C-r>
значит ctrl-r.Это может когда - нибудь чуть- чуть короче V , но я предпочитаю отвечать на ваниль ВИМ для ответов , которые на самом деле показать, как краткое ВИМ может быть для правильного вызова. И разница в любом случае так мала.
Это также может быть следующее для 15 байтов:
Попробуйте онлайн!
источник
DJ:
Эта программа была сделана DJ, нашим любимым котом с бриллиантом на шее. [...]R ,
3627 байтR имеет это как встроенный (
strwrap
), мы возвращаем вектор разделенных линий.Попробуйте онлайн!
источник
Haskell , 70 байт
источник
Python 2 , 74 байта
Попробуйте онлайн!
источник
Java (JDK) ,
4644 байтаВ основном это чистое решение регулярных выражений в Java, почти наверняка самое короткое, которое я написал.
Приветствую Кевина за помощь в сокращении байтов в регулярном выражении!
Попробуйте онлайн!
Используя карри lamdba, он создает регулярное выражение для жадного сопоставления
n
символов, за которыми следует пробел или конец строки. Затем эти символы заменяются самими собой, за которым следует символ новой строки.источник
[ $]
просто соответствует пробелу или,$
если я правильно помню, а не концу строки. Хотя кажется, что он работает, так что похоже, что его можно просто вставить в гольф на одно место для еще меньшего количества байтов.$0
вместо$1
.replaceAll
так многословен!Mathematica, 16 байтов
Встроенная функция. Принимает строку и целое число в качестве входных данных и возвращает строку в качестве выходных данных.
источник
Powershell,
4083 байтаТестовый пример с
n=80
добавленным.Тестовый скрипт:
Выход:
источник
if
/else
с фальшивым троичнымreturn
вelse
части и оператор вthen
части.C (gcc) , 68 байтов
Попробуйте онлайн!
Благодаря Cerecat , экономьте 2 байта, перемещая глобальный
char*l
параметр.источник
Japt , 20 байт
Попробуйте онлайн!
Спасибо Bubbler и Shaggy за помощь
Объяснение:
источник
[X,Y].join(...)
.Сетчатка 0.8.2 , 37 байт
Попробуйте онлайн! Берет
s
иn
на отдельных линиях. Объяснение:Преобразовать
n
в одинарный.Сопоставьте без пробелов, затем посмотрите вперед
n
и посчитайте это$#1
. Затем вернитесь и используйте балансировочную группу, чтобы найти не болееn
символов, за которыми следует пробел.Выведите совпадения в виде списка строк.
источник
.{1,50}
и$0¶
, но где50
вместо этого принимается вход?Древесный уголь , 19 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Принимает ввод
n
иs
по отдельным строкам. Объяснение:Вход
n
.Переместите курсор влево на одну клетку, чтобы сбалансировать правильное движение от первой итерации цикла.
Разбейте строку на пробелы и зациклите слова.
Вычислите, достигнет ли следующее слово правого края.
Если этого не произойдет, переместитесь на одну клетку вправо
Если это тогда начнется новая строка.
Выведите слово.
источник
Красный ,
125, 117, 114112 байтовПопробуйте онлайн!
источник
05AB1E , 18 байт
Попробуйте онлайн.
Объяснение:
источник
Java 8, 135 байт
Попробуйте онлайн.
Объяснение:
источник
JavaScript, 40 байт
Попробуйте онлайн!
источник
APL (Dyalog Unicode) , 14 байтов SBCS
Инфиксная функция; левый аргумент есть
n
, правый аргумент естьn
.Попробуйте онлайн!
⎕CY
с оп у в библиотеке dfns⋄
тогдаwrap
[c] использоватьфункциюwrap [n][c] код этой функции
[n] примечания к этой функции
Гольф версия
wrap
, 59 байт SBCSПопробуйте онлайн!
{
…}
Дфн;⍺
левый аргумент (ширина),⍵
правый аргумент (строка)≢⍵
счетчик (количество символов) строки⍺≥
…:
Если ширина больше или равна этому, то:⍵
вернуть строку⋄
иначе:' '=⍵
Булева маска, где пробелы равны строкеb←
хранить вb
(для б Ланкс)(
…)↑
Взять из этого следующее количество элементов:⍺+1
на один больше ширины⍸
я верю, где правдаg←
хранить вg
(для g aps)⍺≥
Булева маска, где ширина больше или равнаg/⍨
фильтровать индексы промежутка тем⍺,
добавить это к ширине⊃⌽
выбрать последний элемент этого (лит. выбрать первый из перевернутого)t←
хранить вt
(для т аки)b⊃⍨
используйте это, чтобы выбрать элемент из маски B lankst+
добавить это кt
⍵↓⍨
отбросьте столько символов из строки⍺∇
повторить на том же левом аргументе⎕TC,
Append , что в список т erminal с ontrol символов (8: HT, 10: Н. Л., 13: CR)2↓
отбросьте первые два символа из этого (оставляя только ведущий 13: CR)(
...),
добавить это к следующему:t↑⍵
первыеt
символы строкиисточник
Благодаря @Erik the Outgolfer, версия для гольфа:
Python 3 , 94 байта
Попробуйте онлайн!
# Python 3 , 130 байтПопробуйте онлайн!
Не очень удачная версия ...источник
JavaScript + HTML + CSS,
11764 байта-53 байта любезно предоставлены @Neil
источник
(n,s)=>document.body.innerHTML+=`<p style=width:${n}ch><tt>${s}</tt></p>`
74 байтов. Если вы хотите выкопать старые версии Firefox, вы можете сохранить еще 8 байтов(n,s)=>document.body.innerHTML+=`<pre wrap width=${n}>${s}</pre>`
.ch
юнитов. Firefox 65 вычисляет50ch
как500px
; Chromium 70 вычисляется50ch
как400px
elit. Sed eget erat lectus. Morbi mi mi, fringilla sed
(2-я строка) - более 50 символов. Я использую новейший Chrome.<p>
внутрь<tt>
.Желе , 12 байт
Попробуйте онлайн!
К сожалению, это слишком медленно, чтобы работать для предоставленного тестового примера в течение минуты по TIO.
источник
C # (.NET Core) , 162 байта
Эта функция использует регулярное выражение, которое соответствует ближайшему пробелу рядом с n-м или кратным n-ному символу и разбивает строку на его основе.
Попробуйте онлайн!
Ссылка TIO представляет собой полную программу, и у функции есть статическое ключевое слово, поэтому функцию можно вызывать из main.
Test Regex
источник
C # (интерактивный компилятор Visual C #) , 78 байт
Попробуйте онлайн!
Авторы обращаются к @LukeStevens за разработку версии Java ... Очевидно, .NET заставляет вас импортировать
RegularExpressions
пространство имен для замены :(Вот моя оригинальная версия, которая разделяется на символ пробела и использует LINQ для их объединения:
C # (интерактивный компилятор Visual C #) , 91 байт
Попробуйте онлайн!
источник
Дротик , 112 байт
Попробуйте онлайн!
источник
APL (NARS), 48 символов, 96 байтов
тест:
источник
C, 63 байта
Функция этого упражнения b (a, n) будет разбивать строку «a», как сказано в упражнении, таким образом, чтобы не изменять ее длину (если мы увидим результат как одну строку), поскольку изменим несколько пробелов в \ n или новую строку в место. Во входной строке «a» также не должно быть символа \ n для функции b () (она может иметь \ n во входной строке для bs ())
Функция b (a, n) была бы в порядке только потому, что ограничение этого упражнения, которое накладывает каждое слово строки «a», имеет длину <n, если это не так, эта функция может идти
в один бесконечный цикл ... (очень неправильно в моем понимании, поэтому я тоже копирую функцию, более хорошую, потому что в этом случае она вернет -1 и не пойдет в один бесконечный цикл; это bs (a, n) ниже) Я не исключаю, что обе функции прослушиваются .. ,
результат b () передается одной функции, которая добавляет длину каждой строки
источник