Learn Functional Programming by Building a Spreadsheet - Step 81

Tell us what’s happening:

Hey there!
I think this step is problematic. I searched through all the forums and found nothing as a proper answer. If you know the correct answer just paste here please. No need for explanation just the RegEx that works for this step.
Thank you

Your code so far

<!-- file: index.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="./styles.css" />
    <title>Functional Programming Spreadsheet</title>
  </head>
  <body>
    <div id="container">
      <div></div>
    </div>
    <script src="./script.js"></script>
  </body>
</html>
/* file: script.js */
const infixToFunction = {
  "+": (x, y) => x + y,
  "-": (x, y) => x - y,
  "*": (x, y) => x * y,
  "/": (x, y) => x / y,
}

const infixEval = (str, regex) => str.replace(regex, (_match, arg1, operator, arg2) => infixToFunction[operator](parseFloat(arg1), parseFloat(arg2)));

const highPrecedence = str => {
  const regex = /([\d.]+)([*\/])([\d.]+)/;
  const str2 = infixEval(str, regex);
  return str === str2 ? str : highPrecedence(str2);
}

const isEven = num => num % 2 === 0;
const sum = nums => nums.reduce((acc, el) => acc + el, 0);
const average = nums => sum(nums) / nums.length;

const median = nums => {
  const sorted = nums.slice().sort((a, b) => a - b);
  const length = sorted.length;
  const middle = length / 2 - 1;
  return isEven(length)
    ? average([sorted[middle], sorted[middle + 1]])
    : sorted[Math.ceil(middle)];
}

const spreadsheetFunctions = {
  sum,
  average,
  median
}


// User Editable Region

const applyFunction = str => {
  const noHigh = highPrecedence(str);
  
  const infix = /(\d+(\.\d+)?)\s*([+\-])\s*(\d+(\.\d+)?)/;






}

// User Editable Region


const range = (start, end) => Array(end - start + 1).fill(start).map((element, index) => element + index);
const charRange = (start, end) => range(start.charCodeAt(0), end.charCodeAt(0)).map(code => String.fromCharCode(code));

const evalFormula = (x, cells) => {
  const idToText = id => cells.find(cell => cell.id === id).value;
  const rangeRegex = /([A-J])([1-9][0-9]?):([A-J])([1-9][0-9]?)/gi;
  const rangeFromString = (num1, num2) => range(parseInt(num1), parseInt(num2));
  const elemValue = num => character => idToText(character + num);
  const addCharacters = character1 => character2 => num => charRange(character1, character2).map(elemValue(num));
  const rangeExpanded = x.replace(rangeRegex, (_match, char1, num1, char2, num2) => rangeFromString(num1, num2).map(addCharacters(char1)(char2)));
  const cellRegex = /[A-J][1-9][0-9]?/gi;
  const cellExpanded = rangeExpanded.replace(cellRegex, match => idToText(match.toUpperCase()));
}

window.onload = () => {
  const container = document.getElementById("container");
  const createLabel = (name) => {
    const label = document.createElement("div");
    label.className = "label";
    label.textContent = name;
    container.appendChild(label);
  }
  const letters = charRange("A", "J");
  letters.forEach(createLabel);
  range(1, 99).forEach(number => {
    createLabel(number);
    letters.forEach(letter => {
      const input = document.createElement("input");
      input.type = "text";
      input.id = letter + number;
      input.ariaLabel = letter + number;
      input.onchange = update;
      container.appendChild(input);
    })
  })
}

const update = event => {
  const element = event.target;
  const value = element.value.replace(/\s/g, "");
  if (!value.includes(element.id) && value.startsWith('=')) {

  }
}
/* file: styles.css */
#container {
  display: grid;
  grid-template-columns: 50px repeat(10, 200px);
  grid-template-rows: repeat(11, 30px);
}

.label {
  background-color: lightgray;
  text-align: center;
  vertical-align: middle;
  line-height: 30px;
}

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36

Challenge Information:

Learn Functional Programming by Building a Spreadsheet - Step 81

Welcome to the forum :wave:

This site can be really useful for regex: https://regex101.com/

Explore the Common Tokens in the Quick Reference in the lower right

In what way?

Giving solutions like this isn’t allowed on the forum, and it wouldn’t really help you learn how to solve it on your own.

Ok, I see what you mean. :+1: Your regex works for what is described.

Let’s look at the hints:

  1. Your first capture group should use a character class.

A character class should have [ ]
https://www.regular-expressions.info/charclass.html

  1. Your first capture group should match one or more digits or decimal points. Use the \d character class.

You should have 1 character class that matches both digits and . For example it should match .1 because it has a decimal and a digit. Here’s a character class that matches a,b or c [abc] For the purpose of this test it’s ok if .1.1.1 also matches…

  1. Your second capture group should match either the + or - operator.

Here you have ([+\-]) but this is effectively the same as [+-] You can test them both here: https://regex101.com/

You do not need to account for spaces around the operator because the instructions do not mention that. Adding things that the instructions do not explicitly mention usually does not work.

Your regex should match this string: .1.1.1+.2.3 (according strictly to the instructions…).

You should have 3 capture groups that match:

  1. any combination of digits and decimals
  2. + or -
  3. same as 1.

I hope this helps!

thansk @pkdvalis
i tried too many regExes and this one worked finally for me :slight_smile:
– removed

1 Like

You’re welcome!

Please do not post solution code to the forum.