diff --git a/39 Golf/javascript/golf.html b/39 Golf/javascript/golf.html
new file mode 100644
index 00000000..bf43de8e
--- /dev/null
+++ b/39 Golf/javascript/golf.html
@@ -0,0 +1,9 @@
+
+
+GOLF
+
+
+
+
+
+
diff --git a/39 Golf/javascript/golf.js b/39 Golf/javascript/golf.js
new file mode 100644
index 00000000..814d589e
--- /dev/null
+++ b/39 Golf/javascript/golf.js
@@ -0,0 +1,369 @@
+// GOLF
+//
+// Converted from BASIC to Javascript by Oscar Toledo G. (nanochess)
+//
+
+function print(str)
+{
+ document.getElementById("output").appendChild(document.createTextNode(str));
+}
+
+function input()
+{
+ var input_element;
+ var input_str;
+
+ return new Promise(function (resolve) {
+ input_element = document.createElement("INPUT");
+
+ print("? ");
+ input_element.setAttribute("type", "text");
+ input_element.setAttribute("length", "50");
+ document.getElementById("output").appendChild(input_element);
+ input_element.focus();
+ input_str = undefined;
+ input_element.addEventListener("keydown", function (event) {
+ if (event.keyCode == 13) {
+ input_str = input_element.value;
+ document.getElementById("output").removeChild(input_element);
+ print(input_str);
+ print("\n");
+ resolve(input_str);
+ }
+ });
+ });
+}
+
+function tab(space)
+{
+ var str = "";
+ while (space-- > 0)
+ str += " ";
+ return str;
+}
+
+var la = [];
+var f;
+var s1;
+var g2;
+var g3;
+var x;
+
+var hole_data = [
+ 361,4,4,2,389,4,3,3,206,3,4,2,500,5,7,2,
+ 408,4,2,4,359,4,6,4,424,4,4,2,388,4,4,4,
+ 196,3,7,2,400,4,7,2,560,5,7,2,132,3,2,2,
+ 357,4,4,4,294,4,2,4,475,5,2,3,375,4,4,2,
+ 180,3,6,2,550,5,6,6,
+];
+
+function show_obstacle()
+{
+ switch (la[x]) {
+ case 1:
+ print("FAIRWAY.\n");
+ break;
+ case 2:
+ print("ROUGH.\n");
+ break;
+ case 3:
+ print("TREES.\n");
+ break;
+ case 4:
+ print("ADJACENT FAIRWAY.\n");
+ break;
+ case 5:
+ print("TRAP.\n");
+ break;
+ case 6:
+ print("WATER.\n");
+ break;
+ }
+}
+
+function show_score()
+{
+ g2 += s1;
+ print("TOTAL PAR FOR " + (f - 1) + " HOLES IS " + g3 + " YOUR TOTAL IS " + g2 + "\n");
+}
+
+// Main program
+async function main()
+{
+ print(tab(34) + "GOLF\n");
+ print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n");
+ print("\n");
+ print("\n");
+ print("\n");
+ print("WELCOME TO THE CREATIVE COMPUTING COUNTRY CLUB,\n");
+ print("AN EIGHTEEN HOLE CHAMPIONSHIP LAYOUT LOCATED A SHORT\n");
+ print("DISTANCE FROM SCENIC DOWNTOWN MORRISTOWN. THE\n");
+ print("COMMENTATOR WILL EXPLAIN THE GAME AS YOU PLAY.\n");
+ print("ENJOY YOUR GAME; SEE YOU AT THE 19TH HOLE...\n");
+ print("\n");
+ print("\n");
+ next_hole = 0;
+ g1 = 18;
+ g2 = 0;
+ g3 = 0;
+ a = 0;
+ n = 0.8;
+ s2 = 0;
+ f = 1;
+ while (1) {
+ print("WHAT IS YOUR HANDICAP");
+ h = parseInt(await input());
+ print("\n");
+ if (h < 0 || h > 30) {
+ print("PGA HANDICAPS RANGE FROM 0 TO 30.\n");
+ } else {
+ break;
+ }
+ }
+ do {
+ print("DIFFICULTIES AT GOLF INCLUDE:\n");
+ print("0=HOOK, 1=SLICE, 2=POOR DISTANCE, 4=TRAP SHOTS, 5=PUTTING\n");
+ print("WHICH ONE (ONLY ONE) IS YOUR WORST");
+ t = parseInt(await input());
+ print("\n");
+ } while (t > 5) ;
+ s1 = 0;
+ first_routine = true;
+ while (1) {
+ if (first_routine) {
+ la[0] = 0;
+ j = 0;
+ q = 0;
+ s2++;
+ k = 0;
+ if (f != 1) {
+ print("YOUR SCORE ON HOLE " + (f - 1) + " WAS " + s1 + "\n");
+ show_score();
+ if (g1 == f - 1) // Completed all holes?
+ return; // Exit game
+ if (s1 > p + 2) {
+ print("KEEP YOUR HEAD DOWN.\n");
+ } else if (s1 == p) {
+ print("A PAR. NICE GOING.\n");
+ } else if (s1 == p - 1) {
+ print("A BIRDIE.\n");
+ } else if (s1 == p - 2) {
+ if (p != 3)
+ print("A GREAT BIG EAGLE.\n");
+ else
+ print("A HOLE IN ONE.\n");
+ }
+ }
+ if (f == 19) {
+ print("\n");
+ show_score();
+ if (g1 == f - 1)
+ return;
+ }
+ s1 = 0;
+ print("\n");
+ if (s1 != 0 && la[0] < 1)
+ la[0] = 1;
+ }
+ if (s1 == 0) {
+ d = hole_data[next_hole++];
+ p = hole_data[next_hole++];
+ la[1] = hole_data[next_hole++];
+ la[2] = hole_data[next_hole++];
+ print("\n");
+ print("YOU ARE AT THE TEE OFF HOLE " + f + " DISTANCE " + d + " YARDS, PAR " + p + "\n");
+ g3 += p;
+ print("ON YOUR RIGHT IS ");
+ x = 1;
+ show_obstacle();
+ print("ON YOUR LEFT IS ");
+ x = 2
+ show_obstacle();
+ } else {
+ x = 0;
+ if (la[0] > 5) {
+ if (la[0] > 6) {
+ print("YOUR SHOT WENT OUT OF BOUNDS.\n");
+ } else {
+ print("YOUR SHOT WENT INTO THE WATER.\n");
+ }
+ s1++;
+ print("PENALTY STROKE ASSESSED. HIT FROM PREVIOUS LOCATION.\n");
+ j++;
+ la[0] = 1;
+ d = b;
+ } else {
+ print("SHOT WENT " + d1 + " YARDS. IT'S " + d2 + " YARDS FROM THE CUP.\n");
+ print("BALL IS " + Math.floor(o) + " YARDS OFF LINE... IN ");
+ show_obstacle();
+ }
+ }
+
+ while (1) {
+ if (a != 1) {
+ print("SELECTION OF CLUBS\n");
+ print("YARDAGE DESIRED SUGGESTED CLUBS\n");
+ print("200 TO 280 YARDS 1 TO 4\n");
+ print("100 TO 200 YARDS 19 TO 13\n");
+ print(" 0 TO 100 YARDS 29 TO 23\n");
+ a = 1;
+ }
+ print("WHAT CLUB DO YOU CHOOSE");
+ c = parseInt(await input());
+ print("\n");
+ if (c >= 1 && c <= 29 && (c < 5 || c >= 12)) {
+ if (c > 4)
+ c -= 6;
+ if (la[0] <= 5 || c == 14 || c == 23) {
+ s1++;
+ w = 1;
+ if (c <= 13) {
+ if (f % 3 == 0 && s2 + q + (10 * (f - 1) / 18) < (f - 1) * (72 + ((h + 1) / 0.85)) / 18) {
+ q++;
+ if (s1 % 2 != 0 && d >= 95) {
+ print("BALL HIT TREE - BOUNCED INTO ROUGH " + (d - 75) + " YARDS FROM HOLE.\n");
+ d -= 75;
+ continue;
+ }
+ print("YOU DUBBED IT.\n");
+ d1 = 35;
+ second_routine = 1;
+ break;
+ } else if (c < 4 && la[0] == 2) {
+ print("YOU DUBBED IT.\n");
+ d1 = 35;
+ second_routine = 1;
+ break;
+ } else {
+ second_routine = 0;
+ break;
+ }
+ } else {
+ print("NOW GAUGE YOUR DISTANCE BY A PERCENTAGE (1 TO 100)\n");
+ print("OF A FULL SWING");
+ w = parseInt(await input());
+ w /= 100;
+ print("\n");
+ if (w <= 1) {
+ if (la[0] == 5) {
+ if (t == 3) {
+ if (Math.random() <= n) {
+ n *= 0.2;
+ print("SHOT DUBBED, STILL IN TRAP.\n");
+ continue;
+ }
+ n = 0.8;
+ }
+ d2 = 1 + (3 * Math.floor((80 / (40 - h)) * Math.random()));
+ second_routine = 2;
+ break;
+ }
+ if (c != 14)
+ c -= 10;
+ second_routine = 0;
+ break;
+ }
+ s1--;
+ // Fall through to THAT CLUB IS NOT IN THE BAG.
+ }
+ }
+ }
+ print("THAT CLUB IS NOT IN THE BAG.\n");
+ print("\n");
+ }
+ if (second_routine == 0) {
+ if (s1 > 7 && d < 200) {
+ d2 = 1 + (3 * Math.floor((80 / (40 - h)) * Math.random()));
+ second_routine = 2;
+ } else {
+ d1 = Math.floor(((30 - h) * 2.5 + 187 - ((30 - h) * 0.25 + 15) * c / 2) + 25 * Math.random());
+ d1 = Math.floor(d1 * w);
+ if (t == 2)
+ d1 = Math.floor(d1 * 0.85);
+ }
+ }
+ if (second_routine <= 1) {
+ o = (Math.random() / 0.8) * (2 * h + 16) * Math.abs(Math.tan(d1 * 0.0035));
+ d2 = Math.floor(Math.sqrt(Math.pow(o, 2) + Math.pow(Math.abs(d - d1), 2)));
+ if (d - d1 < 0) {
+ if (d2 >= 20)
+ print("TOO MUCH CLUB, YOU'RE PAST THE HOLE.\n");
+ }
+ b = d;
+ d = d2;
+ if (d2 > 27) {
+ if (o < 30 || j > 0) {
+ la[0] = 1;
+ } else {
+ if (t <= 0) {
+ s9 = (s2 + 1) / 15;
+ if (Math.floor(s9) == s9) {
+ print("YOU SLICED- ");
+ la[0] = la[1];
+ } else {
+ print("YOU HOOKED- ");
+ la[0] = la[2];
+ }
+ } else {
+ s9 = (s2 + 1) / 15;
+ if (Math.floor(s9) == s9) {
+ print("YOU HOOKED- ");
+ la[0] = la[2];
+ } else {
+ print("YOU SLICED- ");
+ la[0] = la[1];
+ }
+ }
+ if (o > 45)
+ print("BADLY.\n");
+ }
+ first_routine = false;
+ } else if (d2 > 20) {
+ la[0] = 5;
+ first_routine = false;
+ } else if (d2 > 0.5) {
+ la[0] = 8;
+ d2 = Math.floor(d2 * 3);
+ second_routine = 2;
+ } else {
+ la[0] = 9;
+ print("YOU HOLED IT.\n");
+ print("\n");
+ f++;
+ first_routine = true;
+ }
+ }
+ if (second_routine == 2) {
+ while (1) {
+ print("ON GREEN, " + d2 + " FEET FROM THE PIN.\n");
+ print("CHOOSE YOUR PUTT POTENCY (1 TO 13):");
+ i = parseInt(await input());
+ s1++;
+ if (s1 + 1 - p <= (h * 0.072) + 2 && k <= 2) {
+ k++;
+ if (t == 4)
+ d2 -= i * (4 + 1 * Math.random()) + 1;
+ else
+ d2 -= i * (4 + 2 * Math.random()) + 1.5;
+ if (d2 < -2) {
+ print("PASSED BY CUP.\n");
+ d2 = Math.floor(-d2);
+ continue;
+ }
+ if (d2 > 2) {
+ print("PUTT SHORT.\n");
+ d2 = Math.floor(d2);
+ continue;
+ }
+ }
+ print("YOU HOLED IT.\n");
+ print("\n");
+ f++;
+ break;
+ }
+ first_routine = true;
+ }
+ }
+}
+
+main();