dev-resources.site
for different kinds of informations.
TIL: LIFO Solution and Regular Exprresion Techniques【CodeWars】
Published at
12/5/2024
Categories
javascript
codewars
algorithms
todayilearned
Author
kohki_takatama
Author
14 person written this
kohki_takatama
open
Overview 🔍
The challenge Directions Reduction ask you to find shortest route from array of directions.
Examples:
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"]
Solutions 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;
}, []);
}
This is a LIFO (Last-in-First-out) approach implemented using reduce
.
Steps:
- Declare an empty stack (
dirs
) - For each direction in the input array (
plan
), check if the last element of the stack (dirs
) is the opposite of the current direction - If they are opposites, pop the last element from the stack (and skip current direction). Otherwise, push the current direction onto the stack.
- Repeat this process until all directions have been processed.
Solutions 2: Regular Expression
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)||[];
}
Alternative Version:
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 || [];
}
Steps:
- Join the input array (
arr
) into a single string so we can manipulate it using regular expressions. - Define a regular expression (
pattern
) that matches opposite direction pairs (e.g., 'NORTHSOUTH', 'EASTWEST'). - Use the
replace
method in a loop to remove any direction pairs found by the regular expression. - After all pairs have been removed, use the
match
method to extract the remaining directions from the string and return them as an array.
Discussion and Insights 💭
I believe the minimum case for this solution is as follows:
1. ["SOUTH", "EAST", "WEST", "NORTH"]
-> []
2. ["NORTH", "WEST", "SOUTH", "EAST"]
-> ["NORTH", "WEST", "SOUTH", "EAST"]
I prefer Solution 2, as it is concise and uses regular expressions in a clever way. Initially, I couldn't imagine solving it with regular expressions, but the use of join
, match
, while
, replace
, and test
methods to eliminate pairs is impressive.
If you're curious about these solutions or want to explore more challenges, visit here.
Welcome to leave a comment below!
Thank you for reading 🙌
todayilearned Article's
30 articles in total
My First Post and Introduction
read article
Guess what? You can make a game inside a PDF!
read article
TIL: Tag Function / Tagged Template Literals
read article
update notepad++
read article
TIL: Styling Obsidian text paragraphs
read article
Today I Learned...
read article
Outlook tìm mail nhận trong khoảng thời gian xác định
read article
TIL: using --no-deps with docker compose
read article
TIL: LIFO Solution and Regular Exprresion Techniques【CodeWars】
currently reading
Scrum Fundamentals Certification (SFC) | Study Notes - Part I: Introduction
read article
Downloading the same file 102+ times
read article
Build Golang from Source for v1.23+
read article
3 Myths, 3 Facts, and 3 Strategies to Scale Node.js Apps
read article
How to Validate Inputs Using Only HTML
read article
Turning a Customer Security Concern into a Feature
read article
Opposite Colours Tool
read article
Work Life Balance
read article
Is This a Good Way to Reduce Operational Costs?
read article
TIL: How to Trim Trailing Zeros【CodeWars】
read article
Why 1% - 1% Isn't Zero in Your Calculator (And What It Really Means)
read article
What I’ve Learned from Building a Calculator with Vue.js
read article
Starting to Rust
read article
TIL C11 Annex K exists but you shouldn't use it
read article
Be careful with join type typos
read article
The Role of AI in Financial Services: Opportunities and Challenges
read article
Starting to Rust
read article
Getting Started with the TMDB API: A Beginner's Guide
read article
TIL emalloc() auto-exits on out-of-memory errors
read article
TIL: How To Use the Specification Pattern in C# To Simplify Repositories
read article
Devops Foundation - Day1
read article
Featured ones: