function FY_sort(list){ let len = list.length; let sel; while(len){ sel = Math.floor(Math.random() * len--); [list[len], list[sel]] = [list[sel], list[len]]; } return list; } function exclusive_pop(list, exclude){ let candidate = list.pop(); if(candidate !== exclude) return candidate; list.unshift(candidate); return list.pop(); } function getchain(list){ let head = list.shift(); let out = head.slice(0); let candidate = null; while((candidate = list.find(x => x[0] === out[out.length-1])) !== undefined){ out.push(candidate[1]); list.splice(list.indexOf(candidate), 1); } return out; } function write_chains(list){ let newlist = list.slice(0); let chains = new Array; while(newlist.length > 0) chains.push(getchain(newlist)); out.value += `\nChains: ${chains.length} / ${list.length}\n\n`; chains.forEach(function(chain){ out.value += chain.join(" -> ") + " -> ...\n\n"; }); } function runit(){ let l1 = names.value.split(","); let l2 = FY_sort(l1.slice(0)); let l3 = new Array; out.value = ""; l1.forEach(function(el){ l3.push([el, exclusive_pop(l2, el)]); }); l3.forEach(function(el){ out.value += el.join(" -> ") + "\n"; }); write_chains(l3); } names.value = "Albert,Julia,Mandelbrot,Alzheimer,Asperger,Wolfgang,Ludwig,Washington,Ivan,Trump"; names.addEventListener("keydown", function(ev){ if(ev.key === "Enter") runit(); });
<input id=names><br><textarea id=out placeholder="Press Enter in the above field to run the generator"></textarea>
textarea{ width:100%; height:500px; } input{ width:100%; }