Skip to content

Instantly share code, notes, and snippets.

@primaryobjects
Last active September 22, 2016 03:16
[2016-09-21] Challenge #284 [Intermediate] Punch Card Creator
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
</head>
<body>
<div id="output"></div>
</body>
</html>
Hello, world!
________________________________________________________________
/HELLO,WORLD!
12 / OO O
11| OOO OOO O
0| OO
1|
2| O
3| OO O O
4| O
5| O
6| O OO
7|
8| O O O
9| O
|__________________________________________________________________
This is Reddit's r/dailyprogrammer challenge.
________________________________________________________________
/THISISREDDIT'SR/DAILYPROGRAMMERCHALLENGE.
12 / OO O OOOO OOO O O O OOO O OOO
11| O O O OOO O OO O OO O
0| O O O O O O O
1| O O O O
2| O O O
3| O O O O OO O
4| OO O OO
5| O O O OO O
6| O
7| O O O
8| O O O O O
9| O O O O O O O O O
|__________________________________________________________________
WRITE (6,7) FORMAT(13H HELLO, WORLD) STOP END
________________________________________________________________
/WRITE(6,7)FORMAT(13HHELLO,WORLD)STOPEND
12 / O OO O O O OOO O O O
11| O O OOO O OOO OOO O OO O
0| O O O O OO OO
1| O O
2| O
3| O O O OO O O O
4| O O O O
5| OO OO O O O OO
6| O OO O OO O
7| O
8| O O O O OO O O
9| OO O O
|__________________________________________________________________
//
// [2016-09-21] Challenge #284 [Intermediate] Punch Card Creator
// https://www.reddit.com/r/dailyprogrammer/comments/53sw7z/20160921_challenge_284_intermediate_punch_card/
// Demo: https://jsbin.com/sapubiberi/edit?js,output
// Kory Becker http://primaryobjects.com
//
var deck = '';
deck += 'DEC9 &-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ:#@\'="[.<(+^!$*);\\],%_>?\n';
deck += ' ________________________________________________________________ \n';
deck += ' /&-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ:#@\'="[.<(+^!$*);\\],%_>?\n';
deck += '12 / O OOOOOOOOO OOOOOO \n';
deck += '11| O OOOOOOOOO OOOOOO \n';
deck += ' 0| O OOOOOOOOO OOOOOO \n';
deck += ' 1| O O O O \n';
deck += ' 2| O O O O O O O O \n';
deck += ' 3| O O O O O O O O \n';
deck += ' 4| O O O O O O O O \n';
deck += ' 5| O O O O O O O O \n';
deck += ' 6| O O O O O O O O \n';
deck += ' 7| O O O O O O O O \n';
deck += ' 8| O O O O OOOOOOOOOOOOOOOOOOOOOOOO \n';
deck += ' 9| O O O O \n';
deck += ' |__________________________________________________________________ \n';
function initialize(deck) {
// Read string layout and assign to hash.
var deckHash = {};
var rowNum = 0;
deck.split('\n').forEach(function(row) {
// Skip first 2 rows.
if (rowNum > 1) {
if (rowNum == 2) {
// Read characters (keys).
var parts = row.split(/ +\//);
parts[1].split('').forEach(function(char) {
deckHash[char] = [];
});
console.log('Processed ' + Object.keys(deckHash).length + ' instructions.');
}
else {
// Process encodings (values). Start at column 5.
var keys = Object.keys(deckHash);
for (var col=5; col<row.length - 1; col++) {
if (row[col] == 'O') {
deckHash[keys[col - 5]].push(rowNum - 3);
}
}
}
}
rowNum++;
});
return deckHash;
}
function setCharAt(str,index,chr) {
if(index > str.length-1) return str;
return str.substr(0,index) + chr + str.substr(index+1);
}
function encode(text, deck) {
var card = '';
card += ' ________________________________________________________________\n';
card += ' /* \n';
card += '12 / \n';
card += '11| \n';
card += ' 0| \n';
card += ' 1| \n';
card += ' 2| \n';
card += ' 3| \n';
card += ' 4| \n';
card += ' 5| \n';
card += ' 6| \n';
card += ' 7| \n';
card += ' 8| \n';
card += ' 9| \n';
card += ' |__________________________________________________________________\n';
text = text.toUpperCase().replace(/ /g, '');
card = card.replace('*', text);
var rowNum = 0;
card.split('\n').forEach(function(row) {
var origRow = row;
if (rowNum > 1 && rowNum < 14) {
for (var col=0; col<text.length; col++) {
var char = text[col];
deck[char].forEach(function(index) {
if (rowNum - 2 == index) {
row = setCharAt(row, col + 5, 'O');
}
});
}
}
card = card.replace(origRow, row);
rowNum++;
});
return card;
}
// Initialize our deck.
var deckHash = initialize(deck);
// Setup input.
var input = [
'Hello, world!',
'This is Reddit\'s r/dailyprogrammer challenge.',
'WRITE (6,7) FORMAT(13H HELLO, WORLD) STOP END'
];
// Encode a punch card for each input.
input.forEach(function(test) {
var card = encode(test, deckHash);
$('#output').append('<b>' + test + '</b>');
$('#output').append('<pre>' + card + '</pre>');
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment