DEV Community

Cover image for Coding challenges #1 🧩
Killian Frappart
Killian Frappart

Posted on

Coding challenges #1 🧩

Greetings fellow problem solvers! πŸ€“

As I am learning programming, I decided to spend more time on my problem-solving skills. Practice is a key aspect of the learning process and a great way to stay motivated.

With this new post series, I would like to share with you some code katas' solution. If you feel like it, don't hesitate to take those challenges on your own and share your solutions.

Algorithm/problem solving is just like a muscle that we must often train in order to improve. Today's problems are beginner-friendly, I will slowly bring harder problems on the table as this series is growing up.

Depending on my mood, I will provide solutions written in JavaScript, Python or C#. I can't wait to have your feedbacks and advices!

Table of Contents

Multiples of 3 & 5

From Codewars

The problem:

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Finish the solution so that it returns the sum of all the multiples of 3 or 5 below the number passed in.

My solution (Python):

def solution(number):

    # Return 0 if argument is negative
    if number <= 0: return 0

    # Create a list to store multiples
    multiples_list = []

    # Loop from 1 to argument
    for i in range(1, number):
        if (i % 3 == 0) or (i % 5 == 0):

            # Add multiples to the list
            multiples_list.append(i)

    # Return the sum
    return sum(multiples_list)     
Enter fullscreen mode Exit fullscreen mode

Valid Braces

From Codewars

The problem:

Write a function that takes a string of braces, and determines if the order of the braces is valid. It should return true if the string is valid, and false if it's invalid.

All input strings will be nonempty, and will only consist of parentheses, brackets and curly braces: ()[]{}.

What is considered Valid?
A string of braces is considered valid if all braces are matched with the correct brace.

Example:

"(){}[]"   =>  True
"([{}])"   =>  True
"(}"       =>  False
"[(])"     =>  False
"[({})](]" =>  False
Enter fullscreen mode Exit fullscreen mode

My solution (Python):

def validBraces(string):
    # Return False if arg is not a string  
    if type(string) is not str: return False

    # Return False if arg's length is not even
    if len(string) % 2 is not 0: return False

    # Convert string to list
    braces_list = list(string)

    # Create a braces dictionnary
    braces_dictionnary = {
        "(": ")",
        "{": "}",
        "[": "]"
    }

    # Create a list of 'opened' braces
    opened_braces = []

    # Loop through the list generated by the string
    for brace in braces_list:

        # It is an opening brace
        if brace in braces_dictionnary: 

            # Push it at the end of our opened braces list
            opened_braces.append(brace)

        # It is a closing brace    
        else: 

            # Check if opened braces list is empty
            if len(opened_braces) == 0:
                return False

            # Check if the last encountered opening brace corresponds
            if braces_dictionnary[opened_braces[-1]] == brace:

                # It is the same so we remove it from the opened list
                opened_braces.pop()

            # They are different, string is not valid!    
            else:
                return False

    # Check if there are still opened braces in the list
    if len(opened_braces) > 0:
        return False
    else:
        return True      
Enter fullscreen mode Exit fullscreen mode

Roman Numerals Encoder

From Codewars

The problem:

Create a function taking a positive integer as its parameter and returning a string containing the Roman Numeral representation of that integer.

Modern Roman numerals are written by expressing each digit separately starting with the left most digit and skipping any digit with a value of zero. In Roman numerals 1990 is rendered: 1000=M, 900=CM, 90=XC; resulting in MCMXC. 2008 is written as 2000=MM, 8=VIII; or MMVIII. 1666 uses each Roman symbol in descending order: MDCLXVI.

Help

Symbol    Value
I          1
V          5
X          10
L          50
C          100
D          500
M          1,000
Enter fullscreen mode Exit fullscreen mode

Example:

solution(1000) # should return 'M'
Enter fullscreen mode Exit fullscreen mode

My solution (Python):

def solution(n):

    # Check that n is an integer
    if type(n) is not int:
        return False

   # Symbols sorted by index
    sym_dictionnary = {
        0: { 1: 'M' },
        1: { 9: "CM", 5: "D", 4: "CD", 1: "C" },
        2: { 9: "XC", 5: "L", 4: "XL", 1: "X" },
        3: { 9: "IX", 5: "V", 4: "IV", 1: "I" },
    }

    # Create a digit list from n
    digit_list = list(str(n / 10000))[2:]

    # We will build the result with this list
    result_list = []

    # Loop through the digit list
    for i in range(0, len(digit_list)):

        current_digit = int(digit_list[i])

        # Until the current digit reaches 0
        while current_digit > 0:

            # Find the appropriate symbol in the dictionnary and push it to the result list
            for key in sym_dictionnary[i]:
                if current_digit - key >= 0:
                    current_digit -= key
                    result_list.append(sym_dictionnary[i][key])
                    break;

    # Convert to string and return the result                
    return "".join(result_list)     
Enter fullscreen mode Exit fullscreen mode

Pascal's Triangle

From Codewars

The problem:

In mathematics, Pascal's triangle is a triangular array of the binomial coefficients expressed with formula

Alt Text

Task
Write a function that, given a depth n, returns n top rows of Pascal's Triangle flattened into a one-dimensional list/array.

Example:

n = 1: [1]
n = 2: [1,  1, 1]
n = 4: [1,  1, 1,  1, 2, 1,  1, 3, 3, 1]
Enter fullscreen mode Exit fullscreen mode

My solution (JavaScript):

function pascalsTriangle(n) {

  // Helper variable that represents the pyramid as an array of arrays
  const pyramid = [[1]];

  // Result variable that will be returned
  const result = [1];

  // Loop until our pyramid has enough rows
  for (let i = 1; i < n; i++) {
    const newRow = [];

    // Populate every slots in a row
    for (let j = 0; j <= i; j++){

      // The current number is the sum of the number at the current index and current index - 1 from the previous row
      const currentNum = (pyramid[i-1][j] || 0) + (pyramid[i - 1][j - 1] || 0);
      newRow[j] = currentNum;
      result.push(currentNum)
    }

    // Append a new populated row at the end of every iteration
    pyramid.push(newRow);

  }

  return result;
}     
Enter fullscreen mode Exit fullscreen mode

Persistent Bugger

From Codewars

The problem:

Write a function, persistence, that takes in a positive parameter num and returns its multiplicative persistence, which is the number of times you must multiply the digits in num until you reach a single digit.

Example:

 persistence(39) => 3  # Because 3*9 = 27, 2*7 = 14, 1*4=4
                       # and 4 has only one digit.

 persistence(999) => 4 # Because 9*9*9 = 729, 7*2*9 = 126,
                       # 1*2*6 = 12, and finally 1*2 = 2.

 persistence(4) => 0   # Because 4 is already a one-digit number.
Enter fullscreen mode Exit fullscreen mode

My solution (Python):

def persistence(n):

    # Convert a number to a list of digits
    digit_list = [int(char) for char in str(n)]

    # Count every loop iteration
    count = 0

    # Loop until we have 1 digit left
    while len(digit_list) > 1:

        # Multiply every digits in the list
        newNumber = 1
        for digit in digit_list: newNumber *= digit

        # Update count and current number values
        count += 1
        digit_list = [int(char) for char in str(newNumber)]

    return count   
Enter fullscreen mode Exit fullscreen mode

Top comments (0)