Разбейте строку на n частей (или части длины n)


11

Соревнование

В этом задании вы должны выполнить две разные (но связанные) задачи в зависимости от порядка ввода.
Ваша программа получит строку sи целое число в nкачестве входных данных и будет

  • разделить sна куски длины, nесли на sпервом месте. Последний элемент будет короче, если необходимо.
  • разделить sна nкусочки равной длины, если это nпроизойдет первым. Если len(s)не кратно nпервым len(s) mod nэлементам будет один длиннее.

Вы можете взять только эти 2 входа. sникогда не будет содержать только цифры.

Заметки

  • Вы можете использовать обратное отображение. Отметьте это в своем ответе, если вы это сделаете.
  • sбудет содержать только печатные символы ASCII (без перевода строки).
  • Вы не можете использовать любые встроенные функции, которые решают обе эти задачи напрямую. Все остальные встроенные функции разрешены.
  • Вы должны взять оба аргумента из одного источника.
  • Вы можете принимать аргументы в упорядоченном списке или любом другом формате, который четко указывает их порядок, если он однозначен.
  • Вы можете взять входные данные как одну строку / поток и использовать символ, который не является допустимым входным (например, нулевой байт), чтобы разделить их.
  • nвсегда будет равно или меньше длины sи больше нуля.
  • Вы можете вывести итоговый список в любом подходящем формате, если он четко указывает конкретные части и их порядок.

пример

Входные данные: programming, 3
последний элемент содержит только 2 символа, потому что 11 не делится на 3.
Выходные данные: ["pro", "gra", "mmi", "ng"]

Вход: 3, programming
11 не кратен 3, поэтому первые 2 элемента будут на один длиннее:
Выход: ["prog", "ramm", "ing"]

правила

Контрольные примеры

Тестовые случаи были созданы с помощью этой программы Pyth (используются встроенные функции, поэтому нет правильного ответа). Спасибо @FryAmTheEggman за предоставление базовой версии этого!

3, helloworld -> ['hell', 'owo', 'rld']
helloworld, 3 -> ['hel', 'low', 'orl', 'd']
1, программирование -> ['программирование']
программирование, 1 -> ['p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g']
8, программирование -> ['pr', 'og', 'ra', 'm', 'm', 'i', 'n', 'g']
программирование, 8 -> ['programm', 'ing']
9, код гольф -> ['c', 'o', 'd', 'e', ​​'', 'g', 'o', 'l', 'f']
код гольф, 9 -> ['код гольф']
4, 133tspeak -> ['133', 'ts', 'pe', 'ak']
133tspeak, 4 -> ['133t', 'spea', 'k']

Удачного кодирования!


Вы не можете использовать любые встроенные функции, которые решают эти две задачи. Включает ли это другие встроенные модули, такие как получение каждого n-го символа из строки или разбиение при появлении ?
— Деннис

@Dennis Это просто предназначалось для исключения встроенных функций, которые решают это напрямую. Я пояснил.
— Денкер

Если наш язык не поддерживает массивы, как мы должны выводить? Будет ли перевод строки между каждым результатом строки приемлемым?
— Конор О'Брайен,

Кроме того, для языков, где ввод представляет собой массив неоднозначных чисел, какой должна быть процедура?
— Конор О'Брайен,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Не может быть. s никогда не будет содержать только цифры . Также Вы можете вывести итоговый список в любом приемлемом формате, если он четко указывает на конкретные фрагменты и их порядок, который, конечно, включает в себя многострочный вывод.
— Денкер

Ответы:


3

MATL, 46 26 21 27 29 42 байта

jtU?jtbUe!tn2Gn>?0t(]tgbw(}ie]!2t$X{Oc''Zt

Попробуйте онлайн! (Немного обновлено для работы с последней версией языка)

объяснение

j           % Explicitly grab the first input as a string
t           % Duplicate
U           % Attempt to convert it to a number
?           % If the conversion to a number was successful
    j       % Explicitly grab the second input as a string
    t       % Duplicate the value
    b       % Bubble-up the first element in the stack
    U       % Convert to a number from a string
    e       % Reshape the string into a nGroup x nPerGroup matrix
    !       % Take the transpose
    t       % Duplicate the result
    n       % Number of characters in the repmat result
    2Gn     % Number of characters in the string
    >?      % If chars in repmat > chars in string
        O   % Zero
        t   % Duplicate 
        (   % Assign the last element to a null character (bug in MATL)
    ]       % End if statement
    t       % Duplicate this matrix
    g       % Convert to a logical matrix
    b       % Bubble-up the original string
    w       % Flip the top two elements
    (       % Assign the non-empty characters to the chars from the input string
}           % Else the string comes first
    i       % Explicitly grab the second input (the number)
    e       % Reshape the characters into an nPerGroup x nGroup 2D array
]           % End of if statement
!           % Take the transpose so it reads left-to-right
2           % Number literal
t           % Duplicate
$X{         % Call num2cell to convert to a cell array
Oc          % Null character
''          % Empty string
Zt          % Replace null chars with empty strings
            % Implicit display of stack contents

Что это за непечатные надписи, которые появляются в конце некоторых элементов списка? Они не являются частью ввода и, следовательно, не должны быть частью вывода.
— Денкер

Разве это не eзапрещено?
— FliiFe

Может заменить XUZN?...на U?...и поменять местами две ifветви. Кроме того, вам не нужно3$
— Луис Мендо

@DenkerAffe К сожалению об этом. Должно быть исправлено сейчас.
— Suever

@FliiFe Исходя из комментариев к первоначальному сообщению, eне решает проблему напрямую, поэтому я не считаю ее запрещенной, нет.
— Suever

4

JavaScript (ES6), 132 байта

(s,t)=>+t?[...Array(-~(~-s.length/+t))].map((_,i)=>s.substr(i*t,t)):[...Array(s=+s)].map(_=>t.slice(p,p-=~((t.length-p-1)/s--)),p=0)

Это, вероятно, безнадежно перегружено.


Что ж, мое (ныне покойное) решение было крайне недостаточно разработанным. +1 для вас
— edc65

4

JavaScript (Firefox), 88 87 байт

a=>b=>(s=+b?a:b,i=x=0,l=s.length,[for(c of s)if(r=s.slice(x,x+=+b||l/a+(i++<l%a)|0))r])

Назовите это как (...)("programming")(3)использование Firefox 30+.


2

Рубин, 119 байт

->x,y{r=[t=0];x.to_s==x ?(r.push x[t...t+=y]while x[t]):x.times{r.push y[t...t+=y.size/x+(r[y.size%x]? 0:1)]};r[1..-1]}

И я занимаю первое место на 2 байта ...


У объектов Regex в Ruby могут быть значения, введенные в них так же, как и строки, поэтому x.scan(/.{,#{y}})в первом случае это работает так же хорошо, как и для разделения строк. Или это считается встроенным?
— Стоимость чернил

2

AWK, 121 130 128 122 байт

$1~/^[0-9]+$/{s=1}{a=$(s+1)
b=s?$1:$2
$0=""
for(j=-b;j<=c=length(a);)$0=$0 substr(a,j+=b+s,b+(s=s&&j<c%b*(b+1)?1:0))" "}1

Единственная проблема заключается в том, что первая запись - это строка, которая начинается с числового значения. Это приведет AWKк тому, что строка будет отображаться как этот номер, а вторая запись - как строка.

ОК ... исправлена ​​ошибка с числовым значением, но добавлено 9 байт :(.

Немного переработан, чтобы сэкономить пару байтов.

Почти вернемся к исходной длине. :)


Хорошо, @DenkerAffe, исправил это, чтобы работать вообще и только (в конечном счете) добавил 1 байт.
— Роберт Бенсон

1

Haskell, 131 байт

import Data.Lists
q(d,m)=splitPlaces$(d+1<$[1..m])++[d,d..]
a#b|all(`elem`['0'..'9'])a=q(divMod(length b)$read a)b|1<2=q(read b,0)a

Пример использования:

*Main> "8" # "programming"
["pr","og","ra","m","m","i","n","g"]
*Main> "programming" # "8"
["programm","ing"]

Как это работает: основная работа выполняется вспомогательной функцией, qкоторая принимает пару чисел (d,m)и строку s. Сначала создается список mвремен, d+1за которым следует бесконечное множество d(например, (1,3)-> [2,2,2,1,1,1,1,1,...]). Затем он использует splitPlacesдля разбиения sна куски длины, указанные в списке. splitPlacesостанавливается, если не sхватает элементов, так что бесконечный список в порядке.

Основная функция #проверяет, какой параметр является числом n/ строкой, strи вызывает qлибо, (div (length str) n, mod (length str) n)либо (n, 0)плюс str.


0

C # (LINQPAD) - 335 байт

var y=Util.ReadLine().Split(',');int x,j=0;var t=int.TryParse(y[0].Trim(),out x);x=x==0?int.Parse(y[1].Trim()):x;var i=t?y[1].Trim():y[0];var z="";if(!t){while(i.Substring(j).Length>x){z+=i.Substring(j).Length>x?i.Substring(j,x)+", ":"";j+=x;}z+=i.Substring(j);}else z=string.Join(", ",i.Split(x).Select(s=>string.Concat(s)));z.Dump();

Входная часть чтения заняла немного места. Победитель самого длинного ответа.

Использование № 1:

$ 3, helloworld

>> hell, owo, rld

Использование № 2:

$ helloworld, 3

>>hel, low, orl, d

Оу, что это?
— Бенджамин Уркхарт

0

Pyth, 181 байт

Давайте представим, что самый длинный код в байтах выигрывает \ o /

DyGK@G0J:@G1"."1=YJV%lJKW<l@YN.EclJK=YXYN+@YN@YhN=Y.DYhN)FNr%lJK/-lJ%lJK/-lJ%lJKKW<l@YNsclJK=YXYN+@YN@YhN=Y.DYhN))RY)DPG=K@G1=J:@G0"."1=YJV/lJKW<l@YNK=YXYN+@YN@YhN=Y.DYhN))RY).xyQPQ

Попробуй это здесь! (У онлайн-интерпретатора, похоже, есть ошибка, он отображает ввод, а не должен)

Вот вывод из терминала:

» pyth split.pyth <<<'["helloworld", 3]' 
['hel', 'low', 'orl', 'd']
» pyth split.pyth <<<'[3, "Helloworld"]'
['Hell', 'owo', 'rld']

Серьезно, я открыт для нового подхода. Я новичок в Python, поэтому я, вероятно, пропустил несколько коротких позиций.

Я имею в виду, я думаю, что мой ответ неэффективен с точки зрения того, что он длиннее, чем ответ javascript ...


Можете ли вы предоставить пример ввода и вывода?
— Утренняя монахиня

Обратите внимание на официальное решение под заголовком testcases. Тестовые случаи генерируются Pyth. Решение есть .xcsJKcJsK, где Jи Kдва аргумента.
— Утренняя монахиня

@KennyLau Я добавил ссылку на онлайн-переводчика pyth. Как ни странно, он тоже выводит данные, хотя я уверен, что не вчера ... Попробую это исправить.
— FliiFe

использовать пробелы для подавления печати
— Leaky Nun

@KennyLau места где?
— FliiFe

0

PHP, 114 байт

[$t,$n,$p]=$argv;for(@+$p?$s=$n:$f=$n*($p=strlen($s=$p)/$n)%$n;$t;)echo$t=substr($s,$a+=$e,$e=$p+($i++<$f)|0),"
";
  • Строка не должна начинаться с цифр.
    (Заменить +@$pс , is_numeric($p)чтобы исправить.)
  • Вывод не должен содержать чанк "0".
    (Вставьте ~для печати ASCII, a&для любой ASCII, прежде чем $t;исправить.)
  • Запустите -nrили попробуйте онлайн .

0

PowerShell , 122 118 байт

param($a,$b)if($a-is[int]){$a,$b=$b,((($l=$b|% Le*)-($c=$l%$a))/$a)}$a-split("(..{$b})"*$c+"(.{0,$b})"*$a.Length)-ne''

Попробуйте онлайн!

Меньше гольфа:

param($a,$b)
if($a-is[int]){
    $length=$b|% Length
    $c=$length%$a
    $a,$b=$b,(($length-$c)/$a)  # recalc length and swap
}
$pattern="(..{$b})"*$c+"(.{0,$b})"*$a.Length
$parts=$a -split $pattern       # pattern like '(..{3})(..{3})(.{0,3})(.{0,3})(.{0,3})'
$parts -ne ''                   # output not empty parts
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.