42
\$\begingroup\$

Your challenge is to write a program or function that, when given two strings of equal length, swaps every other character and outputs/returns the resulting strings in either order.

Examples

"Hello," "world!" --> "Hollo!" "werld,"
"code" "golf" --> "codf" "gole"
"happy" "angry" --> "hnpry" "aagpy"
"qwerty" "dvorak" --> "qvertk" "dworay"
"1, 2, 3" "a, b, c" --> "1, b, 3" "a, 2, c"
"3.141592653589" "2.718281828459" --> "3.111291623489" "2.748582858559"
"DJMcMayhem" "trichoplax" --> "DrMcMoylex" "tJichapham"
"Doorknob" "Downgoat" --> "Doonkoot" "Dowrgnab"
"Halloween" "Challenge" --> "Hhlloeegn" "Caallwnee"

Rules

  • The strings will only contain ASCII chars (32-126).
  • The strings will always be the same length, and will never be empty.
  • You may accept input in any suitable format: separate parameters, items in an array, separated by one or more newlines, even concatenated. The only restriction is that one string must come fully before the other (e.g. a1\nb2\nc3 for "abc", "123" is invalid).
  • The output may be in either order (i.e. you can start swapping from the first or the second char), and in any valid format mentioned above. (2-item array, separated by newline(s), concatenated, etc.)

Scoring

This is , so the shortest code in bytes for each language wins.

\$\endgroup\$
4
  • 14
    \$\begingroup\$ +1 for DrMcMoylex. :D \$\endgroup\$
    – DJMcMayhem
    Commented Oct 31, 2016 at 20:45
  • 4
    \$\begingroup\$ "Dowrgnab" anagrams to "Downgrab" ( ͡° ͜ʖ ͡°) \$\endgroup\$ Commented Nov 1, 2016 at 3:44
  • \$\begingroup\$ You should point out explicitly that the "in either order" rule means swapping can begin from the first character or the second. \$\endgroup\$
    – DLosc
    Commented Nov 2, 2016 at 5:08
  • \$\begingroup\$ @DrMcMoylex Take the code, golf example. If we swap starting from second character, we get: codf, gole. Starting from first character: gole, codf. \$\endgroup\$
    – DLosc
    Commented Nov 3, 2016 at 5:17

42 Answers 42

14
\$\begingroup\$

Haskell, 37 bytes

l=(,):flip(,):l
(unzip.).zipWith3($)l

Zips the two strings, alternately swapping the characters, then unzips them.

A 37-byte recursive alternative:

(a:b)?(c:d)=a:d?b
e?_=e
a%b=(a?b,b?a)
\$\endgroup\$
10
\$\begingroup\$

Python, 42 bytes with I/O golfing

def f(a,b):a[1::2],b[1::2]=b[1::2],a[1::2]

Swaps every other character of the two lists. Takes as input two lists of characters, and outputs by modifying them.

l=list('cat')
m=list('dog')    
print l,m

def f(a,b):a[1::2],b[1::2]=b[1::2],a[1::2]

f(l,m)
print l,m

gives

['c', 'a', 't'] ['d', 'o', 'g']
['c', 'o', 't'] ['d', 'a', 'g']
\$\endgroup\$
2
  • 1
    \$\begingroup\$ That's clever. Do you see the input/output formats as too flexible? \$\endgroup\$ Commented Oct 31, 2016 at 22:57
  • \$\begingroup\$ @ETHproductions Not sure, it might be mostly Python-specific that lists are so much manipulable than strings. \$\endgroup\$
    – xnor
    Commented Nov 1, 2016 at 1:29
8
\$\begingroup\$

Vim, 18, 17 bytes

qqyljvPkvPll@qq@q

Try it online!

This uses the V interpreter because of backwards compatibility. Input comes in this format:

string1
string2

Explanation:

 qq                 " Start recording in register 'q'
   yl               " Yank one letter
     j              " Move down a row
      vP            " Swap the yanked letter and the letter under the cursor
        k           " Move back up a row
         vP         " Swap the yanked letter and the letter under the cursor
           ll       " Move two letters to the right. This will throw an error once we're done
             @q     " Call macro 'q' recursively
               q    " Stop recording.
                @q  " Start the recursive loop
