• Как проверить введенное римское число на правильную запись?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Лень вспоминать C, держите вариант конечного автомата проверки римских цифр на JS.
    // Матрица переходов конечного автомата
    // -1 - допустимое конечное состояние
    // null - недопустимое состояние
    const dka = [
      [-1, 1, 5, 4, 10, 9, 15, 14], // 0
      [-1, 2, 5, 4, 10, 9, 15, 14], // 1
      [-1, 3, 5, 4, 10, 9, 15, 14], // 2
      [-1, null, 5, 4, 10, 9, 15, 14], // 3
      [-1, 8, 8, 7, null, null, null, null], // 4
      [-1, null, null, 6, 10, 9, 15, 14], // 5
      [-1, null, null, 7, 10, 9, 15, 14], // 6
      [-1, null, null, 8, 10, 9, 15, 14], // 7
      [-1, null, null, null, 10, 9, 15, 14], // 8
      [-1, null, null, 13, 13, 12, null, null], // 9
      [-1, null, null, null, null, 11, 15, 14], // 10
      [-1, null, null, null, null, 12, 15, 14], // 11
      [-1, null, null, null, null, 13, 15, 14], // 12
      [-1, null, null, null, null, null, 15, 14], // 13
      [-1, null, null, null, null, 18, 18, 17], // 14
      [-1, null, null, null, null, null, null, 16], // 15
      [-1, null, null, null, null, null, null, 17], // 16
      [-1, null, null, null, null, null, null, 18], // 17
      [-1, null, null, null, null, null, null, null], // 18
    ];
    
    // Алфавит
    const alphabet = 'MDCLXVI';
    
    // Разбивает строку на лексемы
    // (номера символов в алфавите, начиная с 1)
    // для отсутствующих символов возвращает 0
    const lexer = (str) => str.split('').map((l) => alphabet.indexOf(l) + 1);
    
    // Проверяет корректность числа в римской записи
    const check = (str) => {
      const lexems = lexer(str);
      let state = 0;
      let idx = 0;
      while (true) {
        const lex = lexems[idx] ?? 0;
        state = dka[state][lex];
        if (state === null) {
          return false;
        }
        if (state === -1) {
          return  idx === str.length;
        }
        idx += 1;
      }
    }
    Ответ написан
    2 комментария
  • Как можно заменить в словаре повторяющиеся значения?

    @PavelMos
    k1 = {"a_1":111, "a_2":104, "a_3":107, "a_4":90, "a_5":115, "a_6":107, "a_7":106, "a_8":107, "a_9":95, "a_10":116, "a_11":127, "a_12":115, "a_13":102, "a_14":99}
    k2 = {"b_1":113, "b_2":107, "b_3":123, "b_4":122, "b_5":117, "b_6":112, "b_7":105, "b_8":108, "b_9":111, "b_10":114, "b_11":102, "b_12":104}
    general_row = dict(sorted({**k1, **k2}.items(), key=lambda x: x[1]))
    general_row_copy = general_row.copy()
    k = 1
    for key in general_row_copy:
        general_row_copy[key] = k
        k += 1
    counter = 1
    sum_of_rank = 0
    listValues=list ( general_row.values() )
    uniqValuesDictDup={x:listValues.count(x) for x in listValues
                    if listValues.count(x)>1}
    
    for i in uniqValuesDictDup:
        #ключи исходного словаря [с дублями]
        t=[x for x in general_row if general_row[x]==i]
        #ключи-порядковые номера-ранги второго словаря
        k=[general_row_copy[x] for x in general_row_copy if x in t]
        av= sum(k)/len(t)
        print (t,k, 'среднее=',av)
        for j in t:
            general_row_copy[j]=sum(k)/len(t)
    
    for i in sorted(general_row_copy):
        print (i, general_row_copy[i], '\r')
    Ответ написан
    Комментировать
  • Почему макрос работает только для тех файлов, которые открыты вручную, а не при выборе, когда вылазит диалоговое окно?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    В Вашем коде, макрос обрабатывает только активный документ (ActiveDocument)
    После выбора файла (ов) необходимо получить ссылку на конкретный файл (doc) и работать с ней.

    Т.е. после процедуры выбора файлов, необходимо, после строки:
    For i = 1 To .SelectedItems.Count
    добавить:
    Set doc = Documents.Open(.SelectedItems(i), Visible:=False) ' Открытие файла

    и везде ниже по коду заменить ActiveDocument на doc

    Открытие файла перед
    doc.Save
    уже не потребуется.
    Ответ написан
    Комментировать
  • Как написать макрос для выделения каждого первого слова в каждом абзаце первого раздела Word?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Разделы в Word - это Sections
    Sections(1) это первый раздел.
    Поэтому Ваш код может выглядеть так:

    For Each p In ActiveDocument.Sections(1).Range.Paragraphs
    p.Range.Words(1).Bold = True
    Next p
    Ответ написан
    Комментировать