Rumah >hujung hadapan web >tutorial js >TIL: Penyelesaian LIFO dan Teknik Ekspresi Biasa【CodeWars】

TIL: Penyelesaian LIFO dan Teknik Ekspresi Biasa【CodeWars】

Susan Sarandon
Susan Sarandonasal
2024-12-20 07:52:10938semak imbas

TIL: LIFO Solution and Regular Exprresion Techniques【CodeWars】

Gambaran keseluruhan ?

Cabaran Pengurangan Arah meminta anda mencari laluan terpendek dari susun arah.

Contoh:

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"]


Penyelesaian 1: LIFO

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.

Langkah-langkah:

  1. Isytiharkan tindanan kosong (dir)
  2. Untuk setiap arah dalam tatasusunan input (pelan), semak sama ada elemen terakhir timbunan (dir) adalah bertentangan dengan arah semasa
  3. Jika ia bertentangan, pop elemen terakhir dari tindanan (dan langkau arah semasa). Jika tidak, tolak arah semasa pada tindanan.
  4. Ulang proses ini sehingga semua arah telah diproses.

Penyelesaian 2: Ekspresi Biasa

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 || [];
}

Langkah-langkah:

  1. Sertai tatasusunan input (arr) ke dalam satu rentetan supaya kami boleh memanipulasinya menggunakan ungkapan biasa.
  2. Tentukan ungkapan biasa (corak) yang sepadan dengan pasangan arah bertentangan (cth., 'NorthSouth', 'EASTWEST').
  3. Gunakan kaedah ganti dalam gelung untuk mengalih keluar sebarang pasangan arah yang ditemui oleh ungkapan biasa.
  4. Selepas semua pasangan telah dialih keluar, gunakan kaedah padanan untuk mengekstrak arah yang tinggal daripada rentetan dan mengembalikannya sebagai tatasusunan.

Perbincangan dan Wawasan ?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn