Created
February 24, 2020 14:25
-
-
Save greenlikeorange/82b399e78811606355128d99251d9266 to your computer and use it in GitHub Desktop.
JS Bin // source https://jsbin.com/necires
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8"> | |
<meta name="viewport" content="width=device-width"> | |
<title>JS Bin</title> | |
<style id="jsbin-css"> | |
body { | |
padding: 25px; | |
} | |
textarea { | |
width: 100%; | |
height: 300px; | |
font-size: 14px; | |
font-family: monospace | |
} | |
#resetData { | |
float: right; | |
} | |
</style> | |
</head> | |
<body> | |
<textarea name="data" id="dataTable" cols="30" rows="10"></textarea> | |
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script> | |
<table id="dataRefTable"></table> | |
<button id="addSampleData">Add Sample data</button> | |
<button id="confirmData">Confirm Data</button> | |
<button id="resetData">Reset Data</button> | |
<hr> | |
<p id="info"></p> | |
<!-- <label for="prizeCount">Prize Count</label> --> | |
<!-- <input type="number" min="1" max="10" id="prizeCount"> --> | |
<button id="start">SELECT RANDOM 100</button> | |
<textarea disabled="disabled" id="resultTable"></textarea> | |
<script id="jsbin-javascript"> | |
'use strict'; | |
var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })(); | |
(function () { | |
var stage = { | |
data: {}, | |
totalTicket: 0, | |
dataConfrimed: false, | |
lastResult: {} | |
}; | |
var elemIds = 'dataTable dataRefTable addSampleData resetData confirmData prizeCount start resultTable'.split(' '); | |
var elems = elemIds.reduce(function (a, b) { | |
a[b] = document.getElementById(b); | |
return a; | |
}, {}); | |
var fns = {}; | |
fns.addSampleData = function addSampleData() { | |
if (stage.dataConfrimed) return; | |
_.range(250).map(function (i) { | |
return elems.dataTable.value += '#1' + (i + 1 + '').padStart(3, '0') + ', ' + _.random(1, 22) + '\n'; | |
}); | |
}; | |
fns.resetData = function resetData() { | |
elems.dataTable.disabled = false; | |
stage.dataConfrimed = false; | |
stage.data = {}; | |
stage.totalTicket = 0; | |
stage.lastResult = {}; | |
elems.dataTable.value = ''; | |
elems.resultTable.value = ''; | |
}; | |
function _pend(t, n) { | |
var p = arguments.length <= 2 || arguments[2] === undefined ? ' ' : arguments[2]; | |
return (t + '').padEnd(n, p); | |
} | |
function _mtr(data) { | |
var head = arguments.length <= 1 || arguments[1] === undefined ? [11, 6, 5, 7] : arguments[1]; | |
return data.map(function (d, i) { | |
return _pend(d, head[i], ' '); | |
}).join('| ') + '\n'; | |
} | |
function writeRefData() { | |
elems.dataTable.value = ''; | |
elems.dataTable.value += ' | Ticket \n'; | |
elems.dataTable.value += 'Voucher No | Total | Left | Served\n'; | |
elems.dataTable.value += '----------------------------------\n'; | |
var totalLeft = 0; | |
var totalServed = 0; | |
Object.keys(stage.data).sort().forEach(function (vn) { | |
var _stage$data$vn = _slicedToArray(stage.data[vn], 2); | |
var left = _stage$data$vn[0]; | |
var served = _stage$data$vn[1]; | |
var row = _mtr([vn, left.length + served.length, left.length, served.length]); | |
totalLeft += left.length; | |
totalServed += served.length; | |
elems.dataTable.value += row; | |
}); | |
elems.dataTable.value += '----------------------------------\n'; | |
elems.dataTable.value += _mtr(['Total ' + Object.keys(stage.data).length, totalLeft + totalServed, totalLeft, totalServed]); | |
elems.resultTable.value = 'Voucher No | Selected Ticket\n'; | |
Object.keys(stage.lastResult).forEach(function (vn) { | |
elems.resultTable.value += _mtr([vn, stage.lastResult[vn].length], [11]); | |
}); | |
} | |
fns.confirmData = function confirmData() { | |
if (stage.dataConfrimed) return; | |
elems.dataTable.value.split('\n').map(function (row) { | |
return row.trim(); | |
}).filter(function (d) { | |
return !!d; | |
}).map(function (row) { | |
return row.split(','); | |
}).filter(function (row) { | |
return row.length; | |
}).filter(function (_ref) { | |
var _ref2 = _slicedToArray(_ref, 2); | |
var vn = _ref2[0]; | |
var tc = _ref2[1]; | |
return !isNaN(+tc); | |
}).map(function (_ref3) { | |
var _ref32 = _slicedToArray(_ref3, 2); | |
var vn = _ref32[0]; | |
var tc = _ref32[1]; | |
var tcn = +tc; | |
var newTotal = stage.totalTicket + tcn; | |
stage.data[vn] = [_.range(stage.totalTicket, newTotal), []]; | |
stage.totalTicket = newTotal; | |
}); | |
stage.dataConfrimed = true; | |
stage.lastResult = {}; | |
elems.dataTable.disabled = true; | |
elems.dataTable.value = ""; | |
writeRefData(); | |
}; | |
fns.start = function start() { | |
if (!stage.dataConfrimed) { | |
alert('Confirm data first!'); | |
return; | |
} | |
if (!Object.keys(stage.data).length) { | |
alert('Please enter correct data first'); | |
return; | |
} | |
if (stage.totalTicket < 100) { | |
alert('No enough tickets.'); | |
return; | |
} | |
var validTickets = _.values(stage.data).reduce(function (a, _ref4) { | |
var _ref42 = _slicedToArray(_ref4, 1); | |
var left = _ref42[0]; | |
return a.concat(left); | |
}, []); | |
if (validTickets.length < 100) { | |
return alert('No more ticket left'); | |
} | |
var r = _.random(0, validTickets.length - 100); | |
var win = _.shuffle(validTickets).slice(r, r + 100); | |
stage.lastResult = win.map(function (wt) { | |
return [Object.keys(stage.data).filter(function (vn) { | |
return stage.data[vn][0].indexOf(wt) !== -1; | |
}), wt]; | |
}).reduce(function (a, _ref5) { | |
var _ref52 = _slicedToArray(_ref5, 2); | |
var vn = _ref52[0]; | |
var wt = _ref52[1]; | |
if (!a[vn]) { | |
a[vn] = [wt]; | |
} else { | |
a[vn].push(wt); | |
} | |
return a; | |
}, {}); | |
Object.keys(stage.lastResult).forEach(function (vn) { | |
var wts = stage.lastResult[vn]; | |
stage.data[vn][0] = _.pullAll(stage.data[vn][0], wts); | |
stage.data[vn][1] = stage.data[vn][1].concat(wts); | |
// stage.data[vn][0].push(wt); | |
// stage.data[vn][1].push(wt) | |
}); | |
writeRefData(); | |
}; | |
Object.keys(fns).forEach(function (fname) { | |
elems[fname].addEventListener('click', fns[fname], false); | |
}); | |
})(); | |
</script> | |
<script id="jsbin-source-css" type="text/css">body { | |
padding: 25px; | |
} | |
textarea { | |
width: 100%; | |
height: 300px; | |
font-size: 14px; | |
font-family: monospace | |
} | |
#resetData { | |
float: right; | |
}</script> | |
<script id="jsbin-source-javascript" type="text/javascript">(function () { | |
const stage = { | |
data: {}, | |
totalTicket: 0, | |
dataConfrimed: false, | |
lastResult: {}, | |
}; | |
const elemIds = 'dataTable dataRefTable addSampleData resetData confirmData prizeCount start resultTable'.split(' '); | |
const elems = elemIds.reduce((a, b) => { | |
a[b] = document.getElementById(b); | |
return a; | |
}, {}); | |
const fns = {}; | |
fns.addSampleData = function addSampleData() { | |
if (stage.dataConfrimed) return; | |
_.range(250).map((i) => { | |
return elems.dataTable.value += `#1${(i+1+'').padStart(3, '0')}, ${_.random(1,22)}\n`; | |
}); | |
} | |
fns.resetData = function resetData() { | |
elems.dataTable.disabled = false; | |
stage.dataConfrimed = false; | |
stage.data = {}; | |
stage.totalTicket = 0; | |
stage.lastResult = {}; | |
elems.dataTable.value = ''; | |
elems.resultTable.value = ''; | |
} | |
function _pend(t, n, p = ' ') { | |
return (t + '').padEnd(n, p); | |
} | |
function _mtr(data, head = [11,6,5,7]) { | |
return data.map((d, i) => _pend(d, head[i], ' ')).join('| ') + '\n'; | |
} | |
function writeRefData() { | |
elems.dataTable.value = ''; | |
elems.dataTable.value += ' | Ticket \n' | |
elems.dataTable.value += 'Voucher No | Total | Left | Served\n'; | |
elems.dataTable.value += '----------------------------------\n'; | |
let totalLeft = 0; | |
let totalServed = 0; | |
Object.keys(stage.data).sort().forEach((vn) => { | |
const [left, served] = stage.data[vn]; | |
const row = _mtr([ | |
vn, | |
left.length + served.length, | |
left.length, | |
served.length | |
]) | |
totalLeft += left.length; | |
totalServed += served.length; | |
elems.dataTable.value += row; | |
}); | |
elems.dataTable.value += '----------------------------------\n'; | |
elems.dataTable.value += _mtr([ | |
`Total ${Object.keys(stage.data).length}`, | |
totalLeft + totalServed, | |
totalLeft, | |
totalServed, | |
]); | |
elems.resultTable.value = 'Voucher No | Selected Ticket\n' | |
Object.keys(stage.lastResult).forEach((vn) => { | |
elems.resultTable.value += _mtr([vn, stage.lastResult[vn].length], [11]) | |
}) | |
} | |
fns.confirmData = function confirmData() { | |
if (stage.dataConfrimed) return; | |
elems.dataTable.value.split('\n') | |
.map(row => row.trim()) | |
.filter(d => !!d) | |
.map((row) => row.split(',')) | |
.filter((row) => row.length) | |
.filter(([vn, tc]) => !isNaN(+tc)) | |
.map(([vn, tc]) => { | |
const tcn = +tc; | |
const newTotal = stage.totalTicket + tcn; | |
stage.data[vn] = [ | |
_.range(stage.totalTicket, newTotal), [] | |
] | |
stage.totalTicket = newTotal; | |
}) | |
stage.dataConfrimed = true; | |
stage.lastResult = {}; | |
elems.dataTable.disabled = true; | |
elems.dataTable.value = ""; | |
writeRefData() | |
} | |
fns.start = function start() { | |
if (!stage.dataConfrimed) { | |
alert('Confirm data first!'); | |
return; | |
} | |
if (!Object.keys(stage.data).length) { | |
alert('Please enter correct data first'); | |
return; | |
} | |
if (stage.totalTicket < 100) { | |
alert('No enough tickets.'); | |
return; | |
} | |
const validTickets = _.values(stage.data) | |
.reduce((a, [left]) => a.concat(left), []); | |
if (validTickets.length < 100) { | |
return alert('No more ticket left'); | |
} | |
const r = _.random(0, validTickets.length -100); | |
const win = _.shuffle(validTickets).slice( | |
r, | |
r+100, | |
); | |
stage.lastResult = win.map((wt) => { | |
return [Object.keys(stage.data).filter((vn) => { | |
return stage.data[vn][0].indexOf(wt) !== -1; | |
}), wt]; | |
}).reduce((a, [vn, wt]) => { | |
if (!a[vn]) { | |
a[vn] = [wt] | |
} else { | |
a[vn].push(wt); | |
} | |
return a; | |
}, {}); | |
Object.keys(stage.lastResult).forEach((vn) => { | |
const wts = stage.lastResult[vn]; | |
stage.data[vn][0] = _.pullAll(stage.data[vn][0], wts); | |
stage.data[vn][1] = stage.data[vn][1].concat(wts); | |
// stage.data[vn][0].push(wt); | |
// stage.data[vn][1].push(wt) | |
}) | |
writeRefData(); | |
} | |
Object.keys(fns).forEach((fname) => { | |
elems[fname].addEventListener('click', fns[fname], false); | |
}); | |
}());</script></body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
body { | |
padding: 25px; | |
} | |
textarea { | |
width: 100%; | |
height: 300px; | |
font-size: 14px; | |
font-family: monospace | |
} | |
#resetData { | |
float: right; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })(); | |
(function () { | |
var stage = { | |
data: {}, | |
totalTicket: 0, | |
dataConfrimed: false, | |
lastResult: {} | |
}; | |
var elemIds = 'dataTable dataRefTable addSampleData resetData confirmData prizeCount start resultTable'.split(' '); | |
var elems = elemIds.reduce(function (a, b) { | |
a[b] = document.getElementById(b); | |
return a; | |
}, {}); | |
var fns = {}; | |
fns.addSampleData = function addSampleData() { | |
if (stage.dataConfrimed) return; | |
_.range(250).map(function (i) { | |
return elems.dataTable.value += '#1' + (i + 1 + '').padStart(3, '0') + ', ' + _.random(1, 22) + '\n'; | |
}); | |
}; | |
fns.resetData = function resetData() { | |
elems.dataTable.disabled = false; | |
stage.dataConfrimed = false; | |
stage.data = {}; | |
stage.totalTicket = 0; | |
stage.lastResult = {}; | |
elems.dataTable.value = ''; | |
elems.resultTable.value = ''; | |
}; | |
function _pend(t, n) { | |
var p = arguments.length <= 2 || arguments[2] === undefined ? ' ' : arguments[2]; | |
return (t + '').padEnd(n, p); | |
} | |
function _mtr(data) { | |
var head = arguments.length <= 1 || arguments[1] === undefined ? [11, 6, 5, 7] : arguments[1]; | |
return data.map(function (d, i) { | |
return _pend(d, head[i], ' '); | |
}).join('| ') + '\n'; | |
} | |
function writeRefData() { | |
elems.dataTable.value = ''; | |
elems.dataTable.value += ' | Ticket \n'; | |
elems.dataTable.value += 'Voucher No | Total | Left | Served\n'; | |
elems.dataTable.value += '----------------------------------\n'; | |
var totalLeft = 0; | |
var totalServed = 0; | |
Object.keys(stage.data).sort().forEach(function (vn) { | |
var _stage$data$vn = _slicedToArray(stage.data[vn], 2); | |
var left = _stage$data$vn[0]; | |
var served = _stage$data$vn[1]; | |
var row = _mtr([vn, left.length + served.length, left.length, served.length]); | |
totalLeft += left.length; | |
totalServed += served.length; | |
elems.dataTable.value += row; | |
}); | |
elems.dataTable.value += '----------------------------------\n'; | |
elems.dataTable.value += _mtr(['Total ' + Object.keys(stage.data).length, totalLeft + totalServed, totalLeft, totalServed]); | |
elems.resultTable.value = 'Voucher No | Selected Ticket\n'; | |
Object.keys(stage.lastResult).forEach(function (vn) { | |
elems.resultTable.value += _mtr([vn, stage.lastResult[vn].length], [11]); | |
}); | |
} | |
fns.confirmData = function confirmData() { | |
if (stage.dataConfrimed) return; | |
elems.dataTable.value.split('\n').map(function (row) { | |
return row.trim(); | |
}).filter(function (d) { | |
return !!d; | |
}).map(function (row) { | |
return row.split(','); | |
}).filter(function (row) { | |
return row.length; | |
}).filter(function (_ref) { | |
var _ref2 = _slicedToArray(_ref, 2); | |
var vn = _ref2[0]; | |
var tc = _ref2[1]; | |
return !isNaN(+tc); | |
}).map(function (_ref3) { | |
var _ref32 = _slicedToArray(_ref3, 2); | |
var vn = _ref32[0]; | |
var tc = _ref32[1]; | |
var tcn = +tc; | |
var newTotal = stage.totalTicket + tcn; | |
stage.data[vn] = [_.range(stage.totalTicket, newTotal), []]; | |
stage.totalTicket = newTotal; | |
}); | |
stage.dataConfrimed = true; | |
stage.lastResult = {}; | |
elems.dataTable.disabled = true; | |
elems.dataTable.value = ""; | |
writeRefData(); | |
}; | |
fns.start = function start() { | |
if (!stage.dataConfrimed) { | |
alert('Confirm data first!'); | |
return; | |
} | |
if (!Object.keys(stage.data).length) { | |
alert('Please enter correct data first'); | |
return; | |
} | |
if (stage.totalTicket < 100) { | |
alert('No enough tickets.'); | |
return; | |
} | |
var validTickets = _.values(stage.data).reduce(function (a, _ref4) { | |
var _ref42 = _slicedToArray(_ref4, 1); | |
var left = _ref42[0]; | |
return a.concat(left); | |
}, []); | |
if (validTickets.length < 100) { | |
return alert('No more ticket left'); | |
} | |
var r = _.random(0, validTickets.length - 100); | |
var win = _.shuffle(validTickets).slice(r, r + 100); | |
stage.lastResult = win.map(function (wt) { | |
return [Object.keys(stage.data).filter(function (vn) { | |
return stage.data[vn][0].indexOf(wt) !== -1; | |
}), wt]; | |
}).reduce(function (a, _ref5) { | |
var _ref52 = _slicedToArray(_ref5, 2); | |
var vn = _ref52[0]; | |
var wt = _ref52[1]; | |
if (!a[vn]) { | |
a[vn] = [wt]; | |
} else { | |
a[vn].push(wt); | |
} | |
return a; | |
}, {}); | |
Object.keys(stage.lastResult).forEach(function (vn) { | |
var wts = stage.lastResult[vn]; | |
stage.data[vn][0] = _.pullAll(stage.data[vn][0], wts); | |
stage.data[vn][1] = stage.data[vn][1].concat(wts); | |
// stage.data[vn][0].push(wt); | |
// stage.data[vn][1].push(wt) | |
}); | |
writeRefData(); | |
}; | |
Object.keys(fns).forEach(function (fname) { | |
elems[fname].addEventListener('click', fns[fname], false); | |
}); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment