[Question]
  [
[Inspiration.](https://twitter.com/dyalogapl/status/806443935811993600)\* I cannot believe we have not had this challenge before:
**Task**
Given one or more printable ASCII strings, interleave them by taking one character from each string, cyclically until out of characters. If a string runs out of characters before the others, just skip that one from then on.
**Examples**
`SIMPLE` gives `SIMPLE`
`POLLS` and `EPEES` gives `PEOPLELESS`
`LYES` and `APRONS` gives `LAYPERSONS`
`ABCDE` and `a c` and `123 567` gives `Aa1B 2Cc3D E567`
`"\n$?*` and `​` (empty string) and `,(.)"`  (trailing space) gives `",\(n.$)?"*`  (trailing space)
---
\* There are shorter APL solutions.
  
[Answer]
# [Jelly](http://github.com/DennisMitchell/jelly), 1 byte
```
Z
```
[Try it online!](http://jelly.tryitonline.net/#code=Wg&input=&args=WydBQkNERScsJ2EgYycsJzEyMyA1NjcnXQ)
The “transpose” built-in will do exactly this to a list of strings.
[Answer]
# Python 2, ~~101~~ ~~89~~ ~~86~~ 69 bytes
~~I'm hoping I can get this into a lambda somehow, shortening it down by making it recursive.~~ It isn't ideal because you would hope transposing is shorter, unfortunately it isn't (from what I have managed to come up with so far).
```
f=lambda s:' '*any(s)and''.join(x[:1]for x in s)+f([x[1:]for x in s])
```
Old solutions:
```
w=input();o=''
while any(w):
 for i in range(len(w)):o+=w[i][:1];w[i]=w[i][1:]
print o
```
`lambda s:''.join(''.join([c,''][c<' ']for c in x)for x in map(None,*[list(y)for y in s]))`
```
w=input();o=''
while any(x>=' 'for x in w):
 for i in range(len(w)):o+=w[i][:1];w[i]=w[i][1:]
print o
```
*thanks to mathmandan for making me feel dumb ;) saved me a bunch of bytes! (on an old solution)*
[Answer]
## [Perl 6](http://perl6.org/), 34 32 bytes
```
{[~] flat roundrobin |$_».comb}
```
```
{roundrobin(|$_».comb).flat.join}
```
A lambda that takes an array of strings as argument, and returns a string.
([Try it online](https://ideone.com/3yFIAL))
[Answer]
## [CJam](http://sourceforge.net/projects/cjam/), 4 bytes
```
qN/z
```
[Try it online!](http://cjam.tryitonline.net/#code=cU4veg&input=QUJDREUKYSBjCjEyMyA1Njc)
We can also write an unnamed function for 4 bytes, which expects a list of strings on top of the stack:
```
{zs}
```
[Try it online!](http://cjam.tryitonline.net/#code=WyJBQkNERSIgImEgYyIgIjEyMyA1NjciXQoKe3pzfQoKfg&input=)
[Answer]
# Pyth - 3 bytes
Very simple, will add expansion later, on mobile.
```
s.T
```
[Test Suite](http://pyth.herokuapp.com/?code=s.T&test_suite=1&test_suite_input=%22SIMPLE%22%0A%22LYES%22%2C%20%22APRON%22%0A%22ABCDE%22%2C%20%22a%20c%22%2C%20%22123%20567%22&debug=0)
```
s                         Join all the strings together
 .T                       Transpose, without chopping off overhang
  (Q implicit)
```
[Answer]
# JavaScript (ES6), ~~52~~ 46 bytes
```
f=([[c,...s],...a])=>s+a?c+f(s+s?[...a,s]:a):c
```
Takes input as an array of strings and outputs as a single string.
### Test snippet
```
f=([[c,...s],...a])=>s+a?c+f(s+s?[...a,s]:a):c
g=a=>console.log("Input:",JSON.stringify(a),"Output:",JSON.stringify(f(a)))
g(["SIMPLE"])
g(["POLLS","EPEES"])
g(["LYES","APRONS"])
g(["ABCDE","a c","123 567"])
g(["\"\\n$?*",",(.)\" "]) // Backslash and quote are escaped, but in/output are correct
```
[Answer]
# Haskell, 33 bytes
```
import Data.List
concat.transpose
```
[Try it on Ideone.](http://ideone.com/fU5986) Usage:
```
Prelude Data.List> concat.transpose$["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"
```
---
### Without using a build-in: (~~38~~ 34 bytes)
```
f[]=[]
f x=[h|h:_<-x]++f[t|_:t<-x]
```
[Try it on Ideone.](http://ideone.com/d8vZGp) 4 bytes off thanks to Zgarb! Usage:
```
Prelude> f["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"
```
[Answer]
# [J](http://jsoftware.com), 13 bytes
```
({~/:)&;#\&.>
```
[Try it online!](https://tio.run/nexus/j#@5@mYGuloFFdp2@lqWatHKOmZ8eVmpyRr5CmYKMe7Okb4OOqDhNQD/D38QlWt1Z3DXB1DUYI@0S6gkQdA4L8/ZCEHZ2cXVyB4okKyUDS0MhYwdTMHCGtFJOnYq8FlAEiHQ09TSUF9f//AQ "J – TIO Nexus")
Based on the [inspiration](https://twitter.com/dyalogapl/status/806443935811993600) for this question.
Another way to do it takes 27 bytes but operates using transpose. Most of the bytes are to handle the automatically added zeroes from padding.
```
[:u:0<:@-.~[:,@|:(1+3&u:)&>
```
## Explanation
```
({~/:)&;#\&.>  Input: list of boxed strings S
          &.>  For each boxed string x in S
        #\       Get the length of each prefix from shortest to longest
                 This forms the range [1, 2, ..., len(x)]
                 Rebox it
(    )         Operate on S and the prefix lengths
      &;         Raze both
   /:            Grade up the raze of the prefix lengths
 {~              Index into the raze of S using the grades
               Return
```
[Answer]
# C, ~~114~~ 84 bytes
-20 bytes for not calculating the length.
```
i,b;f(char**s){b=1;while(b){i=-1;b=0;while(s[++i]>0)if(*s[i])putchar(*s[i]++),++b;}}
```
Accepts array of char pointers and requires last item to be a null-pointer (see usage).
Ungolfed and usage:
```
i,b;f(char**s){
 b=1;
 while(b){
  i=-1;
  b=0;
  while(s[++i]>0)
   if(*s[i])
    putchar(*s[i]++),++b;
 }
}
int main(){
 char*a[]={ 
//  "POLLS","EPEES"
//  "LYES","APRONS"
 "ABCDE","a c","123 567"
 ,0};
 f(a);
 puts("");
}
```
[Answer]
# PHP, ~~68~~ 67 bytes
```
for(;$f=!$k=$f;$i++)for(;y|$v=$argv[++$k];$f&=""==$c)echo$c=$v[$i];
```
Loops over command line arguments. Run with `-r`.
After the inner loop, `$f` is `1` when all strings are finished, `0` else (bitwise `&` casts `""==$c` to int).  
Next iteration of the outer loop: copy `$f` to `$k` (saves one byte from `$k=0`) and toggle `$f`:  
When all strings are done, `$f` is now `false` and the loop gets broken.
[Answer]
## [Retina](http://github.com/mbuettner/retina), 13 bytes
Byte count assumes ISO 8859-1 encoding.
```
O$#`.
$.%`
¶
```
[Try it online!](http://retina.tryitonline.net/#code=TyQjYC4KJC4lYArCtgo&input=QUJDREUKYSBjCjEyMyA1Njc)
### Explanation
```
O$#`.
$.%`
```
This is based on the standard transposition technique in Retina. We sort (`O`) all non-linefeed characters (`.`), by (`$#`) the number of characters in front of them on the same line (`$.%``), i.e. their horizontal position.
The second stage then simply removes linefeeds from the input.
[Answer]
# Java, 19+155=174 160
```
String f(java.util.Queue<String> q){String s,r="";while(!q.isEmpty()){s=q.poll();r+=s.isEmpty()?"":s.charAt(0);if(s.length()>1)q.add(s.substring(1));}return r;}
```
Ungolfed:
```
  String f(java.util.Queue<String> q) {
    String s, r = "";
    while (!q.isEmpty()) {
      s = q.poll();
      r += s.isEmpty() ? "" : s.charAt(0);
      if (s.length() > 1) {
        q.add(s.substring(1));
      }
    }
    return r;
  }
```
Output:
> 
> SIMPLE
> 
> 
> PEOPLELESS
> 
> 
> LAYPERSONS
> 
> 
> Aa1B 2Cc3D E567
> 
> 
> ",(n.$)?"\* ​
> 
> 
> 
First modification: merged string declaration to save some bytes. Removed `import`, it was used by the `main()` method (not shown here) that also needed `LinkedList`. It is fewer bytes to referece `Queue` directly.
[Answer]
# [Python 2](https://docs.python.org/2/), 58 bytes
```
lambda*m:''.join(map(lambda*r:''.join(filter(None,r)),*m))
```
[Try it online!](https://tio.run/nexus/python2#S7ON@Z@TmJuUkqiVa6WurpeVn5mnkZtYoAEVLIILpmXmlKQWafjl56XqFGlq6mjlamr@LyjKzCtRSNPIzCsoLdHQ1EGjNf@rOzo5u7iqc6knKiQDSUMjYwVTM3N1AA "Python 2 – TIO Nexus")
[Answer]
# PHP, 77 bytes
## Golfed
```
function($a){for($d=1;$d!=$s;$i++){$d=$s;foreach($a as$v)$s.=$v[$i];}echo$s;}
```
Anonymous function that takes an array of strings.
I'm sure this could be golfed more, but it's early. On each iteration, we grab the i-th letter from each given string and append it to our final string, one at a time. PHP just throws warnings if we access bits of strings that don't exist, so that's fine. We only stop when no changes have been made after looping through all the strings once.
I feel like the usage of `$d` can be golfed more, but it's early. :P
[Answer]
# [Actually](http://github.com/Mego/Seriously), ~~7~~ 6 bytes
Golfing suggestions welcome! [Try it online!](http://actually.tryitonline.net/#code=YSBa4pmCzqPOow&input=IkFCQ0RFIgoiYSBjIgoiMTIzIDU2NyI)
**Edit:** -1 byte thanks to Teal pelican.
```
a Z♂ΣΣ
```
**Ungolfing**
```
          Implicit input each string.
a         Invert the stack so that the strings are in the correct order.
<space>   Get the number of items on the stack, len(stack).
Z         Zip all len(stack) strings into one, transposing them.
♂Σ        sum() every transposed list of chars into strings.
Σ         sum() again to join the strings together.
```
[Answer]
## JavaScript (ES6), 46 bytes
```
f=([[c,...s],...a])=>c?c+f([...a,s]):a+a&&f(a)
```
```
<textarea oninput=o.textContent=f(this.value.split`\n`)></textarea><div id=o>
```
[Answer]
# Bash + GNU utilities, 55
```
 eval paste `sed "s/.*/<(fold -1<<<'&')/g"`|tr -d \\n\\t
```
I/O via STDIN (line-separated) and STDOUT.
The `sed` formats each line to a [bash process substitution](https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html#Process-Substitution). These are then `eval`ed into `paste` to do the actual interleaving. `tr` then removes unnecessary newlines and tabs.
[Ideone.](https://ideone.com/KYkv8V)
[Answer]
# PHP, 63 bytes
Note: uses IBM-850 encoding
```
for(;$s^=1;$i++)for(;n|$w=$argv[++$$i];$s&=$x<~■)echo$x=$w[$i];
```
Run like this:
```
php -r 'for(;$s^=1;$i++)for(;n|$w=$argv[++$$i];$s&=$x<~■)echo$x=$w[$i];' "\"\n\$?*" "" ",(.)\" " 2>/dev/null;echo
> ",\(n.$)?"* 
```
# Explanation
```
for(                       # Iterate over string index.
  ;
  $s ^= 1;                 # Continue until $s (stop iterating) is 1.
                           # Flip $s so each iteration starts with $s
                           # being 1.
  $i++                     # Increment string index.
)
  for(
    ;
    "n" | $w=$argv[++$$i]; # Iterate over all input strings. OR with "n"
                           # to allow for empty strings.
    $s &= $x<~■            # If last character printed was greater than
                           # \x0 (all printable chars), set $s to 0,
                           # causing the loop to continue.
  )
    echo $x = $w[$i];      # Print char $i of current string.
```
[Answer]
# Python 3, 75 Bytes
I know the other Python one is shorter, but this is the first time I've used `map` ever in my life so I'm pretty proud of it
```
lambda n:''.join(i[k]for k in range(max(map(len,n)))for i in n if len(i)>k)
```
[Answer]
## Python 2, 128 96
I was hoping not to have to use itertools
```
a=lambda a:"".join([i for i in reduce(lambda: b,c:b+c, map(None,*map(lambda m:list(m),a)) if i])
```
Ungolfed
```
 a=lambda a:                              #Start a lambda taking in a
    "".join(                              #Join the result together with empty string
        [i for i in reduce(               #For every item, apply the function and 'keep'
           lambda: b,c:b+c,               #Add lists from...
                map(None,*map(            #None = Identity function, over a map of...
                    lambda m:list(m), a)  #list made for mthe strings m
                   ) if i                 #truthy values only (otherwise the outer map will padd with None.
       ])
```
[Answer]
# [Pip](https://github.com/dloscutoff/pip), 3 bytes
```
WVg
```
[Try it online!](https://tio.run/##K8gs@P8/PCz9////jk7OLq7/ExWS/xsaGSuYmpkDAA "Pip – Try It Online")
The `WV` (weave) builtin does exactly this. It's commonly used as a binary operator to weave two iterables together, but it can also be used as a unary operator to weave a list of iterables together. Here, `g` is the list of command-line arguments.
[Answer]
# [Python 3](https://docs.python.org/3/), 59 bytes
```
f=lambda s:s and s[0][:1]+f(s[1:]+[s[0][1:]][:s[0]>""])or""
```
A recursive function that takes a list of strings and returns a string. [Try it online!](https://tio.run/##K6gsycjPM/7/P802JzE3KSVRodiqWCExL0WhONogNtrKMFY7TaM42tAqVjsaLAJkAYVBTDslpVjN/CIlpf8FRZl5JRppGtFKPpGuwUo6SokFRfl5xUAGUIXmfwA "Python 3 – Try It Online")
### Explanation
We're going to build the interleaved string one character at a time. There are several cases to consider:
* Is the first string in the list nonempty? Take its first character, move the rest of it to the end of the list, and recurse.
* Is the first string in the list empty? Remove it from the list and recurse.
* Is the list of strings empty? Then we're done. Return empty string.
The implementation goes as follows:
```
f = lambda s: s and ... or ""
```
Define `f` to be a function of one argument, `s`, which is a list of strings. If `s` is nonempty, do the `...` part (see below); otherwise, return `""`.
```
s[0][:1] + f(...)
```
Since we now know `s` is nonempty, we can refer to its first element, `s[0]`. We don't know yet whether `s[0]` is empty, though. If it isn't, we want to concatenate its first character to a recursive call; if it is, we can concatenate the empty string to a recursive call. Slicing everything left of index 1 works in both cases.
```
s[1:] + ...
```
The argument to the recursive call is going to be all but the first element of `s`, concatenated to either a 1-element list (the rest of `s[0]` if it was nonempty) or an empty list (if `s[0]` was empty).
```
[s[0][1:]][:s[0] > ""]
```
We put `s[0][1:]` (the part of `s[0]` after the first character, which is the empty string if `s[0]` is empty) into a singleton list and then take a slice of that list. If `s[0]` is empty, `s[0] > ""` is `False`, which is treated as `0` in a slice; thus, we slice from index 0 to index 0--an empty slice. If `s[0]` is not empty, `s[0] > ""` is `True`, which is treated as `1`; thus, we slice from index 0 to index 1--the whole 1-element list.
---
If lists of single-character strings can be used in place of strings, this solution can be **54 bytes**:
```
f=lambda s:s and s[0][:1]+f(s[1:]+(s[0]and[s[0][1:]]))
```
[Try it online!](https://tio.run/##HYsxCsQgEAC/slitJEXkOiFlunSpwmLhEeSEZBXXJq83Xrphhsl3/SX@tBbm01/fw4NYAc8HCE2OrHFDQCFj3YB/0wu9pRundcslcsWAdEapKBpCKiAQGUit@7KpUflcEksH9R4P)
[Answer]
# [K (ngn/k)](https://codeberg.org/ngn/k), 13 bytes
```
<!/,/'(!#:)'\
```
[Try it online!](https://ngn.codeberg.page/k#eJxLs7JR1NfRV9dQVLbSVI/h4kpT0FBydHJ2cVWyVkpUSAaShkbGCqZm5kqaQDmdaKVgT98AH1elWLBKn0jXYKASx4Agf79gJU0AfEcQ7w==)
Port of [miles's J](https://codegolf.stackexchange.com/a/102518/16766) and [DLosc's BQN](https://codegolf.stackexchange.com/a/251298/78410). For a language with flatten and grade/sort-by but not zip-longest, I guess this is one of the best possible approaches.
More straightforward port would be `{(,/x)@<,/!'#'x}` because K doesn't have fork or over. But it is possible to use K train by abusing repeat-scan:
```
<!/,/'(!#:)'\
      (   )'\   Given a list of strings, apply this to each list
                until convergence and collect all intermediate values
                (including the input):
       !#:        get the indices of the list
                This always converges after step 1, giving (x;!#x)
   ,/'          Flatten each
<!/             Sort first by second
```
[Answer]
# C, ~~75~~ 71 bytes
Only limitation is the output length. Currently it's 99, but can be easily stretched to 999 (+1 byte).
```
i;main(a,b)char**b;{a--;for(;i<99;i++)*b[i%a+1]&&putchar(*b[i%a+1]++);}
```
Ungolfed:
```
i;
main( a, b )
char **b;
{
    a--;
    for( ; i < 99; i++ )
        *b[i % a + 1] && putchar( *b[i % a + 1]++ );
}
```
[Answer]
# Oracle SQL, 195 bytes
```
    select listagg(b,'') within group(order by l,o) from(select substr(a,level,1) b,level l,o from i start with length(a)>0 connect by prior a=a and level<=length(a) and prior sys_guid() is not null)
```
Takes its input from a table named `i` with columns `a` (containing the string) and `o` (order of the string):
```
    create table i (a varchar2(4000), a integer)
```
Explanation:  
We're exploiting `CONNECT BY` to break up the strings into each of the characters making them up. `PRIOR SYS_GUID()` being `NOT NULL` ensures we don't end up stuck in a loop.  
We then concatenate the single characters with `LISTAGG` but we shuffle them around with an `ORDER BY` clause, ordering them first by their position in the original string and only then by the string they came from.
Not as short as the other answers but SQL isn't really meant as a string manipulation language :)
[Answer]
# [R](https://www.r-project.org/), 73 bytes
```
for(i in 1:max(nchar(s<-scan(,""))))for(j in seq(s))cat(substr(s[j],i,i))
```
[Try it online!](https://tio.run/##K/r/Py2/SCNTITNPwdAqN7FCIy85I7FIo9hGtzg5MU9DR0lJEwhAarJAaopTCzWKNTWTE0s0ikuTikuAKqOzYnUydTI1Nf8rOTo5u7gqcSklKiQDSUMjYwVTM3Mlrv8A "R – Try It Online")
Explanation: very simple (but verbose), just loop through printing `i`th character of the `j`th string. Fortunately, `substr` returns an empty string if given an out-of-range input.
[Answer]
# [Jq 1.5](https://stedolan.github.io/jq/), 49 bytes
```
map(explode)|transpose|map(map(values)[])|implode
```
Explanation
```
                      # example input:          ["LYES","APRONS"]
  map(explode)        # make list of ordinals   [[76,89,69,83],[65,80,82,79,78,83]]
| transpose           # zip lists               [[76,65],[89,80],[69,82],[83,79],[null,78],[null,83]]
| map(map(values)[])  # rm nulls and flatten    [76,65,89,80,69,82,83,79,78,83]
| implode             # convert back to string  "LAYPERSONS"
```
Sample Run
```
$ paste input <(jq -Mrc 'map(explode)|transpose|map(map(values)[])|implode' input)
["SIMPLE"]                  SIMPLE
["POLLS","EPEES"]           PEOPLELESS
["LYES","APRONS"]           LAYPERSONS
["ABCDE", "a c", "123 567"] Aa1B 2Cc3D E567
["\"\\n$?*", "", ",(.)\" "] ",\(n.$)?"* 
$ echo -n 'map(explode)|transpose|map(map(values)[])|implode' | wc -c
  49    
```
[**Try it online**](https://jqplay.org/s/u4OgJj_3j2)
[Answer]
# [Perl 5](https://www.perl.org/), + `-0n` 24 bytes
```
1while s/^./!print$&/gem
```
[Try it online!](https://tio.run/##K0gtyjH9/9@wPCMzJ1WhWD9OT1@xoCgzr0RFTT89Nff//wB/H59gLtcAV9fgf/kFJZn5ecX/dfMMAA "Perl 5 – Try It Online")
## Explanation
`-0n` slurps the input into `$_` and repeatedly replaces the first char of each line with the result of negating the `print` of each match (which is the empty string since `print` returns `1` by default)
[Answer]
# [Factor](https://factorcode.org/), 22 bytes
```
[ round-robin ""like ]
```
[Try it online!](https://tio.run/##S0tMLskv@h8a7OnnbqWQma@QnVqUl5qjUJxaWJqal5xajGDppVaUFCUWK1hzcVUrKDk6Obu4KikoJSokA0lDI2MFUzNzJYXa/9EKRfmleSm6RflJmXkKSko5mdmpCrH/kxNzchQKijLzSv4DAA "Factor – Try It Online")
[Answer]
# [Vyxal](https://github.com/Vyxal/Vyxal) `s`, 1 byte
```
∩
```
[Try it Online!](https://vyxal.pythonanywhere.com/#WyJzIiwiIiwi4oipIiwiIiwiWydBQkNERScsICdhIGMnLCAnMTIzIDU2NyddIl0=)
]