Advertisement
NokiDoki

Petey Pattern RNG Source Code

Feb 4th, 2019
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict'
  2.  
  3. if (!Array.prototype.flatMap)
  4.     Array.prototype.flatMap = function (callback, self) { return this.reduce((acc, x, i, a) => acc.concat(callback.call(self || this, x, i, a)), []) }
  5.  
  6. function stepPattern(p) {
  7.     if (!p || !p.pat || !p.pat.length)  return []
  8.    
  9.     const prev = p.pat[p.pat.length - 2],
  10.         curr = p.pat[p.pat.length - 1],
  11.         nb = neighbors[curr],
  12.         prevNb = nb.findIndex(n => n.node === prev)
  13.    
  14.     if (nb.length === 2 && ~prevNb) {
  15.         const next = nb[0].node === prev ? nb[1] : nb[0]
  16.         return [{pat: p.pat.concat(next.node), time: p.time + next.time, prob: p.prob}]
  17.     }
  18.    
  19.     const baseProb = p.prob / nb.length
  20.    
  21.     return nb.map(({node: n, time: t}, i) => ({
  22.             pat: p.pat.concat(n),
  23.             time: p.time + t,
  24.             prob: n === prev ? 0 : (i === 0 && prevNb === nb.length - 1 || i === nb.length - 1 && ~prevNb)
  25.                 ? baseProb * 2
  26.                 : baseProb
  27.         })).filter(p => p.prob)
  28. }
  29.  
  30. // Timed by Chockrit: https://docs.google.com/spreadsheets/d/1DPyOlO2szc7D3GnhY9RJXwX1j6aM7XgKMhDthwqJE8E/
  31. const neighbors = {
  32.     'N1': [{node: 'S1', time: 5.072}, {node: 'N2', time: 4.771}, {node: 'S8', time: 4.12}, {node: 'S4', time: 5.956}],
  33.     'N2': [{node: 'S5', time: 7.04}, {node: 'S1', time: 5.555}, {node: 'N5', time: 4.838}, {node: 'N1', time: 4.771}],
  34.     'N3': [{node: 'S3', time: 9.926}, {node: 'N5', time: 6.573}, {node: 'S2', time: 3.904}, {node: 'S7', time: 9.909}],
  35.     'N4': [{node: 'S1', time: 9.66}, {node: 'S2', time: 8.709}, {node: 'S8', time: 7.875}, {node: 'N6', time: 6.74}],
  36.     'N5': [{node: 'N3', time: 6.573}, {node: 'S5', time: 6.246}, {node: 'S7', time: 6.923}, {node: 'N2', time: 4.838}],
  37.     'N6': [{node: 'N4', time: 6.74}, {node: 'S3', time: 5.922}],
  38.     'N7': [{node: 'S3', time: 14.381}, {node: 'S7', time: 14.398}], // no data, using S3 <-> S7 instead
  39.     'S1': [{node: 'N1', time: 6.974}, {node: 'S2', time: 7.641}, {node: 'N2', time: 7.457}, {node: 'N4', time: 11.562}],
  40.     'S2': [{node: 'S1', time: 7.958}, {node: 'S3', time: 11.694}, {node: 'N4', time: 10.928}, {node: 'N3', time: 6.123}],
  41.     'S3': [{node: 'S2', time: 11.328}, {node: 'N3', time: 11.779}, {node: 'N6', time: 7.775}, {node: 'N7', time: 3.137}],
  42.     'S4': [{node: 'S5', time: 10.577}, {node: 'N1', time: 7.908}],
  43.     'S5': [{node: 'N5', time: 8.345}, {node: 'N2', time: 9.139}, {node: 'S6', time: 11.341}, {node: 'S4', time: 10.724}],
  44.     'S6': [{node: 'S7', time: 10.043}, {node: 'S5', time: 11.511}],
  45.     'S7': [{node: 'N3', time: 12.008}, {node: 'N5', time: 9.022}, {node: 'N7', time: 3.4}, {node: 'S6', time: 9.873}],
  46.     'S8': [{node: 'N1', time: 6.056}, {node: 'N4', time: 9.811}]
  47. }
  48.  
  49. let patterns = [{pat: ['N1'], time: 0, prob: 1}], completePatterns = []
  50.  
  51. while (patterns.length) {
  52.     [patterns, completePatterns] = patterns.flatMap(stepPattern)
  53.         .reduce(([pending, done], p) => p.pat.some(function (n) { return !(this.cnt -= n.startsWith('S')) }, {cnt: 3}) // if a pattern has at least 3 stops, it's complete
  54.             ? [pending, done.concat(p)]
  55.             : [pending.concat(p), done],
  56.         [[], completePatterns])
  57. }
  58.  
  59. console.table(completePatterns.sort((a, b) => a.time - b.time)
  60.         .map(({pat, prob, time}) => ({pat: pat.join(' '), time: time.toFixed(3), invProb: 1 / prob})))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement