Отлично сыграно, 2020.

Как будто этот год не был достаточно ужасающим, в настоящее время над Пуэрто-Рико происходит событие Polvo del Sahara (Сахарный воздушный слой), которое, по прогнозам, будет худшим за всю историю человечества (по крайней мере, худшим за последнее время). 50 лет!) Вот как это выглядит:

Конечно, местный звездный метеоролог Ада Монсон также упомянула, что вчера было около шести часов с индексом жары более 100 градусов! Как вы помните, 2020 год начался с землетрясений силой 6,4 балла и афтершоков 5+ по шкале Рихтера в юго-западном регионе Пуэрто-Рико. Это было целую жизнь назад, еще в январе. Подробнее об этом читайте здесь:



А что еще, что еще? О, сегодня типичный праздник Ноче-де-Сан-Хуан; традиция, которую мы унаследовали от Испании еще в те времена, когда они были нашими колонизаторами. Вы спросите, что обычно происходит на Ноче-де-Сан-Хуан? Ну, люди идут на пляжи и в полночь должны семь раз броситься назад в море. Почему? Потому что они хотят вступить в новый год, очищенный от прежних плохих поступков и т. Д. Это сочетание религиозных и языческих обычаев, поскольку оно должно в некоторой степени совпадать с летним солнцестоянием. Вот дополнительная информация, если это вас заинтересовало:



История, обычаи, традиции Ноче-де-Сан-Хуан: специальное предложение« Пляжный четверг
Какое отношение имеет история Ноче-де-Сан-Хуан к Пляжному четвергу , спросите вы? Ну все! Через веселье… www.latinabroad.com »



Однако, поскольку мы все еще находимся в разгаре глобального кризиса здравоохранения, связанного с коронавирусом Covid-19, и последующей изоляции, любой, кто осмелится сделать то, что обычно сделал бы в Ноче-де-Сан-Хуан, нарушит комендантский час, а значит, нарушая закон.

Переходим к программированию. Мне нравится решать (некоторые) алгоритмы, как мне нравится решать (некоторые) головоломки. Я помню, как научился решать судоку, потому что был в гостях у друга в Мадриде, и именно он научил меня, что это такое. (¡Hola N!) С тех пор я обнаружил этот замечательный канал на YouTube, где прекрасный британский решатель головоломок по имени Саймон Энтони в реальном времени рассказывает о своем мыслительном процессе о том, как он подходит к самому нелепому судоку. Я не могу насытиться.

На прошлой неделе я решил зайти в ближайший магазин игрушек, так как: 1 - большинство магазинов недавно открылось, и 2 - мои дети - у обоих есть дни рождения прямо перед праздниками - получают большую часть своего ежегодного притока подарков в течение двух недель. между Рождеством и Днем трех королей. (Да! Дети в Пуэрто-Рико обычно получают подарки утром 6 января, если и только если они взяли коробку и вышли косить траву для верблюдов, тогда они должны покинуть указанную коробку. под их кроватями. На каких верблюдах? Те, на которых ездят, конечно же, Трое Королей. Читатель, пожалуйста, не отставай.) В любом случае, изоляция заставила их просить новые припасы. Это один из тех, что я купил:

Не обманывайте себя, в нем говорится, что это для 8-летних и старше, и ни мой муж, ни я, оба старше 8 лет, не могли понять этого. Как ни странно, мы продолжим попытки. Как ни странно, 8-летний ребенок может взломать эту книгу раньше нас.

Последнее упражнение Codewars, которое я выполнил, было помечено как 4Kyu. Я уже упоминал, что ката тем сложнее, чем меньше число, и в настоящее время я оцениваюсь как 5Kyu Codewarrior, так что этот должен был быть вне моей досягаемости прямо сейчас. Вот о чем все это было:

Next bigger number with the same digits
Create a function that takes a positive integer and returns the next bigger number that can be formed by rearranging its digits. For example:
nextBigger(num: 12)   // returns 21 
nextBigger(num: 513)  // returns 531 
nextBigger(num: 2017) // returns 2071
If the digits can't be rearranged to form a bigger number, return -1 (or nil in Swift):
nextBigger(num: 9)   // returns nil 
nextBigger(num: 111) // returns nil 
nextBigger(num: 531) // returns nil

Я немного псевдокодировал перед тем, как начать: (Шаг 1) Создайте функцию, которая (Шаг 2) проверяет введенное число, снизу вверх, сравнивая каждую цифру с цифрой рядом с ней: (Шаг 3) если цифра справа больше, чем его левый сосед, сломайте и сделайте что-нибудь, и (Шаг 4), если мы не найдем тот, который больше, чем тот, что слева от него, верните -1. Просто, правда?

function nextBigger(n){
  console.log(n);
}

Во-первых, давайте создадим несколько полезных переменных вверху:

function nextBigger(n){
  let numArr = n.toString().split('');
  let endArr = [];
  let index;
  let placeholder;
}

Первая переменная numArr содержит введенное число в виде массива строковых чисел. Я также создаю пустой массив (endArr), переменную с именем index и одну с именем placeholder. Далее, давайте переберемся (т. Е. Пройдемся по массиву, внимательно изучив его), от начала до конца:

function nextBigger(n){
  let numArr = n.toString().split('');
  let endArr = [];
  let index;
  let placeholder;
  for(let i = numArr.length - 1; i >= 0; i--){    
    if(numArr[i] > numArr[i-1]){
      index = i;
      break;
      } else {
      endArr.push(numArr[i]);
      }
    }
}

С помощью этого оператора «если» мы проверяем, больше ли число справа, чем число рядом с ним (сравнивая единицы с десятыми, десятые с сотнями и т. Д.). Если это произойдет, я запишу позицию индекса с помощью переменной index и прерву цикл. Я также ловлю остальные цифры там, где это сравнение не выполняется, в переменной endArr. Могут произойти три вещи: 1 - мы не находим индекс (например, в случае числа, состоящего из одной цифры, например «9», или числа, которое представляет собой одно и то же число в нескольких позициях, например «111» , или даже число, где условие не выполняется, например, «531»; 2 - мы сразу же находим большее число, например, с «513» (а endArr пусто); и 3 - мы находим позицию индекса, где цифра справа больше той, что находится рядом с ней, но только после нескольких раундов итерации (и, следовательно, заполнения переменной endArr). Давайте поскорее избавимся от вариантов 1 и 2, не так ли ?:

function nextBigger(n){
  let numArr = n.toString().split('');
  let endArr = [];
  let index;
  let placeholder;
  for(let i = numArr.length - 1; i >= 0; i--){    
    if(numArr[i] > umArr[i-1]{
      index = i;
      break;
      } else {
      endArr.push(numArr[i]);
      }
    }
  if(!index){
    return -1;
  } else if (index && endArr.length == 0){
    placeholder = numArr[index-1];
    numArr[index-1] = numArr[index];
    numArr[index] = placeholder;
    return parseInt(numArr.join(''));
  }
}

Инструкции просят вас вернуть «-1» в тех случаях, когда нет числа nextBigger, которое можно было бы сделать с такими же заданными цифрами. Случай «else if» относится к случаям, когда следующая большая цифра может быть получена просто путем переключения цифр единиц измерения на десятые, делая «21» из «12», «531» из «513» и «2071» из «2017». Я немного погуглил и не нашел простого переключателя, который занимал бы меньше строк кода. Я просто держу одну цифру в переменной-заполнителе и меняю их порядок, используя ее. Следующий случай вызвал у меня наибольшие затруднения, поэтому лучшее я оставил напоследок. Потерпите меня:

function nextBigger(n){
  let numArr = n.toString().split('');
  let endArr = [];
  let index;
  let placeholder;
for(let i = numArr.length - 1; i >= 0; i--){    
    if(numArr[i] > umArr[i-1]{
      index = i;
      break;
      } else {
      endArr.push(numArr[i]);
      }
    }
if(!index){
    return -1;
  } else if (index && endArr.length == 0){
    placeholder = numArr[index-1];
    numArr[index-1] = numArr[index];
    numArr[index] = placeholder;
    return parseInt(numArr.join(''));
  } else {
//I'm going to need to check which of the numbers, either the one at //numArr[index] or one of the ones in the endArr, is closest to the //one at numArr[index-1] position, so I'm creating this helper //function, checkNum
    function checkNum(num){
      return num > numArr[index -1 ];}
    }
    if ((endArr.find(checkNum)) && (endArr.find(checkNum) <      numArr[index])){
      for(let i = endArr.length - 1; i >= 0; i--){
        if(endArr[i] === endArr.find(checkNum)) {
          placeholder = endArr.splice(i, 1).toString();
          break;
        }
      }
      endArr.push(numArr[index - 1]);
      endArr.push(numArr[index])
      endArr.sort();
      numArr[index-1] = placeholder;
      numArr.splice(index, endArr.length);
      return parseInt(numArr.concat(endArr).join(''));
      } else {
      placeholder = numArr[index];
      endArr.push(numArr[index - 1]);
      endArr.sort();
      numArr[index -1] = placeholder;
      numArr.splice(index, endArr.length);
      return parseInt(numArr.concat(endArr).join(''));
    }
  }
}

Ооооо, как там вдруг стало ужасно страшно! После вспомогательной функции numCheck это «if» означает, что если есть число, большее, чем то, которое я пытаюсь заменить, и («&&» означает «И», поэтому оба утверждения должны быть истинными), если это число меньше чем тот, который находится в позиции numArr [index], то это тот, который мы хотим заменить на номер в numArr [index-1], чтобы создать следующее большее число. Пример может помочь: nextBigger (58756103483994) - это один из 150 тестовых примеров, которые Codewars использует при отправке вашего кода - перейдет ко вторым 9 (я возвращаюсь вперед, помните?) И переключил бы '3' рядом с ним ставится «4», образуя число, заканчивающееся на «4399». Как только мы находим цифры, которые нужно переключить, остальные помещаются в endArr, сортируются и присоединяются к остальным числам в исходном массиве.

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

👋🏽