Как найти подобные шаблоны в списках/массивах строк

правильный синтаксис для импорта зависимости npm в файл .sol следующий:

import "openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol"; //You don't need to write node_modules 

openzeppelin документация гласит:

Вам нужна среда разработки ethereum для выше операторы import для работы!

так что, вероятно, лучше использовать трюфель или Embark для компиляции и переноса вашего контракта.

И последнее, OpenZeppelin использует версию ^ 0.5.0 solidity, поэтому при переходе на компиляцию не забудьте использовать подходящую версию solc.

Дайте мне знать, если это сработало

6
задан StingyJack 1 April 2013 в 20:52
поделиться

8 ответов

Поскольку другие упомянули функцию, которую Вы хотите, Пересекаются. Если Вы используете.NET 3.0, рассматривают использование LINQ's, Пересекают функцию.

См. следующее сообщение для получения дополнительной информации

Рассмотрите использование LinqPAD для экспериментирования.

www.linqpad.net

2
ответ дан 8 December 2019 в 18:42
поделиться

Самый простой способ кодировать состоял бы в том, чтобы создать Словарь затем цикл через каждый объект в каждом массиве. Поскольку каждый объект делает это:

Проверьте, находится ли объект в словаре, раз так добавляют список к массиву. Если объект не находится в словаре, добавляет он и список.

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

3
ответ дан 8 December 2019 в 18:42
поделиться

Вот является использование решения модулем SuffixTree для определения местоположения подпоследовательностей:

#!/usr/bin/env python
from SuffixTree  import SubstringDict
from collections import defaultdict
from itertools   import groupby
from operator    import itemgetter
import sys

def main(stdout=sys.stdout):
    """
    >>> import StringIO
    >>> s = StringIO.StringIO()
    >>> main(stdout=s)
    >>> print s.getvalue()
    [['Mi', 'Fa']] In Arrays (1, 2)
    [['So', 'La', 'Ti']] In Arrays (1, 3)
    [['Jim', 'Bob', 'So']] In Arrays (2, 3)
    [['So']] In Arrays (1, 2, 3)
    <BLANKLINE>
    """
    # array of arrays of strings
    arr = [
        ["Do", "Re", "Mi", "Fa", "So", "La", "Ti",],
        ["Mi", "Fa", "Jim", "Bob", "So",],
        ["Jim", "Bob", "So", "La", "Ti",],
    ]

####    # 28 seconds  (27 seconds without lesser substrs inspection (see below))
####    N, M = 100, 100
####    import random
####    arr = [[random.randrange(100) for _ in range(M)] for _ in range(N)]

    # convert to ASCII alphabet (for SubstringDict)
    letter2item = {}
    item2letter = {}
    c = 1
    for item in (i for a in arr for i in a):
        if item not in item2letter:
            c += 1
            if c == 128:
                raise ValueError("too many unique items; "
                                 "use a less restrictive alphabet for SuffixTree")
            letter = chr(c)
            letter2item[letter] = item
            item2letter[item] = letter
    arr_ascii = [''.join(item2letter[item] for item in a) for a in arr]

    # populate substring dict (based on SuffixTree)
    substring_dict = SubstringDict()
    for i, s in enumerate(arr_ascii):
        substring_dict[s] = i+1

    # enumerate all substrings, save those that occur more than once
    substr2indices = {}
    indices2substr = defaultdict(list)
    for str_ in arr_ascii:
        for start in range(len(str_)):
            for size in reversed(range(1, len(str_) - start + 1)):
                substr = str_[start:start + size]
                if substr not in substr2indices:
                    indices = substring_dict[substr] # O(n) SuffixTree
                    if len(indices) > 1:
                        substr2indices[substr] = indices
                        indices2substr[tuple(indices)].append(substr)
####                        # inspect all lesser substrs
####                        # it could diminish size of indices2substr[ind] list
####                        # but it has no effect for input 100x100x100 (see above)
####                        for i in reversed(range(len(substr))):
####                            s = substr[:i]
####                            if s in substr2indices: continue
####                            ind = substring_dict[s]
####                            if len(ind) > len(indices):
####                                substr2indices[s] = ind
####                                indices2substr[tuple(ind)].append(s)
####                                indices = ind
####                            else:
####                                assert set(ind) == set(indices), (ind, indices)
####                                substr2indices[s] = None
####                        break # all sizes inspected, move to next `start`

    for indices, substrs in indices2substr.iteritems():
        # remove substrs that are substrs of other substrs
        substrs = sorted(substrs, key=len) # sort by size
        substrs = [p for i, p in enumerate(substrs)
                   if not any(p in q  for q in substrs[i+1:])]
        # convert letters to items and print
        items = [map(letter2item.get, substr) for substr in substrs]
        print >>stdout, "%s In Arrays %s" % (items, indices)

if __name__=="__main__":
    # test
    import doctest; doctest.testmod()
    # measure performance
    import timeit
    t = timeit.Timer(stmt='main(stdout=s)',
                     setup='from __main__ import main; from cStringIO import StringIO as S; s = S()')
    N = 1000
    milliseconds = min(t.repeat(repeat=3, number=N))
    print("%.3g milliseconds" % (1e3*milliseconds/N))

Требуется приблизительно 30 секунд для обработки 100 списков 100 объектов каждый. SubstringDict в вышеупомянутом коде мог бы быть эмулирован grep -F -f.

Старое решение:


В Python (сохраняют его в 'group_patterns.py' файл):

#!/usr/bin/env python
from collections import defaultdict
from itertools   import groupby

def issubseq(p, q):
    """Return whether `p` is a subsequence of `q`."""
    return any(p == q[i:i + len(p)] for i in range(len(q) - len(p) + 1))

arr = (("Do", "Re", "Mi", "Fa", "So", "La", "Ti",),
       ("Mi", "Fa", "Jim", "Bob", "So",),
       ("Jim", "Bob", "So", "La", "Ti",))

# store all patterns that occure at least twice
d = defaultdict(list) # a map: pattern -> indexes of arrays it's within
for i, a in enumerate(arr[:-1]):
    for j, q in enumerate(arr[i+1:]): 
        for k in range(len(a)):
            for size in range(1, len(a)+1-k):
                p = a[k:k + size] # a pattern
                if issubseq(p, q): # `p` occures at least twice
                    d[p] += [i+1, i+2+j]

# group patterns by arrays they are within
inarrays = lambda pair: sorted(set(pair[1]))
for key, group in groupby(sorted(d.iteritems(), key=inarrays), key=inarrays):
    patterns = sorted((pair[0] for pair in group), key=len) # sort by size
    # remove patterns that are subsequences of other patterns
    patterns = [p for i, p in enumerate(patterns)
                if not any(issubseq(p, q)  for q in patterns[i+1:])]
    print "%s In Arrays %s" % (patterns, key)

Следующая команда:

$ python group_patterns.py

печать:

[('Mi', 'Fa')] In Arrays [1, 2]
[('So',)] In Arrays [1, 2, 3]
[('So', 'La', 'Ti')] In Arrays [1, 3]
[('Jim', 'Bob', 'So')] In Arrays [2, 3]

Решение ужасно неэффективно.

3
ответ дан 8 December 2019 в 18:42
поделиться

Я взломал программу ниже приблизительно за 10 минут Perl. Это не прекрасно, это использует глобальную переменную, и это просто распечатывает количества каждого элемента, замеченного программой в каждом списке, но это - хорошее приближение к тому, что Вы хотите сделать, это суперлегко кодировать.

Вы на самом деле хотите все комбинации всех подмножеств элементов, характерных для каждого массива? Вы могли перечислить все элементы более умным способом, если бы Вы хотели, но если Вы просто хотели все элементы, которые существуют, по крайней мере, однажды в каждом массиве, Вы могли использовать команду Unix "grep-v 0" на выводе ниже, и это покажет Вам пересечение всех элементов, характерных для всех массивов. Ваш вопрос пропускает определенную деталь, таким образом, я не могу отлично реализовать что-то, что решает Вашу проблему.

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

#!/usr/bin/perl -w

use strict;

my @Array1 = ( "Do", "Re", "Mi", "Fa", "So", "La", "Ti");
my @Array2 = ( "Mi", "Fa", "Jim", "Bob", "So" );
my @Array3 = ( "Jim", "Bob", "So", "La", "Ti" );

my %counts;
sub count_array {
    my $array = shift;
    my $name  = shift;
    foreach my $e (@$array) {
        $counts{$e}{$name}++;
    }
}

count_array( \@Array1, "Array1" );
count_array( \@Array2, "Array2" );
count_array( \@Array3, "Array3" );

my @names = qw/ Array1 Array2 Array3 /;
print join ' ', ('element',@names);
print "\n";

my @unique_names = keys %counts;
foreach my $unique_name (@unique_names) {
    my @counts = map {
        if ( exists $counts{$unique_name}{$_} ) {
            $counts{$unique_name}{$_};
        } else {
            0;
        }
    }
    @names;

    print join ' ', ($unique_name,@counts);
    print "\n";
}

Вывод программы:

element Array1 Array2 Array3
Ti 1 0 1
La 1 0 1
So 1 1 1
Mi 1 1 0
Fa 1 1 0
Do 1 0 0
Bob 0 1 1
Jim 0 1 1
Re 1 0 0
2
ответ дан 8 December 2019 в 18:42
поделиться

Я уверен, что существует НАМНОГО более изящный путь, но...

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


        private void button1_Click(object sender, EventArgs e)
        {

            string[] array1 = { "do", "re", "mi", "fa", "so" };
            string[] array2 = { "mi", "fa", "jim", "bob", "so" };
            string[] pattern1 = { "mi", "fa" };
            MessageBox.Show(FindPatternInArray(array1, pattern1).ToString());
            MessageBox.Show(FindPatternInArray(array2, pattern1).ToString());

        }

        private bool FindPatternInArray(string[] AArray, string[] APattern)
        {
            return string.Join("~", AArray).IndexOf(string.Join("~", APattern)) >= 0;
        }
1
ответ дан 8 December 2019 в 18:42
поделиться

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

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

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

Эти функции должны быть стандартными на большинстве языков или довольно легкими записать себя.

1
ответ дан 8 December 2019 в 18:42
поделиться

Во-первых, запустите путем подсчета каждого объекта. Вы составляете временный список: Сделайте = 1, "Ми" = 2, "Таким образом", = 3, и т.д. можно удалить из временного списка все те, которые соответствуют = 1 (исключая: Сделайте). Временный список содержит список групповых объектов (сохраните его где-нибудь).

Теперь, Вы пытаетесь составить списки два от одного во временном списке и следующего в исходных списках. "Так" + "La" = 2, "Bob" + "Так" = 2, и т.д. Удалите тех с = 1. У Вас есть списки пары, которая появляется по крайней мере дважды (сохраните ее где-нибудь).

Теперь, попытайтесь составить списки 3 объектов путем взятия пары из временного списка, и взять следование из исходных списков. ("Ми", "Fa"), + "Так" = 1, ("Ми", "Fa") + "Jim" = 1, ("Так", "La") + "Ti" = 2 Удаляют тех с = 1. У Вас есть списки 3 объектов, который появляется по крайней мере дважды (сохраните его).

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

В конце Вы берете все сохраненные списки, и Вы объединяете их.

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

1
ответ дан 8 December 2019 в 18:42
поделиться

Предположим, что пароль состоит из строки из девяти символов английского алфавита (26 символов). Если каждый возможный пароль можно проверить за миллисекунду, сколько времени потребуется, чтобы проверить все возможные пароли?

0
ответ дан 8 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: