Niklaus Wirth

Niklaus Wirth

Translate

(29)Map the Debris


день программы "#100 Days Of Code"
Return a new array that transforms the element's average altitude into their orbital periods.
The array will contain objects in the format {name: 'name', avgAlt: avgAlt}.
You can read about orbital periods on wikipedia.
The values should be rounded to the nearest whole number. The body being orbited is Earth.
The radius of the earth is 6367.4447 kilometers, and the GM value of earth is 398600.4418 km3s-2.



Here are some helpful links:

function orbitalPeriod(arr) {
 var GM = 398600.4418;
  var earthRadius = 6367.4447;
var answer =[];

  var radius;
  
  for (var i = 0; i < arr.length; i++){
    answer[i]= {};
   answer[i].name = arr[i].name;
    
    radius =earthRadius + arr[i].avgAlt;
    answer[i].orbitalPeriod = Math.round(2 * Math.PI *Math.sqrt((Math.pow(radius,3))/GM));

}
return answer;

}

orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}]);



Ответы:
orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}])
return [{name: "sputnik", orbitalPeriod: 86400}].

orbitalPeriod([{name: "iss", avgAlt: 413.6}, {name: "hubble", avgAlt: 556.7}, {name: "moon", avgAlt: 378632.553}])
return [{name : "iss", orbitalPeriod: 5557}, {name: "hubble", orbitalPeriod: 5734}, {name: "moon", orbitalPeriod: 2377399}].

(28)Make a Person

Make a Person
28-ой день программы "#100 Days Of Code"

Fill in the object constructor with the following methods below:

getFirstName()
getLastName()
getFullName()
setFirstName(first)
setLastName(last)
setFullName(firstAndLast)

Run the tests to see the expected output for each method.

The methods that take an argument must accept only one argument and it has to be a string.

These methods must be the only available means of interacting with the object.

Here are some helpful links:



var Person = function(firstAndLast) {
  var namesArr = firstAndLast.split(" ");
  
  this.getFirstName = function(){
    return namesArr[0];
  };
  this.getLastName = function(){
    return namesArr[1];
  };
  this.getFullName = function(){
    return namesArr.join(" ");
  };
  this.setFirstName = function(first){
    namesArr[0] = first;
  };
  this.setLastName = function(last){
    namesArr[1] = last;
  };
  this.setFullName = function(firstAndLast){
    namesArr = firstAndLast.split(' ');
  };
    return firstAndLast;
};

var bob = new Person('Bob Ross');
bob.getFullName();




(27)Friendly Date Ranges


27-ой день программы "#100 Days Of Code"

Convert a date range consisting of two dates formatted as YYYY-MM-DD into a more readable format.

The friendly display should use month names instead of numbers and ordinal dates instead of cardinal (1st instead of 1).

Do not display information that is redundant or that can be inferred by the user: if the date range ends in less than a year from when it begins, do not display the ending year.

Additionally, if the date range begins in the current year (i.e. it is currently the year 2016) and ends within one year, the year should not be displayed at the beginning of the friendly range.

If the range ends in the same month that it begins, do not display the ending year or month.

Examples:

makeFriendlyDates(["2016-07-01", "2016-07-04"]) should return ["July 1st","4th"]

makeFriendlyDates(["2016-07-01", "2018-07-04"]) should return ["July 1st, 2016", "July 4th, 2018"].



function makeFriendlyDates(str) {
   
 
  var months = ['January','February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
  
   function convertDate(str) {
    var dateStr = str.split('-');
    return (new Date(Date.UTC(dateStr[0], dateStr[1] - 1, dateStr[2])));

  }
  var dateA = convertDate(str[0]);
  var dateB = convertDate(str[1]);
  
  function dayEnd (val){
   if(val==1 || val ==21 || val == 31){
     return val +'st';
   }else if(val == 2 || val == 22){
     return val + 'nd';
   } else if(val == 3 || val == 33){
     return val +'rd';
   }else{
     return val + 'th';
   }
  }

   function monthDiff(dateA, dateB) {
    var monthB = dateB.getUTCFullYear() * 12 + dateB.getUTCMonth();
    var monthA = dateA.getUTCFullYear() * 12 + dateA.getUTCMonth();
    return monthB - monthA;
  }

  
  function dayDiff(dateA, dateB) {
    if(dateB.getUTCMonth() === dateA.getUTCMonth()){
      return dateA.getUTCDate()-dateB.getUTCDate();
    }
    return 0;
  }

  
  function getMonth(date) {
    return months[date.getUTCMonth()];
  }
 


  
 function displayDate() {

   
    if (dateB.getTime() - dateA.getTime() === 0) {
      return [getMonth(dateA) + ' ' + dayEnd(dateA.getUTCDate()) + ', ' + dateA.getUTCFullYear()];
    }

    
    if (dateA.getUTCMonth() === dateB.getUTCMonth() && dateA.getUTCFullYear() === dateB.getUTCFullYear()) {
      return [getMonth(dateA) + ' ' + dayEnd(dateA.getUTCDate()), dayEnd(dateB.getUTCDate())];
    }

    
    if (monthDiff(dateA, dateB) < 12 && dateA.getUTCFullYear() !== dateB.getUTCFullYear() ) {
      return [getMonth(dateA) + ' ' + dayEnd(dateA.getUTCDate()), getMonth(dateB) + ' ' + dayEnd(dateB.getUTCDate())];
    }

    
    if (monthDiff(dateA, dateB) <= 12 && dayDiff(dateA, dateB)>0) {
      return [getMonth(dateA) + ' ' + dayEnd(dateA.getUTCDate())+', '+dateA.getUTCFullYear(), getMonth(dateB) + ' ' + dayEnd(dateB.getUTCDate())];
    }

    if (monthDiff(dateA, dateB) < 12) {
      return [getMonth(dateA) + ' ' + dayEnd(dateA.getUTCDate())+', '+dateA.getUTCFullYear(), getMonth(dateB) + ' ' + dayEnd(dateB.getUTCDate())];
    }

   
    return [getMonth(dateA) + ' ' + dayEnd(dateA.getUTCDate()) + ', ' + dateA.getUTCFullYear(), getMonth(dateB) + ' ' + dayEnd(dateB.getUTCDate()) + ', ' + dateB.getUTCFullYear()];
  }
  
  

  return displayDate();
}

makeFriendlyDates(['2016-07-01', '2016-07-04']);



Ответы:

makeFriendlyDates(["2016-07-01", "2016-07-04"])
return ["July 1st","4th"].

makeFriendlyDates(["2016-12-01", "2017-02-03"])
return ["December 1st","February 3rd"].

makeFriendlyDates(["2016-12-01", "2018-02-03"])
return ["December 1st, 2016","February 3rd, 2018"].

makeFriendlyDates(["2017-03-01", "2017-05-05"])
return ["March 1st, 2017","May 5th"]

makeFriendlyDates(["2018-01-13", "2018-01-13"])
return ["January 13th, 2018"].

makeFriendlyDates(["2022-09-05", "2023-09-04"])
return ["September 5th, 2022","September 4th"].

makeFriendlyDates(["2022-09-05", "2023-09-05"])
return ["September 5th, 2022","September 5th, 2023"].


(26) No repeats please

No repeats please
26-ой день программы "#100 Days Of Code"

Return the number of total permutations of the provided string that don't have repeated consecutive letters. Assume that all characters in the provided string are each unique.

For example, aab should return 2 because it has 6 total permutations (aab, aab, aba, aba, baa, baa), but only 2 of them (aba and aba) don't have the same letter (in this case a) repeating.

Более подробно о первом варианте решения, можно прочитать здесь! macengr.wordpress.com



function permAlone(str) {
 
  if(str.length===0){
    return 1;
  }
   var amount=0;
  for(var i = 0; i < str.length; i++){
    if(str[i]!== arguments[1]){
      amount +=permAlone(str.substring(0,i)+str.substring(i+1),str[i]);
      
    }
  }
  return amount;
}

permAlone('aab');



Using a Heap Algorithm to generate all permutations


function permAlone(str) {
  
  var arr = str.split('');
  var permutations = [];
  var regex = /(.)\1+/g;
  
  function swap(index1, index2) {
    var aux = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = aux;
  }
  
  function generate(int) {
    if (int === 1) {
      permutations.push(arr.join(''));
    } else {
      for (var i = 0; i < int - 1; i++) {
        generate(int - 1);
        if (int % 2 === 0) {
          swap(i, int-1);
        } else {
          swap(0, int-1);
        }
      }
      generate(int - 1);
    }  
  }      
  
  generate(arr.length);
  
  var filtered = permutations.filter(function(string) {
    return !string.match(regex);
  });
  
  return filtered.length;

Ответы:

permAlone("aab")
return a number.

permAlone("aab")
return 2.

permAlone("aaa")
return 0.

permAlone("aabb")
return 8.

permAlone("abcdefa")
return 3600.

permAlone("abfdefa")
return 2640.

permAlone("zzzzzzzz")
return 0.

permAlone("a")
return 1.

permAlone("aaab")
return 0.

permAlone("aaabb")
return 12.


(25) Inventory Update

Inventory Update
25-ый день программы "#100 Days Of Code"

Compare and update the inventory stored in a 2D array against a second 2D array of a fresh delivery. Update the current existing inventory item quantities (in arr1). If an item cannot be found, add the new item and quantity into the inventory array. The returned inventory array should be in alphabetical order by item.



function updateInventory(arr1, arr2) {
    // All inventory must be accounted for or you're fired!
  for(var i = 0; i < arr1.length; i++){
    for(var j = 0; j < arr2.length; j++){
     if(arr1[i][1] ===arr2[j][1]){
       arr1[i][0] += arr2[j][0];
         arr2.splice(j, 1);
          j--;
     }     
   }
  }
   arr1 = arr1.concat(arr2); 
  arr1.sort(function(a,b){
    return a[1] > b[1];
  });
    return arr1;
}

// Example inventory lists
var curInv = [
    [21, "Bowling Ball"],
    [2, "Dirty Sock"],
    [1, "Hair Pin"],
    [5, "Microphone"]
];

var newInv = [
    [2, "Hair Pin"],
    [3, "Half-Eaten Apple"],
    [67, "Bowling Ball"],
    [7, "Toothpaste"]
];

updateInventory(curInv, newInv);



Ответы:

The function updateInventory
return an array.

updateInventory([[21, "Bowling Ball"], [2, "Dirty Sock"], [1, "Hair Pin"], [5, "Microphone"]], [[2, "Hair Pin"], [3, "Half-Eaten Apple"], [67, "Bowling Ball"], [7, "Toothpaste"]]).length
return an array with a length of 6.

updateInventory([[21, "Bowling Ball"], [2, "Dirty Sock"], [1, "Hair Pin"], [5, "Microphone"]], [[2, "Hair Pin"], [3, "Half-Eaten Apple"], [67, "Bowling Ball"], [7, "Toothpaste"]])
return [[88, "Bowling Ball"], [2, "Dirty Sock"], [3, "Hair Pin"], [3, "Half-Eaten Apple"], [5, "Microphone"], [7, "Toothpaste"]].

updateInventory([[21, "Bowling Ball"], [2, "Dirty Sock"], [1, "Hair Pin"], [5, "Microphone"]], [])
return [[21, "Bowling Ball"], [2, "Dirty Sock"], [1, "Hair Pin"], [5, "Microphone"]].

updateInventory([], [[2, "Hair Pin"], [3, "Half-Eaten Apple"], [67, "Bowling Ball"], [7, "Toothpaste"]])
return [[67, "Bowling Ball"], [2, "Hair Pin"], [3, "Half-Eaten Apple"], [7, "Toothpaste"]].

updateInventory([[0, "Bowling Ball"], [0, "Dirty Sock"], [0, "Hair Pin"], [0, "Microphone"]], [[1, "Hair Pin"], [1, "Half-Eaten Apple"], [1, "Bowling Ball"], [1, "Toothpaste"]])
return [[1, "Bowling Ball"], [0, "Dirty Sock"], [1, "Hair Pin"], [1, "Half-Eaten Apple"], [0, "Microphone"], [1, "Toothpaste"]].


(24)Exact Change

Exact Change
24-ый день программы "#100 Days Of Code"

Design a cash register drawer function checkCashRegister() that accepts purchase price as the first argument (price), payment as the second argument (cash), and cash-in-drawer (cid) as the third argument.

cid is a 2D array listing available currency.

Return the string "Insufficient Funds" if cash-in-drawer is less than the change due. Return the string "Closed" if cash-in-drawer is equal to the change due.

Otherwise, return change in coin and bills, sorted in highest to lowest order.




function checkCashRegister(price, cash, cid) {
  var change=[];
  // Here is your change, ma'am.
 var money =[["PENNY", 1], ["NICKEL", 5], ["DIME", 10], ["QUARTER", 25], ["ONE", 100], ["FIVE", 500], ["TEN", 1000], ["TWENTY", 2000], ["ONE HUNDRED", 10000]];
  var debt = cash * 100 - price*100;
  var cashInDrawer = 0;
  var rating = 0;
  
  for(i = money.length - 1; i >= 0; i--){
    cid[i][1] = Math.round(cid[i][1] * 100);
    cashInDrawer += cid[i][1];
    rating = 0;
    if(debt >= money[i][1]){
      while(cid[i][1] - money[i][1] >= 0){
        if(debt - money[i][1] >= 0){
          cid[i][1] -= money[i][1];
          debt -=money[i][1];
          cashInDrawer -= money[i][1];
          rating += money[i][1];
        } else {
          break;
        }
      }
      change.push([money[i][0], rating/100]);
    }
  }
  
  if(debt > 0){
    return "Insufficient Funds";
  } else if(cashInDrawer === 0){
    return "Closed";
  }
  return change;
}

// Example cash-in-drawer array:
// [["PENNY", 1.01],
// ["NICKEL", 2.05],
// ["DIME", 3.10],
// ["QUARTER", 4.25],
// ["ONE", 90.00],
// ["FIVE", 55.00],
// ["TEN", 20.00],
// ["TWENTY", 60.00],
// ["ONE HUNDRED", 100.00]]

checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]);



Ответы:

checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]])
return an array.

checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])
return a string.

checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])
return a string.

checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]])
return [["QUARTER", 0.50]].

checkCashRegister(3.26, 100.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]])
return [["TWENTY", 60.00], ["TEN", 20.00], ["FIVE", 15.00], ["ONE", 1.00], ["QUARTER", 0.50], ["DIME", 0.20], ["PENNY", 0.04]].

checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])
return "Insufficient Funds".

checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1.00], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])
return "Insufficient Funds".

checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])
return "Closed".


(23)Symmetric Difference

(23)Symmetric Difference
23-ий день программы "#100 Days Of Code"



function sym(args) {
  return Array.prototype.reduce.call(arguments,(a,b)=>a.filter(c=>b.every(d=>c!=d)).concat(b.filter(c=>a.every(d=>c!=d))),[]).filter((e,i,a)=>a.indexOf(e)===i);
}

sym([1, 2, 3], [5, 2, 1, 4]);



const sym = (...args) => {    
  return args.reduce((acc, curr) => {
    // change curr to hold unique values
    const set = new Set(curr)
    curr = Array.from(set)
    
    return acc.filter(a => !curr.includes(a)).concat(curr.filter(b => !acc.includes(b)))
  }, [])
}

sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])

Ответы:

sym([1, 2, 3], [5, 2, 1, 4])
return [3, 4, 5].

sym([1, 2, 3], [5, 2, 1, 4])
contain only three elements.

sym([1, 2, 5], [2, 3, 5], [3, 4, 5])
return [1, 4, 5]

sym([1, 2, 5], [2, 3, 5], [3, 4, 5])
contain only three elements.

sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])
return [1, 4, 5].

sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])
contain only three elements.

sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3])
return [2, 3, 4, 6, 7].

sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3])
contain only five elements.

sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])
return [1, 2, 4, 5, 6, 7, 8, 9].

sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])
contain only eight elements.


Запись коллекции (22) Record Collection

Record Collection
22-ой день программы "#100 Days Of Code"

Текст задания привожу полностью:

You are given a JSON object representing a part of your musical album collection. Each album has several properties and a unique id number as its key. Not all albums have complete information.

Write a function which takes an album's id (like 2548), a property prop (like "artist" or "tracks"), and a value (like "Addicted to Love") to modify the data in this collection.

If prop isn't "tracks" and value isn't empty (""), update or set the value for that record album's property.

Your function must always return the entire collection object.

There are several rules for handling incomplete data:

If prop is "tracks" but the album doesn't have a "tracks" property, create an empty array before adding the new value to the album's corresponding property.

If prop is "tracks" and value isn't empty (""), push the value onto the end of the album's existing tracks array.

If value is empty (""), delete the given prop property from the album.



Попробовал разные варианты решения. Этот мне понравился больше всего. Вначале отсекаем пустую строку. Если строка пустая, то удаляем свойства.

Если свойство не traks, то изменяем значение.

Если в альбоме нет свойства traks, то добавляем его и создаем пустой массив



// Setup
var collection = {
    "2548": {
      "album": "Slippery When Wet",
      "artist": "Bon Jovi",
      "tracks": [ 
        "Let It Rock", 
        "You Give Love a Bad Name" 
      ]
    },
    "2468": {
      "album": "1999",
      "artist": "Prince",
      "tracks": [ 
        "1999", 
        "Little Red Corvette" 
      ]
    },
    "1245": {
      "artist": "Robert Palmer",
      "tracks": [ ]
    },
    "5439": {
      "album": "ABBA Gold"
    }
};
// Keep a copy of the collection for tests
var collectionCopy = JSON.parse(JSON.stringify(collection));

// Only change code below this line
function updateRecords(id, prop, value) {
   if(value===''){
    delete collection[id][prop];
  } else if(prop !="tracks"){
    collection[id][prop] = value;
  } else {
  if(!collection[id].hasOwnProperty('tracks')){
    collection[id][prop] = [];
   
  } 
    collection[id][prop].push(value);
  }
  
  return collection;
}

// Alter values below to test your code
updateRecords(5439, "artist", "ABBA");




Ответы:

After updateRecords(5439, "artist", "ABBA"),
artist should be "ABBA"

After updateRecords(5439, "tracks", "Take a Chance on Me"),
tracks should have "Take a Chance on Me" as the last element.

After updateRecords(2548, "artist", ""),
artist should not be set

After updateRecords(1245, "tracks", "Addicted to Love"),
tracks should have "Addicted to Love" as the last element.

After updateRecords(2468, "tracks", "Free"),
tracks should have "1999" as the first element.

After updateRecords(2548, "tracks", ""),
tracks should not be set


Выбрать № тел. США (21)Validate US Telephone Numbers

Выбрать № тел. США
21-ый день программы "#100 Days Of Code"

Несмотря на кажущуюся простоту задания, оно забрало у меня достаточно много времени. Время было потрачено с пользой на углубленное изучение дополнительного материала по регулярным выражениям!

Учитывая то, что нам предложено в задании сделать возврат именно в булевом выражении, то я остановился на методе test()

Решил воспользоваться подсказкой, которую дали в задании. Для этого приведу его полностью:

Return true if the passed string is a valid US phone number.

The user may fill out the form field any way they choose as long as it is a valid US number. The following are examples of valid formats for US numbers (refer to the tests below for other variants):

555-555-5555
(555)555-5555
(555) 555-5555
555 555 5555
5555555555
1 555 555 5555

For this challenge you will be presented with a string such as 800-692-7753 or 8oo-six427676;laskdjf. Your job is to validate or reject the US phone number based on any combination of the formats provided above. The area code is required. If the country code is provided, you must confirm that the country code is 1. Return true if the string is a valid US phone number; otherwise return false.

В общем, я решил пойти путем простым и просто выбрать номера, которые будут являться допустимыми стандартами США

Так как, метод test() вернет значение true если номера заданы по стандарту, то мне осталось просто прописать это в условие. Для наглядности, я вынес его в отдельную переменную.

^ - начало, $- конец строки(якоря) И далее - первая единица или пробел , ? - ленивый поиск В скобочную группу выбрал первые три цифры в скобках или без, Далее пробел или "-" в наборе (диапазоне), затем три цифры и опять или пробел или дефис и четыре цифры. Ну и везде - ленивый поиск.

В этом задании задействованы почти все классы, символы и прочее, что можно было почерпнуть в учебнике.

Думаю, что для более подробного изучения, мне стоит к этому еще не раз вернуться. Пока что, я постарался выбрать и объяснить решение именно так.



function telephoneCheck(str) {

    var re = /^1? ?(\(\d{3}\)|\d{3})[ -]?\d{3}[ -]?\d{4}$/;
   

    return re.test(str);
}

telephoneCheck("555)-555-5555");



Ответы:

telephoneCheck("555-555-5555")
return a boolean.

telephoneCheck("1 555-555-5555")
return true.

telephoneCheck("1 (555) 555-5555")
return true.

telephoneCheck("5555555555")
return true.

telephoneCheck("555-555-5555")
return true.

telephoneCheck("(555)555-5555")
return true.

telephoneCheck("1(555)555-5555")
return true.

telephoneCheck("555-5555")
return false.

telephoneCheck("5555555")
return false.

telephoneCheck("1 555)555-5555")
return false.

telephoneCheck("1 555 555 5555")
return true.

telephoneCheck("1 456 789 4444")
return true.

telephoneCheck("123**&!!asdf#")
return false.

telephoneCheck("55555555")
return false.

telephoneCheck("(6505552368)")
return false

telephoneCheck("2 (757) 622-7382")
return false.

telephoneCheck("0 (757) 622-7382")
return false.

telephoneCheck("-1 (757) 622-7382")
return false

telephoneCheck("2 757 622-7382")
return false.

telephoneCheck("10 (757) 622-7382")
return false.

telephoneCheck("27576227382")
return false.

telephoneCheck("(275)76227382")
return false.

telephoneCheck("2(757)6227382")
return false.

telephoneCheck("2(757)622-7382")
return false.

telephoneCheck("555)-555-5555")
return false.

telephoneCheck("(555-555-5555")
return false.

telephoneCheck("(555)5(55?)-5555")
return false.


Аргументы дополнительные (20) Arguments Optional

Аргументы дополнительные
20-ый день программы "#100 Days Of Code"

Наша задача - Создайте функцию, которая суммирует два аргумента вместе. Если только один аргумент указан, то возвращает функцию, которая ожидает один аргумент и возвращает сумму.


For example, addTogether(2, 3) should return 5, and addTogether(2) should return a function.
Calling this returned function with a single argument will then return the sum:
var sumTwoAnd = addTogether(2);
sumTwoAnd(3) returns 5.

Далее создадим переменную для результата и начинаем создание условий "Если"

Если длина всего псевдомассива аргументов три и менее, то первый аргумент будет равен первой переменной а второй - другой. Создали эти переменные.

Честно говоря, я посмотрел в результаты, которые будет принимать и отдавать наша функция и немножко поленился делать проверку на !isNaN(), но ниже я приведу решение полностью

Теперь нам на помощь приходит typeof(). Проверяем, является ли второй аргумент числом и если да, то проверим и второй. Если оба - числа, то вернем их сумму.

Иначе, если второй аргумент не определен, а первый это число, то вернем функцию (как по условию задания), которая заведомо вернет undifened

Предложены ссылки:



function addTogether() {
  var results;
  if(arguments.length <=3){
    var a1 = arguments[0];
    var a2 = arguments[1];
    if(typeof(a2)==='number'){
      if(typeof(a1) ==='number'){
      
        results = a1 +a2;
      }
    } else if(a2===undefined && typeof(a1)==='number'){
      return function(a2){
        if(typeof(a2)==='number'){
          return a1 + a2;
        }
        else return results;
      };
    }
  }
  return results;
}

addTogether(2,3);



С проверкой на NaN


