_

Trochę lepsze sortowanie tekstów

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

Re: Trochę lepsze sortowanie tekstów

Postprzez asa » sty 18, 2019 10:16

Ciapy od windowsa sobie poradzili a z autotesku nie - menadżer warstw.
Badziewiaku tak jak to czuję Kojacek sprawa lispowo jest do ogarnięcia. Nasze zabawki mają sporo narzędzi do katowania list zaś u mine w głupiej łepetynie coś tam się skleja do kupy jak je wykorzystać by uzyskać knocowy efekt w postaci tego co Twój programik działa.
Pdorawiam ciepło
asa
P.S.
Fajnie by było gdyby porównać prędkość naszych zabawek pod warunkiem oczywiście że ktoś splodzi lispowa wersję.
asa
 
Posty: 568
Dołączył(a): lut 18, 2007 20:01

Re: Trochę lepsze sortowanie tekstów

Postprzez badziewiak » sty 18, 2019 14:12

Hej
Poniżej wrzucam moją implementację do miejsca, w którym się zatrzymaliśmy - może to Wam coś podpowie. Pewne szczegóły się różnią od tego co przedstawiłem, ale idea docelowa jest taka sama. Nawet myślę sobie, że ten kod doprowadzę do tego, co powyżej opisałem - będzie zgrabniej.
Kod: Zaznacz cały
    CultureInfo plPL = CultureInfo.CreateSpecificCulture( "pl-PL" );
    RKKontenery.MultiMapBezSortowania<string /*maska*/, KeyValuePair<List<string /*tekst podzielony na elementy maski*/>, int /*nr tekstu wejściowego*/>> maskiZtekstamiPierwotne = new RKKontenery.MultiMapBezSortowania<string, KeyValuePair<List<string>, int>>();
    Regex regExAlfabet = new Regex( @"[\w\s]", RegexOptions.IgnoreCase );
    Regex regExLiczba = new Regex( @"\d", RegexOptions.IgnoreCase );
    //Pozostać przy tej formie oznaczania masek a nie przy enum, bo ta forma zapewnia łatwiejsze obrabianie masek w kolekcji.
    const string maskaAlfabet = "A";
    const string maskaLiczba = "L";
    const int znacznikPozycjaDodanaSztucznie = -1;
    Dictionary<string /*maska pierwotna*/, List<int> /*pozycje w masce pierwotnej*/> pozycjePierwotneElementowMasekDict = new Dictionary<string, List<int>>();

    for( int i = 0; i < tekstyList.Count; i++ )
    {
      string tekst = tekstyList[i];
      string maskaBiezacegoTekstu = "";
      string maskaPoprzedniegoZnaku = "";
      string tekstPrzypisanyDoElementuMaski = "";
      List<string> tekstPodzielonyNaElementyMaskiBiezacej = new List<string>();
      List<int> pozycjeElementowMaskiPierwotnej = new List<int>();
      for( int j = 0; j < tekst.Length; j++ )
      {
        //Ustalić maskę bieżącego znaku
        string maskaZnakuBiezacego = "";
        string znakBiezacy = tekst.Substring( j, 1 );
        if( regExLiczba.IsMatch( znakBiezacy ) )
        {
          maskaZnakuBiezacego = maskaLiczba;
        } //else if( regExLiczba.IsMatch( znakBiezacy ) )
        else if( regExAlfabet.IsMatch( znakBiezacy ) )
        {
          maskaZnakuBiezacego = maskaAlfabet;
        } //if( regExAlfabet.IsMatch( znakBiezacy ) )
        else
        {
          maskaZnakuBiezacego = znakBiezacy;  //Wszelkie kropki, ukośniki i inne będą tu wiernie odwzorowane.
        } //else
        //W przypadku pierwszego znaku zwyczajnie ustawić maskę, w przeciwnym wypadku dodać w razie różnic.
        if( j == 0 )
        {
          maskaBiezacegoTekstu = maskaZnakuBiezacego;
          maskaPoprzedniegoZnaku = maskaZnakuBiezacego;
          tekstPrzypisanyDoElementuMaski = znakBiezacy;
          pozycjeElementowMaskiPierwotnej.Add( maskaBiezacegoTekstu.Length - 1 );
        } //if( i == 0 )
        else
        {
          if( maskaZnakuBiezacego != maskaPoprzedniegoZnaku )
          {
            maskaBiezacegoTekstu += maskaZnakuBiezacego;
            maskaPoprzedniegoZnaku = maskaZnakuBiezacego;
            tekstPodzielonyNaElementyMaskiBiezacej.Add( tekstPrzypisanyDoElementuMaski );
            tekstPrzypisanyDoElementuMaski = znakBiezacy;
            pozycjeElementowMaskiPierwotnej.Add( maskaBiezacegoTekstu.Length - 1 );
          } //if( maskaZnakuBiezacego != maskaPoprzedniegoZnaku )
          else
          {
            tekstPrzypisanyDoElementuMaski += znakBiezacy;
          } //else if( maskaZnakuBiezacego != maskaPoprzedniegoZnaku )
        } //else if( i == 0 )
      } //for( int i = 0; i < tekst.Length; i++ )
      //Koniec analizowanego tekstu - dodać ostatni fragment tekstu.
      tekstPodzielonyNaElementyMaskiBiezacej.Add( tekstPrzypisanyDoElementuMaski );

      //Jeśli znajdą się same cyfry oddzielone jednym przecinkiem, to scalić je w jedną liczbę dziesiętną.
      if( maskaBiezacegoTekstu.Length > 2 )
      {
        bool podmieniono = false;
        string maskaNowa = "";
        List<string> tekstPodzielonyNaElementyMaskiNowej = new List<string>();
        List<int> pozycjeElementowMaskiNowej = new List<int>();
        int znalezionaPozycjaBiezaca = -1;
        int znalezionaPozycjaPoprzednia = -1;
        while( ( znalezionaPozycjaBiezaca = maskaBiezacegoTekstu.IndexOf( "L,L", znalezionaPozycjaBiezaca + 1 ) ) >= 0 )
        {
          podmieniono = true;
          //Jeśli wcześniej niczego nie znaleziono i liczba nie jest na początku, to dopisać początek.
          if( znalezionaPozycjaPoprzednia < 0 )
          {
            if( znalezionaPozycjaBiezaca > 0 )
            {
              int poczatekTekstuMiedzyLiczbami = 0;
              int koniecTekstuMiedzyLiczbami = znalezionaPozycjaBiezaca - 1;
              for( int j = poczatekTekstuMiedzyLiczbami; j <= koniecTekstuMiedzyLiczbami; j++ )
              {
                maskaNowa += maskaBiezacegoTekstu.Substring( j, 1 );
                tekstPodzielonyNaElementyMaskiNowej.Add( tekstPodzielonyNaElementyMaskiBiezacej[j] );
                pozycjeElementowMaskiNowej.Add( j );
              } //for( int j = poczatekTekstuMiedzyLiczbami; j <= koniecTekstuMiedzyLiczbami; j++ )
            } //if( znalezionaPozycjaBiezaca > 0 )
          } //if( znalezionaPozycjaPoprzednia < 0 && znalezionaPozycjaBiezaca > 0 )
          //Dopisać do nowej maski to, co zostało znalezione między wyszukiwaniami
          else
          {
            if( znalezionaPozycjaBiezaca - znalezionaPozycjaPoprzednia > 3 )
            {
              int poczatekTekstuMiedzyLiczbami = znalezionaPozycjaPoprzednia + 3;
              int koniecTekstuMiedzyLiczbami = znalezionaPozycjaBiezaca - 1;
              for( int j = poczatekTekstuMiedzyLiczbami; j <= koniecTekstuMiedzyLiczbami; j++ )
              {
                maskaNowa += maskaBiezacegoTekstu.Substring( j, 1 );
                tekstPodzielonyNaElementyMaskiNowej.Add( tekstPodzielonyNaElementyMaskiBiezacej[j] );
                pozycjeElementowMaskiNowej.Add( pozycjeElementowMaskiNowej.Count );
              } //for( int j = poczatekTekstuMiedzyLiczbami; j <= koniecTekstuMiedzyLiczbami; j++ )
            } //if( znalezionaPozycjaBiezaca - znalezionaPozycjaPoprzednia > 3 )
          } //else if( znalezionaPozycjaPoprzednia < 0 && znalezionaPozycjaBiezaca != 0 )
          //Zastąpić sekwenclę "L,L" na maskaLiczba
          maskaNowa += maskaLiczba;
          tekstPodzielonyNaElementyMaskiNowej.Add( tekstPodzielonyNaElementyMaskiBiezacej[znalezionaPozycjaBiezaca] + tekstPodzielonyNaElementyMaskiBiezacej[znalezionaPozycjaBiezaca + 1] + tekstPodzielonyNaElementyMaskiBiezacej[znalezionaPozycjaBiezaca + 2] );
          znalezionaPozycjaPoprzednia = znalezionaPozycjaBiezaca;
          pozycjeElementowMaskiNowej.Add( pozycjeElementowMaskiNowej.Count );
        } //while( ( znalezionaPozycja = maskaBiezacegoTekstu.IndexOf( "L,L", znalezionaPozycja ) ) >= 0 )
        //Dopisać resztę, jeśli coś pozostało
        int pozycjaNastepnegoTekstu = znalezionaPozycjaPoprzednia + 3;
        if( pozycjaNastepnegoTekstu < maskaBiezacegoTekstu.Length )
        {
          //Przepisać do końca
          for( int j = pozycjaNastepnegoTekstu; j < maskaBiezacegoTekstu.Length; j++ )
          {
            maskaNowa += maskaBiezacegoTekstu.Substring( j, 1 );
            tekstPodzielonyNaElementyMaskiNowej.Add( tekstPodzielonyNaElementyMaskiBiezacej[j] );
            pozycjeElementowMaskiNowej.Add( pozycjeElementowMaskiNowej.Count );
          } //for( int j = pozycjaNastepnegoTekstu; j < maskaBiezacegoTekstu.Length; j++ )
        } //if( pozycjaNastepnegoTekstu < maskaBiezacegoTekstu.Length )
        if( podmieniono )
        {
          maskaBiezacegoTekstu = maskaNowa;
          tekstPodzielonyNaElementyMaskiBiezacej = tekstPodzielonyNaElementyMaskiNowej;
          pozycjeElementowMaskiPierwotnej = pozycjeElementowMaskiNowej;
        } //if( podmieniono )
      } //if( maskaBiezacegoTekstu.Length > 2 )
      maskiZtekstamiPierwotne.Dodaj( maskaBiezacegoTekstu, new KeyValuePair<List<string>, int>( tekstPodzielonyNaElementyMaskiBiezacej, i ) );
      if( !pozycjePierwotneElementowMasekDict.ContainsKey( maskaBiezacegoTekstu ) )
      {
        pozycjePierwotneElementowMasekDict.Add( maskaBiezacegoTekstu, pozycjeElementowMaskiPierwotnej );
      } //if( !pozycjePierwotneMasek.ContainsKey( maskaBiezacegoTekstu ) )
    } //foreach( string tekst in tekstyList )
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2295
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Trochę lepsze sortowanie tekstów

