aoc day 7

by tpapak

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-beta1/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/2.6.3/cytoscape.js"></script>
<script src="https://cdn.rawgit.com/cpettitt/dagre/v0.7.4/dist/dagre.min.js"></script>
<script src="https://cdn.rawgit.com/cytoscape/cytoscape.js-dagre/1.1.2/cytoscape-dagre.js"></script>
		<div id='inDiv'>
        Paste the text in here:
        <br>
			<textarea id="strings" cols="50" rows="20">lf AND lq -> ls
iu RSHIFT 1 -> jn
bo OR bu -> bv
gj RSHIFT 1 -> hc
et RSHIFT 2 -> eu
bv AND bx -> by
is OR it -> iu
b OR n -> o
gf OR ge -> gg
NOT kt -> ku
ea AND eb -> ed
kl OR kr -> ks
hi AND hk -> hl
au AND av -> ax
lf RSHIFT 2 -> lg
dd RSHIFT 3 -> df
eu AND fa -> fc
df AND dg -> di
ip LSHIFT 15 -> it
NOT el -> em
et OR fe -> ff
fj LSHIFT 15 -> fn
t OR s -> u
ly OR lz -> ma
ko AND kq -> kr
NOT fx -> fy
et RSHIFT 1 -> fm
eu OR fa -> fb
dd RSHIFT 2 -> de
NOT go -> gp
kb AND kd -> ke
hg OR hh -> hi
jm LSHIFT 1 -> kg
NOT cn -> co
jp RSHIFT 2 -> jq
jp RSHIFT 5 -> js
1 AND io -> ip
eo LSHIFT 15 -> es
1 AND jj -> jk
g AND i -> j
ci RSHIFT 3 -> ck
gn AND gp -> gq
fs AND fu -> fv
lj AND ll -> lm
jk LSHIFT 15 -> jo
iu RSHIFT 3 -> iw
NOT ii -> ij
1 AND cc -> cd
bn RSHIFT 3 -> bp
NOT gw -> gx
NOT ft -> fu
jn OR jo -> jp
iv OR jb -> jc
hv OR hu -> hw
19138 -> b
gj RSHIFT 5 -> gm
hq AND hs -> ht
dy RSHIFT 1 -> er
ao OR an -> ap
ld OR le -> lf
bk LSHIFT 1 -> ce
bz AND cb -> cc
bi LSHIFT 15 -> bm
il AND in -> io
af AND ah -> ai
as RSHIFT 1 -> bl
lf RSHIFT 3 -> lh
er OR es -> et
NOT ax -> ay
ci RSHIFT 1 -> db
et AND fe -> fg
lg OR lm -> ln
k AND m -> n
hz RSHIFT 2 -> ia
kh LSHIFT 1 -> lb
NOT ey -> ez
NOT di -> dj
dz OR ef -> eg
lx -> a
NOT iz -> ja
gz LSHIFT 15 -> hd
ce OR cd -> cf
fq AND fr -> ft
at AND az -> bb
ha OR gz -> hb
fp AND fv -> fx
NOT gb -> gc
ia AND ig -> ii
gl OR gm -> gn
0 -> c
NOT ca -> cb
bn RSHIFT 1 -> cg
c LSHIFT 1 -> t
iw OR ix -> iy
kg OR kf -> kh
dy OR ej -> ek
km AND kn -> kp
NOT...

Babel + JSX

function getGraph(ins){
  var nodes = getNodes(ins);
  return nodes;
};

function getNodes(ins){
	var a = ins.split('\n');
  var nodes = a.reduce((nodeList, edg)=>{
    var fncs = ['AND', 'OR', 'LSHIFT', 'RSHIFT', 'NOT'];
    var [left, right] = edg.split(' -> ');
    var anl = [];
    var prevNode = (_.find(nodeList, {name:right}));
    if(!prevNode){
      var nodeObj = {id: right, name:right, sgn:0, cmd:'', ins:[], outs:[]};
      anl.push(nodeObj);
    }else{
      anl.push(prevNode);
    }
    var fnNode='';
    fnNode = fncs.reduce( (acc, fnc) => {
    	if( left.search(fnc) !== -1 ){
      	var fnName = (left+right).replace(/ /g,'');
        acc.name = fnName;
        acc.id = fnName;
        acc.cmd = fnc;
        acc.ins = left.replace(fnc+' ','').split(' ');
        acc.outs.push(right);
      };
      return acc;
    },{id: '', name:'', sgn:0, cmd:'', ins:[], outs:[]});
    if(fnNode.name){
    	// _.head(anl).ins.push(fnNode.name);
       anl.push(fnNode);
    }
    var out = _.reject(nodeList,{name:_.head(anl).name}).concat(anl);
    if(!(isNaN(parseInt(left)))){
      _.find(out, {name:right}).sgn = parseInt(left);
    }else{
      if(!(fnNode.name)){
        _.find(out, {name:right}).ins.push(left);
      }
    }
    return out;
  },[]);
  return nodes;

};

var btn = document.getElementById('btn');
btn.addEventListener('click', process);
function process(){
var inStr = document.getElementById('strings').value;
    var ourNodes = getNodes(inStr);
    var elems = nodesToElements(ourNodes);
    var grph = _.reduce(elems.edges, (acc, edg) => {
      var ed = [edg.data.source, edg.data.target];
      acc.push(ed);
      return acc;
    },[]);
    console.log(grph);
    var sortedNodeIds = topsort(grph);
    var sortedNodes = _.sortBy(elems.nodes, nd => {
      var pos = sortedNodeIds.indexOf(nd.data.id);
      return pos;
    });
    //console.log(sortedNodeIds, sortedNodes);
  var pnds = processNodes(sortedNodes);
  var aNode = _.find(pnds, nd =>...