sanket3280/code-execution
0
1/**2 * Language-specific code executors for optimized code evaluation3 */4 5/**6 * JavaScript/Node.js executor7 */8class JavaScriptExecutor {9 static processCode(sourceCode, inputObj) {10 const helperNames = new Set(['ListNode', 'createLinkedList', 'linkedListToArray', 'TreeNode', 'buildBinaryTree', 'binaryTreeToArray', '__Stack', '__Queue', '__Deque', '__MinHeap', '__Trie', '__formatArray', 'formatArray']);11 const matches = [];12 const reList = [13 /function\s+(\w+)\s*\(/g,14 /const\s+(\w+)\s*=\s*\(/g,15 /var\s+(\w+)\s*=\s*function/g,16 /let\s+(\w+)\s*=\s*function/g17 ];18 for (const re of reList) {19 let m; while ((m = re.exec(sourceCode)) !== null) { matches.push(m[1]); }20 }21 const userFunc = matches.find(n => !helperNames.has(n) && !/^__/.test(n)) || null;22 23 if (!userFunc) return { processedSourceCode: sourceCode, usedRunner: false };24 25 let functionCall = this.generateFunctionCall(userFunc, inputObj);26 27 const formatOverride = `28function formatArray(arr) {29 return '[' + arr.join(',') + ']';30}31const originalLog = console.log;32console.log = function(...args) {33 const formatted = args.map(arg => {34 if (Array.isArray(arg)) {35 return formatArray(arg);36 } else if (arg === undefined) {37 return "undefined";38 }39 return arg;40 });41 originalLog.apply(console, formatted);42};43`;44 45 let listHelpers = '';46 if (this.needsLinkedListHelpers(userFunc, sourceCode)) {47 listHelpers = this.getLinkedListHelpers();48 }49 50 return {51 processedSourceCode: listHelpers + formatOverride + sourceCode + '\n\n' + functionCall,52 usedRunner: true53 };54 }55 56 static generateFunctionCall(userFunc, inputObj) {57 const isMergeTwoLists = userFunc === 'mergeTwoLists';58 const isReverseList = userFunc === 'reverseList';59 60 if (isMergeTwoLists) {61 const list1 = inputObj.list1 || [];62 const list2 = inputObj.list2 || [];63 return `64const list1 = createLinkedList(${JSON.stringify(list1)});65const list2 = createLinkedList(${JSON.stringify(list2)});66const resultNode = ${userFunc}(list1, list2);67const result = linkedListToArray(resultNode);68console.log(result);`;69 } else if (isReverseList) {70 const head = inputObj.head || [];71 return `72const head = createLinkedList(${JSON.stringify(head)});73const resultNode = ${userFunc}(head);74const result = linkedListToArray(resultNode);75console.log(result);`;76 } else if (inputObj.s !== undefined && inputObj.t !== undefined) {77 return `const result = ${userFunc}("${inputObj.s}", "${inputObj.t}"); console.log(result);`;78 } else if (inputObj.s !== undefined) {79 if (userFunc.toLowerCase().includes("anagram")) {80 const secondParam = inputObj.t || "nagaram";81 return `const result = ${userFunc}("${inputObj.s}", "${secondParam}"); console.log(result);`;82 } else {83 return `const result = ${userFunc}("${inputObj.s}"); console.log(result);`;84 }85 } else if (inputObj.nums !== undefined && inputObj.target !== undefined) {86 return `const result = ${userFunc}([${inputObj.nums.join(',')}], ${inputObj.target}); console.log(result);`;87 } else if (inputObj.x !== undefined) {88 return `const result = ${userFunc}(${inputObj.x}); console.log(result);`;89 } else if (inputObj.strs !== undefined) {90 let strsArray;91 if (typeof inputObj.strs === 'string') {92 strsArray = inputObj.strs.split(',').map(s => `"${s}"`).join(',');93 } else if (Array.isArray(inputObj.strs)) {94 strsArray = inputObj.strs.map(s => `"${s}"`).join(',');95 } else {96 strsArray = `"${inputObj.strs}"`;97 }98 return `const result = ${userFunc}([${strsArray}]); console.log(result);`;99 } else {100 const firstKey = Object.keys(inputObj)[0];101 const firstValue = inputObj[firstKey];102 if (typeof firstValue === 'string') {103 return `const result = ${userFunc}("${firstValue}"); console.log(result);`;104 } else if (Array.isArray(firstValue)) {105 return `const result = ${userFunc}([${firstValue.join(',')}]); console.log(result);`;106 } else {107 return `const result = ${userFunc}(${firstValue}); console.log(result);`;108 }109 }110 }111 112 static needsLinkedListHelpers(userFunc, sourceCode) {113 return userFunc === 'mergeTwoLists' || userFunc === 'reverseList' || sourceCode.includes('ListNode');114 }115 116 static getLinkedListHelpers() {117 return `118function ListNode(val, next) {119 this.val = (val === undefined ? 0 : val);120 this.next = (next === undefined ? null : next);121}122 123function createLinkedList(arr) {124 if (!arr || arr.length === 0) return null;125 const dummy = new ListNode(0);126 let current = dummy;127 for (let i = 0; i < arr.length; i++) {128 current.next = new ListNode(arr[i]);129 current = current.next;130 }131 return dummy.next;132}133 134function linkedListToArray(head) {135 const result = [];136 let current = head;137 while (current) {138 result.push(current.val);139 current = current.next;140 }141 return result;142}143`;144 }145}146 147/**148 * Python executor149 */150class PythonExecutor {151 static processCode(sourceCode, inputObj) {152 const re = /\bdef\s+(\w+)\s*\(/g;153 const helperNames = new Set(['create_linked_list', 'linked_list_to_array', 'build_binary_tree', 'binary_tree_to_array']);154 let fnName = null; let m;155 while ((m = re.exec(sourceCode)) !== null) {156 const cand = m[1];157 if (!cand.startsWith('__') && !helperNames.has(cand)) { fnName = cand; break; }158 }159 160 if (!fnName) return { processedSourceCode: sourceCode, usedRunner: false };161 162 const toPythonLiteral = (v) => {163 if (Array.isArray(v)) return `[${v.map(toPythonLiteral).join(', ')}]`;164 if (typeof v === 'string') return JSON.stringify(v);165 if (typeof v === 'number') return String(v);166 if (typeof v === 'boolean') return v ? 'True' : 'False';167 return JSON.stringify(v);168 };169 170 let args = this.generateArgs(fnName, inputObj, sourceCode, toPythonLiteral);171 172 const isMergeTwoLists = fnName === 'mergeTwoLists';173 const isReverseList = fnName === 'reverseList';174 let listHelpers = '';175 if (isMergeTwoLists || isReverseList || sourceCode.includes('class ListNode')) {176 listHelpers = this.getLinkedListHelpers();177 }178 179 let pyCall = this.generatePythonCall(fnName, args, inputObj, isMergeTwoLists, isReverseList);180 181 const runner = `\n\n${listHelpers}\n\nif __name__ == "__main__":\n import sys\n try:\n ${pyCall}\n if isinstance(result, list):\n output = '[' + ','.join(map(str, result)) + ']'\n elif isinstance(result, bool):\n output = str(result).lower()\n elif result is None:\n output = '[]'\n else:\n output = str(result)\n print(output, flush=True)\n sys.exit(0)\n except Exception as e:\n print(f"Error: {e}", file=sys.stderr, flush=True)\n sys.exit(1)\n`;182 183 return {184 processedSourceCode: sourceCode + runner,185 usedRunner: true186 };187 }188 189 static generateArgs(fnName, inputObj, sourceCode, toPythonLiteral) {190 try {191 const sigRegex = new RegExp(`def\\s+${fnName}\\s*\\(([^)]*)\\)`);192 const sigMatch = sourceCode.match(sigRegex);193 if (sigMatch) {194 const rawParams = sigMatch[1]195 .split(',')196 .map(p => p.trim())197 .filter(Boolean)198 .map(p => p.replace(/=.*/, ''))199 .map(p => p.replace(/:.*/, ''));200 const paramNames = rawParams.filter(p => p !== 'self');201 202 const pickValueFor = (name) => {203 if (Object.prototype.hasOwnProperty.call(inputObj, name)) return inputObj[name];204 if (name === 's') return inputObj.s ?? inputObj.string ?? inputObj.roman ?? inputObj.x;205 if (name === 't') return inputObj.t ?? inputObj.target;206 if (name === 'x') return inputObj.x ?? inputObj.num;207 if (name === 'nums' || name === 'arr' || name === 'numbers') return inputObj.nums ?? inputObj.arr ?? inputObj.numbers;208 if (name === 'target') return inputObj.target;209 if (name === 'strs' || name === 'strings') return inputObj.strs ?? inputObj.strings;210 const keys = Object.keys(inputObj);211 if (keys.length === 1) return inputObj[keys[0]];212 return null;213 };214 215 const argValues = paramNames.map(n => pickValueFor(n));216 return argValues.map(v => v === null ? 'None' : toPythonLiteral(v)).join(', ');217 } else {218 return this.generateFallbackArgs(inputObj, toPythonLiteral);219 }220 } catch (e) {221 return 'None';222 }223 }224 225 static generateFallbackArgs(inputObj, toPythonLiteral) {226 if (inputObj.s !== undefined && inputObj.t !== undefined) {227 return `${toPythonLiteral(String(inputObj.s))}, ${toPythonLiteral(String(inputObj.t))}`;228 } else if (inputObj.nums !== undefined && inputObj.target !== undefined) {229 return `${toPythonLiteral(inputObj.nums)}, ${toPythonLiteral(inputObj.target)}`;230 } else if (inputObj.s !== undefined) {231 return toPythonLiteral(String(inputObj.s));232 } else if (inputObj.x !== undefined) {233 return toPythonLiteral(inputObj.x);234 } else if (inputObj.strs !== undefined) {235 return toPythonLiteral(inputObj.strs);236 } else {237 const firstKey = Object.keys(inputObj)[0];238 const firstValue = inputObj[firstKey];239 return toPythonLiteral(firstValue);240 }241 }242 243 static generatePythonCall(fnName, args, inputObj, isMergeTwoLists, isReverseList) {244 if (isMergeTwoLists && Array.isArray(inputObj.list1) && Array.isArray(inputObj.list2)) {245 const l1 = JSON.stringify(inputObj.list1);246 const l2 = JSON.stringify(inputObj.list2);247 return `list1 = create_linked_list(${l1})248list2 = create_linked_list(${l2})249result = ${fnName}(list1, list2)250if isinstance(result, ListNode):251 result = linked_list_to_array(result)`;252 } else if (isReverseList && Array.isArray(inputObj.head)) {253 const head = JSON.stringify(inputObj.head);254 return `head = create_linked_list(${head})255result = ${fnName}(head)256if isinstance(result, ListNode):257 result = linked_list_to_array(result)`;258 } else {259 return `result = ${fnName}(${args})`;260 }261 }262 263 static getLinkedListHelpers() {264 return `265if 'ListNode' not in globals():266 class ListNode:267 def __init__(self, val=0, next=None):268 self.val = val269 self.next = next270 def create_linked_list(arr):271 if not arr:272 return None273 head = ListNode(arr[0])274 cur = head275 for i in range(1, len(arr)):276 cur.next = ListNode(arr[i])277 cur = cur.next278 return head279 def linked_list_to_array(head):280 out = []281 cur = head282 while cur:283 out.append(cur.val)284 cur = cur.next285 return out286`;287 }288}289 290/**291 * Java executor292 */293class JavaExecutor {294 static processCode(sourceCode, inputObj) {295 // Check if code already has a main method296 if (sourceCode.includes('public static void main') || sourceCode.includes('class Main')) {297 console.log('โ ๏ธ Java: Code already has main method, skipping wrapper');298 return { processedSourceCode: sourceCode, usedRunner: false };299 }300 301 // Try multiple patterns to find the method302 let methodMatch = sourceCode.match(/class\s+Solution[\s\S]*?public\s+(\w+[\s\<\>\[\]]*\s+)(\w+)\s*\(/);303 304 // If first pattern fails, try simpler pattern305 if (!methodMatch) {306 methodMatch = sourceCode.match(/public\s+(\w+[\s\<\>\[\]]*\s+)(\w+)\s*\([^)]*\)\s*\{/);307 }308 309 if (!methodMatch) {310 console.log('โ ๏ธ Java: No Solution class method found');311 console.log('โ ๏ธ Java source code:', sourceCode.substring(0, 200));312 return { processedSourceCode: sourceCode, usedRunner: false };313 }314 315 const returnTypeStr = methodMatch[1].trim();316 const methodName = methodMatch[2];317 console.log(`โ
Java: Found method ${methodName} with return type ${returnTypeStr}`);318 319 const toJavaLiteral = (v) => {320 if (Array.isArray(v)) return `new int[]{${v.join(',')}}`;321 if (typeof v === 'string') return '"' + v.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';322 if (typeof v === 'number') return String(v);323 if (typeof v === 'boolean') return v ? 'true' : 'false';324 return 'null';325 };326 327 let args = this.generateArgs(methodName, inputObj, toJavaLiteral);328 let resultOutput = this.generateResultOutput(returnTypeStr);329 let listHelpers = this.getLinkedListHelpers(sourceCode, methodName);330 let mainBody = this.generateMainBody(methodName, args, returnTypeStr, resultOutput, inputObj);331 332 let importsNeeded = this.getRequiredImports(sourceCode);333 const mainClass = `\n\n${listHelpers}public class Main {\n public static void main(String[] args) {${mainBody} }\n}\n`;334 335 return {336 processedSourceCode: importsNeeded + sourceCode + mainClass,337 usedRunner: true338 };339 }340 341 static generateArgs(methodName, inputObj, toJavaLiteral) {342 try {343 if (inputObj.s !== undefined && inputObj.t !== undefined) {344 return `${toJavaLiteral(String(inputObj.s))}, ${toJavaLiteral(String(inputObj.t))}`;345 } else if (inputObj.s !== undefined) {346 if (methodName.toLowerCase().includes("anagram")) {347 const secondParam = inputObj.t || "nagaram";348 return `${toJavaLiteral(String(inputObj.s))}, ${toJavaLiteral(String(secondParam))}`;349 } else {350 return toJavaLiteral(String(inputObj.s));351 }352 } else if (inputObj.x !== undefined) {353 return toJavaLiteral(inputObj.x);354 } else if (inputObj.nums !== undefined && inputObj.target !== undefined) {355 return `${toJavaLiteral(inputObj.nums)}, ${toJavaLiteral(inputObj.target)}`;356 } else if (inputObj.strs !== undefined) {357 const arr = Array.isArray(inputObj.strs) ? inputObj.strs : String(inputObj.strs).split(',');358 return `new String[]{${arr.map(s => toJavaLiteral(String(s))).join(',')}}`;359 } else {360 const firstKey = Object.keys(inputObj)[0];361 const firstValue = inputObj[firstKey];362 return toJavaLiteral(firstValue);363 }364 } catch (e) {365 return '';366 }367 }368 369 static generateResultOutput(returnTypeStr) {370 if (returnTypeStr.includes('int[]')) {371 return ` System.out.print("[");372 if (result != null) {373 for (int i = 0; i < result.length; i++) {374 System.out.print(result[i]);375 if (i < result.length - 1) System.out.print(",");376 }377 }378 System.out.println("]");`;379 } else if (returnTypeStr.includes('String[]')) {380 return ` System.out.print("[");381 if (result != null) {382 for (int i = 0; i < result.length; i++) {383 System.out.print("\""+result[i]+"\"");384 if (i < result.length - 1) System.out.print(",");385 }386 }387 System.out.println("]");`;388 } else if (returnTypeStr.includes('List<Integer>') || returnTypeStr.includes('ArrayList<Integer>')) {389 return ` System.out.print("[");390 if (result != null) {391 for (int i = 0; i < result.size(); i++) {392 System.out.print(result.get(i));393 if (i < result.size() - 1) System.out.print(",");394 }395 }396 System.out.println("]");`;397 } else if (returnTypeStr.includes('List<String>') || returnTypeStr.includes('ArrayList<String>')) {398 return ` System.out.print("[");399 if (result != null) {400 for (int i = 0; i < result.size(); i++) {401 System.out.print("\""+result.get(i)+"\"");402 if (i < result.size() - 1) System.out.print(",");403 }404 }405 System.out.println("]");`;406 } else if (returnTypeStr === 'boolean') {407 return ` System.out.println(result ? "true" : "false");`;408 } else if (returnTypeStr === 'void') {409 return ` System.out.println("Done");`;410 } else {411 return ` System.out.println(result);`;412 }413 }414 415 static getLinkedListHelpers(sourceCode, methodName) {416 if (sourceCode.includes("class ListNode") || methodName === 'mergeTwoLists') {417 return `\nclass ListNode { int val; ListNode next; ListNode(){} ListNode(int v){val=v;} ListNode(int v, ListNode n){val=v; next=n;} }\nclass __LL { static ListNode fromArray(int[] a){ if(a==null||a.length==0) return null; ListNode d=new ListNode(0); ListNode c=d; for(int v: a){ c.next=new ListNode(v); c=c.next;} return d.next;} static String toString(ListNode h){ StringBuilder sb=new StringBuilder("["); boolean f=true; while(h!=null){ if(!f) sb.append(','); f=false; sb.append(h.val); h=h.next;} return sb.append(']').toString(); } }\n`;418 }419 return '';420 }421 422 static generateMainBody(methodName, args, returnTypeStr, resultOutput, inputObj) {423 if (methodName === 'mergeTwoLists') {424 const arr1 = (inputObj.list1 && Array.isArray(inputObj.list1)) ? inputObj.list1.join(',') : '';425 const arr2 = (inputObj.list2 && Array.isArray(inputObj.list2)) ? inputObj.list2.join(',') : '';426 return `\n Solution solution = new Solution();\n ListNode l1 = __LL.fromArray(new int[]{${arr1}});\n ListNode l2 = __LL.fromArray(new int[]{${arr2}});\n ListNode result = solution.${methodName}(l1,l2);\n System.out.println(__LL.toString(result));\n`;427 } else if (returnTypeStr === 'void') {428 return `\n Solution solution = new Solution();\n solution.${methodName}(${args});\n${resultOutput}\n`;429 } else {430 return `\n Solution solution = new Solution();\n ${returnTypeStr} result = solution.${methodName}(${args});\n${resultOutput}\n`;431 }432 }433 434 static getRequiredImports(sourceCode) {435 let importsNeeded = '';436 if (!sourceCode.includes('import java.util.')) {437 importsNeeded += 'import java.util.*;\n';438 }439 if (!sourceCode.includes('import java.io.')) {440 importsNeeded += 'import java.io.*;\n';441 }442 return importsNeeded;443 }444}445 446/**447 * C++ executor448 */449class CppExecutor {450 static processCode(sourceCode, inputObj) {451 const functionMatch = sourceCode.match(/(?:vector<int>|vector<string>|int|bool|string|ListNode\*)\s+(\w+)\s*\(/);452 if (!functionMatch) return { processedSourceCode: sourceCode, usedRunner: false };453 454 const functionName = functionMatch[1];455 const returnTypeMatch = sourceCode.match(new RegExp(`(vector<int>|vector<string>|int|bool|string|ListNode\\*)\\s+${functionName}`));456 const returnType = returnTypeMatch ? returnTypeMatch[1] : 'vector<int>';457 458 const toCppLiteral = (v) => {459 if (Array.isArray(v)) return `{${v.join(',')}}`;460 if (typeof v === 'string') return '"' + v.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';461 if (typeof v === 'number') return String(v);462 if (typeof v === 'boolean') return v ? 'true' : 'false';463 return '0';464 };465 466 let args = this.generateArgs(functionName, inputObj, toCppLiteral);467 let outputCode = this.generateOutputCode(returnType);468 let mainFunction = this.generateMainFunction(functionName, args, returnType, outputCode, inputObj);469 let includesNeeded = this.getRequiredIncludes(sourceCode);470 471 let cleanSourceCode = sourceCode;472 const hasMain = /\bint\s+main\s*\(/.test(sourceCode);473 if (hasMain) {474 // Remove all existing main functions more thoroughly475 cleanSourceCode = sourceCode.replace(/\bint\s+main\s*\([^)]*\)\s*\{[\s\S]*?\}/g, '');476 }477 478 return {479 processedSourceCode: includesNeeded + cleanSourceCode + mainFunction,480 usedRunner: true481 };482 }483 484 static generateArgs(functionName, inputObj, toCppLiteral) {485 try {486 if (inputObj.list1 !== undefined && inputObj.list2 !== undefined) {487 const arr1 = Array.isArray(inputObj.list1) ? inputObj.list1 : [];488 const arr2 = Array.isArray(inputObj.list2) ? inputObj.list2 : [];489 const a1Str = arr1.length > 0 ? '{' + arr1.join(',') + '}' : '{}';490 const a2Str = arr2.length > 0 ? '{' + arr2.join(',') + '}' : '{}';491 return `mk(vector<int>${a1Str}), mk(vector<int>${a2Str})`;492 } else if (inputObj.head !== undefined) {493 const head = Array.isArray(inputObj.head) ? inputObj.head : [];494 const headStr = head.length > 0 ? '{' + head.join(',') + '}' : '{}';495 return `mk(vector<int>${headStr})`;496 } else if (inputObj.nums !== undefined && inputObj.target !== undefined) {497 return `vector<int>${toCppLiteral(inputObj.nums)}, ${toCppLiteral(inputObj.target)}`;498 } else if (inputObj.s !== undefined && inputObj.t !== undefined) {499 return `${toCppLiteral(String(inputObj.s))}, ${toCppLiteral(String(inputObj.t))}`;500 } else if (inputObj.s !== undefined) {501 if (functionName.toLowerCase().includes("anagram")) {502 const secondParam = inputObj.t || "nagaram";503 return `${toCppLiteral(String(inputObj.s))}, ${toCppLiteral(String(secondParam))}`;504 } else {505 return toCppLiteral(String(inputObj.s));506 }507 } else if (inputObj.x !== undefined) {508 return toCppLiteral(inputObj.x);509 } else if (inputObj.strs !== undefined) {510 const arr = Array.isArray(inputObj.strs) ? inputObj.strs : String(inputObj.strs).split(',');511 return `vector<string>{${arr.map(s => toCppLiteral(String(s))).join(',')}}`;512 } else {513 const firstKey = Object.keys(inputObj)[0];514 const firstValue = inputObj[firstKey];515 return toCppLiteral(firstValue);516 }517 } catch (e) {518 return '';519 }520 }521 522 static generateOutputCode(returnType) {523 if (returnType === 'vector<int>' || returnType === 'vector<string>') {524 return ` cout << "[";525 for (int i = 0; i < result.size(); i++) {526 cout << result[i];527 if (i < result.size() - 1) cout << ",";528 }529 cout << "]" << endl;`;530 } else if (returnType === 'bool') {531 return ` cout << (result ? "true" : "false") << endl;`;532 } else if (returnType === 'ListNode*') {533 return ` cout << "["; bool f=true; while(result){ if(!f) cout<<","; f=false; cout<<result->val; result=result->next;} cout << "]" << endl;`;534 } else {535 return ` cout << result << endl;`;536 }537 }538 539 static generateMainFunction(functionName, args, returnType, outputCode, inputObj) {540 if (functionName === 'mergeTwoLists') {541 const arr1 = Array.isArray(inputObj.list1) ? inputObj.list1 : [];542 const arr2 = Array.isArray(inputObj.list2) ? inputObj.list2 : [];543 const a1Str = arr1.length > 0 ? '{' + arr1.join(',') + '}' : '{}';544 const a2Str = arr2.length > 0 ? '{' + arr2.join(',') + '}' : '{}';545 return `\n\nint main(){\n std::vector<int> a1 = ${a1Str};\n std::vector<int> a2 = ${a2Str};\n auto mk=[&](const std::vector<int>& a){ ListNode* d=new ListNode(0); ListNode* c=d; for(int v:a){ c->next=new ListNode(v); c=c->next;} return d->next; };\n ListNode* l1=mk(a1); ListNode* l2=mk(a2);\n ListNode* res = ${functionName}(l1,l2);\n std::cout << "["; bool f=true; while(res){ if(!f) std::cout<<","; f=false; std::cout<<res->val; res=res->next;} std::cout << "]\n";\n return 0;\n}\n`;546 } else if (functionName === 'reverseList') {547 const head = Array.isArray(inputObj.head) ? inputObj.head : [];548 const headStr = head.length > 0 ? '{' + head.join(',') + '}' : '{}';549 return `\n\nint main(){\n std::vector<int> a = ${headStr};\n auto mk=[&](const std::vector<int>& a){ ListNode* d=new ListNode(0); ListNode* c=d; for(int v:a){ c->next=new ListNode(v); c=c->next;} return d->next; };\n ListNode* head=mk(a);\n ListNode* res = ${functionName}(head);\n std::cout << "["; bool f=true; while(res){ if(!f) std::cout<<","; f=false; std::cout<<res->val; res=res->next;} std::cout << "]\n";\n return 0;\n}\n`;550 } else if (returnType === 'ListNode*') {551 return `\n\nint main() {\n auto mk=[&](const std::vector<int>& a){ ListNode* d=new ListNode(0); ListNode* c=d; for(int v:a){ c->next=new ListNode(v); c=c->next;} return d->next; };\n ${returnType} result = ${functionName}(${args});\n${outputCode}\n return 0;\n}\n`;552 } else {553 return `\n\nint main() {\n ${returnType} result = ${functionName}(${args});\n${outputCode}\n return 0;\n}\n`;554 }555 }556 557 static getRequiredIncludes(sourceCode) {558 let includesNeeded = '';559 if (!sourceCode.includes('#include <vector>')) includesNeeded += '#include <vector>\n';560 if (!sourceCode.includes('#include <iostream>')) includesNeeded += '#include <iostream>\n';561 if (!sourceCode.includes('#include <string>')) includesNeeded += '#include <string>\n';562 if (!sourceCode.includes('#include <algorithm>')) includesNeeded += '#include <algorithm>\n';563 if (!sourceCode.includes('using namespace std')) includesNeeded += 'using namespace std;\n';564 return includesNeeded;565 }566}567 568/**569 * Language executor factory570 */571class LanguageExecutorFactory {572 static getExecutor(language) {573 switch (language) {574 case 'JAVASCRIPT_NODE':575 return JavaScriptExecutor;576 case 'PYTHON3':577 case 'PYTHON3_8':578 return PythonExecutor;579 case 'JAVA':580 case 'JAVA8':581 case 'JAVA14':582 return JavaExecutor;583 case 'CPP14':584 case 'CPP17':585 case 'C':586 return CppExecutor;587 default:588 return null;589 }590 }591 592 static processCode(sourceCode, language, inputObj) {593 const Executor = this.getExecutor(language);594 if (!Executor) {595 return { processedSourceCode: sourceCode, usedRunner: false };596 }597 return Executor.processCode(sourceCode, inputObj);598 }599}600 601module.exports = {602 JavaScriptExecutor,603 PythonExecutor,604 JavaExecutor,605 CppExecutor,606 LanguageExecutorFactory607};608 