fork(2) download
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. void swap(void* pa, void* pb, size_t sz)
  5. {
  6. char *p1 = pa, *p2 = pb;
  7. while (sz--)
  8. {
  9. char tmp = *p1;
  10. *p1++ = *p2;
  11. *p2++ = tmp;
  12. }
  13. }
  14.  
  15. /*
  16. Want: abcdefgh12345678 -> a1b2c3d4e5f6g7h8
  17.  
  18. a b c d e f g h
  19.   1 2 3 4 5 6 7 8
  20.  
  21.   4 1-sized swaps:
  22.  
  23. a 1 c 3 e 5 g 7
  24.   b 2 d 4 f 6 h 8
  25.  
  26. a1 c3 e5 g7
  27.   b2 d4 f6 h8
  28.  
  29.   2 2-sized swaps:
  30.  
  31. a1 b2 e5 f6
  32.   c3 d4 g7 h8
  33.  
  34. a1b2 e5f6
  35.   c3d4 g7h8
  36.  
  37.   1 4-sized swap:
  38.  
  39. a1b2 c3d4
  40.   e5f6 g7h8
  41.  
  42. a1b2c3d4
  43.   e5f6g7h8
  44. */
  45.  
  46. void interleave(char* s, size_t len)
  47. {
  48. size_t start, step, i, j;
  49.  
  50. if (len <= 2)
  51. return;
  52.  
  53. if (len & (len - 1))
  54. return; // only power of 2 lengths are supported
  55.  
  56. for (start = 1, step = 2;
  57. step < len;
  58. start *= 2, step *= 2)
  59. {
  60. for (i = start, j = len / 2;
  61. i < len / 2;
  62. i += step, j += step)
  63. {
  64. swap(s + i,
  65. s + j,
  66. step / 2);
  67. }
  68. }
  69. }
  70.  
  71. char testData[][64 + 1] =
  72. {
  73. { "Aa" },
  74. { "ABab" },
  75. { "ABCDabcd" },
  76. { "ABCDEFGHabcdefgh" },
  77. { "ABCDEFGHIJKLMNOPabcdefghijklmnop" },
  78. { "ABCDEFGHIJKLMNOPQRSTUVWXYZ0<({[/abcdefghijklmnopqrstuvwxyz1>)}]\\" },
  79. };
  80.  
  81. int main(void)
  82. {
  83. unsigned i;
  84.  
  85. for (i = 0; i < sizeof(testData) / sizeof(testData[0]); i++)
  86. {
  87. printf("%s -> ", testData[i]);
  88. interleave(testData[i], strlen(testData[i]));
  89. printf("%s\n", testData[i]);
  90. }
  91.  
  92. return 0;
  93. }
  94.  
Success #stdin #stdout 0s 1832KB
stdin
Standard input is empty
stdout
Aa -> Aa
ABab -> AaBb
ABCDabcd -> AaBbCcDd
ABCDEFGHabcdefgh -> AaBbCcDdEeFfGgHh
ABCDEFGHIJKLMNOPabcdefghijklmnop -> AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPp
ABCDEFGHIJKLMNOPQRSTUVWXYZ0<({[/abcdefghijklmnopqrstuvwxyz1>)}]\ -> AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz01<>(){}[]/\