Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритмы и формулы
DF2 :: ФОРУМЫ > Основные форумы > Софт и железо > Программирование / Coding
Страницы: 1, 2, 3, 4
gamecreator
по-моему я понял алгоритм Дьякона
sergroj
Цитата(Д'якон @ 11 Mar 2008, 03:55)
Почему?

Ну ведь у тебя на картинках везде присутствует только часть внешней области. Они меньше внутенности. Но когда сама внешняя область при этом может быть больше.
izrukvruki
Можете написать алгоритм (код на Паскале и Бейсик) генерации случайной строки (пароля) заданной длины...
Guevara-chan
Ну, допустим, вот (навскидку):

Код
Procedure.S GeneratePass(Len)
Define I, Pass.S
For I = 1 To Len
Pass + Chr(Random(122 - 97) + 97)
Next I
ProcedureReturn Pass
EndProcedure
izrukvruki
Это на чем?
пароль желательно чтоб содержал как цифры (большие и маленькие), как и цифры.

а почему такая формула Chr(Random(122 - 97) + 97)???
Dofur
Большие и маленькие цифры ? smile.gif Может буквы большые и маленькие, а? А то большие цифры страшно...

P.S. Если просто рандом брали - могли бы выпадать коды 0, 1, итд - для которых нет символов. Потом Хрона и сделала чтобы все коды были в нужных пределах - чтобы коду соответствовала буква...
Guevara-chan
Цитата
Это на чем?

PureBASIC v4.0

Цитата
пароль желательно чтоб содержал как цифры (большие и маленькие), как и цифры.

А другие символы допустимы ?

Цитата
а почему такая формула Chr(Random(122 - 97) + 97)???

Подборка по ASCII.

P.S. Так пойдет ?

Код
Procedure.S GeneratePass(Len)
#PassChars = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
Define I, Pass.S
Define PassCharsCount = Len(#PassChars) - 1
For I = 1 To Len
Pass + Mid(#PassChars, Random(PassCharsCount) + 1, 1)
Next I
ProcedureReturn Pass
EndProcedure
izrukvruki
а на Бейсик нельзя никак? нет у меня этого PureBASIC v4.0, да и качать неохото

Я вот так переоформили

Private Sub CommandButton10_Click()
Dim i, pass, n
n = 128
Randomize
For i = 1 To n
pass = pass + Chr(Rnd(255) + 97)
Next i
MsgBox (pass)
End Sub

но у меня пароль получается состоит только из а и b
Guevara-chan
Цитата
а на Бейсик нельзя никак? нет у меня этого PureBASIC v4.0

Раскрой мне, плиз, смысл этой фразы.

Цитата
но у меня пароль получается состоит только из а и b

facepalm.jpg
Да, такое бывает, когда лепишь абы что. Можешь теперь попробовать с моей формулой.
Diplomat
2 izrukvruki :

1. pass - должна быть строковой переменной.

2. Буквы, цифры, знаки препинания и классические спецсимволы в ASC- это символы с 33-го по 126-й. А ты пытаешься использовать символы с номерами 97-352. При том, что их всего 255. Не лучший вариант, не так ли? )

Используй алгоритм, предложенный Хроно. Там используется не таблица кодов, а переменная-банк символов, что удобнее. Это хрестоматийный вариант- гибок и проверен временем.

Вот код для Блиц-Бейсиков, оформленный более понятно и получивший отключаемую фичу: разбиение пароля на блоки-группы символов.
Код
SeedRnd MilliSecs();рандомизатор.

Global Symbols$="ABCDEFGHIJKLMOPQRSTUVWXYZ0123456789";переменная-набор символов, из которых будет строиться пароль

Local NGroups = 5;Кол-во групп символов, на которые будет разбит пароль
Local NSymbols=5;Кол-во символов в каждой группе
Global Separator$="-";Символ-разделитель для групп символов

Global Password$; строковая переменная для хранения пароля

For Group = 1 To NGroups
    For Symbol=1 To NSymbols

 ;строим группу символов, произвольно выбирая их по одному из переменной-набора
     NSymbol=Rnd(Len(Symbols)-1)+1
     Password = Password + Mid( Symbols,NSymbol,1)
 
    Next
;вставляем разделительный символ в конце каждой группы, если после нее будут другие группы
    If Group<NGroups Then Password = Password + Separator
Next

;Выводим сгенерированный пароль на экран и завершаем программу
Print Password
WaitKey()
End
izrukvruki
Цитата(Diplomat @ 22 Apr 2008, 15:59)
2 izrukvruki :

1. pass - должна быть строковой переменной.

2. Буквы, цифры, знаки препинания и классические спецсимволы в ASC- это символы с 33-го по 126-й. А ты пытаешься использовать символы с номерами 97-352. При том, что их всего 255. Не лучший вариант, не так ли? )

Используй алгоритм, предложенный Хроно. Там используется не таблица кодов, а переменная-банк символов, что удобнее. Это хрестоматийный вариант- гибок и проверен временем.

Вот код для Блиц-Бейсиков, оформленный более понятно и получивший отключаемую фичу: разбиение пароля на блоки-группы символов.
Код
SeedRnd MilliSecs();рандомизатор.

Global Symbols$="ABCDEFGHIJKLMOPQRSTUVWXYZ0123456789";переменная-набор символов, из которых будет строиться пароль

Local NGroups = 5;Кол-во групп символов, на которые будет разбит пароль
Local NSymbols=5;Кол-во символов в каждой группе
Global Separator$="-";Символ-разделитель для групп символов

Global Password$; строковая переменная для хранения пароля

For Group = 1 To NGroups
    For Symbol=1 To [COLOR=red]NSymbols[/COLOR]

;строим группу символов, произвольно выбирая их по одному из переменной-набора
     [COLOR=red]NSymbol[/COLOR]=Rnd(Len(Symbols)-1)+1
     Password = Password + Mid( Symbols,[COLOR=red]NSymbol[/COLOR],1)
 
    Next
;вставляем разделительный символ в конце каждой группы, если после нее будут другие группы
    If Group<NGroups Then Password = Password + Separator
Next

;Выводим сгенерированный пароль на экран и завершаем программу
Print Password
WaitKey()
End


а вот где я красным отметил - одна и таже переменная используется??? ошибки нету? В целом я алгоритм понял - но все равно пароль получается только из первых двух символов набора (AB), если набор поменятть (напрмер на "587") то пароль будет из символов 58

Ладно, спасибище. дальше разбирусь...
Guevara-chan
А у меня тут еще вот какой вариант родился:

Код
Procedure.S GeneratePass(Len)
#PassChars = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
#CharSize = SizeOf(Character)
Define I, Pass.S = Space(Len)
Define PassCharsCount = Len(#PassChars) - 1
Len - #CharSize
For I = 0 To Len Step #CharSize
PokeC(@Pass + I, Asc(Mid(#PassChars, Random(PassCharsCount) + 1, 1)))
Next I
ProcedureReturn Pass
EndProcedure

Так побыстрее, но не уверена, что удастся успешно перевести на VB.

Цитата
а вот где я красным отметил - одна и таже переменная используется???

Нет.
Diplomat
Цитата
...ошибки нету?... ...все равно пароль получается только из первых двух символов набора...

Я не выкладываю код с явными ошибками. Данный код работает и генерирует корректные пароли.
Полагаю, ты неверно портируешь его на Варсик (ты ведь VB используешь, не так ли?). Поскольку Варсик я уже лет пять в глаза не видел- его особенности успел напрочь позабыть и помочь с корректным портированием не смогу.
Ищи свою ошибку. Успехов.
izrukvruki
а есть алгоритм случайного распределения натуральных чисел не больше N....?

Ну например N=5

1
5
4
3
2
Azure
распределения в чем ?
hippocamus
Наверное так: для каждого числа случайная позиция. Если занята - ищем вверх или вниз (случайно).
izrukvruki
Цитата(Azure @ 14 Jul 2008, 16:36)
распределения в чем ?


между собой
hippocamus
Ну, а чем тебе мой не подходит?
gamecreator
всмысле чтобы каждое число встречалось 1 раз?
тогда так:
1. забиваем логический массив нулями (длина - количество чисел)
2. генерим число.
3. если это число уже встречалось (т.е. элемент массива, что ему соответствует - истина), то переходим к п.2
4. отмечаем число в массиве и выводим/сохраняем
5. если нужное количество чисел не достигнуто, идем к п.2
6. получаем некоторое количество неповторяющихся чисел из заданного диапазона.
izrukvruki
какой-то у тебя не очень рациональный алгоритм...

организовать цикл по А от 1 до N, может брать первое число А=1 , и генерировать число I - место А в масcиве, если это место уже занято, то I=I+1, если I больше N, то I=I-N
hippocamus
Всегда так делал. Если у тебя порядка 10000 элем. - и не заметишь.

Добавлено ([mergetime]1216216686[/mergetime]):
По другому:
организовать список из А эл.
Для эл. Массива по rnd эл. Из списка. Затем эл. Списка исключать.
izrukvruki
Прошу помощи!
Пишу на VisualBasic.

Есть число следующего вида
Z=ddmmnnnn или ddmmnnn (7 или 8 цифр в числе, но начало всегда стабильно ddmm)

как проверить, что:
1) Z это число (что внутри нет "плохих" символов (пробелы, буквы, пр. знаки))
2) mm - это месяц в двоичном формате (т.е. 01..12 допустимо, 1..9, 13... недопустимо)
3) dd - это день от 01..31 допустимо
4) существует файл "C:\ddmmnnnn"

особо проблемы с 1 и 4 пунктом
Монца
а как пробовал?

Добавлено ([mergetime]1232359350[/mergetime]):
1. десятичное число? засовываешь в строку, вырезаешь символ проверяешь цифра или нет, второй вариант - пытаешься сконвертить в число, если ловишь exception, значит не число.

Добавлено ([mergetime]1232359389[/mergetime]):
4. api функция fileexists ну или как то так
izrukvruki
а как проверять цифра или нет? Так понимаю нужно проверить принадлежность символа к множеству ("0", "1",...,"9") Но не знаю как работать с множествами.

4. ага. PathFileExists
gamecreator
Цитата(izrukvruki @ 19 Jan 2009, 13:12)
а как проверять цифра или нет? Так понимаю нужно проверить принадлежность символа к множеству ("0", "1",...,"9") Но не знаю как работать с множествами.

вот вам все какие-то множества... по аски-коду проверь
izrukvruki
это как?
gamecreator
if (z[i]<='0' && z[i]>='9') тогда десятичная цифра.
Shaidar Haran
А регулярные выражения заюзать религия не позволяет? )
izrukvruki
а это как?
gamecreator
Цитата(Shaidar Haran @ 19 Jan 2009, 13:53)
А регулярные выражения заюзать религия не позволяет? )

а в бейсике они есть?
Shaidar Haran
В самом бейсике нет, но я же так понял, вы под Виндой?
Цитата
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "abc"
TempStr = "abc 123 abc"
MsgBox TempStr 'исходная строка
Result = objRegExp.Replace(TempStr, "def")
MsgBox Result
objRegExp.Global = True
Result = objRegExp.Replace(TempStr, "def")
MsgBox Result

например.
Монца
самый простой (но сам бы я так не делал) попробовать сконвертить и поймать и обработать исключение, если конечно бейсик умеет.
а так, вырезаешь символ, и смотришь как геймкриэйтор сказал. Только условие другое. В ASCII символы цифр идут подряд, от 0 до 9, этого достаточно.
Gloin
Вам таварищъ Шаидаръ пора бы примеры индийского кода на iбашорг постить, в топ точно попадёте.




Добавлено ([mergetime]1232370913[/mergetime]):
И исключения в этом случает - горе от ума.
Shaidar Haran
Цитата(Gloin @ 19 Jan 2009, 18:15)
Вам таварищъ Шаидаръ пора бы примеры индийского кода на iбашорг постить, в топ точно попадёте.

Не индийского, а индусского.
Алсо, пример взят мною из гугла, и в нем видно, что бейсик умеет работать с регулярками. Конкретное применение в данном случае - на совести разработчика.
Алл хайль гугур!
Guevara-chan
Цитата
самый простой (но сам бы я так не делал) попробовать сконвертить и поймать и обработать исключение, если конечно бейсик умеет.

А что, было бы весело: с любой ошибки при Val() - выброс исключения).
izrukvruki
Как можно сделать обновление файла (название файла и директории указаны примерные...):

т.е. у нас на работе сеть, на сервере лежит файл G:\temp\files.gsm, который я иногда меняю, и тогда его нужно всем сотрудникам обновить (этот файл нужен для работы программы, и должен лежать в папке где стоит программа).
У каждого на компе тоже есть этот файл, но в разных папках (у кого-то C:\apps\gsm\files.gsm, у кого-то C:\ops\gsm\files.gsm, у кого-то еще где. Причем сами пользователи не знают где у них этот файл лежит - так бы я 7zip сделал инсталятор и его по почте всем разослал...
Поэтому нужно сначало НАЙТИ, где лежит старый файл, а потом заменить его на обновленный.

Мне кажется, что это можно реализовать в виде BAT файла...
gamecreator
реализовать функцию обновления в проге нельзя?

а вообще может они это сделают вручную? им же самим польза будет - может с компом научатся работать
Guevara-chan
Гм... Имя файл всегдла одно и то же ?
Gloin
ДА ДА, я хочу поиск по всему диску.
Монца
Управлять обновлением можно так: написать спец программу - стартер.
Вместо запуска программы, которой нужен files.gsm запускать стартер, этот стартер лезет на сервер - и проверяет обновление, при необходимости копирует новые файлы, после запускает саму программу.
У нас устроено именно так, плюс стартер может делать еще некоторые вещи.
Shaidar Haran
Цитата(Монца @ 22 Jan 2009, 23:11)
У нас устроено именно так, плюс стартер может делать еще некоторые вещи.

Вообще-то да, почему инициировать обновление должен именно сервер? Пущай клиенты сами заботятся о своем состоянии таки.
izrukvruki
А что организовать поиск файла на диске сложно (не возможно)? с занесением полученного пути в некую переменную, а потом скопировать из одного каталога в другой...

программе особо не нужен файл files.gsm для работы, просто если он есть она его подцепляет, нет - без него будет работать...

Хрона, Да имя файла всегда одно и тоже - Pereregisr.gms
Причем нужный мне файл - скорей всего единственный на диске, и лежит в подпапке GMS/Pereregisr.gms

Игродел:
Цитата
а вообще может они это сделают вручную? им же самим польза будет - может с компом научатся работать

Им за эту процедуру НЕ ПЛАТЯТ, а мне платят - я должен заботиться чтоб на всех компах был свежий файл...

Монца, а можно подробнее?
gamecreator
Цитата(izrukvruki @ 22 Jan 2009, 21:27)
А что организовать поиск файла на диске сложно?
да
Цитата(izrukvruki @ 22 Jan 2009, 21:27)
а можно подробнее?
вместо нужной проги запускается сторонняя, которая сверяет файл на диске с файлом на сервере, производит обновление, а потом запускает то что надо.
кстати, диск сетевой чтоли? файл много весит?
izrukvruki
Файл весит по-разному -130-150 кб. Да диск сетевой. Но на всех компах он одинаково называется (G:\)
gamecreator
попробуй батник с содержанием:
Код
copy /Y /Z /B "G:\temp\files.gms" "files.gms"
program.exe


Добавлено ([mergetime]1232649674[/mergetime]):
запускать вместо проги. он должен лежать в папке с прогой
izrukvruki
Все!!! Доперло!!!
Просто в папку где лежит файл, который нуно заменить - кинуть батник, который написал Игродел, токо без строки program.exe, и на рабочий стол кинуть ярлык... Пусть просто щелкают по нему.
Gloin
У тебя экзешник далеко от файла лежит? Можно ведь и относительный путь прописать.
gamecreator
просто если прога и файл лежат в определенных до какого-то места путях, то можно сделать чтобы батник еще и прогу запускал
Монца
изрук, держи
http://www.polesoft.ru/project/psstart
там есть и исходники
izrukvruki
А что в батнике написать, чтоб черный экран (типо ДОС) закрылся?
Вообще, где моно почитать какие команды в батник можно писать?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.