#JavaScript (ES6), 106 <s>107 113 126 141</s> A porting to javascript of the Pip answer by @DLosc. I needed some time to fully understand it, and it's genius. **Edit** -15 bytes following the hint by @Titus, directly appending chars to the input string `a` and avoiding early return (so no `for/if`) **Edit 2** enumerating the 6 value for the Min function saves other 13 bytes **Edit 3** changed c function again. I thought the verbose `length` and `split` would be too lengthy. I was wrong. Assuming lowercase input <!-- language: lang-js --> a=>[...a].some(z=>c(a+=z)>b,c=a=>Math.min(...[...'lcowbe'].map((c,i)=>~-a.split(c).length>>!i)),b=c(a))&&a *Less golfed* <!-- language: lang-js --> a=>{ c=a=>{ // cowbell functions - count cowbells k = [... 'lcowbe'].map((c,i) => (a.split(c).length - 1) // count occurrences of c in a / (!i + 1) // divide by 2 if first in list ('l') ); return Math.min(...k); }; b = c(a); // starting number of cowbells [...a].some(z => ( // iterate for all chars of a until true a += z, c(a) > b // exit when I have more cowbells )); return a; } **Test** <!-- begin snippet: js hide: false console: true babel: false --> <!-- language: lang-js --> f= a=>[...a].some(z=>c(a+=z)>b,c=a=>Math.min(...[...'lcowbe'].map((c,i)=>~-a.split(c).length>>!i)),b=c(a))&&a ;["christopher walken begs for more cowbell!" ,"the quick brown fox jumps over the lazy dog" ,"cowbell" ,"cowbell cowbell cowbell" ,"cowbell cowbell cowbel" ,"bcelow" ,"abcdefghijklmnopqrstuvwxyz" ,"cccowwwwbbeeeeelllll" ,"be well, programming puzzles & code golf" ,"lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!" ,`c-c-b-c i have a cow, i have a bell. uh! bell-cow! i have a cow, i have a cowbell. uh! cowbell-cow! bell-cow, cowbell-cow. uh! cow-cowbell-bell-cow. cow-cowbell-bell-cow! `].forEach(x=>console.log(x+'\n\n'+f(x))) <!-- end snippet -->