Nano Hash - криптовалюты, майнинг, программирование

Это считается жестким кодированием?

У меня есть задание, в котором нам нужно взять строку s и позицию pos, и мне нужно «собрать» все целые числа в позиции. Например, если сказать 3 abcdef123, должно получиться abc123def (целые числа начинаются с позиции 3). Главная, где эти параметры приняты, не изображена.

Пример ввода может выглядеть так:

5 ab1cdefgh (1 перемещается на 5-й индекс)

6 1abcdefgh (1 перемещается на 6-й индекс)

8 1abcdefgh (1 перемещается в конец)

8 abcdefgh1 (1 не двигается)

0 1abcdefgh

-1 (выйти)

void gatherDigits(std::string& s, const int pos) {

int ints = 1;
int size = s.size();

for (int i = 0; i < size; i++) {
    if (std::isdigit(s.at(i))) {
        ints++;
    }
}

s = ""; 
char letter;
char l;
int count = 0;
for (letter = 'a'; letter <= 'z'; letter++) {
    if (count == pos) {
        l = letter;
        break;
    }
    s = s + letter;
    count++;
}   

for (int i = 1; i < ints; i++) {

    if (i == 10) {
        s = s + std::to_string(0);
    }
    else {

        s = s + std::to_string(i);
    }
}   

for (int i = pos + ints; i < size + 1; i++) {
    s = s + l;
    l++;
   }
}

Однако я столкнулся с затруднительным положением. Я не уверен, считается ли это жестким кодированием (нам явно указано не использовать жесткий код). Единственные переменные, которые нам разрешено использовать, это int и char, поэтому я настроил их таким образом. Кроме того, все входные примеры представлены в нижнем регистре от a до z и от 0 до 9 целых. Наш код должен выполняться за время O(n^2).

Более сложный ввод может выглядеть так:

6 12ab3cdefghij456klm7n8op9q0

Предлагаемое решение включает использование операторов подкачки. Мой код отвечает всем остальным требованиям, за исключением отсутствия операторов swap. В конце концов, я просто спрашиваю: можно ли считать это жестким программированием?

16.02.2016

  • Жесткое кодирование, например, будет заключаться в том, чтобы поместить входные значения в программу как значения, а не считывать их от пользователя. Тогда эти значения будут жестко закодированы. Жестко закодированные значения не могут изменяться во время выполнения. 16.02.2016
  • Единственная мысль, которую я вижу, может считаться жестким кодированием, — это магическое число 10 в строке if (i == 10). Я не уверен, почему это там. 16.02.2016
  • Также обратите внимание, что ваша программа может дать сбой на 0,001% (или около того) всех компьютеров, а именно на всех, которые не используют алфавит ASCII. Спецификация С++ говорит только о том, что закодированные цифры являются смежными, буквы не обязательно должны быть. Это позволит компиляторам C работать в системах, которые, например, используют алфавит EBCDIC, который есть промежутки между буквами. На самом деле сейчас вам не о чем беспокоиться, ASCII преобладает, и если вам нужно кодировать систему, которая не использует ASCII, вы это знаете. 16.02.2016
  • @JeremyFriesner, это потому, что десятое целое число должно быть нулем, а не 10. Мой код настроен таким образом, что он объединяет 10. Я, вероятно, попытаюсь найти лучшее решение, но это текущая ситуация. 16.02.2016
  • Вы уверены, что цифры и буквы всегда будут в таком порядке? Потому что если это так, вам, конечно, не нужно O (n ^ 2). Кроме того, если вам не нужно сохранять порядок букв и цифр, есть прекрасное решение O (n). 16.02.2016
  • @hubert: это была и моя первая мысль, но она неверна, не так ли? Цифры должны начинаться с указанной позиции; это только гарантирует, что есть целое число в указанной позиции или непосредственно перед ней. 16.02.2016
  • @hubert: в первом примере говорится, что целые числа начинаются с позиции 3. Я бы использовал поворот после двух стабильных_разделов. 16.02.2016
  • Я бы не рассматривал это жесткое кодирование. Одна вещь, которую вы могли бы улучшить в коде, — это использовать функции isalpha и isdigit из ‹cctype› для проверки типов символов. 16.02.2016
  • Я только что понял, что хард-код и хард-код сопоставляются в моем сознании с двумя совершенно разными значениями. 16.02.2016
  • @HubertApplebaum последний пример будет иметь результат: abcdef1234567890ghijklmnopq (где целые числа начинаются с 6-го индекса). Я согласен, что это странная серая область, поскольку я явно реструктурирую строку на основе индексов, но все примеры, приведенные в моем коде, работают - думаю, мне придется спросить у инструктора. 16.02.2016
  • Кроме того, целью является эффективное использование памяти. Это мой первый курс по C++, поэтому я понятия не имею, как это проверить. Из задания: поскольку цель состоит в том, чтобы эффективно использовать память, решениям, которые используют промежуточные строки (или буферы) для решения этой проблемы (использование целочисленных или символьных переменных допустимо, но не массивов, строк, векторов и т. д.), будет назначено только частичное счет 16.02.2016
  • @rici вот скриншот примеров ввода: imgur.com/a/R2Tfv 16.02.2016
  • @HubertApplebaum: Для вашего развлечения, вот перестановка O (n), которую я собрал прошлой ночью. Он не сохраняет порядок букв и цифр, но имеет определенную элегантность. Хотя он основан на алгоритме разделения Lomuto, он настолько отличается, что я не думаю, что это можно сделать с помощью стандартной библиотеки. (Вторая часть может быть, но к тому моменту, зачем беспокоиться :)) .com/a/765f532faa26ac84 16.02.2016
  • @Rob: К сожалению, все примеры вашего профессора имеют буквы и цифры в определенном порядке, поскольку это отвлекает от фактического описания проблемы. Лично я думаю, что вам не следует полагаться на это (и в этом суть ответа). Кстати, существует решение O(n log n), поэтому, если вы действительно хотите преуспеть, вы можете попытаться понять это. 16.02.2016

Ответы:


1

То, что вы сделали жестко запрограммированным, - это ожидание того, что буквы в строке начинаются с a и создают последовательность abcd...., а ваши цифры образуют 1234.... Я не могу сказать, будет ли ваш супервайзер считать это жестко запрограммированным, но это определенно делает ваш код довольно негибким, и я бы сделал это только в том случае, если эти свойства явно указаны в описании проблемы.

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

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

void gatherDigits(std::string& s, const int pos) {
    //moves all digits to the start of the range and returns the number of digits
    int cnt = std::stable_partition(s.begin(), s.end(), ::isdigit) - s.begin();

    //make sure we don't write past the end of the string
    assert(pos+cnt < s.size()); 

    //rotates the string such that the digits start at the correct place
    std::rotate(s.begin(), s.begin() + cnt, s.begin() + pos + cnt);
}
16.02.2016
  • Спасибо за ответ - мне нужно узнать о символах и цифрах. Будет ли мой исходный код считаться эффективным с точки зрения памяти? Мы не должны использовать какие-либо переменные, кроме int и char (для эффективного использования памяти), но нам разрешено иметь время выполнения O (n ^ 2). 16.02.2016
  • @HuberAppleBaum: Спасибо за исправления, но почему вы удалили пространство имен std перед isdigit? 16.02.2016
  • @Rob: я не вижу связи между использованием переменных int и char и эффективностью памяти, но я предполагаю, что ваше решение примерно настолько эффективно и быстро, насколько это возможно. Мое решение несколько неоптимально с точки зрения эффективности использования памяти, поскольку std::stable_partition обычно выделяет дополнительный буфер памяти. Однако оба решения решают разные задачи, и я все равно не проводил никаких измерений. 16.02.2016
  • @MikeMB: Возможно, он удалил std из std::isdigit, потому что он не компилируется :-). 16.02.2016
  • @rici: На каком компиляторе? Какой заголовок вы включили? 16.02.2016
  • @MikeMB: gcc 5.3 (coliru) / #include <cctype>: coliru.stacked-crooked.com/a/8c0dfde75828c7b9 16.02.2016
  • @rici: Интересно. Похоже, что libstdc++ (и, возможно, libc++, но не стандартная библиотека VC++) косвенно включает <locale>, который вводит функцию шаблона с тем же именем, поэтому компилятор не может решить, какую функцию использовать, что приводит к ошибке компилятора, которую вы видите. 16.02.2016
  • @MikeMB: Да, я пробовал и с libc++. У меня нет VС++. 16.02.2016
  • Да, я убрал префикс std иначе у вас двусмысленность. Вы можете либо исправить это с помощью лямбды, которая перенаправляет на std::isdigit, либо привести ее к правильному указателю функции, либо вызвать версию C, что я и сделал. Не стесняйтесь переходить на любую версию, которую вы предпочитаете (но эта самая короткая). 16.02.2016
  • @Hubert: Спасибо, я согласен, что это лучшее решение, и оставлю все как есть. 16.02.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..