Розділіть струну на 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.