\$\endgroup\$
4
  • \$\begingroup\$ Cut two letters by using x instead of yl and then jus P instead of second vP: lqqxjvPkPll@qq@q \$\endgroup\$
    – Hauleth
    Commented Nov 2, 2016 at 15:19
  • \$\begingroup\$ @lukasz I had tried that initially, but for whatever reason, that runs it too many times and swaps the last letters when it shouldn't. I'll look into it some more though \$\endgroup\$
    – DJMcMayhem
    Commented Nov 2, 2016 at 15:21
  • \$\begingroup\$ Works for me v.tryitonline.net/… \$\endgroup\$
    – Hauleth
    Commented Nov 2, 2016 at 15:22
  • 1
    \$\begingroup\$ @ŁukaszNiemier That link has the same code as I posted. Did you hit the [save] button? Either way, it's not working for me. The real reason why is because when you x the last character on the line, it moves your cursor to the left, messing up the placement of the swap. \$\endgroup\$
    – DJMcMayhem
    Commented Nov 2, 2016 at 16:13
6
\$\begingroup\$

Haskell, 41 bytes

(a:b)#(c:d)=(a,c):d#b
_#_=[]
(unzip.).(#)

Returns a pair with the strings. Usage example: ( (unzip.).(#) ) "Hello," "world!"-> ("Hollo!","werld,").

Simple recursive approach: take the first char of each string as a pair and append a recursive call with the (rest of the) strings swapped. unzip makes a pair of lists out of the list of pairs.

\$\endgroup\$
6
\$\begingroup\$

05AB1E, 11 10 bytes

øvyNFÀ}})ø

Try it online!

Explanation

input = ["code", "golf"] used as example.

ø             # zip strings into list of pairs
              # STACK: ['cg', 'oo', 'dl', 'ef']
 vy           # for each pair
   NFÀ        # rotate left index times
      }}      # end-if, end-loop
              # STACK: 'cg, 'oo', 'dl', 'fe'
        )ø    # wrap in list and zip
              # OUTPUT: ['codf', 'gole']
\$\endgroup\$
5
\$\begingroup\$

Perl, 48 bytes

Bytecount includes 47 bytes of code and -p flag.

say<>=~s%.\K(.)%"s/.{$-[0]}\\K(.)/$1/;\$1"%geer

Run with -p and -E flag. Expect each string on a different line :

perl -pE 'say<>=~s%.\K(.)%"s/.{$-[0]}\\K(.)/$1/;\$1"%geer' <<< "Hello
World"

Explanations :

-p : capture input in $_ and prints it at the end. (to get and print the first string)
<> : get a line of input. (to get the second string).
=~ : apply a regex to <> : s%%%geer, where thanks to r the modified string is returned (and then printed thanks to say).
The regex :
.\K(.) finds two characters, and will replace the second one with the result of the evaluation of this code "s/.{$-[0]}\\K(.)/$1/;\$1" :
The first part, s/.{$-[0]}\\K(.)/$1/ applies a regex to $_ : .{$-[0]} skips the first characters to get to the same point as the outer regex (since $-[0] contains the index of the first capture group, so in that case the index of the characters to substitute), and then we capture a char with (.) and replace it with the character of the outer regex ($1). And then we add $1 so the result of "s/.{$-[0]}\\K(.)/$1/;\$1" is the character we captured in the inner regex.
You may have noticed that $1 refer to the character we want to replace in both strings (so two different characters), so we play with /ee modifier of the regex which evaluates the right side of the regex twice : the first one will substitute only the $1 that isn't preceded by the \.

\$\endgroup\$
5
\$\begingroup\$

Python, 55 bytes

lambda a,b:[(-~len(a)/2*s)[::len(a)+1]for s in a+b,b+a]

Slicing!

58 bytes:

def f(a,b):n=len(a);print[(s*n)[:n*n:n+1]for s in a+b,b+a]

64 bytes:

f=lambda a,b,s='',t='':a and f(b[1:],a[1:],s+a[0],t+b[0])or[s,t]

Recursively accumulates the characters of the two strings into s and t, and outputs the pair of them at the end. The alternation is done by switching the input strings each recursive call. Outputting a space-separated string was the same length:

lambda a,b,s='',t=' ':a and f(b[1:],a[1:],s+a[0],t+b[0])or s+t

This narrowly beat out a different recursive strategy of alternately taking characters from each string, with each of the two possible strings as the first one. (65 bytes)

g=lambda a,b:a and a[0]+g(b[1:],a[1:])
lambda a,b:(g(a,b),g(b,a))
\$\endgroup\$
5
\$\begingroup\$

Jelly, 5 bytes

żṚż¥/

Input is as separate arguments, output is concatenated.

Try it online! or verify all test cases.

How it works

żṚż¥/  Main link. Left argument: s (string). Right argument: t (string)

ż      Zipwith; yield the array of pairs of corresponding characters of s and t.
   ¥   Combine the two links to the left into a dyadic chain:
 Ṛ         Reverse the chain's left argument.
  ż        Zip the result with the chain's right argument.
    /  Reduce the return value of the initial ż by the quicklink Ṛż¥.
\$\endgroup\$
4
\$\begingroup\$

MATL, 11 10 9 8 bytes

Thanks to ETHproductions for 1 byte off!

"@X@YS&h

Input is a 2D array containing the two strings, such as: ['Halloween'; 'Challenge']. The output strings are in reverse order.

Try it online!

Explanation

        % Input 2D array implicitly
"       % For each column
  @     %   Push current column
  X@    %   Push iteration index, starting at 1
  YS    %   Circularly shift the column by that amount
  &h    %   Concatenate horizontally with (concatenated) previous columns
        % End implicitly
        % Display implicitly

Old version: 9 bytes

tZyP:1&YS

Explanation

        % Take input implicitly
t       % Duplicate 
        % STACK: ['Halloween'; 'Challenge'], ['Halloween'; 'Challenge']
Zy      % Size
        % STACK: ['Halloween'; 'Challenge'], [2 9]
P       % Flip array
        % STACK: ['Halloween'; 'Challenge'], [9 2]
:       % Range. Uses first element of the array as input
        % STACK: ['Halloween'; 'Challenge'], [1 2 3 4 5 6 7 8 9]
