Розділіть струну на 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, тому перші два елементи будуть один довший:
Вихід: ["prog", "ramm", "ing"]

Правила

Тестові справи

Тестові випадки були згенеровані за допомогою цієї програми Pyth (використовує вбудовані файли , тому немає правильної відповіді). Дякуємо @FryAmTheEggman за надання базової версії цього!

3, helloworld -> ['пекло', '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 -> ['програма', 'ing']
9, код гольфу -> ['c', 'o', 'd', 'e', ​​'', 'g', 'o', 'l', 'f']
код гольфу, 9 -> ['код гольфу']
4, 133tspeak -> ['133', 'ts', 'pe', 'ak']
133tspeak, 4 -> ['133t', 'говорить', 'k']

Щасливе кодування!


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

@Dennis Це було покликане виключити вбудовані елементи, які вирішують це безпосередньо. Я уточнив.
— Денкер

Якщо наша мова не підтримує масиви, як ми повинні виводити? Чи прийнятний буде новий рядок між кожним результатом рядка?
— Conor O'Brien

Крім того, для мов, де вхід - це масив неоднозначних чисел, якою має бути процедура?
— Conor O'Brien

@ 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

owo що це?
— Бенджамін

0

Піт, 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']

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

Я маю на увазі, я вважаю, що моя відповідь деспектна з точки зору, вона довша, ніж відповідь на JavaScript ...


Чи можете ви надати зразок введення та виводу?
— Leaky Nun

Зверніть увагу на офіційне рішення під заголовком 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.