unction addTogether() {
  var response;
  if (arguments.length <= 3) { 
    var a = arguments[0];
    var b = arguments[1];
    if (!isNaN(b) && typeof(b) === 'number') { 
      if (!isNaN(a) && typeof(a) === 'number') {
        response = a + b;
      } 
    } else if (b === undefined && typeof(a) === 'number') {
      return function(b) {
        if (!isNaN(b) && !isNaN(a) && typeof(b) === 'number' && arguments.length === 1) { return a + b; }
        else return response;
      };
    }
  }  
  return response;
}

addTogether(2)(3);

Ответы:

convertHTML("abc")
return abc.



addTogether(2, 3)
return 5.

addTogether(2)(3)
return 5.

addTogether("http://bit.ly/IqT6zt")
return undefined.

addTogether(2, "3")
return undefined.

addTogether(2)([3])
return undefined.


Функция повтора строки заданное кол-во раз (19) -Repeat a string repeat a string

Функция повтора строки заданное кол-во раз

-Repeat a string repeat a string
19-ый день программы "#100 Days Of Code"

Не знаю, стоит ли здесь что - либо объяснять, но попробую.

Итак, мы должны повторить строку определенное кол-во раз (равное - num). Для этого есть метод str.repeat(num)

Он позволяет нам проделать эту операцию сразу.

В условии, так же сказано, что при num < 0 , функция должна вернуть пустую строку.

Я написал это условие через if



function repeatStringNumTimes(str, num) {
  
  if(num > 0){
    return str.repeat(num);
  } else {
    str = "";
  }
  return str;
}

repeatStringNumTimes("abc", 3);



Ответы:

repeatStringNumTimes("*", 3)
return "***".

repeatStringNumTimes("abc", 3)
return "abcabcabc"

repeatStringNumTimes("abc", 4)
return "abcabcabcabc"

repeatStringNumTimes("abc", 1)
return "abc".

repeatStringNumTimes("*", 8)
return "********"

repeatStringNumTimes("abc", -2)
return ""



Бинарный код в текст(18) Binary Agents

Бинарный код в текст(18) Binary Agents
18-ый день программы "#100 Days Of Code"

Для доступа к каждому коду в строке нам нужно разделить её на коды, которые соответствуют одной букву или символу. Используем split()

Если коротко, то parseInt(stSp[i], 2) - получаем число из строки с двоичным представлением - цифра 2.

Переводим значения Юникода в буквы stSp[i] = String.fromCharCode(parseInt(stSp[i], 2));

Объединяем буквы в строку и возвращаем значение.



function binaryAgent(str) {
 
  var stSp = str.split(' ');
  for( var i = 0; i < stSp.length; i++){
   stSp[i] = String.fromCharCode(parseInt(stSp[i], 2));
  }
  return stSp.join("");
}

binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");



Ответы:

binaryAgent("01000001 01110010 01100101 01101110 00100111
01110100 00100000 01100010 01101111 01101110 01100110 01101001
01110010 01100101 01110011 00100000 01100110 01110101 01101110
00100001 00111111")

return "Aren't bonfires fun!?"

binaryAgent("01001001 00100000 01101100 01101111 01110110
01100101 00100000 01000110 01110010 01100101 01100101 01000011
01101111 01100100 01100101 01000011 01100001 01101101
01110000 00100001")

return "I love FreeCodeCamp!"


Многомерный массив в массив с отбором элементов -(17) Steamroller

Многомерный массив в массив с отбором элементов - Steamroller
17 день программы "#100 Days Of Code"

Пробовал решить через reduce(). Ниже приведу. Но мне кажется что правильнее так. Метод forEech() нам предоставит доступ к элементу любой степени вложенности. Остается просто проверить и выбрать подходящий. В нашем случае - НЕ являющийся массивом элемент. Иначе продолжим переборю



function steamrollArray(arr) {
  
  var newArray = [];
  myFunction(arr);
  function myFunction(arr){
    arr.forEach(function(subarray){
      if(!Array.isArray(subarray)) {
        newArray.push(subarray);
      } else {
        myFunction(subarray);
      }
    });
  }
  return newArray;
}

steamrollArray([1, [2], [3, [[4]]]]);



Можно решить и так!

function steamrollArray(arr) {
 var newArray = arr.reduce(function(a, b) {
    return a.concat(b);
  }, []);
  var myArr = newArray.join('');
  return myArr.split('');
}
steamrollArray([1, [2], [3, [[4]]]]);

Ответы:

steamrollArray([[["a"]], [["b"]]])
return ["a", "b"].

steamrollArray([1, [2], [3, [[4]]]])
return [1, 2, 3, 4].

steamrollArray([1, [], [3, [[4]]]])
return [1, 3, 4].

steamrollArray([1, {}, [3, [[4]]]])
return [1, {}, 3, 4].


Функция метода filter() - Finders Keepers(16)


16-ый день программы "#100 Days Of Code"

Задание звучит так:
Создайте функцию, которая просматривает массива (первый аргумент) и возвращает первый элемент в массиве, который проходит тест на истину (второй аргумент).

Рекомендуется воспользоваться Array.prototype.filter() - см. ссылку ниже.

Сразу на ум пришло простое решение:



function findElement(arr, func) {
  var num = 0;
  for(var i = 0; i < arr.length; i++){
    if(func(arr[i])){
       return arr[i];
     } 
   } 
 }
findElement([1, 2, 3, 4], function(num){ return num % 2 === 0; });


Решение достаточно простое - Перебирать массив arr циклом for, и если - в массиве будет число, при котором - if функция будет работать (true) - то есть выполнится ее условие - num % 2 === 0;, то вернет найденное число в массиве.

Задние система приняла и посчитала выполненным, но меня не оставляло чувство, что я сделал что-то не совсем так, потому что не использовал предложенный метод filter().

Решил попробовать еще один вариант:



function findElement(arr, func) {

   return num = arr.filter(func)[0];

findElement([1, 2, 3, 4], function(num){ return num % 2 === 0; });

Здесь я воспользовался методом filter() для проверки массива на заданное условие - function(num) и вернул первый элемент, который подошел по условиям функции - [0].

Это необходимо было делать, потмоу что фильтрация массива - возвращает все элементы, которые подходят под эти условия.


Ответы:

findElement([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; })
return 8.

findElement([1, 3, 5, 9], function(num) { return num % 2 === 0; })
return undefined.


Наименьшее общее кратное (15) Smallest Common Multiple

Наименьшее общее кратное - Smallest Common Multiple
15-ый день программы "#100 Days Of Code"

Не знаю даже как правильно сформулировать задание. Если честно, то на понимание того, что от меня требовалось, ушло больше времени, чем на решение. Попробую сформулировать своими словами, а вы, если что, то загляните в ответы внизу поста.

Нам будет представлены некие два числа, а мы должны найти наименьшее кратное (т.е то число, которое делится без остатка), не только для этих чисел, но и для тех целых чисел, которые будут находиться в промежутке между ними. Например:([2, 5]) это не только для 2 и 5, но и для 3, и 4!

Большее или меньшее число находится на первой позиции мы не знаем, как и не знаем промежуток. Поэтому я решил вначале отсортировать arr по возрастанию - sort() и если промежуток равен 1 (числа рядом), то сделать сразу возврат их произведения, которое и будет наименьшим общим кратным.

arr.sort();
if(arr[1] - arr[0] === 1){
return arr[1]*arr[0];
}

Далее запускаем цикл while с циклом for внутри него, для того, чтобы перебрать все элементы между заданными числами (от большего к меньшему)
for(var i = arr[1]-2; i >=arr[0]; i--)

Для проверки мы создали переменную var somNum = arr[1]*(arr[1]-1); куда мы поместили произвольное число полученное при умножении бОльшего заданного на бОльшее - 1.

Для работы цикла while создал переменную work. ЛОна же будет прерывать его, когда значение будет найдено.

Для перебора создал переменную select



function smallestCommons(arr) {
  arr.sort();
  if(arr[1] - arr[0] === 1){
    return arr[1]*arr[0];
  } 
  var work = true;
  var somNum = arr[1]*(arr[1]-1);
  var select = 0;
  while(work){
    for(var i = arr[1]-2; i >=arr[0]; i--){
      if(somNum % i === 0) select++;
else break;
    }if(select=== arr[1]- arr[0] -1){
      work = false;
      return somNum;
    }else{
      select = 0;
      somNum +=arr[1]*(arr[1]-1);
    
    }
  }
 
}


smallestCommons([1,5]);



Ответы:

smallestCommons([1, 5])
return a number.

smallestCommons([1, 5])
return 60.

smallestCommons([5, 1])
return 60.

smallestCommons([1, 13])
return 360360.

smallestCommons([23, 18])
return 6056820.


Сумма простых чисел -Sum All Primes(14)


день программы "#100 Days Of Code"

Задание сводится к тому, что нам нужно найти сумму простых чисел в заданном интервале

Задачу можно разделить на: поиск простого числа, добавление этого числа в массив и сложение всех чисел массива

Определение простого числа из Википедии:

Просто́е число́ (др.-греч. πρώτος ἀριθμός) — натуральное (целое положительное) число, имеющее ровно два различных натуральных делителя — единицу и самого себя. Другими словами, число x является простым, если оно больше 1 и при этом делится без остатка только на 1 и на x. К примеру, 5 — простое число, а 6 является составным числом, так как, помимо 1 и 6, также делится на 2 и на 3.

Разбор примера:

Создаем две переменные. Одна из них - пустой массив, куда будут помещаться простые числа. Вторая - рабочая. Она нужна для выполнения или прерывания цикла .

Первым циклом мы отбираем все числа от 2 до заданного числа. Вторым - мы проверяем делиться ли каждое из этих чисел без остатка на другие, возможные числа. Если делится:if(i%prArray[j]===0), то цикл прерываем.

Все простые числа отправляются в созданный нами массив

Теперь остается только сложить все числа нового массива:
var summa = prArray.reduce(function(a,b){
return a+b;
});

Новую переменную для суммы, можно и не создавать, но так выглядит более наглядно.

Второй вариант решения мало отличается от первого. Там несколько другой подход в определении простого числа и добавлении его в массив.

function sumPrimes(num) {
  var prArray = [];
  var prNum;
  for(var i = 2; i <= num; i++){
    prNum = true;
    for(var j= 0; j <= num-1; j++){
      if(i%prArray[j]===0){
        prNum = false;
        break;
      }
    }if(prNum){
    prArray.push(i);
  }
  }
 var summa = prArray.reduce(function(a,b){
   return a+b;
 }); 
  return summa;
}

sumPrimes(10);


Второй вариант решения:



function sumPrimes(num) {
  var newArr = [];
  var simNum = [];

  
  for(var i = 2; i <= num; i++){
    if(!newArr[i]){
      simNum.push(i);
    
    for(var j = i<<1; j <= num; j+=i){
     newArr[j] = true;
    }
   }
  }
 function sum(a,b){ 
  return a+b;
 }
  return simNum.reduce(sum, 0);
}

sumPrimes(10);



Ответы:

sumPrimes(10)
return a number.

sumPrimes(10)
return 17.

sumPrimes(977)
return 73156.


Последовательность Фибоначи - Sum All Odd Fibonacci Numbers (13)

Последовательность Фибоначи
13-ый день программы "#100 Days Of Code"

Первые два числа в последовательности Фибоначчи равны 1 и 1. Каждое дополнительное число в последовательности является суммой двух предыдущих чисел. Первые шесть цифр последовательности Фибоначчи 1, 1, 2, 3, 5 и 8.

Учитывая, что Num положительное целое число, возвращает сумму всех нечетных чисел Фибоначчи, которые меньше или равны NUM.

Например, sumFibs (10) должен возвращать 10, потому что все нечетные числа Фибоначчи меньше чем 10: 1, 1, 3 и 5.

Так, как последовательность начинается с 0 и 1, то создали две переменные Num1 и Num2 с такими значениями.

Для решения этой задачи нам потребуется знать сумму двух последних чисел - sumNum и вариант ответа - answer

Задаем цикл while() , в котором, пока самое большее число последовательности Num2 меньше или равно заданному числу - num, мы выполняем проверку нашего числа на то, что оно является нечетным . И если так, то наш ответ становится суммой чисел нашей последовательности.

В этом же цикле ниже (а код выполняется сверху вниз), мы вначале определяем сумму двух последних чисел массива и потом передвигаем наши два номера на порядок выше (в конец нашей последовательности)

Цикл повторяется, пока условие верно.

Ответом будет сумма всех нечетных чисел последовательности -answer



function sumFibs(num) {
  var Num1 = 0;
 var Num2 = 1;
  var sumNum = 0;
  var answer = 0;
  while(Num2 <= num){
    if(Num2 % 2 !== 0){
      answer += Num2;
    }
    sumNum =Num1 + Num2;
    Num1 = Num2;
    Num2 = sumNum;
    
  }
  return answer;
}

sumFibs(4);



Ответы:

sumFibs(1)
return a number.

sumFibs(1000)
return 1785.

sumFibs(4000000)
return 4613732.

sumFibs(4)
return 5.

sumFibs(75024)
return 60696.

sumFibs(75025)
return 135721.


Spinal Tap Case(12)

Замена в строке символов и букв

Spinal Tap Case
12-ый день программы "#100 Days Of Code"

Как вы можете увидеть из ответов к заданию, нам предстоит написать код, который все слова сделает в нижнем регистре и добавит между ними "-"

Материал по регулярным выражениям очень нужный и достаточно сложный. Мне кажется, что придется уделить ему намного больше времени, чем я подумал вначале.

Пока что, думаю, что стоит остановиться на объяснении действий функции.

Как уже понятно, replace(), будет менять одно на другое. То есть , например вот такое выражение: var nstr = "ILoveJavaScript";
alert(nstr.replace(/([a-zA-Z])([^a-zA-Z]|(?=[A-Z]))/g,"$1 "));

Вернет строку разделенную пробелом I Love Java Script

А вот такое выражение:
alert(nstr.replace(/\s/g,"-"));
I-Love-Java-Script

Заменит пробелы /\s/g на дефис.

Остается сделать вывод в нижнем регистре toLowerCase();



function spinalCase(str) {
 
  return str.replace(/([a-zA-Z])([^a-zA-Z]|(?=[A-Z]))/g,"$1-").toLowerCase();
}

spinalCase('This Is Spinal Tap');



Ответы:

spinalCase("This Is Spinal Tap")
return "this-is-spinal-tap".

spinalCase("thisIsSpinalTap")
return "this-is-spinal-tap".

spinalCase("The_Andy_Griffith_Show")
return "the-andy-griffith-show".

spinalCase("Teletubbies say Eh-oh")
return "teletubbies-say-eh-oh".

spinalCase("AllThe-small Things")
return "all-the-small-things".


Преобразование HTML элементов - Convert HTML Entities (11)

Преобразование HTML элементов
Convert HTML Entities

11-ый день программы "#100 Days Of Code"

Никогда задание не было таким легким! А может быть это только показалось мне на первый взгляд? И я предлагаю не самое простое и лучшее решение? Как бы то ни было, но задание уже сдано и теперь я его публикую на ваш строгий суд.

Кто ведет блоги или сайты по программированию, или пробовал написать какой - то кусочек HTML кода на странице сайта, знают, что это сделать не так - то просто, потому что код будет тут же преобразован и вы увидите действие а не сам код.

Для отображения тегов и других знаков кода используются специальные символы и другие сочетания знаков. В этом задании нам и предложено написать такой код, который будет заменять HTML символы, специальными знаками.

Если у вас остались вопросы по заданию, то есть смысл посмотреть ответы внизу поста.

Для нашего удобства предложены следующие ссылки:

Для решения задания, я воспользовался примером:

var str = 'Twas the night before Xmas...';
var newstr = str.replace(/xmas/i, 'Christmas');
console.log(newstr); // Twas the night before Christmas...

Это самое простое, методом replace("Что меняем","На что меняем");

Вот что у меня получилось:



function convertHTML(str) {

     str= str.replace(/&/g,"&amp;"); 
     str= str.replace(/</g,"&lt;");   
     str= str.replace(/"/g,"&quot;");   
     str= str.replace(/'/g,"&apos;");  
     str= str.replace(/>/g,"&gt;");

  return str;
}
convertHTML("Dolce & Gabbana");



Ответы:

convertHTML("Dolce & Gabbana")
return Dolce &​amp; Gabbana.

convertHTML("Hamburgers < Pizza < Tacos")
return Hamburgers &​lt; Pizza &​lt; Tacos.

convertHTML("Sixty > twelve")
return Sixty &​gt; twelve.

convertHTML('Stuff in "quotation marks"')
return Stuff in &​quot;quotation marks&​quot;.

convertHTML("Shindler's List")
return Shindler&​apos;s List.

convertHTML("<>")
return &​lt;&​gt;.

convertHTML("abc")
return abc.





Diff Two Arrays (10)

Разница двух массивов Diff Two Arrays
Десятый день программы "#100 Days Of Code"

Вернет только уникальные (не повторяющиеся) элементы двух массивов, сравнив элементы первого и второго массива между собой. Если не совпадают то добавит в новый массив и вернет

Создали новый пустой массив.Для поиска значений в массиве используем indexOf(), а для отсеивания одинаковых (фильтрации), используем filter()

Просто сравниваем между собой два массива по очереди и если совпадений нет, то добавляем в новый массив.

function diffArray(arr1, arr2) {
  var newArr = [];
  // Same, same; but different.
  var numArr1 = arr1.filter(function(n){
    if(arr2.indexOf(n) < 0){
       return true;
       } else { 
         return false;
       }
  });
  
  var numArr2 = arr2.filter(function(n){
    if(arr1.indexOf(n) < 0){
      return true;
    } else {
      return false;
    }
    });
    
  newArr = numArr1.concat(numArr2);
  return newArr;
}

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5])
return an array.

["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]
return ["pink wool"].

["andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]
return ["diorite", "pink wool"].

["andesite", "grass", "dirt", "dead shrub"], ["andesite", "grass", "dirt", "dead shrub"]
return [].

[1, 2, 3, 5], [1, 2, 3, 4, 5]
return [4].

[1, "calf", 3, "piglet"], [1, "calf", 3, 4]
return ["piglet", 4].

[], ["snuffleupagus", "cookie monster", "elmo"]
return ["snuffleupagus", "cookie monster", "elmo"].

[1, "calf", 3, "piglet"], [7, "filly"]
return [1, "calf", 3, "piglet", 7, "filly"].


Sorted Union (9)

Sorted Union

Функция будет выбирать из всех массивов только представленные элементы, без повторов
Девятый день программы "#100 Days Of Code"

Создаем переменную - пустой массив. Сюда будем собирать не повторяющиеся цифры.

В переменную numArr добавим новый массив .Так, как arr является не массивом, а массивоподобным объектом, то у меня были сложности с решением этого задания. Помогло то, что "Метод slice() может использоваться для преобразования массивоподобных объектов / коллекций в новый массив Array. Вам просто нужно привязать метод к объекту. Псевдомассив arguments внутри функции как раз является примером «массивоподобного объекта»". Более подробно о этом методе с примером.

Создаем переменную comArr - это общий массив, который получается после reduce(). Обратите внимание, что функции работают в присвоенных значениях переменных.

Далее все просто. Так как у нас есть общий массив и пустой массив мы выбираем в него не повторяющиеся элементы (newArr.indexOf(comArr[i]) === -1), путем перебора массива циклом for.

В новый массив попадают только новые элементы, которых нет в массиве ( -1).



function uniteUnique(arr) {
  var newArr =[];
  var numArr = Array.prototype.slice.call(arguments, 0);
  
  var comArr = numArr.reduce(function(a, b){
    return a.concat(b);
  },[]);
 
for(var i = 0; i < comArr.length; i++){
  if(newArr.indexOf(comArr[i]) === -1){
      newArr.push(comArr[i]);
  }
}
  return newArr;
}

uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);


uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1])
return [1, 3, 2, 5, 4].

uniteUnique([1, 3, 2], [1, [5]], [2, [4]])
return [1, 3, 2, [5], [4]].

uniteUnique([1, 2, 3], [5, 2, 1])
return [1, 2, 3, 5].

uniteUnique([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8])
return [1, 2, 3, 5, 4, 6, 7, 8].


Булевые примитивы (Boo who) (8)

Восьмой день программы "#100 Days Of Code"
Задание - Булевые примитивы

Вот задание полностью:


Boo who Check if a value is classified as a boolean primitive. Return true or false.

Boolean primitives are true and false.

Remember to use Read-Search-Ask if you get stuck. Try to pair program. Write your own code.

Here are some helpful links:

Ссылка на Boolean Objects


Честно говоря, я это задание решил просто по тому, что должна вернуть данная функция. В подробности не вдавался. Видимо это еще предстоит.

Буду благодарен, если кто - то сможет мне объяснить, что это и как решить правильно! :-)


function booWho(bool) {
 
 if(bool === true || bool === false) {
   return true;
 }
  
  return false;
}

booWho(null);

booWho(true)
return true.

booWho(false)
return true.

booWho([1, 2, 3])
return false.

booWho([].slice)
return false.

booWho({ "a": 1 })
return false.

booWho(1)
return false.

booWho(NaN)
return false.

booWho("a")
return false.

booWho("true")
return false.

booWho("false")
return false.


Пропущенные буквы

Пропущенные буквы - Missing letters

Седьмой день программы "#100 Days Of Code"
Функция, которая ищет пропущенные буквы в части строки, данной в алфавитном порядке. Если находит, то возвращает пропущенную букву, а если нет, то должна вернуть undefined

Если не понятно задание. то лучше сразу посмотреть на ответы в конце поста

Я решил эту задачу исходя из того, что каждой< букве будет соответствовать свой Юникод, а так как, в алфавитном порядке Юникод будет отличаться только на единицу , то ...

Решил строку превратить в массив и далее сделать перебор массива, переводя все буквы в Юникод и добавляя их в конец нового, пустого массива

Для перевода букв в Юникод я использовал String.prototype.charCodeAt()

Теперь в новом массиве мы имеем последовательность цифр Юникода. Наша задача найти пропущенную цифру. Для этого я решил запустить второй цикл for.

Вот эта строка условия ((numArray[k]+1) < (numArray[k+1])) то есть, если следующая цифра будет больше, чем +1, то нужно к Юникоду предыдущей цифры прибавить единицу. Тем самым, мы получим Юникод недостающей буквы. Теперь делаем возврат. Юникод переводим в буквы, String.fromCharCode()

Да и возврат num в конце - обязательное условие, иначе не получим - желаемый undefined

function fearNotLetter(str) {
var numArray = [];
var num ;
var strArray = str.split("");
var ch;
for(var i = 0; i < strArray.length; i++){
  numArray.push(str.charCodeAt(i));
}
for(k = 0; k < numArray.length; k++){
  if((numArray[k]+1) < (numArray[k+1])){
    num = numArray[k]+1;
     return String.fromCharCode(num);
  }  
 
} 
  return num; 
}

fearNotLetter("abce");

Второй вариант решения

Здесь совершенно другой подход в том, что нужно создать отдельный массив с алфавитом

Полученную строку переводим в верхний регистр и разделяем ее по буквам. В отдельную переменную помещаем весь алфавит в верхнем регистре. Отдельно создаем переменную, которая будет находить в нашем алфавите первую букву от начала заданной нам последовательности. Создаем отдельно переменную под последнюю букву

Делаем проверку, сопоставляя буквы в двух массивах. Если находим несовпадение, то возвращаем эту букву в нижнем регистре.

Отдельно возвращаем undefined

Ничего не могу сказать по поводу этого решения, но мне первое нравится больше. Мне кажется, что оно более полно отражает возможности JavaScript

Друзья, а что думаете вы?
Есть ли у вас свои , отличные от этих решения?

Оставляйте комментарии, или ссылки на ваш gitHub, freeCodeCamp, Codepen или другие ресурсы.
Давайте дружить!

function fearNotLetter(str) {
  str = str.toUpperCase();
  str = str.split("");
  var alphabet =['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
  var startRange = alphabet.indexOf(str[0]);
  var endRange = alphabet.indexOf(str[str.length-1]);
  
  
  for (var i=0; i < str.length; i++) {
    
    if (str[i] != alphabet[startRange+i]) {
      //str.splice(i, 0, alphabet[startRange+i]);
      //return str[i].toLowerCase();

      return alphabet[startRange+i].toLowerCase();
    }else {
      
    }
  }
  return undefined;
}

fearNotLetter("abce");
fearNotLetter("abce")
return "d".

fearNotLetter("abcdefghjklmno")
return "i".

fearNotLetter("bcd")
return undefined.

fearNotLetter("yz")
return undefined.

Цепочка ДНК (DNA)

Шестой день программы "#100 Days Of Code"
Задание - написать функцию, которая будет формировать цепочку ДНК из представленной РНК

Если есть желание вспомнить, что такое ДНК и последовательность нуклеотидов в ней, то можно погуглить, или посмотреть в Википедии.

Главное, что нам предстоит сделать, это задать соответствие представленным нуклеотидам и сформировать из этих пар подмассивы. Затем поместить их в массив и вывести его на экран.

Осталось только вспомнить, что нуклеотиды соответствуют друг другу парами:Аденин - Тимин, Гуанин - Цитозин, и наоборот.

То есть, нам нужно подставить к каждому нуклеотиду из заданной цепочки соответствующий и сформировать из них пары.

Если не понятно задание, то лучше просто посмотреть ответы - что должна вернуть функция, в конце поста.

Начнем с того, что представленная последовательность у нас - строка. Для того, чтобы мы могли обратиться к ней по индексам, или сделать перебор всей строки циклом for нам нужно получить массив.

Для того, чтобы полученные пары нуклеотидов, а в нашем случае пары букв, мы создали пустой массив

Теперь, согласно заданному соответствию, мы пишем цикл switch, который будет подставлять нужное значение в нашу переменную, при каждом проходе цикла.

Запускаем цикл перебора массива for и в действии пишем, что в конец нового массива мы хотим добавить "подмассив" (в [] - скобках) пар значений. Где первое значение - это значение заданного массива (строки str) и соответствующего ему варианта, полученного путем перебора в switch

Остается теперь сделать возврат этого значения нашей функцией.


function pairElement(str) {
  var strArray = str.split("");
  var newArray = [];
  var toLet = function(test){
    switch(test){
      case "A":
        return "T";
      case "T":
        return "A";
      case "G":
        return "C";
      case "C":
        return "G";
      default:
        break;
    }
  };
for(var i = 0; i < strArray.length; i++){
  newArray.push([strArray[i], toLet(strArray[i])]);
}
  
  return newArray;
}


Вариант решения Spicyn Sergey


function pairElement(str) {
var pairs = {'A': 'T', 'T': 'A', 'C': 'G', 'G': 'C'};
return str.split('').map(function(nbase) {
return [nbase, pairs[nbase]];
});
}
pairElement("GCG");

pairElement("ATCGA")
return [["A","T"],["T","A"],["C","G"],["G","C"],["A","T"]].

pairElement("TTGAG")
return [["T","A"],["T","A"],["G","C"],["A","T"],["G","C"]].

pairElement("CTCTA")
return [["C","G"],["T","A"],["C","G"],["T","A"],["A","T"]].


Pig Latin

Функция добавляющая "way", если слово начинается с гласной и добавляющая согласные из начала в конец слова с прибавлением окончания"ay"

Пятый день программы "#100 Days Of Code"

Задание называется Pig Latin - Латынь Свиньи, наверное.

Дано следующее задание:

function translatePigLatin(str) {

return str;
}

translatePigLatin("consonant");

Суть задания в том, что нужно написать функцию, которая будет принимать слово на английском (в нижнем регистре) и преобразовать это слово таким образом, чтобы получилось так:

Если слово начинается с главной буквы, то просто добавить к нему окончание - way

Если с согласной, то нужно перенести ВСЕ согласные в конец слова в такой же последовательности и прибавить окончание - ay

Если условие не понятно, то лучше посмотрите на то, что должна сделать функция, в конце поста

Используемые методы:

Создаем три переменные. Одна из них будет разделять строку, превращая ее в массив. Другая будет искать в строке гласные буквы . Третья, будет возвращать подстроку с указанной позиции.

Далее записываем так:if (str.search(/[aeiou]/g) === 0) {
strArray.push("w", "a", "y");
str = strArray.join("");
return str;
}


То есть, если на первом месте будет главная в конец массива будет добавлены по буквам ("w", "a", "y")

В другом случае, включится цикл поиска for in в подстроке, который удалит согласную из начала строки и добавит её в конец, прибавив окончание - ay и вернет результат

Последнее действие, которое мы производим - это объединяем массив опять в строку и результат возвращает уже заданная функция.

Ниже привожу полученный код полностью.


function translatePigLatin(str) {
  var strArray = str.split("");
  var vowNum = str.search(/["aeoui"]/g);
  var subStr = str.substr(0, vowNum);
if(vowNum === 0){
  strArray.push("w","a","y");
   return strArray.join("");
}
for(var i in subStr){
   strArray.push(subStr[i]);
   strArray.shift(subStr[i]);
}
   strArray.push("a","y");
  return strArray.join("");
}

translatePigLatin("consonant");

translatePigLatin("california")
return "aliforniacay".
translatePigLatin("paragraphs")
return "aragraphspay".
translatePigLatin("glove")
return "oveglay".
translatePigLatin("algorithm")
return "algorithmway".
translatePigLatin("eight")
return "eightway".

Функция меняющая слово в строке с учетом регистра

Четвертый день программы "#100 Days Of Code".
Сегодня нужно написать функцию, которая будет менять слово в строке с учетом регистра
Search and Replace

Дано следующее задание:

function myReplace(str, before, after) {

return str;
}

myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");


На первый взгляд мне показалось задание слишком простым и я попробовал его решить методом replace(). Все было бы хорошо, и строка на входе, и замену производит, НО регистр не учитывает.

Поэтому пришлось подойти к решению с другой стороны. Первым делом, для того чтобы была возможность обратиться к каждому отдельному слову, пришлось превратить строку в массив методом split()

Теперь появилась возможность сделать проверку того, является ли первая буква слова, подлежащего замене, заглавной

Для этого мы используем наш любимый if

if(before[0] === before[0].toUpperCase() ) {
after = after.charAt(0).toUpperCase() + after.slice(1);
}

В действии смой функции - на строке с переменной after используем метод charAt(). Он вернет нам заглавную букву в замененном слове, если в заменяемом она была заглавная. Но этот метод вернет только одну заглавную буквуДля того, чтобы вернуть все слово стоит применить метод slice(), с аргументом - 1. То есть вернуть все буквы данного слова начиная со второй. Теперь нам остается присоединить их к первой, заглавной букве +

Поскольку, мы уже имеем дело со str, как с массивом, а не строкой, то придется отказаться от метода replace(), которым я пытался решить задачу с первого раза и вспомнить о старом , добром переборе массива for

for(var i = 0; i < str.length; i++) {
if(str[i] == before) {
str[i] = after;
return str.join(' ');
}
}

Думаю, что здесь все понятно без объяснений. Остановлюсь только на том, что в конце мы объединяем массив в строку методом join()

Все ссылки, которые я привел в тексте, возможно, будут полезны тем, кто захочет более подробно прочитать о данных методах.

Ниже привожу полученный код полностью.



function myReplace(str, before, after) {
str = str.split(' ');
  
  if(before[0] === before[0].toUpperCase() ) {
    after = after.charAt(0).toUpperCase() + after.slice(1);
  }
  
  for(var i = 0; i < str.length; i++) {
    if(str[i] == before) {
      str[i] = after;
      return str.join(' ');
    }
  }
  return str;
}

myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");

Примеры того, что вернет функция:


myReplace("Let us go to the store", "store", "mall")
return "Let us go to the mall".
myReplace("He is Sleeping on the couch", "Sleeping", "sitting")
return "He is Sitting on the couch".
myReplace("This has a spellngi error", "spellngi", "spelling")
return "This has a spelling error".
myReplace("His name is Tom", "Tom", "john")
return "His name is John".
myReplace("Let us get back to more Coding", "Coding", "algorithms")
return "Let us get back to more Algorithms".


Функция поиска в массиве объектов с определенными свойствами

Третий день программы

Сегодня будет задание с объектами и массивами
Wherefore art thou

Задание звучит так:

Сделайте функцию, которая просматривает массив объектов (первый аргумент) и возвращает массив всех объектов, которые имеют соответствующие свойства и пары значений (второй аргумент). Каждое свойство и значение пара исходного объекта должен присутствовать в объекте из коллекции,и если так, то он должен быть включен в возвращаемый массив.

Заданное начало кода выглядит так:

function whatIsInAName(collection, source) {
// What's in a name?
var arr = [];
// Only change code below this line
// Only change code above this line
return arr;
}
whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });

Для решения этой задачи мы воспользуемся методами:

Очень неплохо вспомнить методы перебирающие массивы можно здесь -learn.javascript.ru, на русском языке.


Я решил эту задачу так:


function whatIsInAName(collection, source) {
  // What's in a name?
   var prop = Object.keys(source);
  // Only change code below this line
    return collection.filter(function (smb) {
    for(var i = 0; i < prop.length; i++) {
      if(!smb.hasOwnProperty(prop[i]) || smb[prop[i]] !== source[prop[i]]) {
        return false;
      }
    }
    return true;
  });
  
  
  // Only change code above this line
  
}

whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });

Более подробно стоит рассмотреть каждый метод.

Логика решения здесь следующая:

Для того, чтобы нам в массиве collection искать свойства объекта source нам нужно знать эти самые свойства. Потому что это может быть first, или а, или ещё какое - либо значение.

Для этого мы воспользуемся методом Object.keys(obj).

Как следует из описания:

Метод Object.keys возвращает массив строковых элементов, соответствующих именам перечисляемых свойств, найденных непосредственно в самом объекте. Порядок свойств такой же, как и при ручном перечислении свойств в объекте через цикл.

Пример:

var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // консоль: ['0', '1', '2']

В нашем случае alert вернет - last

var source = { last: "Capulet" };
var prop = Object.keys(source);
alert(prop);
// last

Теперь у нас есть свойство last которое мы поместили в переменную var prop

Это позволяет нам теперь найти такое свойство в массиве collection. Для этого нам стоит воспользоваться методом Array.prototype.filter()

Этот метод выбран потому, что он позволяет провести проверку массива с поиском заданного свойства. А так же, метод filter() создаёт новый массив со всеми элементами, прошедшими проверку, задаваемую в передаваемой функции.

Синтаксис метода:

arr.filter(callback[, thisArg])

Здесь:

callback
Функция проверки каждого элемента. Вызывается с аргументами (element, index, array). Возвращает true для сохранения элемента и false для его пропуска.
thisArg
Необязательный параметр. Значение, используемое в качестве this при выполнении функции callback.

Описание:

Метод filter() вызывает переданную функцию callback один раз для каждого элемента, присутствующего в массиве, и конструирует новый массив со всеми значениями, для которых функция callback вернула true или значение, становящееся true при приведении в boolean. Функция callback вызывается только для индексов массива, имеющих присвоенные значения; она не вызывается для индексов, которые были удалены или которым значения никогда не присваивались. Элементы массива, не прошедшие проверку функцией callback, просто пропускаются и не включаются в новый массив.

Теперь мы применим этот метод к нашему массиву colection и в качестве аргумента зададим уже знакомую функцию перебора массива for. For будет перебирать свойства, полученные от source и искать через метод фильтр формировать новый массив, если такие свойства будут найдены.

Выглядит это так:

function whatIsInAName(collection, source) {
var prop = Object.keys(source);

return collection.filter(function (smb) {
for(var i = 0; i < prop.length; i++) {
if(!smb.hasOwnProperty(prop[i]) || smb[prop[i]] !== source[prop[i]]) {
return false;
}
}
return true;
});

Теперь стоит остановиться на строке с if

Здесь мы отсеиваем те объекты массива, которые не имеют данного свойства

Остается более подробно остановиться на Методе hasOwnProperty().Он возвращает логическое значение, указывающее, содержит ли объект указанное свойство. То есть, если свойство есть, то true. Мы в первой строке идем от обратного добавляя НЕ = (!)

То есть - теперь мы получили функцию, которая вернет нам только те объекты, в которых обнаружит данные свойства.

Примеры того, что вернет функция:


whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" })
return [{ first: "Tybalt", last: "Capulet" }].

whatIsInAName([{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }], { "a": 1 })
return [{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }].

whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 })
return [{ "a": 1, "b": 2 }, { "a": 1, "b": 2, "c": 2 }].

whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "c": 2 })
return [{ "a": 1, "b": 2, "c": 2 }].




Конвертер арабских цифр в римские

Второй день программы

Сегодня построением конвертера, который переводит арабские цифры в римские.
Roman Numeral Converter

Для начала нам нужно понять, что многие римские цифры получаются путем сложения. Например римская цифра VIII - получается из V + III. (5+3), а III = I + I + I

Следовательно, нам нужно выделить только особо идентичные цифры (которые не получаются путем сложения

Эти римские символы мы представили в массиве var romSim

Их арабские аналоги мы представили с той же последовательности в массиве арабских чисел - var arNum

Для полученных путем сложения, и не только, римских символов, мы создали пустой массив - var myRomSim = [];

Теперь мы создаем цикл for для перебора всех римских символов в массиве.

Внутри него мы создаем цикл while, для сравнения заданного числа num с нашим созданным массивом арабских чисел var arNum

Теперь цикл будет находить точно такое же число (или меньшее) в массиве арабских чисел и добавлять аналог этого числа [i] из массива римских символовvar romSim в наш пустой массив var myRomSim = [];

При выполнении этого число num будет уменьшаться на найденное арабское num -= arNum[i];

Цикл будет повторяться столько раз, пока весь остаток не будет добавлен к римскому символу.

Например: Зададим число 8. Первое, что надет цикл - V, но останется 3. Поэтому цикл запустится еще раз и добавит только I, останется 2. Еще два раза и получим -VIII


function convertToRoman(num) {
 var myRomSim = [];
  var romSim = ['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I'];
  var arNum = [1000,900,500,400,100,90,50,40,10,9,5,4,1];
  for(i = 0; i < romSim.length; i++){
    while(num >= arNum[i]){
      myRomSim +=romSim[i];
      num -= arNum[i];
    }
  }
 return myRomSim;
}

convertToRoman(36);


Функция: "Каждое слово в строке с заглавной буквы"

Первый день программы

Сегодня занимался разбором функции, которая делает заглавными каждую первую букву, каждого слова в строке

Функция будет принимать значение в виде строки str и преобразовывать строку.

Название функции можно дать произвольно. Например titleCase или любое другое.

Вначале создадим новый пустой массив - var myArr

Создали новую переменную var arr, в которую поместили значения нашей строки strсделав все буквы маленькими методом .toLowerCase() и превратив ее в массив методом .split(" ") , разделив по пробелу.

Далее мы запускаем функцию for - обычного перебора массива.

Внутри этой функции создадим новую переменную var word , в которой и будет находиться наше каждое слово массива с заглавной буквы.

Для этого мы к каждому слову (элементу массива arr[i] применяем метод .replace((arr[i].charAt(0)),(arr[i].charAt(0).toUpperCase()));, где заменяем первую букву слова (элемента массива) (arr[i].charAt(0)) - первая часть метода .replace. То есть - здесь мы показываем, что мы будем менять

А вторым значением этого метода мы показываем - на что будем менять. В нашем случае на (arr[i].charAt(0).toUpperCase())То есть - на заглавный первые буквы.

Теперь каждое слово после нужного преобразования, мы добавляем в новый массив. Добавляем методом push();. То есть - в конец массива. И учитывая последовательность работы цикла мы получим прежнюю последовательность слов, но уже с заглавной буквы каждое.

Тепрь, нам только остается преобразовать наш массив в строку, методом .join(' '); и вернуть содержимое.


function titleCase(str) {
  var myArr = [];
  var arr = str.toLowerCase().split(" ");
for(i = 0; i < arr.length; i++){
  var word = arr[i].replace((arr[i].charAt(0)),(arr[i].charAt(0).toUpperCase()));
myArr.push(word);
}
  return myArr.join(' ');
}

titleCase("I'm a little tea pot");