Team Ai
Apppublic

sanket3280/code-execution

sourceHugging Faceupdated 11mo agoView on Hugging Face
0likes
languageExecutors.js608 linesDownload Raw Back to execution
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