Skip to content

Instantly share code, notes, and snippets.

@kirill578
Created September 23, 2022 21:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kirill578/f52c4d813f091e42d2a233827dc4a706 to your computer and use it in GitHub Desktop.
Save kirill578/f52c4d813f091e42d2a233827dc4a706 to your computer and use it in GitHub Desktop.
var topsort = function (hash) {
let nodes = (Object.values(hash));
let output = [];
let seen = new Set();
nodes.forEach(node => {
if (!seen.has(node)) {
dfs(node, seen, output)
}
})
return output;
}
var dfs = function (node, seen, output) {
seen.add(node)
for(let i=0;i<node.next.length; i++) {
let inner = node.next[i];
if (!seen.has(inner)) {
dfs(inner, seen, output)
}
}
output.unshift(node.value)
}
//let dict = ["ab", "abx", "aby", "c", "cg", "db", "dc", "a"]
let dict = ["a", "bb", "ba"]
// confirm no circles
let rules = new Set()
var dostuff = function(dict) {
console.log(dict)
dict.map((word, i) => {
if (word === '' && i !== 0) {
throw new Error("illegal state")
}
})
console.log(dict)
// console.log(dict)
for (let i=0;i<dict.length;i++) {
let prevLetter = dict[i - 1] != undefined ? dict[i - 1][0] : undefined;
let letter = dict[i] != undefined ? dict[i][0] : undefined;
if (prevLetter !== undefined && letter !== undefined && prevLetter !== letter) {
rules.add(`${prevLetter}${letter}`)
}
}
let inner = Object.values(dict.reduce((acc, word) => {
if (word.length === 0) {
return acc
}
if (acc[word[0]] === undefined) {
acc[word[0]] = [];
}
acc[word[0]].push(word.slice(1))
return acc;
}, {}));
for (let i=0;i<inner.length;i++) {
dostuff(inner[i])
}
}
dostuff(dict)
let entries = Object.fromEntries(Array.from(new Set(dict.join("").split(""))).map(letter => ([letter, { value: letter, next: [] }])))
rules.forEach(rule => {
entries[rule[0]].next.push(entries[rule[1]])
})
// todo check circular dep
var checkCircular = function(entry) {
let visited = new Set();
let _checkCircular = function(entry) {
visited.add(entry)
for(let i=0;i<entry.next.length;i++) {
let edge = entry.next[i];
if (!visited.has(edge)) {
return true;
}
let isCircular = _checkCircular(edge);
if (isCircular) {
return true;
}
}
return false;
}
return _checkCircular(entry);
}
console.log(rules)
Object.values(entries).forEach((item) => {
if (checkCircular(item)) {
throw new Error("circular")
}
})
console.log('---')
console.log(topsort(entries).join(""))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment