sanket3280/code-execution
0
1/**2 * Data Structure Serializer3 * Converts complex data structures to language-specific string format4 */5 6class DataStructureSerializer {7 /**8 * Detect the type of data structure9 * @param {any} data - Input data10 * @returns {string} - Type: 'primitive', 'array', 'object', 'graph', 'tree', 'null'11 */12 detectType(data) {13 if (data === null || data === undefined) {14 return 'null';15 }16 17 if (typeof data !== 'object') {18 return 'primitive';19 }20 21 if (Array.isArray(data)) {22 // Check if it's a 2D array23 if (data.length > 0 && Array.isArray(data[0])) {24 return 'array2d';25 }26 return 'array';27 }28 29 // Check if it's a tree node (has val/value and left/right or children)30 if (this.isTreeNode(data)) {31 return 'tree';32 }33 34 // Check if it's a graph (object with numeric/string keys and array values)35 if (this.isGraph(data)) {36 return 'graph';37 }38 39 // Default to object/hash map40 return 'object';41 }42 43 /**44 * Check if data represents a tree node45 */46 isTreeNode(data) {47 if (!data || typeof data !== 'object') return false;48 49 // Binary tree node50 if (('val' in data || 'value' in data) && ('left' in data || 'right' in data)) {51 return true;52 }53 54 // N-ary tree node55 if (('val' in data || 'value' in data) && 'children' in data) {56 return true;57 }58 59 return false;60 }61 62 /**63 * Check if data represents a graph64 */65 isGraph(data) {66 if (!data || typeof data !== 'object' || Array.isArray(data)) return false;67 68 // Check if all values are arrays (adjacency list)69 const values = Object.values(data);70 if (values.length === 0) return false;71 72 return values.every(v => Array.isArray(v));73 }74 75 /**76 * Serialize data to language-specific format77 * @param {any} data - Input data78 * @param {string} language - Target language (JAVASCRIPT_NODE, PYTHON3, JAVA17, CPP14, C)79 * @returns {string} - Serialized string80 */81 serialize(data, language) {82 const type = this.detectType(data);83 const serializer = this.getSerializer(type, language);84 return serializer(data);85 }86 87 /**88 * Deserialize output string to JavaScript object89 * @param {string} output - Output string90 * @param {string} language - Source language91 * @returns {any} - Parsed data92 */93 deserialize(output, language) {94 if (!output || typeof output !== 'string') {95 return output;96 }97 98 const trimmed = output.trim();99 100 // Try JSON parse first (works for most cases)101 try {102 return JSON.parse(trimmed);103 } catch (e) {104 // If JSON parse fails, return as string105 return trimmed;106 }107 }108 109 /**110 * Get serializer function for type and language111 */112 getSerializer(type, language) {113 const serializers = {114 'JAVASCRIPT_NODE': this.getJavaScriptSerializers(),115 'PYTHON3': this.getPythonSerializers(),116 'JAVA17': this.getJavaSerializers(),117 'CPP14': this.getCppSerializers(),118 'C': this.getCSerializers()119 };120 121 const langSerializers = serializers[language] || serializers['JAVASCRIPT_NODE'];122 return langSerializers[type] || langSerializers['primitive'];123 }124 125 /**126 * Get JavaScript serializers127 */128 getJavaScriptSerializers() {129 return {130 primitive: (data) => JSON.stringify(data),131 array: (data) => JSON.stringify(data),132 array2d: (data) => JSON.stringify(data),133 object: (data) => JSON.stringify(data),134 graph: (data) => JSON.stringify(data),135 tree: (data) => JSON.stringify(data),136 null: () => 'null'137 };138 }139 140 /**141 * Get Python serializers142 */143 getPythonSerializers() {144 return {145 primitive: (data) => {146 if (typeof data === 'string') {147 return JSON.stringify(data); // Keeps quotes148 }149 if (typeof data === 'boolean') {150 return data ? 'True' : 'False';151 }152 return String(data);153 },154 array: (data) => JSON.stringify(data),155 array2d: (data) => JSON.stringify(data),156 object: (data) => JSON.stringify(data),157 graph: (data) => JSON.stringify(data),158 tree: (data) => JSON.stringify(data),159 null: () => 'None'160 };161 }162 163 /**164 * Get Java serializers165 */166 getJavaSerializers() {167 return {168 primitive: (data) => String(data),169 array: (data) => {170 if (!Array.isArray(data)) return '[]';171 return JSON.stringify(data);172 },173 array2d: (data) => {174 if (!Array.isArray(data)) return '[]';175 return JSON.stringify(data);176 },177 object: (data) => JSON.stringify(data),178 graph: (data) => JSON.stringify(data),179 tree: (data) => JSON.stringify(data),180 null: () => 'null'181 };182 }183 184 /**185 * Get C++ serializers186 */187 getCppSerializers() {188 return {189 primitive: (data) => String(data),190 array: (data) => JSON.stringify(data),191 array2d: (data) => JSON.stringify(data),192 object: (data) => JSON.stringify(data),193 graph: (data) => JSON.stringify(data),194 tree: (data) => JSON.stringify(data),195 null: () => 'null'196 };197 }198 199 /**200 * Get C serializers201 */202 getCSerializers() {203 return {204 primitive: (data) => String(data),205 array: (data) => JSON.stringify(data),206 array2d: (data) => JSON.stringify(data),207 object: (data) => JSON.stringify(data),208 graph: (data) => JSON.stringify(data),209 tree: (data) => JSON.stringify(data),210 null: () => 'null'211 };212 }213}214 215module.exports = DataStructureSerializer;216 