1&YS    % Circularly shift each column by those amounts respectively
        % STACK: [Caallwnee';'Hhlloeegn']
        % Display implicitly
\$\endgroup\$
0
4
\$\begingroup\$

Jelly, 9 8 6 bytes

Thanks to Dennis for saving 2 bytes!

Zṙ"J$Z

Uses the Jelly encoding.

Try it online!

\$\endgroup\$
2
  • \$\begingroup\$ You can use ṙ"J$ instead of Ėṙ@/€. Also, separating the string is not required, so you can drop the Y. \$\endgroup\$
    – Dennis
    Commented Oct 31, 2016 at 23:47
  • \$\begingroup\$ @Dennis Ahh, that's neat. Thanks! :) \$\endgroup\$
    – Adnan
    Commented Nov 1, 2016 at 15:26
3
\$\begingroup\$

V, 12 bytes

lòyljvPkvPll

Try it online!

Nothing too interesting, just a direct port of my vim answer so I can compete with (but not beat) 05AB1E.

\$\endgroup\$
3
\$\begingroup\$

Pyke, 9 bytes

,Fo2%I_(,

Try it here!

          - o = 0
,         -   transpose(input)
 F     (  -  for i in ^:
  o2%     -    (o++ %2)
     I_   -   if ^: i = reverse(i)
        , - transpose(^)
\$\endgroup\$
3
\$\begingroup\$

Pyth, 8 bytes

C.e_FbkC

Try it online: Demonstration

Transposes the words, reverses each pair of letters 'current index'-times, transpose again.

\$\endgroup\$
3
\$\begingroup\$

JavaScript (ES6), 55 bytes

f=([c,...s],[d,...t],o="",p="")=>c?f(t,s,o+c,p+d):[o,p]

I wanted to do something clever with using regexp to replace alternate characters but that ended up taking 67 57 bytes:

a=>a.map((s,i)=>a[+!i].replace(/.(.?)/g,(_,c,j)=>s[j]+c))
\$\endgroup\$
3
  • \$\begingroup\$ Nice. I had f=([a,...A],[b,...B])=>a?[a+f(B,A)[0],b+f(A,B)[0]]:[""] for the same length. \$\endgroup\$ Commented Oct 31, 2016 at 22:49
  • \$\begingroup\$ I hoped to do a lot better, but no way, just 1 less. Time to post a non recursive answer \$\endgroup\$
    – edc65
    Commented Oct 31, 2016 at 23:05
  • \$\begingroup\$ @edc65 Nice idea to use map, it shaved 10 bytes off my regexp answer. Still too long though. \$\endgroup\$
    – Neil
    Commented Nov 1, 2016 at 1:00
3
\$\begingroup\$

JavaScript (ES6), 51 54

Edit 3 bytes saved thx @Neil

Function with array input/output

p=>p.map((w,i)=>w.replace(/./g,(c,j)=>p[i+j&1][j]))

I like this one more, but it's 55 (2 strings in input, array in output)

(a,b)=>[...a].reduce(([p,q],c,i)=>[q+c,p+b[i]],['',''])

Test

f=
p=>p.map((w,i)=>w.replace(/./g,(c,j)=>p[i+j&1][j]))

function go() {
  var a=A.value, b=B.value
  if (a.length == b.length)
    O.textContent = f([a,b]).join('\n')
  else
    O.textContent = '- different length -'
    
}

go()
<input id=A value='Hello,'><input id=B value='world!'>
<button onclick='go()'>go</button><pre id=O></pre>

\$\endgroup\$
1
  • \$\begingroup\$ replace saves you 3 bytes: p=>p.map((w,i)=>w.replace(/./g,(c,j)=>a[i+j&1][j])). \$\endgroup\$
    – Neil
    Commented Nov 1, 2016 at 0:56
2
\$\begingroup\$

Perl, 40 bytes

Includes +1 for -n

Give strings as lines on STDIN

interlace.pl
hello
world
^D

interlace.pl

#!/usr/bin/perl -n
s/./${1&$.+pos}[pos]=$&/seg}{print@0,@1
\$\endgroup\$
2
\$\begingroup\$

Java, 132 103 100 bytes

Thanks to Kevin Cruijssen for suggesting returning the array (among other improvements) and saving 29 bytes! Also Olivier Grégoire for 3 bytes!

char[]c(char[]s,int l){for(int o=l;o-->0;)if(o%2>0){char t=s[o];s[o]=s[l+o+1];s[l+o+1]=t;}return s;}

Called like this:

public static void main(String[] args) {
    System.out.println(c("Hello,world!".toCharArray(), 5)); // 5 is the length of each "String"
}

Output:

Hollo,werld!

Takes advantage of the fact that input can basically be formatted in any way (in this case, a single char array of Strings that are delimited by a comma), and pretty lenient output rules as well.

\$\endgroup\$
8
  • \$\begingroup\$ Hi, original input format you've got there. You can golf it some more though: char[]c(char[]s,int l){for(int o=l,t;o-->0;)if(l%2>0){t=s[l];s[l]=s[l+o+1];s[l+o+1]=(char)t;}return s;} (103 bytes) with the output being returned instead of printed directly. Example input: System.out.println(c("Hello,world!".toCharArray(), 5));; Example output: Hollo,werld!. \$\endgroup\$ Commented Nov 1, 2016 at 9:01
  • \$\begingroup\$ True enough, I hadn't considered just returning the char array for some reason. That's great! \$\endgroup\$
    – Hypino
    Commented Nov 1, 2016 at 15:26
  • \$\begingroup\$ The result should be Hollo!werld, and not Hollo,werld! (the punctuation is incorrect). I believe this can be fixed with a input value of 6 instead of 5. \$\endgroup\$ Commented Nov 2, 2016 at 14:28
  • \$\begingroup\$ Since you cast t to char, why don't you declare it in the for loop directly as a char? You'd spare a few bytes doing so. \$\endgroup\$ Commented Nov 2, 2016 at 14:34
  • \$\begingroup\$ Unfortunately you can't declare the char within the for-loop initializer, but you inspired me to check if declaring the char separately would be shorter than the cast and it indeed is by 1 byte. \$\endgroup\$
    – Hypino
    Commented Nov 2, 2016 at 15:57
2
\$\begingroup\$

Japt, 8 4 bytes

yÈéY

Try it

yÈéY     :Implicit input of array U
y        :Transpose
 È       :Map each element at 0-based index Y then transpose back
  éY     :  Rotate right Y times
\$\endgroup\$
2
\$\begingroup\$

R, 71 bytes

\(a,b=rev(a)){for(j in 1:nchar(a)%/%2*2)substr(a,j,j)<-substr(b,j,j);a}

Attempt This Online!

Input and output are each a vector containing two strings.

This works quite simple: the program iterates through the even indices and swaps each \$j^{th}\$ character of two strings. Note that just in a single call of the substr the corresponding characters of both strings get swapped. The modified vector is output after the loop end.

Quite interesting, the program accepts vectors with more than 2 strings too. In this case the characters are swapped in strings pairwise: the 1st string with the last string, the 2nd with the second last etc. In the vectors with the odd number of strings the median (central) string is kept unchanged.

Also unequally long strings will get their characters swapped. In this case the characters' indices are limited by the length of the shortest string.

P.S. this 45 byte version \(s,n=2*nchar(s))substring(s,m<-c(0:n,0:n),m) will produce splitted strings (but I don't consider it to be a valid answer):

[1] ""  "W" "e" "r" "l" "d" "," ""  ""  ""  ""  ""  ""  ""  "H" "o" "l" "l" "o"
[20] "!" ""  ""  ""  ""  ""  "" 
\$\endgroup\$
2
\$\begingroup\$

Uiua SBCS,  8   6 bytes

⍉≡↻°⊏⍉

Try it!

-2 thanks to jan

Explanation

⍉≡↻°⊏⍉­⁡​‎‎⁡⁠⁢⁤‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁤‏⁠‎⁡⁠⁢⁡‏⁠‎⁡⁠⁢⁢‏⁠‎⁡⁠⁢⁣‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁢‏⁠‎⁡⁠⁣‏‏​⁡⁠⁡‌⁤​‎‎⁡⁠⁡‏‏​⁡⁠⁡‌­
     ⍉  # ‎⁡transpose
   °⊏   # ‎⁢range of length
 ≡↻     # ‎⁣elementwise rotate
⍉       # ‎⁤transpose
\$\endgroup\$
2
  • \$\begingroup\$ Inspired by the Japt answer: you can leave out ◿2 and it still works \$\endgroup\$
    – jan
    Commented Jun 30 at 11:28
  • \$\begingroup\$ @jan Oh, of course it would. That's clever. \$\endgroup\$
    – chunes
    Commented Jun 30 at 11:35
1
\$\begingroup\$

C, 124 bytes

main(c,v)char**v;{char a[99],b[99];for(c=0;v[1][c]^0;++c){a[c]=v[1+c%2][c];b[c]=v[2-c%2][c];}a[c]=0;b[c]=0;puts(a);puts(b);}

Call with:

program.exe string1 string2

String length is limited to 98 characters.

\$\endgroup\$
1
\$\begingroup\$

Octave, 64 61 bytes

@(x)reshape(x((t=1:end)+(2*mod(t,2)-1).*(mod(t-1,4)>1)),2,[])

Anonymous function that inputs a 2D char array with each string in a row, and produces the output in the same format.

Try it at Ideone.

\$\endgroup\$
1
\$\begingroup\$

Racket 208 bytes

(let((sl string->list)(ls list->string)(r reverse))(let p((s(sl s))(t(sl t))(u'())(v'())(g #t))(if(null? s)
(list(ls(r u))(ls(r v)))(p(cdr s)(cdr t)(cons(car(if g s t))u)(cons(car(if g t s))v)(if g #f #t)))))

Ungolfed:

(define (f s t)
  (let ((sl string->list)                ; create short names of fns
        (ls list->string)
        (r reverse))
    (let loop ((s (sl s))                ; convert string to lists
               (t (sl t))
               (u '())                   ; create empty new lists
               (v '())
               (g #t))                   ; a boolean flag
      (if (null? s)                      ; if done, return new lists converted back to strings
          (list (ls (r u))
                (ls (r v)))
          (loop (rest s)
                (rest t)                 ; keep adding chars to new lists alternately
                (cons (first (if g s t)) u) 
                (cons (first (if g t s)) v)
                (if g #f #t))            ; alternate the boolean flag
          ))))

Testing:

(f "abcdef" "123456")

Output:

'("a2c4e6" "1b3d5f")

Above is recursive version.

Iterative version:

(let*((sl string->list)(ls list->string)(r reverse)(s(sl s))(t(sl t))(l'())(k'())(p(λ(a b g)(set! l(cons(if g a b)l))
(set! k(cons(if g b a)k)))))(for((i s)(j t)(n(in-naturals)))(p i j(if(= 0(modulo n 2)) #t #f)))(list(ls(r l))(ls(r k))))

Ungolfed:

(define (f s t)
  (let* ((sl string->list)              ; create short form of fn names
         (ls list->string)
         (r reverse)

         (s (sl s))                     ; convert strings to lists
         (t (sl t))

         (l '())                        ; create empty lists for new sequences
         (k '())

         (p (λ(a b g)                   ; fn to add chars to one or other list
              (set! l (cons (if g a b) l))
              (set! k (cons (if g b a) k)))))

    (for ((i s)(j t)(n (in-naturals)))  ; loop with both strings
          (p i j                        ; add to new lists alternately
             (if (= 0 (modulo n 2)) #t #f)))

    (list (ls (r l))                  ; convert reversed lists to strings
          (ls (r k)))))
\$\endgroup\$
1
\$\begingroup\$

PowerShell v2+, 82 bytes

param($a,$b)$i=0;[char[]]$a|%{$c+=($_,$b[$i])[$i%2];$d+=($b[$i],$_)[$i++%2]};$c;$d

Still golfing... Nope. Can't seem to golf this down any without using a regex like other answers (boo on copying algorithms).

So we take $a and $b as strings, set index $i to 0, cast $a as a char-array, and send it through a loop |%{...}. Each iteration, we're string-concatenating onto $c and $d by indexing into an array-select (i.e., so it alternates back and forth). Then, we leave $c and $d on the pipeline, and output via implicit Write-Output happens at program completion.

\$\endgroup\$
1
\$\begingroup\$

Lithp, 120 characters (+3 for -v1 flag)

Line split in 2 for readability:

#P::((invoke P "map" (js-bridge #W,I::(replace W (regex "." "g")
     (js-bridge #C,J::(index (index P (& (+ I J) 1)) J))))))

Requires the -v1 flag to run.js as some functions are not yet part of the standard library.

Sample usage:

(
    (def f #P::((invoke P "map" (js-bridge #W,I::(replace W (regex "." "g")
                (js-bridge #C,J::(index (index P (& (+ I J) 1)) J)))))))
    (print (f (list "Hello," "world!")))
)

This sort of highlights that I haven't spent enough time on the standard library. Having to use js-bridge/1 twice and the long regex form, as well as invoking map using invoke/* all contribute to this being much longer than it needs to be.

Time to work on my standard library more I think.

\$\endgroup\$
1
\$\begingroup\$

PHP, 79 Bytes

for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][+$i]??" $y";

Previous Version PHP, 82 Bytes

for(;$i<strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])$x.=$a[1+$i%2][$i];echo"$x $y";
\$\endgroup\$
7
  • \$\begingroup\$ for(...)echo$a[1+$i%2][$i];echo" $y"; (-2) \$\endgroup\$
    – Titus
    Commented Nov 2, 2016 at 14:16
  • \$\begingroup\$ building off of Titus's comment for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][$i]??" $y"; is a further -2, though it requires php 7 \$\endgroup\$
    – user59178
    Commented Nov 2, 2016 at 14:43
  • \$\begingroup\$ @user59178 nice but you need 1 Byte more \$\endgroup\$ Commented Nov 2, 2016 at 15:04
  • \$\begingroup\$ do you? it works for me, you just get a Notice: String offset cast occurred in Command line code on line 1 \$\endgroup\$
    – user59178
    Commented Nov 2, 2016 at 18:02
  • \$\begingroup\$ @user59178 Yes to print the first letter of the first word \$\endgroup\$ Commented Nov 2, 2016 at 18:31
1
\$\begingroup\$

C, 54 52 bytes

f(char*a,char*b,char*c){while(*c++=*a++,*c++=*b++);}

Assumes output c has already the desired length.

Usage:

main(){
 char a[]="123456";
 char b[]="abcdef";
 char c[sizeof(a)+sizeof(b)-1];
 f(a,b,c);
 puts(c);

}

If you insist on creating the output, here is a 91 bytes solution:

char*g(char*a,char*b){char*c=malloc(2*strlen(a)),*d=c;while(*c++=*a++,*c++=*b++);return d;}

Usage:

main(){
 char a[]="123456";
 char b[]="abcdef";
 puts(g(a,b));
}
\$\endgroup\$
1
\$\begingroup\$

Ly, 11 bytes

ir>ir[<o>o]

Try it online!

This takes the two strings on separate input lines, and outputs the interlaced strings concatenated together. At a high level... It reads the two strings onto separate stacks, then just loops printing the top the each stack.

ir          - read first string onto the stack, reverse it
  >ir       - switch to new stack, read second string and reverse it
     [    ] - loop until the stack is empty
      <o    - switch to first stack and print a char
        >o  - switch to the second stack and print a char
\$\endgroup\$
1
\$\begingroup\$

q, 32 bytes

{?[;x;y]each(not\)count[x]#10b}.

k, 24 bytes

{?[;x;y]'(~:\)(#x)#10b}.
\$\endgroup\$
1
\$\begingroup\$

Uiua, 4 characters

⍥:°⊏

Try it here!

Uses separate parameters instead of items in an array.

\$\endgroup\$
1
  • \$\begingroup\$ Wow, that's nuts. I had no idea repeat worked like that. \$\endgroup\$
    – chunes
    Commented Jun 30 at 11:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.