Cabaran Pengurangan Arah meminta anda mencari laluan terpendek dari susun arah.
Input -> Output ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"] -> ["WEST"] /* Because moving "NORTH" and "SOUTH", or "EAST" and "WEST", is unnecessary. */ /* Case: omit the first "NORTH"-"SOUTH" pair ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"] -> ["SOUTH", "EAST", "WEST", "NORTH", "WEST"] Case: omit the "EAST"-"WEST" pair -> ["SOUTH", "NORTH", "WEST"] Case: omit the "NORTH"-"SOUTH" pair -> ["WEST"] */ // this case cannot be reduced: ["NORTH", "WEST", "SOUTH", "EAST"] -> ["NORTH", "WEST", "SOUTH", "EAST"]
function dirReduc(plan) { var opposite = { 'NORTH': 'SOUTH', 'EAST': 'WEST', 'SOUTH': 'NORTH', 'WEST': 'EAST'}; return plan.reduce(function(dirs, dir){ if (dirs[dirs.length - 1] === opposite[dir]) dirs.pop(); // Remove last direction if it's the opposite else dirs.push(dir); // Otherwise, add current direction to the stack return dirs; }, []); }
Ini ialah pendekatan LIFO (Last-in-First-out) yang dilaksanakan menggunakan reduce.
function dirReduce(arr) { let str = arr.join(''), pattern = /NORTHSOUTH|EASTWEST|SOUTHNORTH|WESTEAST/; while (pattern.test(str)) str = str.replace(pattern,''); // Remove pairs while they exist return str.match(/(NORTH|SOUTH|EAST|WEST)/g)||[]; }
Versi Alternatif:
function dirReduc(arr) { const pattern = /NORTHSOUTH|EASTWEST|SOUTHNORTH|WESTEAST/; let str = arr.join(''); while (pattern.test(str)) { str = str.replace(pattern, ''); // Remove pairs while they exist } const result = str.match(/(NORTH|SOUTH|EAST|WEST)/g); return result || []; }
Saya percaya kes minimum untuk penyelesaian ini adalah seperti berikut:
1. ["SOUTH", "EAST", "WEST", "NORTH"] -> [] 2. ["NORTH", "WEST", "SOUTH", "EAST"] -> ["NORTH", "WEST", "SOUTH", "EAST"]
Saya lebih suka Penyelesaian 2, kerana ia ringkas dan menggunakan ungkapan biasa dengan cara yang bijak. Pada mulanya, saya tidak dapat membayangkan menyelesaikannya dengan ungkapan biasa, tetapi penggunaan kaedah cantum, padan, sambil, ganti dan ujian untuk menghapuskan pasangan adalah mengagumkan.
Jika anda ingin tahu tentang penyelesaian ini atau ingin meneroka lebih banyak cabaran, lawati di sini.
Selamat tinggalkan ulasan di bawah!
Terima kasih kerana membaca ?
Atas ialah kandungan terperinci TIL: Penyelesaian LIFO dan Teknik Ekspresi Biasa【CodeWars】. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!