Advertisement
mabu

Задача на перебор вариантов

Nov 1st, 2015
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifndef unicode
  2.     #define unicode
  3. #endif
  4. #include once "windows.bi"
  5. ' Для разбиения параметров программы по пробелам
  6. #include once "win\shellapi.bi"
  7.  
  8. ' Строка с цифрами
  9. Const DigitsString = "0123456789"
  10. Const DigitsStringLength As Integer = 10
  11. ' Строка с буквами
  12. Const CharsString = "abc"
  13. Const CharsStringLength As Integer = 3
  14. ' Символы новой строки
  15. Const NewLine = !"\r\n"
  16. Const NewLineLength As Integer = 2
  17.  
  18. ' Количество параметров не устраивает
  19. Const ErrorParams = !"Использование: v-vars.exe строка\r\n"
  20. ' Неудачное выделение памяти
  21. Const HeapAllocError = !"Система не может выделить память\r\n"
  22. ' Неудачное создание кучи
  23. Const HeapCreateError = !"Не могу создать кучу памяти\r\n"
  24.  
  25. ' Главная функция
  26. Declare Function EntryPoint Alias "EntryPoint"()As Integer
  27. ' Получение количества листьев на последнем уровне
  28. Declare Function GetListCount(ByRef Pattern As WString, ByVal PatternLength As Integer)As Integer
  29. ' Заполняет строку символами
  30. Declare Sub PadString(ByVal StringToPadding As WString Ptr, ByVal StageLength As Integer, ByVal StringLength As Integer, ByRef Pattern As WString, ByVal PatternLength As Integer, ByVal StartSymbol As Integer, ByVal RepeatCount As Integer)
  31.  
  32.  
  33. Function GetListCount(ByRef Pattern As WString, ByVal PatternLength As Integer)As Integer
  34.     Dim intResult As Integer = 1
  35.     For i As Integer = 0 To PatternLength - 1
  36.         Select Case Pattern[i]
  37.             Case 35 ' код символа #
  38.                 intResult *= DigitsStringLength ' Цифры
  39.             Case 36 ' код символа $
  40.                 intResult *= CharsStringLength ' Буквы
  41.         End Select
  42.     Next
  43.     Return intResult
  44. End Function
  45.  
  46. Sub PadString(ByVal StringToPadding As WString Ptr, ByVal StageLength As Integer, ByVal StringLength As Integer, ByRef Pattern As WString, ByVal PatternLength As Integer, ByVal StartSymbol As Integer, ByVal RepeatCount As Integer)
  47.     Dim k As Integer ' Счётчик в цикле строки‐заменителя шаблона
  48.     Dim r As Integer = 1 ' Повторитель
  49.     For j As Integer = StartSymbol To StageLength - 1 Step StringLength
  50.         Dim tmpChar As Integer = (Pattern)[k]
  51.         StringToPadding[j] = tmpChar
  52.         r += 1
  53.         If r > RepeatCount Then
  54.             r = 1
  55.             k += 1
  56.         End If
  57.         If k >= PatternLength Then
  58.             k = 0
  59.         End If
  60.     Next
  61. End Sub
  62.  
  63. Function EntryPoint Alias "EntryPoint"()As Integer
  64.     Dim hOut As Handle = GetStdHandle(STD_OUTPUT_HANDLE)
  65.     ' Получить строку из параметров
  66.     Dim ArgsCount As Integer = Any
  67.     ' Массив параметров командной строки
  68.     Dim Args As WString Ptr Ptr = CommandLineToArgvW(GetCommandLine(), @ArgsCount)
  69.     If ArgsCount > 1 Then
  70.         ' Первый параметр — строка‐шаблон
  71.         ' Длина шаблона
  72.         Dim PatternLength As Integer = lstrlen(*Args[1])
  73.         ' Длина подстроки = шаблон + перевод строки
  74.         Dim StringLength As Integer = PatternLength + NewLineLength
  75.         ' Количество символов
  76.         Dim StageLength As Integer = StringLength * GetListCount(*Args[1], PatternLength)
  77.        
  78.         ' Создать кучу
  79.         Dim hHeap As Handle = HeapCreate(HEAP_NO_SERIALIZE, 0, 0)
  80.         If hHeap <> NULL Then
  81.             ' Выделить память в куче под массив строк
  82.             Dim hMemory As WString Ptr = HeapAlloc(hHeap, HEAP_NO_SERIALIZE, (StageLength + 1) * SizeOf(WString))
  83.             If hMemory <> 0 Then
  84.                 ' Заполнить память символами перевода строки
  85.                 ' При этом Винапи в конце автоматически поставит нулевой символ
  86.                 ' Нулевой символ находится в hMemory[StageLength]
  87.                 For i As Integer = PatternLength To StageLength - 1 Step StringLength
  88.                     lstrcpy(hMemory[i], NewLine) ' винапи добавляет в конце нулевой символ
  89.                 Next
  90.                
  91.                 ' Количество повторений символа
  92.                 Dim RepeatCount As Integer = 1
  93.                 ' Обойти весь шаблон с конца
  94.                 For i As Integer = PatternLength - 1 To 0 Step -1
  95.                     Dim Symbol As Integer = (*Args[1])[i]
  96.                     Select Case Symbol
  97.                         Case 35 ' #
  98.                             ' Повторять цифры определённое количество раз
  99.                             PadString(hMemory, StageLength, StringLength, DigitsString, DigitsStringLength, i, RepeatCount)
  100.                             ' Увеличить количество повторений следующего символа
  101.                             RepeatCount *= DigitsStringLength
  102.                         Case 36 ' $
  103.                             ' Повторять буквы определённое количество раз
  104.                             PadString(hMemory, StageLength, StringLength, CharsString, CharsStringLength, i, RepeatCount)
  105.                             ' Увеличить количество повторений следующего символа
  106.                             RepeatCount *= CharsStringLength
  107.                         Case Else
  108.                             ' Повторять этот символ определённое количество раз
  109.                             For j As Integer = i To StageLength - 1 Step StringLength
  110.                                 hMemory[j] = Symbol
  111.                             Next
  112.                     End Select
  113.                 Next
  114.                 ' Распечатать результат
  115.                 WriteConsole(hOut, hMemory, lstrlen(hMemory), 0, 0)
  116.             Else
  117.                 ' Неудачное выделение памяти
  118.                 WriteConsole(hOut, @HeapAllocError, lstrlen(@HeapAllocError), 0, 0)
  119.             End If
  120.             ' Уничтожить кучу, при этом память отдавать куче не нужно
  121.             HeapDestroy(hHeap)
  122.         Else
  123.             ' Неудачное создание кучи
  124.             WriteConsole(hOut, @HeapCreateError, lstrlen(@HeapCreateError), 0, 0)
  125.         End If
  126.     Else
  127.         ' Количество параметров не устраивает
  128.         WriteConsole(hOut, @ErrorParams, lstrlen(@ErrorParams), 0, 0)
  129.     End If
  130.     LocalFree(Args)
  131.     Return 0
  132. End Function
  133.  
  134. EntryPoint()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement