Разбейте строку на 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.