feat(interview-prep): Fractran (#17328)
This commit is contained in:
committed by
Kristofer Koishigawa
parent
993fd01fde
commit
1478f4c1ed
@ -3588,6 +3588,83 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Fractran",
|
||||
"description": [
|
||||
"<div class=\"rosetta\"><p class=\"rosetta__paragraph\"><span class=\"rosetta__text--bold\"><a class=\"rosetta__link--wiki\" href=\"https://en.wikipedia.org/wiki/FRACTRAN\" title=\"wp: FRACTRAN\">FRACTRAN</a></span> is a Turing-complete esoteric programming language invented by the mathematician <a class=\"rosetta__link--wiki\" href=\"https://en.wikipedia.org/wiki/John Horton Conway\" title=\"wp: John Horton Conway\">John Horton Conway</a>.</p><br/><p class=\"rosetta__paragraph\">A FRACTRAN program is an ordered list of positive fractions $P = (f_1, f_2, \\ldots, f_m)$, together with an initial positive integer input $n$.</p>",
|
||||
"<br/><p class=\"rosetta__paragraph\">The program is run by updating the integer $n$ as follows:</p><br/><ul class=\"rosetta__unordered-list\"><li class=\"rosetta__list-item--unordered\">for the first fraction, $f_i$, in the list for which $nf_i$ is an integer, replace $n$ with $nf_i$ ;</li>",
|
||||
"<li class=\"rosetta__list-item--unordered\">repeat this rule until no fraction in the list produces an integer when multiplied by $n$, then halt.</li></ul>",
|
||||
"<br>",
|
||||
"<p class=\"rosetta__paragraph\">Conway gave a program for primes in FRACTRAN:</p><br/><p class=\"rosetta__paragraph\"><span class=\"rosetta__text--indented\"> $17/91$, $78/85$, $19/51$, $23/38$, $29/33$, $77/29$, $95/23$, $77/19$, $1/17$, $11/13$, $13/11$, $15/14$, $15/2$, $55/1$</span></p><br/><p class=\"rosetta__paragraph\">Starting with $n=2$, this FRACTRAN program will change $n$ to $15=2\\times (15/2)$, then $825=15\\times (55/1)$, generating the following sequence of integers:</p><br/><p class=\"rosetta__paragraph\"><span class=\"rosetta__text--indented\"> $2$, $15$, $825$, $725$, $1925$, $2275$, $425$, $390$, $330$, $290$, $770$, $\\ldots$</span></p><br/><p class=\"rosetta__paragraph\">After 2, this sequence contains the following powers of 2:</p><br/><p class=\"rosetta__paragraph\"><span class=\"rosetta__text--indented\">$2^2=4$, $2^3=8$, $2^5=32$, $2^7=128$, $2^{11}=2048$, $2^{13}=8192$, $2^{17}=131072$, $2^{19}=524288$, $\\ldots$</span></p><br/><p class=\"rosetta__paragraph\">which are the prime powers of 2.</p>",
|
||||
"<br/><dl class=\"rosetta__description-list\"><dt class=\"rosetta__description-title\">Task:</dt></dl>",
|
||||
"<p class=\"rosetta__paragraph\">Write a function that takes a fractran program as a string parameter and returns the first 10 numbers of the program as an array. If the result does not have 10 numbers then return the numbers as is.</p></div>"
|
||||
],
|
||||
"solutions": [
|
||||
"function fractran(progStr){\n var num = new Array();\n var den = new Array();\n var val ;\n var out=\"\";\n function compile(prog){\n var regex = /\\s*(\\d*)\\s*\\/\\s*(\\d*)\\s*(.*)/m;\n while(regex.test(prog)){\n num.push(regex.exec(prog)[1]);\n den.push(regex.exec(prog)[2]);\n prog = regex.exec(prog)[3];\n }\n }\n\n function step(val){\n var i=0;\n while(i<den.length && val%den[i] != 0) i++;\n return num[i]*val/den[i];\n }\n\n var seq=[]\n\n function exec(val){\n var i = 0;\n while(val && i<limit){\n seq.push(val)\n val = step(val);\n i ++;\n }\n }\n\n // Main\n compile(progStr);\n var limit = 10;\n exec(2);\n return seq;\n}\n"
|
||||
],
|
||||
"tests": [
|
||||
{
|
||||
"text": "<code>fractran</code> should be a function.",
|
||||
"testString": "assert(typeof fractran=='function','<code>fractran</code> should be a function.');"
|
||||
},
|
||||
{
|
||||
"text": "<code>fractran(\"'+tests[0]+'\")</code> should return an array.",
|
||||
"testString": "assert(Array.isArray(fractran(tests[0])),'<code>fractran(\"'+tests[0]+'\")</code> should return an array.');"
|
||||
},
|
||||
{
|
||||
"text": "<code>fractran(\"'+tests[0]+'\")</code> should return <code>'+JSON.stringify(results[0])+'</code>.",
|
||||
"testString": "assert.deepEqual(fractran(tests[0]),results[0],'<code>fractran(\"'+tests[0]+'\")</code> should return <code>'+JSON.stringify(results[0])+'</code>.');"
|
||||
},
|
||||
{
|
||||
"text": "<code>fractran(\"'+tests[1]+'\")</code> should return <code>'+JSON.stringify(results[1])+'</code>.",
|
||||
"testString": "assert.deepEqual(fractran(tests[1]),results[1],'<code>fractran(\"'+tests[1]+'\")</code> should return <code>'+JSON.stringify(results[1])+'</code>.');"
|
||||
},
|
||||
{
|
||||
"text": "<code>fractran(\"'+tests[2]+'\")</code> should return <code>'+JSON.stringify(results[2])+'</code>.",
|
||||
"testString": "assert.deepEqual(fractran(tests[2]),results[2],'<code>fractran(\"'+tests[2]+'\")</code> should return <code>'+JSON.stringify(results[2])+'</code>.');"
|
||||
},
|
||||
{
|
||||
"text": "<code>fractran(\"'+tests[3]+'\")</code> should return <code>'+JSON.stringify(results[3])+'</code>.",
|
||||
"testString": "assert.deepEqual(fractran(tests[3]),results[3],'<code>fractran(\"'+tests[3]+'\")</code> should return <code>'+JSON.stringify(results[3])+'</code>.');"
|
||||
},
|
||||
{
|
||||
"text": "<code>fractran(\"'+tests[4]+'\")</code> should return <code>'+JSON.stringify(results[4])+'</code>.",
|
||||
"testString": "assert.deepEqual(fractran(tests[4]),results[4],'<code>fractran(\"'+tests[4]+'\")</code> should return <code>'+JSON.stringify(results[4])+'</code>.');"
|
||||
}
|
||||
],
|
||||
"id": "5a7dad05be01840e1778a0d1",
|
||||
"challengeType": "3",
|
||||
"releasedOn": "May 31, 2018",
|
||||
"files": {
|
||||
"indexjs": {
|
||||
"key": "indexjs",
|
||||
"ext": "js",
|
||||
"name": "index",
|
||||
"contents": [
|
||||
"function fractran (progStr) {",
|
||||
" // Good luck!",
|
||||
"}"
|
||||
],
|
||||
"head": [],
|
||||
"tail": [
|
||||
"let tests=[",
|
||||
" '3/2,1/3',",
|
||||
" '3/2,5/3,1/5',",
|
||||
" '3/2,6/3',",
|
||||
" '2/7,7/2',",
|
||||
" '17/91 78/85 19/51 23/38 29/33 77/29 95/23 77/19 1/17 11/13 13/11 15/14 15/2 55/1'",
|
||||
"]",
|
||||
"let results=[",
|
||||
" [ 2, 3, 1 ],",
|
||||
" [ 2, 3, 5, 1 ],",
|
||||
" [ 2, 3, 6, 9, 18, 27, 54, 81, 162, 243 ],",
|
||||
" [ 2, 7, 2, 7, 2, 7, 2, 7, 2, 7 ],",
|
||||
" [ 2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290 ]",
|
||||
"]"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Hailstone sequence",
|
||||
"description": [
|
||||
|
Reference in New Issue
Block a user