Postprzez asa » sty 18, 2019 19:14

Proszę lispowników o sprawdzenie czy wyrabia takie coś
Kod: Zaznacz cały

(defun test (lista / ?? a1 ??? wynik)
(setq ??(mapcar '(lambda (el1)(setq a1(vl-string->list el1))
(list(read(vl-string-subst "" (apply 'strcat (mapcar 'chr
(member(nth(vl-position (car(vl-remove-if '(lambda (el) (< el 58)) a1)) a1) a1) a1))) el1))
(apply 'strcat (mapcar 'chr
(member(nth(vl-position (car(vl-remove-if '(lambda (el) (< el 58)) a1)) a1) a1) a1)))
))lista) )
(setq ???(acad_strlsort (mapcar '(lambda (el) (cadr el)) ??)) maska nil)
(while ???(setq el (car ???) maska (append maska(list el))  ??? (vl-remove el(cdr  ???)) ) )
(setq wynik nil)
(mapcar '(lambda (a1)(setq ??? nil)      
(mapcar '(lambda(el) (if(vl-some '= (list a1) (cdr el))(setq ???(append ???(list el)) ?? (vl-remove el ??))))??)
(setq wynik (append wynik (list ???))))maska)
(setq wynik (apply 'append(mapcar '(lambda (a1)(vl-sort a1 (function(lambda (el1 el2) (< (car el1) (car el2)))) ) ) wynik)))
(setq wynik (mapcar '(lambda(el)(if (not (null(car el)))(strcat (rtos(car el)) (cadr el)) (cadr el))) wynik))
wynik
);;;;
(setq lista (list "0Ola""100Z" "barbara jest ...." "10Zaras wskoczy"  "1.2z" "1.5z" "12cc" "-1asa"   "0asa"  "20bbb"  "100bbb"  "2bbb" "20kra" "100asa"  "100kra"  "2kra"  ))   
(test lista)

W zakresie zadanej przez Badziewiaka pracy domowej ;)
bo wynik ma poprawny
("-1asa" "0asa" "100asa" "barbara jest ...." "2bbb" "20bbb" "100bbb" "12cc" "2kra" "20kra" "100kra" "0Ola" "1.2z" "1.5z" "100Z" "10Zaras wskoczy")
Pozdrawiam ciepło
asa
P.S.
Pewnie dało by się to zrobić jeszcze krócej i wydajniej, ale to tylko zabawa ;) Oczywiście są "pewne niedociągnięcia", ale to tylko zabawa. Lambdy mapcary ... lubię ja ...
asa
 
Posty: 568
Dołączył(a): lut 18, 2007 20:01

Re: Trochę lepsze sortowanie tekstów

Postprzez badziewiak » sty 18, 2019 19:37

Ale chwilunia, to dopiero jedna trzecia roboty!
Teraz te maski trzeba dopasować wg mojego opisu, aby w jednej kolumnie były dane tego samego typu. Chyba nie chcemy porównywać ceny za hamburgera z listą nazwisk, prawda? Przeskoczyłeś ważny etap :)

Zobacz drugą z trzech części roboty:
Kod: Zaznacz cały
    List<string> maskiZrodloweList = new List<string>();
    List<string> maskiWszystkieDopasowane = new List<string>(); //Wirtualna tablica masek
    //Na razie skopiować wszystkie maski pierwotne do wirtualnej tablicy masek
    int nrWierszaMaskiNajdluzszej = 0;
    int dlugoscMaskiNajdluzszej = 0;
    foreach( KeyValuePair<string /*maska pierwotna*/,  List<KeyValuePair<List<string> /*tekst podzielony na elementy maski*/, int /*nr tekstu wejściowego*/>>> para in maskiZtekstamiPierwotne.zawartosc )
    {
      string maskaPierwotna = para.Key;
      maskiZrodloweList.Add( maskaPierwotna );
      maskiWszystkieDopasowane.Add( maskaPierwotna );
      int dlugoscMaski = maskaPierwotna.Length;
      if( dlugoscMaski > dlugoscMaskiNajdluzszej )
      {
        dlugoscMaskiNajdluzszej = dlugoscMaski;
        nrWierszaMaskiNajdluzszej = maskiWszystkieDopasowane.Count - 1;
      } //if( dlugoscMaski > dlugoscMaskiNajdluzszej )
    } //foreach( KeyValuePair<string, List<string>> para in maskiZtekstami.zawartosc )

    //Teraz przeglądać wszystkie maski wg kolumn.
    int iloscWierszy = maskiWszystkieDopasowane.Count;
    int nrKolumny = 0;
    do
    {
      string kolumnaNajdluzszejMaski = maskiWszystkieDopasowane[nrWierszaMaskiNajdluzszej].Substring( nrKolumny, 1 );
      for( int nrWiersza = 0; nrWiersza < iloscWierszy; nrWiersza++ )
      {
        string maskaBiezacaZrodlowa = maskiZrodloweList[nrWiersza];
        string maskaBiezacaModyfikowana = maskiWszystkieDopasowane[nrWiersza];
        int nrOstatniegoZnaku = maskaBiezacaModyfikowana.Length - 1;
        //Jeśli to już koniec bieżącej maski, to dodawać do jej końca kolumnę najdłuższej maski
        if( nrOstatniegoZnaku < nrKolumny )
        {
          maskaBiezacaModyfikowana += kolumnaNajdluzszejMaski;
          maskiWszystkieDopasowane[nrWiersza] = maskaBiezacaModyfikowana;
          //Zaktualizować położenie odpowiednika kolumny źródłowej. Polega to po prostu na wstawieniu wartości -1 do bieżącej kolumny
          List<int> pozycjePierwotneMaskiBiezacej = pozycjePierwotneElementowMasekDict[maskaBiezacaZrodlowa];
          pozycjePierwotneMaskiBiezacej.Add( znacznikPozycjaDodanaSztucznie );
          pozycjePierwotneElementowMasekDict.Remove( maskaBiezacaZrodlowa );
          pozycjePierwotneElementowMasekDict.Add( maskaBiezacaZrodlowa, pozycjePierwotneMaskiBiezacej );
        } //if( nrOstatniegoZnaku < nrKolumny )
        else
        {
          string kolumnaBiezacejMaski = maskaBiezacaModyfikowana.Substring( nrKolumny, 1 );
          //Jeśli kolumna bieżącej maski jest inna, to wstawić do niej ten sam element kolumny, który występuje w masce najdłuższej
          if( kolumnaBiezacejMaski != kolumnaNajdluzszejMaski )
          {
            maskaBiezacaModyfikowana = maskaBiezacaModyfikowana.Insert( nrKolumny, kolumnaNajdluzszejMaski );
            maskiWszystkieDopasowane[nrWiersza] = maskaBiezacaModyfikowana;
            //Zaktualizować położenie odpowiednika kolumny źródłowej. Polega to po prostu na wstawieniu wartości -1 do bieżącej kolumny
            List<int> pozycjePierwotneMaskiBiezacej = pozycjePierwotneElementowMasekDict[maskaBiezacaZrodlowa];
            pozycjePierwotneMaskiBiezacej.Insert( nrKolumny, znacznikPozycjaDodanaSztucznie );
            pozycjePierwotneElementowMasekDict.Remove( maskaBiezacaZrodlowa );
            pozycjePierwotneElementowMasekDict.Add( maskaBiezacaZrodlowa, pozycjePierwotneMaskiBiezacej );
            //Czy po modyfikacji bieżąca maska stała się najdłuższa?
            if( dlugoscMaskiNajdluzszej < maskaBiezacaModyfikowana.Length )
            {
              dlugoscMaskiNajdluzszej = maskaBiezacaModyfikowana.Length;
              nrWierszaMaskiNajdluzszej = nrWiersza;
            } //if( dlugoscMaskiNajdluzszej < maskaBiezaca.Length )
          } //if( kolumnaBiezacejMaski != kolumnaNajdluzszejMaski )
        } //else if( maskaBiezaca.Length < dlugoscMaskiNajdluzszej )
      } //for( int nrWiersza = 0; nrWiersza < iloscWierszy; nrWiersza++ )
      nrKolumny++;
    }
    while( nrKolumny < dlugoscMaskiNajdluzszej );


Aby się nie rozdrabniać, od razu wrzucę kod odpowiedzialny za przygotowanie danych do sortowania wg wielu kolumn jak wielopoziomowe sortowanie w arkuszu kalkulacyjnym:
Kod: Zaznacz cały
        //Teraz przygotować wiersze do sortowania zgodnie z nowymi maskami
        List<int> kolejnoscWejsciowaTekstowPrzetwarzanych = new List<int>();
        for( int i = 0; i < maskiZrodloweList.Count; i++ )
        {
          string maskaBiezacaZrodlowa = maskiZrodloweList[i];
          string maskaBiezacaModyfikowana = maskiWszystkieDopasowane[i];
          List<int> pozycjePierwotneMaskiZrodlowej = pozycjePierwotneElementowMasekDict[maskaBiezacaZrodlowa];
          //Pobrać teksty maski źródłowej
          List<KeyValuePair<List<string>, int>> tekstyDoSortowaniaListCalejMaski = maskiZtekstamiPierwotne.zawartosc[maskaBiezacaZrodlowa];
          for( int j = 0; j < tekstyDoSortowaniaListCalejMaski.Count; j++ )
          {
            List<string> tekstJedenDoSortowania = tekstyDoSortowaniaListCalejMaski[j].Key;
            int indeksTekstuWejsciowego = tekstyDoSortowaniaListCalejMaski[j].Value;
            kolejnoscWejsciowaTekstowPrzetwarzanych.Add( indeksTekstuWejsciowego );
            List<CVariant> wiersz = new List<CVariant>();
            for( int k = 0; k < maskaBiezacaModyfikowana.Length; k++ )
            {
              string elementMaskiBiezacej = maskaBiezacaModyfikowana.Substring( k, 1 );
              int pozycjaElementuMaski = pozycjePierwotneMaskiZrodlowej[k];
              //Jeśli element w masce został dodany sztucznie, wstawić określoną wartość zależnie od typu elementu maski. W przeciwnym wypadku wstawić wartość rzeczywistą.
              if( pozycjaElementuMaski == znacznikPozycjaDodanaSztucznie )
              {
                CVariant kolumna = null;
                if( elementMaskiBiezacej == maskaAlfabet )
                {
                  kolumna = new CVariant( "" );
                } //if( elementMaskiBiezacej == maskaAlfabet )
                else if( elementMaskiBiezacej == maskaLiczba )
                {
                  kolumna = new CVariant( ( double )0 );
                } //else if( elementMaskiBiezacej == maskaLiczba )
                else
                {
                  kolumna = new CVariant( elementMaskiBiezacej );
                } //else
                wiersz.Add( kolumna );
              } //if( pozycjaElementuMaski == znacznikPozycjaDodanaSztucznie )
              else
              {
                string elementDoSortowaniaRzeczywisty = tekstJedenDoSortowania[pozycjaElementuMaski];
                CVariant kolumna = null;
                if( elementMaskiBiezacej == maskaAlfabet )
                {
                  kolumna = new CVariant( elementDoSortowaniaRzeczywisty );
                } //if( elementMaskiBiezacej == maskaAlfabet )
                else if( elementMaskiBiezacej == maskaLiczba )
                {
                  kolumna = new CVariant( double.Parse( elementDoSortowaniaRzeczywisty, plPL ) );
                } //else if( elementMaskiBiezacej == maskaLiczba )
                else
                {
                  //Pewnie jakiś separator czy inne cholerstwo
                  kolumna = new CVariant( elementMaskiBiezacej );
                } //else
                wiersz.Add( kolumna );
              } //else if( pozycjaElementuMaski == znacznikPozycjaDodanaSztucznie )
            } //for( int k = 0; k < maskaBiezacaModyfikowana.Length; k++ )
            sort.dodajWiersz( wiersz ); //<-------------- Tu wstawia się wiersze, które będą posortowane wg wielu kolumn jak w arkuszu kalkulacyjnym.
          } //for( int j = 0; j < tekstyDoSortowaniaList.Count; j++ )
        } //for( int i = 0; i < maskiZrodloweList.Count; i++ )


A tak u mnie wygląda wyciąganie kolejności posortowanych elementów:
Kod: Zaznacz cały
    if( sort.iloscWierszy > 0 )
    {
      sort.sortuj();
    } //if( sort.iloscWierszy > 0 )
    indeksyList = new List<int>();
    for( int i = 0; i < kolejnoscWejsciowaTekstowPrzetwarzanych.Count; i++ )
    {
      indeksyList.Add( kolejnoscWejsciowaTekstowPrzetwarzanych[sort.indeks( i )] );
    } //for( int i = 0; i < kolejnoscWejsciowaTekstowPrzetwarzanych.Count; i++ )
Ostatnio edytowany przez badziewiak, sty 18, 2019 20:02, edytowano w sumie 1 raz
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2295
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Trochę lepsze sortowanie tekstów

Postprzez asa » sty 19, 2019 08:26

Badziewiaku wiem ze to tylko wstęp z moje strony do tematu ale troszkę mi się zajęć przeróżnych nazbierało więc szybko w międzyczasie spłodziłem lispa ;-) (niedorobiony specjalnej troski mi wyszedł chyba ;-) ). W sumie w tych zabawach chciałem sprawdzić jak lispa sobie będzie rządził z analizą pojedynczego stringa czyli dłubanie z niego liczb fragmentów słów i takich tam. Daje radę dinozaur choć... zawsze będzie choć. Dalsze operacje po rozłożeniu stringa na powiedzmy listę (liczba kawałek_stringu liczba ) to jest to co lispy lubią czyli operacje na listach podlistach a w tym zakresie dinozaur moim zadaniem jest nie do pobicia.
Pozdrawiam ciepło
asa
P.S.
Przepraszam za literowki ale mobilne mi nie służą ... dinozaurami się chyba za dużo bawię
asa
 
Posty: 568
Dołączył(a): lut 18, 2007 20:01

Re: Trochę lepsze sortowanie tekstów

Postprzez asa » lut 01, 2019 23:30

A tu jakoś tak ucichło a temat fajny ...
asa
 
Posty: 568
Dołączył(a): lut 18, 2007 20:01

Poprzednia strona

Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników