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

TIL: Penyelesaian LIFO dan Teknik Ekspresi Biasa【CodeWars】

Susan Sarandon
Lepaskan: 2024-12-20 07:52:10
asal
865 orang telah melayarinya

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

Salin selepas log masuk

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;
    }, []);
}
Salin selepas log masuk

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)||[];
}
Salin selepas log masuk

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 || [];
}
Salin selepas log masuk

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"]
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan