Braid Badly Boundlessly
code-golfstring
Your program or function must, given a string in any standard input format, output an infinite stream of delimiter-separated strings where each string is determined from the previous by a braiding algorithm. The program starts with printing the input string.
The algorithm is described as follows: Infinitely alternate between
(1) splitting the string into three substrings then swapping the first two substrings and flattening.
and
(2) splitting the string into three substrings then swapping the last two substrings and flattening.
starting with (1).
The three substrings should be of non-increasing length with the maximum length no more than 1 greater than the minimum length of the three substrings. (This means that when the length of the given string is a multiple of three, the three substrings should be the same length. When the length of the given string is one more than a multiple of three, the first substring should be one character longer than each of the last two substrings. When the length of the given string is two more than a multiple of three, the first and second substrings should each be one character longer than the last substring.)
Example
Let the input be "abcdefg"
. Let the delimiter be a newline.
Then the program would first print "abcdefg"
.
It applies (1) which splits the string into ["abc","de","fg"]
and swaps the first two elements, reaching ["de","abc","fg"]
. It flattens to get "deabcfg"
which it prints and uses for the next step.
The program applies (2) to "deabcfg"
to split into ["dea","bc","fg"]
and swaps into ["dea","fg","bc"]
, flattening to reach "deafgbc"
.
The program applies (1) to "deafgbc"
and the process repeats ad infinitum.
Then the output would be the newline-separated
abcdefg
deabcfg
deafgbc
fgdeabc
fgdbcea
bcfgdea
bcfeagd
eabcfgd
eabgdcf
gdeabcf
gdecfab
cfgdeab
cfgabde
abcfgde
abcdefg
deabcfg
deafgbc
fgdeabc
fgdbcea
bcfgdea
bcfeagd
eabcfgd
eabgdcf
gdeabcf
gdecfab
cfgdeab
cfgabde
abcfgde
abcdefg
[...]
Specifications
- Note that the string should not be split at the beginning and then only swapped later. The string should be split on each and every iteration
- The delimiter between lines could be whichever character is convenient. You may assume it does not appear in the input string.
- The string input shall be at least three characters
- The input consists solely of printable characters (0x20-0x7F)
- Of course, standard loopholes are forbidden.
I/O
- The input and output should be taken in standard I/O methods.
- The input and output should be taken as string, list of characters, or equivalent.
- The output should be output continuously, which means you may assume infinite memory.
Test cases
For the test cases, we will assume that the delimiter is a newline. Just the portion before the endless stream is repeats is shown.
input
--
output
-----
abcdefg
--
abcdefg
deabcfg
deafgbc
fgdeabc
fgdbcea
bcfgdea
bcfeagd
eabcfgd
eabgdcf
gdeabcf
gdecfab
cfgdeab
cfgabde
abcfgde
-----
abc
--
abc
bac
bca
cba
cab
acb
-----
abcdefgh
--
abcdefgh
defabcgh
defghabc
ghadefbc
ghabcdef
bcdghaef
bcdefgha
efgbcdha
efghabcd
habefgcd
habcdefg
cdehabfg
cdefghab
fghcdeab
fghabcde
abcfghde
abcdefgh
-----
Braid
--
Braid
aiBrd
aidBr
dBair
dBrai
radBi
raidB
idraB
idBra
Brida
-----
Cycle
--
Cycle
clCye
cleCy
eCcly
eCycl
yceCl
ycleC
leycC
leCyc
Cylec
-----
O Canada!
--
O Canada!
anaO Cda!
anada!O C
da!anaO C
da!O Cana
O Cda!ana
-----
A man, a plan, a canal - panama!
--
A man, a plan, a canal - panama!
an, a canalA man, a pl - panama!
an, a canal - panama!A man, a pl
- panama!Aan, a canal man, a pl
- panama!A man, a plan, a canal
man, a pla - panama!An, a canal
man, a plan, a canal - panama!A
n, a canal man, a pla- panama!A
n, a canal - panama!A man, a pla
- panama!A n, a canal man, a pla
- panama!A man, a plan, a canal
man, a plan- panama!A , a canal
man, a plan, a canal - panama!A
, a canal -man, a plan panama!A
, a canal - panama!A man, a plan
panama!A m, a canal -an, a plan
panama!A man, a plan, a canal -
an, a plan, panama!A m a canal -
an, a plan, a canal - panama!A m
a canal - an, a plan,panama!A m
a canal - panama!A man, a plan,
panama!A ma a canal - n, a plan,
panama!A man, a plan, a canal -
n, a plan, panama!A maa canal -
n, a plan, a canal - panama!A ma
a canal - pn, a plan, anama!A ma
a canal - panama!A man, a plan,
anama!A mana canal - p, a plan,
anama!A man, a plan, a canal - p
, a plan, aanama!A man canal - p
, a plan, a canal - panama!A man
canal - pa, a plan, anama!A man
canal - panama!A man, a plan, a
nama!A man, canal - pa a plan, a
nama!A man, a plan, a canal - pa
a plan, a nama!A man,canal - pa
a plan, a canal - panama!A man,
canal - pan a plan, a ama!A man,
canal - panama!A man, a plan, a
ama!A man, canal - pana plan, a
ama!A man, a plan, a canal - pan
a plan, a cama!A man, anal - pan
a plan, a canal - panama!A man,
anal - panaa plan, a cma!A man,
anal - panama!A man, a plan, a c
ma!A man, aanal - pana plan, a c
ma!A man, a plan, a canal - pana
plan, a cama!A man, anal - pana
plan, a canal - panama!A man, a
nal - panam plan, a caa!A man, a
nal - panama!A man, a plan, a ca
a!A man, a nal - panamplan, a ca
a!A man, a plan, a canal - panam
plan, a cana!A man, a al - panam
plan, a canal - panama!A man, a
al - panamaplan, a can!A man, a
al - panama!A man, a plan, a can
!A man, a pal - panamalan, a can
!A man, a plan, a canal - panama
lan, a cana!A man, a pl - panama
lan, a canal - panama!A man, a p
l - panama!lan, a canaA man, a p
l - panama!A man, a plan, a cana
A man, a pll - panama!an, a cana