Решение задачи с собеседования: numberWithSpaces

2024 ж. 14 Сәу.
5 620 Рет қаралды

Согласно задания, требуется:
1) реконструировать логику кода, пояснить что он делает;
2) переписать код образом, который полностью соответствует логике оригинального кода, но при этом делает тоже самое и лучше;
3) критерием работоспособности кода, является тест, присутствующий в задании;
4) обнаружить ошибку в оригинальном коде и предложить ее исправление.
ссылка на оригинальную формулировку:
drive.google.com/drive/folder...
Таймкоды:
будут после
AsForJs новости в Telegram: t.me/AsForJavaScript
AsForJs Talks в Telegram: t.me/AsForJsTalks
Поддержать маленького бородатого JavaScript-ра
Карта Приват (Bobrov Maksym): 5168745021397333
USDT Tron (TRC20): TKoZu59WHiX6L6qvwYTYTsZJerDrnAHBTx
USDT etherium (erc20): 0x75fb8a62dfcf453b2e73f1ef1c407d46f918fffa
TON: UQAGXvuhxg3qU0eFgOxtdDlKXqdp1zPq6yCRSRbRYQClxOzH
bitcoin:bc1q74aru82v4d3alay7p53jdwkmxe4a5gz7fmvfm2?message=AsForJS&time=1686349743
PayPal: demimurych@protonmail.com
/ demimurych
Boosty: boosty.to/asforjs
Документ:
⎡~sobes ~14 ~refact ~numberWithSpaces⎦

Пікірлер
  • очень крутой разбор в ходе которого Мурыч рассказывает много всего полезного!!!

    @_Good_Evening_@_Good_Evening_28 күн бұрын
  • Благодарю, спасибо за то что вы делаете

    @TrancePartyVideo@TrancePartyVideoАй бұрын
  • Красивый видос!

    @reybrown6616@reybrown661617 күн бұрын
  • Задачка интересная!👍 Пробовал найти какое-то красивое и лаконичное её решение. Казалось бы, вот его уже нащупал: const newFunc = (x, fullValue) => { const log10 = Math.log10(Math.abs(x)); if (!fullValue && log10 >= 12) { return (x < 0 ? '-' : '') + '999B+'; } if (fullValue || log10 < 6) { return x.toLocaleString('en', { maximumFractionDigits: 20, }).replaceAll(',', ' '); } return new Intl.NumberFormat('en', { notation: 'compact', roundingMode: 'trunc', maximumSignificantDigits: log10 % 3 < 1 ? 3 : 4, }).format(x); }; Но 2 теста из 12 таки проваливаются. Хэх...😔

    @SerzhNesteruk@SerzhNesteruk14 күн бұрын
  • Расскажите про функцию - это реверсинжинирнг?! Ба!!!

    @sledleo@sledleo7 күн бұрын
  • Цікавий процес розбору коду. Дякую за матеріал і вітання з Чернігова ;)

    @funtik1991@funtik199128 күн бұрын
    • Celo чи salo

      @sledleo@sledleo7 күн бұрын
  • Ваш канал - скарбниця знань! Стільки важливої інфи ніде не отримаєш!!

    @khrystynaovdeichuk5994@khrystynaovdeichuk5994Ай бұрын
  • Интересует часть задания со звёздочкой. Из-за того, что без крайней необходимости используется конструкция try...catch, функция numberWithSpaces при вызове без аргументов (или с первым аргументом null) вместо того, чтобы упасть (что было бы вполне логично), возвращает undefined. Как вариант решения этой проблемы, мне кажется, лучше просто бросить исключение (при некорректном первом аргументе), а ловить и обрабатывать его уже непосредственно при вызове функции. 🤔

    @SerzhNesteruk@SerzhNesterukКүн бұрын
    • Само решение можно оформить, например, так: const newFunc = (x, fullValue) => { if (x == null) { throw new TypeError(`The first argument cannot be ${x}`); } const numeric = x.toString(); const { length } = numeric; if (fullValue || length < 7) { return new Intl.NumberFormat('uk-UA', { maximumFractionDigits: 20, }).format(x).replace(',', '.'); } if (length > 12) { return '999B+'; } const [start, end, symbol] = length > 9 ? [-12, -9, 'B'] : [-9, -6, 'M']; const offset = length % 3 ? 2 : 1; const extraZeros = length % 3 - 1 ? /\.?0+$/ : /0$/; const integerPart = numeric.slice(start, end); const fractionalPart = numeric.slice(end, end + offset); return (integerPart + '.' + fractionalPart).replace(extraZeros, '') + symbol; };

      @SerzhNesteruk@SerzhNesterukКүн бұрын
  • Никогда не надо на 100% доверять ТЗ тестовых заданий. Они вообще в большинстве случаев некорректны. Я запомнил на всю жизнь, как когда-то, лет 7-8 назад, выполнял тестовое задание на вакансию PHP/Symfony джуна. Решил четко следовать ТЗ, хотя там тоже были такие очевидные недочеты, в том числе никаких требований по валидации данных. Тестовое сделал, меня даже похвалили проверяющие за стиль написания кода. В фидбеке написали, что редкий соискатель так грамотно может оформлять код, читаемость на высоте. Но они не готовы мне сделать предложение, так как я упустил валидацию данных и еще пару моментов, о которых в ТЗ не было ни слова. А разработчик, если в ТЗ чего-то нет, по их мнению должен об этом позаботиться сам. 😅 Хреново то, что когда получаешь тестовое, как и несколько сот других соискателей, тебе не будет никто ничего пояснять и отвечать на вопросы.

    @phat80@phat8024 күн бұрын
  • Ого, мне это тестовое прислали)))

    @SolidMaxim@SolidMaximАй бұрын
    • Какое гадкое тестовое. За него хотя бы платили?) Я в такое соглашаюсь нырять только за деньги, как правило :| Особенно когда вижу, что код написан чисто чтобы попортить нервы соискателю.

      @EvolMate@EvolMateАй бұрын
    • @@EvolMate я его и не собирался делать, оно не оплачивается.

      @SolidMaxim@SolidMaximАй бұрын
    • интересно, если его прогнать в chatGPT, что выдаст =) ?

      @l1feGood@l1feGood29 күн бұрын
    • @@l1feGood чат гпт такое решать не умеет, есть нейронки заточенные специально для задач под код, почекай

      @stillsiderq5181@stillsiderq518128 күн бұрын
    • @@stillsiderq5181Работающие программисты спокойно пользуются GPT 4 и полностью довольны. Есть знакомый, пишет энтерпрайз на Java. Оплачивает только подписку на GPT 4. И ему не надо никаких специфичных нейронок. Пробовал несколько, в том числе заточенных под разработку, они оказались не лучше, если не хуже. А если они не лучше, то зачем использовать узкоспециализированный инструмент, когда можно использовать инструмент общего назначения?

      @phat80@phat8024 күн бұрын
  • Не подскажите, вот, ссылаясь на ваши же эфиры, js-код на уровне v8 может быть преобразован как к состоянию байт кода ( обязательный этап ), так и к состоянию машинного кода ( вследствие работы компилятора с уже сформированным байт кодом ). И с машинным кодом всё понятно, он есть, его можно как-то передать процессору и тот его исполнит. А что в случае с байт кодом? Его процессор, насколько я понимаю, прочитать не может. Я читал о том, что байт код якобы исполняется в рамках виртуальной машины v8, но не совсем понимаю что это значит и насколько это правдиво. Мне не понятно, как вообще код может исполниться, будучи не преведённым к машинному представлению, учитывая что это единственная форма кода, с которой процессор может работать. В конце концов у нас же всё равно есть машина и на ней есть процессор с определённой архитектурой. И так или иначе, чтобы наша машина что-то сделала нужно дёргать этот самый процессор.

    @user-sw4ed4gh9n@user-sw4ed4gh9n23 күн бұрын
  • А чи є можливість трішки урізноманітнити музикальну колекцію? 😅

    @ivan.karbashevskyi@ivan.karbashevskyi29 күн бұрын
  • Так а где правильная реализация данной функции?

    @l1feGood@l1feGood29 күн бұрын
    • Согласно условию задания, его суть в реконструкции логики оригинальной функции. И в построении новой функции, которая бы полностью повторяла поведение первой. Иными словами, следуя условию задачи - написать првильную функцию нельзя, так как оригинальная содержит массу проблем, которые мы обязаны повторить.

      @demimurych1@demimurych129 күн бұрын
    • Вероятно, это задача на рефакторинг. Нам нужно просто убрать дублирование кода и вложенность огромного количества условных операторов. Единственной "правильной реализации" здесь, скорее всего, нет. Напрашивается, к примеру, стандартный приём Replace Nested Conditional with Guard Clauses (хотя Мурыча в нём очень смутит применение нескольких return). Условия первого блока if и последнего блока else можно объединить (Consolidate Conditional Expression). А форматирование числа для условных миллионов и миллиардов можно реализовать существенно иначе, полностью сохранив внешнее поведение функции, но избежав switch...case и вязанки if...else.

      @SerzhNesteruk@SerzhNesteruk13 күн бұрын
  • Число заменяет числом с двумя десятичными знаками ( с точкой) + буквенным указанием количества миллиардов (b billion) , миллионов М million.., фуллвалью тру когда результат без букв с пробелами..

    @TrancePartyVideo@TrancePartyVideo29 күн бұрын
    • И ты ошибся. В общем случае - это действительно так. Однако оригинальная функция содержит ряд "cспецифических поведений", которые прямо зависят от длины строки, чем делают невозможным решение в общем случае. Например когда длина строки 7 символов.

      @demimurych1@demimurych127 күн бұрын
    • @@demimurych1 скорее всего, просто это мои предположения пока такие, исходное - парсефлоатом приводим к числу, и исходя из его значения и параметра фулвалью округляем , дальше перегоняем обратно в строку и форматируем с м и b если нужно, я ещё не досмотрел, досмотрю постараюсь понять как вы сделали.

      @TrancePartyVideo@TrancePartyVideo27 күн бұрын
    • ​@@TrancePartyVideo Спасибо за интересную идею!👍 Попробовал её реализовать. Вот, что получилось: const newFunc = (x, fullValue) => { try { const numeric = x.toString(); const { length } = numeric; if (fullValue || length < 7) { return x.toLocaleString('en', { maximumFractionDigits: 20, }).replaceAll(',', ' '); } if (length > 12) { return '999B+'; } const [start, end, symbol] = length > 9 ? [-12, -9, 'B'] : [-9, -6, 'M']; const offset = length % 3 ? 2 : 1; const integerPart = numeric.slice(start, end); const fractionalPart = numeric.slice(end, end + offset); return parseFloat(integerPart + '.' + fractionalPart) + symbol; } catch (e) { console.log(`[newFunc] error with ${e}`); } } Все 12 тестов проходят успешно (а это означает, что задача таки решена), хотя функции всё же не совсем эквивалентны. Например numberWithSpaces(1.2345678) возвращает "1.2.3M", а newFunc(1.2345678) - "1.2M".

      @SerzhNesteruk@SerzhNesteruk14 күн бұрын
  • ще не вмерла але вже незабаром

    @scottjenkinsjr@scottjenkinsjr27 күн бұрын
KZhead