🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #309343

Re: fir's sicl

#309343
From: M.M.
Date: Tue, 08 Aug 2017 05:07
193 lines
8545 bytes
On Tuesday, August 8, 2017 at 2:29:47 AM UTC+2, (fir) wrote:
> W dniu wtorek, 8 sierpnia 2017 02:06:03 UTC+2 użytkownik M.M. napisał:
> > On Tuesday, August 8, 2017 at 1:34:50 AM UTC+2, (fir) wrote:
> > > W dniu wtorek, 8 sierpnia 2017 00:41:27 UTC+2 użytkownik M.M. napisał:
> > > > On Monday, August 7, 2017 at 11:14:27 PM UTC+2, godek....@gmail.com wrote:
> > > > 
> > > > > szczerze mówiąc, osobiście wolę korzystać z gotowych i ogólnych
> > > > > rozwiązań, niż wynajdywać koło na nowo
> > > > 
> > > > Pewnie, kto nie woli? Każdy by chciał ogólnego i zarazem wydajnego
> > > > gotowca, ale ogólne często właśnie nie spełniają wymagań wydajnościowych, albo
> > > > wbrew pozorom nie są takie ogólne za jakie uchodzą - i trzeba zakodzić.
> > > > 
> > > > Pozdrawiam
> > > 
> > > z tego co wiem jesli w ktos stawia jakies zadanie typu, dajmy na to
> > > 
> > > "policz i wypisz na ekran linie z pliku notatki.txt ktore sa dluzsze niz 75 znakow"
> > > 
> > > to zwykle e c robi sie to ręcznie (czyli 'rzezbi' na poziomie petli ifow tablic i znakow itd
> > 
> > Osobiście, gdy nie mam powodu, albo nawet gdy mam mało ważny powód, ale 
> > wolę przeznaczyć czas na coś innego, to nie rzeźbię takich zadań w
> > forach i ifach. Używam np. awka i wc; a nawet w C++ używam QStringa i
> > QRegExp. Co innego gdy bardzo ważna jest wydajność. 
> > 
> > 
> > > konkretnie byloby to
> > > 
> > > int main()
> > > {
> > >  chunk text = LoadChunk("notatki.txt");
> > >   //wczytuje plik do ramu
> > > 
> > >  chunks lines = SplitChunkOnLines(text); 
> > > 
> > >   // dzieli na linie i zwraca tablice lini 
> > >   // (w postaci bar {poczatek, koniec lini})
> > > 
> > >  int n = ChunksLength(lines);
> > > 
> > >  int long_lines_counter = 0;
> > > 
> > >  for(int i=0; i<n; i++)
> > >  {
> > >     int line_length = ChunkLength(lines.first[i]);
> > >     
> > >     if(line_length>75)
> > >     {
> > >       PrintfChunk(lines.first[i]);
> > >       
> > >       long_lines_counter++; 
> > >     }
> > >     
> > >  }
> > >  printf("\n number of  long lines: %d", long_lines_counter);
> > > 
> > >  return long_lines_counter;
> > > }
> > > 
> > > uwagi
> > > I. logiczne, przyjemne, proste a byc moze calkiem odkrywcze (ze wzgledu na idee chunk/chunks) [moge wyjasnic dokladniej jak to dziala ale raczej jutro bo ide spac]
> > > 
> > > II. nie znam za duzo rzeczy w c tego typu (nie znam wcale ale moje doswiadczenie jest ograniczone)
> > > 
> > > III. dla mnie lepsze niz wyrazenia regularne
> > > 
> > > IV. nie jestem pewien jak to sie ma do wersji na kontenerach w c++ javaskrypcie czy pythonie ale raczej nie wypada calkiem zle, 
> > > prawdopodobnie jest z grubsza na rowni a dla koderow w c moze miec dodatkowe zalety bo rozumieja co jest under the hood bo to jest kod w c (dosyc krotki)
> > 
> > W QT prościej. 22 linijki włącznie z helpem, kodowaniem, argumentami z
> > linii polecenia:
> > 
> > #include <cstdio>
> > #include <cstdlib>
> > #include <QTextStream>
> > 
> > int main(int argc, char *argv[])
> > {
> >     QTextStream out(stdout);
> >     QTextStream inp(stdin);
> >     if( argc != 3 ) {
> >         out << "using:\n" << "cat notatki.txt | wc len encode";
> >         abort();
> >     }
> >     int count = 0;
> >     const int len = QString(argv[1]).toInt();
> >     inp.setCodec(argv[2]);
> >     while( ! inp.atEnd() ) {
> >         count += inp.readLine().size() >= len;
> >     }
> >     out << "count = " << count << endl;
> >     return 0;
> > }
> >  
> > 
> 
> to chyba nie jest krocej , bo jak wywale komentarze to u mnie jest
> 
> int main()
>  {
>   chunk text = LoadChunk("notatki.txt");
>   chunks lines = SplitChunkOnLines(text); 
>   int n = ChunksLength(lines);
>   int long_lines_counter = 0;
>   for(int i=0; i<n; i++)  {
>     int line_length = ChunkLength(lines.first[i]);
>    if(line_length>75) {      PrintfChunk(lines.first[i]);       long_lines_counter++;      }
>   }
>   printf("\n number of  long lines: %d", long_lines_counter);
>  return long_lines_counter;
> }
> 
> to ze w szerz jest dluzej wynika tylko z tego ze osobiscie wole dlugie nazwy nie z kodu

Programy takie same nie są, Twój np. wczytuje cały plik do RAM, mój 
działa inline na jednym wierszu. Faktycznie, mój jest ciut dłuższy, ale
ma help, obslugę kodowania i długość wiersza z linii komend.

Ten program robi to samo co Twój:
#include <cstdio>
#include <cstdlib>
#include <QTextStream>
#include <QRegExp>

int main(int argc, char *argv[])
{
    QTextStream out(stdout);
    QTextStream inp(stdin);
    if( argc != 4 ) {
        out << "using:\n" << "cat notatki.txt | wc len encode regexp";
        abort();
    }
    int count = 0;
    const int len = QString(argv[1]).toInt();
    inp.setCodec(argv[2]);
    const QRegExp rxp( argv[3]);
    while( ! inp.atEnd() ) {
        const QStringList tokens = inp.readLine().split( rxp );
        if( tokens.size() > 0 && tokens[0].size() > len ) {
            count++;
            out << tokens[0] << endl;
        }
    }
    out << "count = " << count << endl;
    return 0;
}

Ma 27 linii. Skompiluje się na wiele systemów. Ma już podręczny help i
wszystkie parametry bierze z linii polecenia.

Po obdarciu ma 17 linijek i chyba nadal robi to samo co Twój:
#include <cstdio>
#include <QTextStream>
#include <QRegExp>
int main(int argc, char *argv[])
{
    QTextStream out(stdout), inp(stdin);
    int count = 0;
    while( ! inp.atEnd() ) {
        const QStringList tokens = inp.readLine().split( QRegExp("\\s+") );
        if( tokens.size() > 0 && tokens[0].size() > 75 ) {
            count++;
            out << tokens[0] << endl;
        }
    }
    out << "count = " << count << endl;
    return 0;
}

Na pewno jest równie zwarty jak Twój i pewnie uruchomi się poprawnie na
wielu różnych systemach.



> 
> pozatym to co ty piszesz robi chyba raczej cos innego niz moj program, co to dokladnie robi?
Teraz chyba już to samo.

> 
> > 
> > > raczej pisze sie program w pythonie 
> > Python to moim zdaniem też język klej, ponieważ w operacjach na 
> > "pojedynczej zmiennej" jest koszmarnie wolny.
> > 
> czytalem jakies dyskucje na temat podobnego przetwarzania tekstow w pythonie i nie byl koszmarnie wolny, wiekszosc roboty robil w api swoich kontenerow ktore i tak bylo zaimplementowane w c

Tak, przetwarzanie tekstu może zachodzić głównie w jakimś kodzie 
bibliotecznym napisanym w C. Jeśli duże fragmenty tekstu są
obrabiane "naraz", to nie zaobserwujemy aż 100 krotnego spadku 
wydajności.

Pozdrawiam
Technical Details
Message-ID: <1b409eb1-db00-4501-9779-b545f918b889@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!w51no1066083qtc.0!news-out.google.com!n39ni465qtf.1!nntp.google.com!w51no1066081qtc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <6950309e-21a6-436f-a500-301fc68754d5@googlegroups.com> <0c601f7b-4830-4d01-894a-9960dc6333fd@googlegroups.com> <9c9cc4ed-e8ac-43bc-9aae-89419967b92f@googlegroups.com> <9246338b-0d67-4774-a4be-6a76cd7386a7@googlegroups.com> <36fe8cff-997e-441c-8570-ef8171726ab8@googlegroups.com> <3259c160-b8be-4d8f-b8b1-930ecd99060c@googlegroups.com> <84cda872-2f99-4631-9696-38ae0ae5cc46@googlegroups.com> <7e64a61e-2f05-4831-b9b9-cb5abc435a10@googlegroups.com> <c187f471-aab0-4e10-aa37-f0c942952a86@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 10.200.48.136 with SMTP id v8mr1805547qta.5.1502168830842;        Mon, 07 Aug 2017 22:07:10 -0700 (PDT)
X-Received: by 10.31.164.205 with SMTP id n196mr17393vke.22.1502168830771; Mon, 07 Aug 2017 22:07:10 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!w51no1066083qtc.0!news-out.google.com!n39ni465qtf.1!nntp.google.com!w51no1066081qtc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Mon, 7 Aug 2017 22:07:10 -0700 (PDT)
In-Reply-To: <c187f471-aab0-4e10-aa37-f0c942952a86@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=77.254.42.28; posting-account=xjvq9QoAAAATMPC2X3btlHd_LkaJo_rj
NNTP-Posting-Host: 77.254.42.28
References: <6950309e-21a6-436f-a500-301fc68754d5@googlegroups.com> <0c601f7b-4830-4d01-894a-9960dc6333fd@googlegroups.com> <9c9cc4ed-e8ac-43bc-9aae-89419967b92f@googlegroups.com> <9246338b-0d67-4774-a4be-6a76cd7386a7@googlegroups.com> <36fe8cff-997e-441c-8570-ef8171726ab8@googlegroups.com> <3259c160-b8be-4d8f-b8b1-930ecd99060c@googlegroups.com> <84cda872-2f99-4631-9696-38ae0ae5cc46@googlegroups.com> <7e64a61e-2f05-4831-b9b9-cb5abc435a10@googlegroups.com> <c187f471-aab0-4e10-aa37-f0c942952a86@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <1b409eb1-db00-4501-9779-b545f918b889@googlegroups.com>
Subject: Re: fir's sicl
From: "M.M." <mmarszik@gmail.com>
Injection-Date: Tue, 08 Aug 2017 05:07:10 +0000
Lines: 224
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit