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

Как найти число из его трехзначных комбинаций?

Если имеется 8-значное число 65478209 (цифры в номере могут повторяться) и даны комбинации всегда в порядке числа, то если даны все комбинации 8с3 = 56 комбинаций то каким будет кратчайшее решение узнать число) ?

Примером сценария может быть вход в банк, когда пользователю нужно ввести 3 случайных цифры своего кода, например 3-ю, 5-ю и 6-ю, где это одна из комбинаций 8c3. Итак, если даны все комбинации 8c3, то каким будет решение/логика для нахождения числа? (или первое число, если в качестве решения есть еще числа)

Для решения проблем на языке программирования входными данными будет массив из 56 комбинаций из 3 цифр, и мы должны найти код, который равен «65478209» или что-то в этом роде.


  • Это на самом деле очень интересно. Это что-то вроде решателя судоку. Моя первая мысль без программирования — сделать кучу массивов. Вы знаете, что цифры не повторяются? неповторяющиеся цифры делают это намного проще. 09.03.2016
  • @ goodguy5, да, цифры могут повторяться. Очень интересно решить эту проблему, но я не уверен, как ориентироваться в сообществе, и не смог найти решения в Интернете. Было бы хорошо, если бы вы, ребята, могли вводить информацию 10.03.2016

Ответы:


1

Как насчет использования перестановки? Я пишу простой код в стиле c++. Проверь это.

int k = 3;
string digit = "65478209";
int digitLen = digit.length();

int* indexArr = new int[digitLen];
for(int i=0; i < digitLen; i++) indexArr[i] = i;

do
{
    bool isInOrder=true;
    string ret = "";
    for(int i=1; i < k; i++) if(indexArr[i] < indexArr[i-1])
    {
        isInOrder = false;
        break;
    }
    if(!(isInOrder)) continue;

    for(int i=0; i < k; i++) ret += digit[indexArr[i]];
} while(next_permutation(indexArr, indexArr+digitLen));

delete indexArr;

Редактировать

вот мое решение.

vector<string> combinations;
set<int> includedDigit;
vector<int> referCnt;

// Get reference count from all precedences
for(int i=0; i < combinations.size(); i++)
{
    string e = combinations[i];
    for(int j=0; j < k-1; j++)
    {
        includedDigit.insert(e.at(j) - '0');
        for(int l=j+1; l < k; l++)
        {
            int curDigit = e.at(l) - '0';
            referCnt.push_back(curDigit);
        }
    }
}

// Sorting reference counts with digit
vector<pair<int,int>> ret;
for(int i=0; i < 10; i++)
{
    int digitCnt = count(referCnt.begin(), referCnt.end(), i);
    if(digitCnt == 0 && includedDigit.find(i) != includedDigit.end()) ret.push_back(make_pair(1, i));
    else if(digitCnt != 0) ret.push_back(make_pair(digitCnt, i));
}
sort(ret.begin(), ret.end());

// Print the result
for(auto it=ret.begin(); it != ret.end(); it++)
{
    pair<int,int> val = *it;
    cout << val.second;
}

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

09.03.2016
  • Как вы знаете, преобразовать строку в int очень просто. std::stoi(str) 09.03.2016
  • Я имею в виду, что на входе будет массив из 56 комбинаций из 3 цифр, и нам нужно найти код 65478209. 09.03.2016
  • Хорошо. Я неправильно понял. Затем мы должны сделать карту для построения информации об отношении к цифрам. я отредактирую пост 09.03.2016
  • Я добавил решение. Пожалуйста, проверь это. 09.03.2016
  • @stak, я имею в виду, что логика есть. Вы должны быть в состоянии преобразовать язык. Вы пытались использовать этот пример, чтобы написать его на Java? Если да, то что у вас было зависание? Или вы просто хотите, чтобы вам дали готовый код? 10.03.2016
  • @ goodguy5, я не слишком хорошо знаком с синтаксисом C++, испытываю трудности с преобразованием в Java или C#. Я вижу, что есть разные наборы данных и операторы. Может ли кто-нибудь хотя бы прокомментировать шаги или предоставить на одном из вышеуказанных языков. Также я не уверен, что это направлено на повторяющиеся цифры в данном номере. 11.03.2016
  • @stak, разница между C++ и C# или Java невелика. Например, pair<int,int> можно легко изменить на HashMap<Integer,Integer> в Java. count и sort также являются общей функцией, которую вы знаете. Во всяком случае, я сказал, что этот код необходимо изменить для повторяющихся цифр. Я просто предлагаю начальную и более легкую версию этой проблемы в качестве отправной точки. Тем не менее, вы можете получить окончательный результат, который хотите, от этого решения. Почему бы вам не подумать глубоко? 11.03.2016
  • @stack, в Java есть Vector класс ссылка. cout используется для стандартного потока вывода, который эквивалентен System.out.print(). val.second указывает второе значение pair<int,int>. 11.03.2016

  • 2
    k = 3
    

    Следующий рекурсивный алгоритм выбирает все комбинации k-элементов из упорядоченного набора:

    1. Выберите i в качестве первого элемента.
    2. Объедините i с каждой из комбинаций k-1 элементов, выбранных рекурсивно из набора элементов, превышающих i.
    3. Повторите вышеописанное для каждого i в наборе.
    09.03.2016
    Новые материалы

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

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

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

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

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

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

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