На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: RaD
  
    > Переборы, странное поведение кода
      Всем привет.
      Суть в следующем пробую свои силы в освоении
      языка пайтон. Перевел код с другого языка.
      И он как-то странно работает.
      Нужно объяснение и правка.

      тестировал следующий код:
      ExpandedWrap disabled
        ''' Переборы 2 для получения последовательностей '''
         
        sL = []
         
        Isxodstroka = '23651' #236513264532
        print('Последовательность')
        print (Isxodstroka)
         
         
        m = len(Isxodstroka)
        print ('m = ',m)
         
        def IndifStrnig(S0):
            return 'true'
            Last=''
            for i in range(m): Next=S0[i]
            if Next != Last: Last = Next
            else:return 'false'
         
        def GenStr(S0, S1):
            if len(S0) == m:
                if IndifStrnig(S0): sL.append(S0)
            else:
                for i in range(len(S1)):GenStr(S0+S1[i],S1[1:i-1]+S1[i+1:len(S1)])
                                
        GenStr('',Isxodstroka)
         
        def mylistsort():
            last = mylist[-1]
            for i in range(len(mylist)-2, -1, -1):
                if last == mylist[i]:
                    del mylist[i]
                else:
                    last = mylist[i]
                    
        mylist = list(set(sL))
         
        sL = mylist
         
        for item in enumerate(sL):
            print(item)
         
        print(' ')
         
         
        print(' расчет завершен ')

      А то никак не соображу что именно не так :blink:
      Заранее спасибо.
      плохо, когда уверенность
      в своей правоте ограничивает видимость
      собственным носом
        Что должен делать код?
        Зачем нужна функция IndifStrnig, которая просто возвращает 'true'?
          что должен делать код? создавать последовательности,
          но они создаюся не верно.
          если возвращает true происходит событие по которому происходит добавление в Лист элемент
          Сообщение отредактировано: RusSun -
          плохо, когда уверенность
          в своей правоте ограничивает видимость
          собственным носом
            RusSun, я бы на твоём месте снабдил комментариями каждую функцию (что она должна делать). А там и ответ тебе дадут быстрее, и возможно, пока комментарии пишешь, сам додумаешься в чём проблема.
            Ты ведь даже не написал, что вообще должен делать этот код.
            Цитата RusSun @
            что должен делать код? создавать последовательности,
            Он не создаёт последовательности? Создаёт. Создаёт неправильно? Тогда в чём эта неправильность заключается?
            Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
              Цитата amk @
              Он не создаёт последовательности? Создаёт. Создаёт неправильно? Тогда в чём эта неправильность заключается?

              Понял. Напишу позже всё подробно и с примером. Сейчас времени нет. :'(
              Итак пишу как и обещал.

              сначала немного оффтопа:
              ...Доче спать не дают колики...
              ... Доча не даёт спать всем)))...
              Поэтому мысли линейны и топорны...
              Цитата: КВН Шутки от «Саратова»
              "Каким бы ни было испытание в «Форт Боярде», Николай Валуев просто шел к ключу, брал его и выходил из дверей."
              конец оффтопа.

              Теперь строго по теме.
              Цель:
              посмотрев Видеокурс "Ленивый питон" курс ленивый питон
              Получить такие же значения последовательностей, что и на языке Дельфи(паскаль)
              Решил опробовать свои силы.
              Что делает?
              Берёт строку Isxodstroka = '2332'
              и должна перестановками создать новые строчки.
              Есть условие в новых строках
              не должно быть два повторяющихся друг за другом числа.

              ExpandedWrap disabled
                var
                  Form1: TForm1;
                 // data : array of integer; // Тут будут храниться данные
                  Step:integer;
                implementation
                 
                {$R *.dfm}
                 
                 
                procedure TForm1.Button1Click(Sender: TObject);
                var
                  m: integer;
                  sL: TStringList;
                 
                function IndifStrnig(S0: string):boolean;
                var Last,Next:string;
                   i:byte;
                 
                begin
                result:=true ;
                Last:='';
                for I := 1 to m do begin
                                 Next:=S0[i];
                                 //showmessage(Next+ ' <> '+ Last +' Last '+ Last );
                                 //form1.Caption:='добавляем строчку '+S0;
                                 //sleep(100);
                                 if Next<>Last then Last:=Next else result:=false;
                                   end;
                //if Last=S0[m] then  else result:=false;
                 
                end;
                procedure GenStr(S0, S1: string);
                var
                  i: integer;
                begin
                  if Length(S0) = m then  begin
                   if IndifStrnig(S0) then sL.Add(S0)
                    end
                  else
                    for i := 1 to Length(S1) do begin
                      GenStr(S0+S1[i], copy(S1,1,i-1) + copy(S1,i+1,Length(S1)));
                      inc(Step); Application.ProcessMessages;Count.Caption:=intTostr(Step)
                                                end;
                end;
                 
                begin
                  sL := TStringList.Create;
                  try
                    sL.Sorted := True;
                    //sL.Duplicates := dupIgnore;
                    m := Length(Edit1.Text);
                    GenStr('',Edit1.Text);
                    ListBox1.Items.Text := sL.Text;
                    Label3.Caption:=intTostr(sL.Count);
                    sL.SaveToFile('Data.txt');
                  finally
                    sL.Free;
                  end;
                end;

              По коду
              Главная процедура GenStr она собственно и рулит
              ExpandedWrap disabled
                def GenStr(S0, S1):
                    if len(S0) == m:
                        if IndifStrnig(S0): sL.append(S0)
                    else:
                        for i in range(0,len(S1),1):GenStr(S0+S1[i],S1[1:i-1]+S1[i+1:len(S1)])

              В ней использую другую функцию
              IndifStrnig(S0)
              немного изменил её, но всё равно что-то не верно.
              ExpandedWrap disabled
                def IndifStrnig(S0):
                    Last=''
                    for i in range(0,m,1):
                        Next=S0[i]
                        if Next == Last:return 'false'
                        else:Last = Next
                        if Next != Last:return 'true'

              которая должна возвращать 'true' два элемента Next и Last не равны
              и последний Last присваивать новому значению Next в остальных случаях давать результат 'false'
              Далее делаем вызов GenStr('',Isxodstroka) со строкой '2332' к примеру

              затем избавляется от дубликатов (взято из справки)
              ExpandedWrap disabled
                def mylistsort():
                    last = mylist[-1]
                    for i in range(len(mylist)-2, -1, -1):
                        if last == mylist[i]:
                            del mylist[i]
                        else:
                            last = mylist[i]
                            
                mylist = list(set(sL))

              И в кульминации выводим что так получилось с нумерацией элементов
              ExpandedWrap disabled
                for item in enumerate(sL):
                    print(item)
                 
                print(' ')
                 
                 
                print(' расчет завершен ')

              Вот:
              ____________________________________________

              Последовательность
              2332
              m = 4
              (0, '2333')
              (1, '2233')
              (2, '2332')

              расчет завершен
              >>>
              ___________________________________________

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

              Последовательность
              2332
              m = 4
              (0, '2323')
              (1, '3232')

              расчет завершен
              Сообщение отредактировано: RusSun -
              плохо, когда уверенность
              в своей правоте ограничивает видимость
              собственным носом
                Так мне только что дошло что можно поправить
                ExpandedWrap disabled
                  def GenStr(S0, S1):
                      if len(S0) == m:
                          if not IndifStrnig(S0): sL.append(S0)
                      else:
                          for i in range(0,len(S1),1):GenStr(S0+S1[i],S1[1:i-1]+S1[i+1:len(S1)])

                он добавлял всё неверные варианты изменил процедуру на if not IndifStrnig(S0)
                и сразу появился один из двух правильных ответов (0, '2323')
                Теперь остаётся узнать как мне добиться от него чтобы он дальше сделал
                работу с последовательностью начинающуюся с 3.. и добавил ещё один результат 3232

                ExpandedWrap disabled
                  sL = []
                   
                  Isxodstroka = '2332' #236513264532
                  print('Последовательность')
                  print (Isxodstroka)
                   
                   
                  m = len(Isxodstroka)
                  print ('m = ',m)
                   
                  def IndifStrnig(S0):
                      Last=''
                      for i in range(0,m,1):
                          Next=S0[i]
                          if Next == Last:return 'false'
                          else:
                              Last = Next
                          if Next != Last:return 'true'
                          #2323
                          #3232
                          #else:return 'false'
                   
                  def GenStr(S0, S1):
                      if len(S0) == m:
                          if not IndifStrnig(S0): sL.append(S0)
                      else:
                          for i in range(0,len(S1),1):GenStr(S0+S1[i],S1[1:i-1]+S1[i+1:len(S1)])
                                          
                  GenStr('',Isxodstroka)
                   
                  def mylistsort():
                      last = mylist[-1]
                      for i in range(len(mylist)-2, -1, -1):
                          if last == mylist[i]:
                              del mylist[i]
                          else:
                              last = mylist[i]
                              
                  mylist = list(set(sL))
                   
                  sL = mylist
                   
                  for item in enumerate(sL):
                      print(item)
                   
                  print(' ')
                   
                   
                  print(' расчет завершен ')
                Сообщение отредактировано: RusSun -
                плохо, когда уверенность
                в своей правоте ограничивает видимость
                собственным носом
                  Итак финальная правка
                  меняем в строке 27 старый код
                  ExpandedWrap disabled
                    GenStr(S0+S1[i],S1[1:i-1]+S1[i+1:len(S1)])
                  на исправленный
                  ExpandedWrap disabled
                    GenStr(S0+S1[i],S1[0:i]+S1[i+1:len(S1)+1])

                  Посмотрел более внимательно тему срезы
                  два нюаса
                  1 строка начинается с 0.
                  2 второе число читал здесь

                  "Оператор извлечения среза: [X:Y]. X – начало среза, а Y – окончание;

                  символ с номером Y в срез не входит."

                  Сделав поправки получаем рабочий код. Надеюсь я не ошибся.)

                  Итак странность заключалась в неверном понимании работы кода. Тема закрыта.
                  плохо, когда уверенность
                  в своей правоте ограничивает видимость
                  собственным носом
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script Execution time: 0,1178 ]   [ 17 queries used ]   [ Generated: 27.06.19, 00:55 GMT ]