Split string into n pieces (or pieces of length n)
JavaScript (ES6), 132 bytes
(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)
This is probably hopelessly over-engineered.
JavaScript (Firefox), 88 87 bytes
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])
Call it like (...)("programming")(3)
using Firefox 30+.
MATL, 46 26 21 27 29 42 bytes
jtU?jtbUe!tn2Gn>?0t(]tgbw(}ie]!2t$X{Oc''Zt
Try it Online! (Updated slightly to work with the latest version of the language)
Explanation
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