Szybki sposob na zliczanie danych w plikach

Szybki sposob na zliczanie danych w plikach
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@furious programming nawet gdy w łańcuchu zamienię dane bez ozdobników - niepotrzebne dane Czas wykonywania Bedzie bardzo długo trwał nawet, gdy wyrzucę śmieci, Delphi i pascal nie radzi sobie z przetwarzaniem to samo przez to samo. 13 tyś zmiennych.I żadnego algorytmu mi nie polecicie, A wiesz dlaczego bo to pętla pod obciążeniem ,,,,


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 1x, ostatnio: Mariusz Bruniewski
szatkus
Już miałeś polecony przynajmniej jeden: https://pl.wikipedia.org/wiki/Tablica_mieszaj%C4%85ca
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Tuchów
  • Postów:12166
2
Mariusz Bruniewski napisał(a):

@furious programming nawet gdy w łańcuchu zamienię dane bez ozdobników - niepotrzebne dane Czas wykonywania Bedzie bardzo długo trwał nawet, gdy wyrzucę śmieci, […]

Te dane nie mają racji bytu, więc niepotrzebnie marnują miejsce na dysku — setki megabajtów, jeśli nie wiele gigabajtów. Cały czas mam wrażanie, że z jakiegoś powodu czerpiesz satysfakcję z zapychania dysku danymi — im więcej tym lepiej, bo lepiej brzmi, że masz pierdyliony linii w odcholerionach plików. Ty naprawdę myślisz, że im więcej tym lepiej? :D

Delphi i pascal nie radzi sobie z przetwarzaniem to samo przez to samo.

Chyba Ty. Jeśli nie umiesz napisać wydajnego algorytmu, to nie zwalaj winy na język.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Zobacz pozostałe 10 komentarzy
flowCRANE
Już to dawno temu zrobiłem. Długo jeszcze będziesz błaznować?
Mariusz Bruniewski
Mariusz Bruniewski
Dobranoc ktoś musi być mądrzejszy i zaprzestać tej głupiej konwersacji...
flowCRANE
„[…] po prostu nie radzisz sobie z wielkością ponad milion.” — nie mierz innych swoją miarą. Ja nie mam z tym żadnego problemu.
Mariusz Bruniewski
Mariusz Bruniewski
masz bo liczysz do 100
flowCRANE
Puknij się w czoło.
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
4

No i zrobiłem. Musiałem poszukać jakiś fajnych kolekcji. Znalazłem. Pierwszy raz w życiu użyłem tej klasy hashlisty. Ogólnie kod jest gówniany, sporo konkatenuje stringi, samo zapisywanie do pliku zabiera połowę czasu. Program działa ok 4-5 sek. Odpalam go w 1 wątku na 9 letnim laptopie. Na współczesnym sprzęcie, z szybszym dyskiem i odpalając parsowanie na n wątkach zejdzie się spokojnie poniżej 1s, a troszkę kod picując (chociażby ekstrakcja kluczy robię przechodząc o(n), ale nie wiem czy warunki nie zjadają czasu bo być może Pos() RPos() byłby szybszy, oraz zapis do pliku - można by to zrobić lepiej bez łączenia stringów przez + i splity), można by jeszcze więcej wycisnąć, ale nie chce mi się za free picować kodu dla kogoś, kto nie potrafi po polsku pisać. Chciałem kodu nie wrzucać tylko filmik, ale to chyba jeden sposób na udowodnienie racji i tego, że to nie Pascal jest problemem a czynnik między monitorem a fotelem. No i porównajcie objętość tego kodu, gdzie mój już jest sporo nadmiarowy i można by go skrócić. Dodatkowo dane testowe wygenerowałem więc powtórzenia są na niskim poziomie - po kilka powtórzeń. Im więcej powtarzalnych krotek to będzie się szybciej liczyło, więc mam zestaw testowy bardzo pesymistyczny.

Serio poniższy kod jest gówniany i CR bym nie przepuścił, ale nie ma sensu na potrzeby tego wątku robić refactoru prototypu.

Kopiuj
...

type

  TMap = specialize TGHashMapLP<string, Integer>;    

...


function THolyGrail.ReadExtractKeysAndCountInMap: string;
var
  i,j: integer;
  openBracketPos, closeBracketPos, firstSpacePos, lastSpacePost : integer;
  txtf,f: TextFile;
  s: String;
  s1,s2,s3,k : String;
  values: TMap;
  e: string;
  rec: TStringArray;
begin
  values := TMap.Create;

  for i := 1 to 100 do
  begin
    AssignFile(txtf, IntToStr(i)+'.txt');
    Reset(txtf);

    while true do
    begin
       ReadLn(txtf, s) ;

       if eof(txtf) then
       begin
         break;
       end;

       firstSpacePos := -1;

       for j := 1 to 100 do
       begin
         if s[j]=' ' then
         begin
           if firstSpacePos = -1 then
           begin
             firstSpacePos := j;
           end else begin
             lastSpacePost := j;
           end;
         end else if s[j] = '[' then
         begin
           openBracketPos := j;
         end else if s[j] = ']' then
         begin
           closeBracketPos := j;
         end;
       end;

       s1 := Copy (s,1,firstSpacePos-1);
       s2 := Copy (s,openBracketPos+1,closeBracketPos-openBracketPos-1);
       s3 := Copy (s, lastSpacePost+1,Length(s)-lastSpacePost);
       k:= s1 + ' ' + s2 + ' ' +s3;

       if values.Contains(k) then
       begin
         values[k] := values[k]+1;
       end else begin
         values.Add(k,1);
       end;
    end;
    Close(txtf);
  end;

  j :=  values.Count;

  AssignFile(F, 'output.txt');
  Rewrite(F);

  for e in values.Keys do
  begin
    rec := e.Split (' ');
    s1 := rec[0];
    s2 := rec[1];
    s3 := rec[2];
    writeln(F, IntToStr(values.Items[e]) + ' - ' + rec[0] + ' razy wystąpiło powtórzenie w rzędzie [' + rec[1]+ '] => Powtórzenia liczb z sortowaniem pliki PLBS.txt Poz.: ' + rec[2]);
  end;

  CloseFile(F);
  values.Destroy;
end; 

screecast:
zliczanie.gif

Tak więc weź sobie ten mój kod i dalej baw się w oszukiwanie się i granie w lotto. Jeśli natomiast chcesz po swojemu to koniecznie oczyszczaj ten shitowy format i używaj porządnych map do liczenia. TStringLiata jest gówniana. Podobnie TFPGMap. No i trzeba by to przekazać w jakimś streamie do dalszego przetwarzania albo zoptymalizować zapis do pliku.

btw. przez ten moment nieoptymalny kod napisany na kolanie zliczył 1,4mln linii. W pierwszych postach twierdziłeś, że miałeś problemy już z tysiącami...

kolejna edyta - zostały zmienne do debuggu, ale ich już nie usuwam.

edytowany 2x, ostatnio: pragmaticdev
szatkus
O, czyli jest haszmapa w FP. Ja bez litości waliłem do niej całe stringi, nawet się nie bawiłem w wycinanie wartości. Aczkolwiek to zawsze jakaś optymalizacja. Ale autor dał limit czasu na godzinę, więc w sumie cokolwiek jest spoko :D
PR
pragmaticdev
No nie jest tak różowo jak w .net gdzie masz z paczki, bo standardowy TFPGMap z FP działał baaaardzo wolno. Nawet z wycinaniem wartości po kilkunastu minutach byłem na nastym pliku. Bez wycinania wartości - czyli klucze jako całe te chamskie stringi to po kilkunastu minutach byłem na pliku 5 :D Niemniej się da. TGHashMapLP jest customową klasą. Tu są ciekawe pomiary -https://forum.lazarus.freepascal.org/index.php/topic,34348.15.html Fajnie jakby ktoś przetestował na czymś lepszym niż mój stary czołg, ale obecnie nie mam dostępu do innych maszyn.
PR
pragmaticdev
Btw. wszystko co potrzebne do rozwiązania tego problemu jest na tacy w sieci.
PR
pragmaticdev
No w 1h się mieszczę XD Autor, najpierw pisał o 100 plikach, potem 500, a na końcu o 2000. Fajnie jakby odkrył, czego właściwie chce.
szatkus
O kurde, ale to w sumie dziwne, bo wycinając wartości przetważasz "tylko" 20 razy minej danych, więc trochę dziwne, że z potencjalnie kilkunastu godzin zszedłeś do kilku sekund.
PR
pragmaticdev
Czytałem, że ta standardowa mapa w FP źle radzi sobie z długimi kluczami stringowymi. Nie wchodziłem w szczegóły bo nie warto ;p Przetestowałem 2000 plików - czyli 28mln wierszy i na moim złomie poszło poniżej 2min. Dlatego wystarczy szukać w sieci i troszkę myśleć a do programowania zabierać się albo jak ma się jakieś pojęcie, lub słuchać rad ludzi co coś już w życiu napisali.
szatkus
Pewnie sam wiesz, że takie rady to w tym wątku jak grochem o ścianę.
PR
pragmaticdev
Masz racje, ale jak ktoś za dwa lata tu wejdzie to nie będzie miał przekonania, że się nie da bo jakiś guru od lotto mówiący pół wierszem tam twierdzi, tylko zobaczymy, że się da. Dodatkowo, może ludzie nabiorą do gościa dystansu.
flowCRANE
@pragmaticdev: widziałeś Generics.Collections? Zobacz, może coś Ci się przyda w przyszłości. W razie czego autor tej libki jest użytkownikiem 4p, więc można po ludzku podyskutować. ;)
PR
pragmaticdev
@furious programming: zobacz wątek jaki zalinkowałem wyżej - w nowym FPC Generics.Collections jest szybszy niż starszy, jednak nadal LGenerics jest szybszy - przynajmniej jeden gosć robił pomiary, więc wziąłem co było najszybsze ;p
flowCRANE
Ach, nie zauważyłem linku w tym gąszczu tekstu. Dlatego sam wszystkie linki dodatkowo pogrubiam. :D
Mariusz Bruniewski
Mariusz Bruniewski
TMap = specialize TGHashMapLP<string, Integer>; jaka klasa?
PR
pragmaticdev
No TGHashMapLP<T,U> - to generyk jest.
PR
pragmaticdev
Musisz zainstalować do lazarusa pakiet LGenerics - przecież wyżej w linku są opisane pakiety z generycznymi mapami do FPC. Proszę czytaj to co linkujemy.
Mariusz Bruniewski
Mariusz Bruniewski
https://github.com/avk959/LGenerics to, lecz problem z instalacją
flowCRANE
@pragmaticdev: powinieneś użyć konstrukcji while no EoF(Plik) do — jest krótka i robi to co trzeba. :P
PR
pragmaticdev
Tak, to nie jest kod godny powtarzania, a jedynie PoC, pokazujący, że oczyszczanie danych oraz dobrze dobrana struktura danych bardzo pomaga.
Mariusz Bruniewski
Mariusz Bruniewski
Odwaliłeś kawal dobrej roboty.100 zł wyśle Tobie, jeśli będzie to czego oczekuję może być?
PR
pragmaticdev
Zacznij słuchać bardziej doświadczonych ludzi, z większą wiedzą, którzy zjedli zęby na rozwiązywaniu problemów oraz debuggowaniu produkcji. Zacznij kwestionować 10 razy swoje własne konkluzje. Podążaj za radami i badaj w praktyce pomysły, a nie rób eksperymentów myślowych. To będzie najlepszy prezent jaki mi zrobisz. Co do tej symbolicznej stówki - daj spokój, bo to dla mnie niezręczne i troszkę nie na miejscu, a i za te 100zł to uczciwie kupiłbyś z 30 minut konsultacji ze mną.
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

https://github.com/avk959/LGenerics to, lecz problem z instalacją

  • LG.jpg (69 KB) - ściągnięć: 19

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
1

A próbowałeś otworzyć w swojej solucji projektu perpetum tototlotkera, skąpilować i kliknąć dodaj do projektu ;) ?

PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
2

screenshot-20210411110533.png

Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@pragmaticdev Ciekawi mnie Twój kod i za wszelką cenę chce go sprawdzić. TGHashMapLPunit1.pas Error: Identifier not found "TGHashMapLP" Chce, aby kod działał nie w konsoli lecz w unicie.

Kopiuj
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, LGenerics; // nawet gdy dodam tutaj LGenerics

  type

  TMap = specialize TGHashMapLP < string, Integer>; 
  • LG.jpg (27 KB) - ściągnięć: 10

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 2x, ostatnio: Mariusz Bruniewski
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

W żaden sposób nie mogę dodać TGHashMapLP czy to wina fpc: 3.2.0

  • FPL.JPG (45 KB) - ściągnięć: 23

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
0

Ja cie... Przecież ja wczoraj też nie znałem tej bibliotek i i odpaliłem exampla, który tam jest. Wystarczy dodać uses lgHashMap ....

Zobacz pozostałe 7 komentarzy
PR
pragmaticdev
Btw co to jest szybkość czasu? Proponuję jednak stosować standardowe metryki wydajności,
Mariusz Bruniewski
Mariusz Bruniewski
spokojnie wynagrodzę to za ten temat jak i https://4programmers.net/Forum/Delphi_Pascal/348196-problem_klas_delphi_na_lazarusa?p=1758481#id1758481. Odezwe się na priv wpierw sprawdzę
PR
pragmaticdev
Ja poproszę najbliższy wygrany zestaw 6 licz na losowanie.
Mariusz Bruniewski
Mariusz Bruniewski
Co do zestawu 6 liczb teraz zajmuje się wyliczaniem Mini Lotto
PR
pragmaticdev
Nie ma problemu - może być pakiet wygranych 5-tek na najbliższy kwartał - poskładam sobie.
Szalony Programista
Szalony Programista
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Postów:227
3

Rzadki paradygmat programowania dysfunkcyjnego, mało kto się w tych czasach na niego decyduje.

Mariusz Bruniewski
Mariusz Bruniewski
Piszesz ogólnie co do zliczania danych z plików czy to co przedstawił @pragmaticdev
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@pragmaticdev dopiero teraz testuję Twój kod. Czy nie ma przekłamań.


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
1

Po to było mi to :-)

  • LG.jpg (78 KB) - ściągnięć: 50

Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
Szalony Programista
Szalony Programista
Jak wygrasz to nie zapominaj o ludziach z forum, którzy cię wspierali
PR
pragmaticdev
@Szalony Programista: w innym komentarzu już zarezerwowałem wygrane na najbliższy kwartał. Z racji, że mój superkod przybliżył naszego małego Fermatta do sukcesu mam pierwszeństwo do odcinania kuponów ;p
Mariusz Bruniewski
Mariusz Bruniewski
Wpierw docenię @furious programming za jego wkład i za wielką wiedze. Pomógł mi dużo. Tak macie rację nie jestem alfa i omegą w programowaniu, ale czy to istotne? To nie czyni powodu do wyśmiewania. Zatem mam pomysły i wzory w głowie, gdzie należny przenieść je na kod, a tego wam brakuje. Zatem uzupełniamy się wzajemnie. Pomógł mi @kAzek no i teraz @pragmaticdev.
PR
pragmaticdev
Nadal nie wiem, co Ty masz w głowie, więc nie brakuje mi tego ;p Jeśli jest to zawierzanie w gry, tak policzone, żeby przegrywać to masz racje - tego w mojej głowie nie ma. Bardziej nastawiam się na zysk w zamian za dawanie realnej wartości.
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
0

Czyli rozumiem, że udało Ci się wpiąć mój kod do Twojego programu i działa tak jak oczekiwałeś?

Zobacz pozostałe 14 komentarzy
PR
pragmaticdev
Nie wiem ocb ze zmiennymi - znów cię nie rozumiem co mówisz. Mój kod kompilowaoem pod FPC 3.2.0. jak bardziej Ci pasuje CloseFile niż Close to sobie tak zmień - to i tak tylko PoC, żeby udowodnić, że się da i nie będę dalej go rozwijać.
Mariusz Bruniewski
Mariusz Bruniewski
U mnie działa CliseFile w przedstawionym kodzie przez @pragmaticdev Tak jak zamieścił wywala błąd error kompilatora.
flowCRANE
Nie może nie działać — to wbudowana procedura.
PR
pragmaticdev
Wiara - wypad z tych komentarzy tylko jak ludzie post, kod i kod błędu.
Mariusz Bruniewski
Mariusz Bruniewski
Zaraz podejdę do kompa i wysle kod błędu
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@pragmaticdev PROCES MYŚLENIA I WIARY.

Wyobraź sobie, że taka lina jest blisko Ziemi. Powiesz sobie przejdę po niej. A niech teraz ona będzie bardzo wysoko. Powiesz nie dam rady. Choć lina tak samo długa jak i gruba. To jest strach. Aby go przezwyciężyć niektórzy muszą mieć opaski na oczach. Być w zaślepieniu, aby otworzyć oczy, że wszystko jest możliwe!

Pierwsza tajemnica. WIARA.

=====================

Musisz mieć przekonanie w 100%, że to co chcesz uzyskać zaistnieje w realności. To może być zdrowie, stosunki partnerskie - polepszenie ich lub cokolwiek. To 100% musi być realne dla Ciebie. Wystarczy jedna chwila zwątpienia w to co wierzysz. Proces stwarzania jest bardzo osłabiony. Nie o 1% myśli np. myślisz cały czas pozytywnie a tylko jedna myśl przyszła negatywna w stosunku do 99% myśli pozytywnych. Ta jedna myśl jak myślicie ma tylko 1%. Oczywiście, że nie to ma co najmniej 50% osłabienia Twojej wiary. Taka jest prawda. Jedno zwątpienie zakłóca niesamowicie proces stwarzania, gdyż w tym momencie 1% myśli negatywnej podświadomość zaczyna przedstawiać Tobie kolejne warianty negatywności. Poprzez obrazy i wyobrażenia w podświadomości. Popatrz na poniższy obrazek i zauważ o co mi chodzi w przekazie. jaki.jpg


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
1

Jak spadniesz z liny 30cm od ziemią to co najwyżej skręcisz kostkę. Jak spadniesz z 10m możesz się zabić lub zostać kaleką. Strach w tym przypadku jest racjonalny bo skutki niepowodzenia cięższe i nieuchronne. Z wiarą u mnie na bakier. Twardo stąpam po ziemi i kieruje się determinizmem. O ile zgodzę się, że konsekwencja i systematyka są potrzebne tak powinno się wybierać osiągalne cele i racjonalne metody. Jeśli ktoś pokazałby mi człowieka, który uczy się programować i kiepsko mu idzie i chce zacząć robić programy na zamówienie, zatrudnić się czy otworzyć jakiegoś SaaS to powiem, że przedsiębiorca, zaradny. Jak widzę takiego gościa co to robi by oszukać system liczbowy - powiem wariat. Nie istnieją żadne badania potwierdzające możliwość wykrycia klucza w grach liczbowych, przez fakt entropii. Równie dobrze możesz wierzyć, że kiedyś obudzisz się i wyrosną ci skrzela. Będziesz co dziennie moczył się w wodzie i doskonalił pływanie i mimo, że nie zwątpisz ani razy to prędzej się utopisz niż zostaniesz rybą. Nie chodzi o to, że wygrana jest nierealna - istnieje pewne małe aczkolwiek skonczone prawdopodobieństwo, że trafisz, ale to przez przypadek. Za to nierealnym jest stworzenie modelu, który powtarzalnie będzie przewidywał losowania. Jeśli taki jesteś pewien to zacznij od prostszych rzeczy - bez czujników wiatru, ciśnienia, dokładnej kamery tylko mając jakiś milion prób rzutu moneta opracuj sposób na przewidzenie czy wypadnie orzeł czy reszka. Potem bierz się, za bardziej skąplikowane gry.

edytowany 2x, ostatnio: pragmaticdev
Mariusz Bruniewski
Mariusz Bruniewski
Skąd nawiazuesz temat to wygranej. Jak pisze o czym zupełnie innym. Twoja podświadomość podchwycila temat w czym się lubuje. Zatem nic świadome masz do tego. Podświadomość Twoja ubliza...
PR
pragmaticdev
Dobra, rozwiązałeś problem i super, nie rób więcej offtopu. Uważam temat za zamknięty. Na pierdołowate tematy jak podświadomość zaprasza do offtop czy flame.
Mariusz Bruniewski
Mariusz Bruniewski
To cudo
PR
pragmaticdev
Mówisz o mnie? Pozwól, że nie będę zaprzeczał ;)
Mariusz Bruniewski
Mariusz Bruniewski
Odezwę się na priv w ramach wdzięczności. Dziękuję
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@furious programmingerror.JPG
Nie może nie działać — to wbudowana procedura. — @furious programming


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 3x, ostatnio: Mariusz Bruniewski
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
1

@Mariusz Bruniewski: bo wołasz to z kodu formy pewnie i myśli że chodzi k Close z customformy. Zawołaj tam System.Close - ja nie używałem customformy i nie było konfliktu. Lub to CloseFile użyj.

Btw głupie jest walenie logiki bezpośrednio do kodu formy. Zrób jakies klasy z logiką, co implementują jakiś interface i wstrzykuje to do formy jakimś kontenerem. Chyba mormot ma jakieś DI. Wtedy unikniesz konfliktów z kodem form. No i masz mniejszy coupling i możliwość wymiany implementacji na szybszą/wolną/inna.

edytowany 1x, ostatnio: flowCRANE
Zobacz pozostałe 9 komentarzy
PR
pragmaticdev
O ile prędzej nie nastąpi jakąś zimna fuzja i w miejscu tego wątku nie powstanie idealny algorytm przewidywania mini lotka ;) Telewizja przyjedzie, mówię Wam.
Mariusz Bruniewski
Mariusz Bruniewski
O tym wspomniałem, @furious programming bo on myślał, że wywołuje aplikację w konsoli :-) CloseFile załatwia sprawę zatem po co te zdania
PR
pragmaticdev
Dobra decyzja. Piszący tutoriale raczej wiedzą co robią.
PR
pragmaticdev
Btw na PW pytałeś się o console w kontekście użycia tej mapy a nie Close więc nie odwracaj kota ;)
PR
pragmaticdev
A te uwagi są po to - bo jakbyś miał porządną architekturę to by konflikty nie powstały. Masz zbyt powiązane elementy programu i to są efekty uboczne.
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@pragmaticdev to teraz ja dziele się wiedzą.


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 1x, ostatnio: Mariusz Bruniewski
Zobacz pozostałe 42 komentarze
Szalony Programista
Szalony Programista
@Mariusz Bruniewski: nie umiem rzucać, musiał bym mieć jakąś alternatywną metodę i skąd ja ci wezmę 4 kościoły?.
Mariusz Bruniewski
Mariusz Bruniewski
Pisze w tej chwili z telefonu. Zatem słowniki szaleją. Już poprawiłem komentarz.
robertz68
akurat chyba kostka do gry nie jest idealnym losowym obiektem, niby wytworzona jest z jednorodnego materiału (zakładam że nie jest spreparowana do konkretnych wyników) ale ma wgłębienia w postaci kropek. Jeśli usuniemy czynnik ludzki i do "rzutów" użyjemy jakiegoś urządzenia które będzie to robiło w identyczny sposób, dodatkowo usuniemy warunki fizyczne, czyli odpompujemy powietrze to myślę że po bardzo dużej ilości prób wyniki będą wskazywały na przewagę ustawień kostki z małą ilością kropek na spodzie (z tej strony jest więcej materiału). Ale to tylko dywagacje.
Mariusz Bruniewski
Mariusz Bruniewski
@robertz68: rzuć nią 1000 razy zadaj sobie ten trud. Gaussa nie oszukasz:-)
Szalony Programista
Szalony Programista
Nie będę w domu kostką brukową rzucał, a innej nie mam i już mama każde iść spać więc...
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
1

@Szalony Programista


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
edytowany 1x, ostatnio: Mariusz Bruniewski
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

Nie faja


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

Okazało się, że kod przedstawiony przez @pragmaticdev nie jest szybki. Oczywiście value.add to jak TStringList.add. Postanowiłem zliczyć 5 plików po 14 mln lini. LGeneric wypadł o 1 minutę później.


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
1

Ale Ty wiesz, że zastosowałeś dziedzinę 50x większą niż pierwotnie zakładałeś na początku tego wątku? Mówiłeś o 100 plikach po 14k lini to daje 1 400 000 linii. Potem gdzieś mówiłeś o 1000 plikach po 14k linii czyli już mamy 14 000 000 linii czyli 10x więcej. Jak masz 5 plików po 14kk linii to mamy już 70 000 000 linii czyli 50x więcej... Rozumiem, że potargałem Twoje ego, tym, że sądzę, że wymyślasz sobie rzeczywistość i Twoje posty to w połowie po prostu brednie, które nie są pisane po polsku... ale co byś nie zrobił, zwiększając dziedzinę testową, to czas wykonania algorytmu też będzie wzrastał...

Zobacz pozostałe 6 komentarzy
szatkus
Czyli mamy dwie zmienne, z czego jedna to max 6? To dawaj tablicą.
PR
pragmaticdev
Mi się wydaje, że to jest tak jak z zbieraniem w parafii na remont rynien. Nie chodzi o to, żeby rynny naprawić, ale, żeby było na co zbierać.
szatkus
Chyba mamy jakieś ograniczenie górne, bo ile będzie losowań lotto za naszego życia?
PR
pragmaticdev
Za naszego życia? Za życia każdego będzie pewnie koło 30 000 losowań. Każde losowanie może wyłonić jedną z ok. 850k kombinacji, przy czym, to wbrew pozorom nie jest maksymalna ilość możliwych losowań w historii świata, bo wszak wylosowana kombinacja może wypaść wielokrotnie na różnych losowaniach.
flowCRANE
@szatkus: zawsze możesz na każde losowanie puszczać z dziesięć tysięcy losów — wyczerpiesz kombinacje za życia. :D
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
1

Natomiast jak coś działa Tobie wolno to wrzuć tutaj kod metody i proszę porównaj jego działania na tej samej co ja dziedzinie - czyli 100 plików po 14k linii. Inaczej nie jest to miarodajne, bo wzrost czasu nie jest tutaj liniowy.

Mariusz Bruniewski
Mariusz Bruniewski
Ja zawsze powtarzam, że testuje granice. To co wymyka się programistom. Do 100 każdy potrafi liczyć.
PR
pragmaticdev
Nie do 100, tylko do 1 400 000 krotek... nie nie testujesz granicy, tylko wymyślasz bez uzasadnienia jakieś ilości plików z ilościami danych w nich ;p
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
0

Nie umiesz używać komentarzy... Twój problem, który sam zdefiniowałeś to liczenie 100 plików z 14k liniami w czasie poniżej 1h. Ja zrobiłem algorytm co liczy to w kilka sekund ;p Chyba założenia są spełnione XD Pytanie też ile czasu liczyło się to Twoje 70mln wierszy bo teraz to tylko ściemniasz historyjki jakieś. Podaj dokładny czas. Ten kwestia, że to jakieś 7GB danych... czyli na przeciętnym SSD jakaś 1 minuta to będzie wczytywanie danych do pamięci, a też pytanie ile te kolekcje spuchną i ile masz ramu na komputerze testowym... Na pewno nie zrobisz algorytmu, którego dziedzina testowa będzie dążyć do nieskończoności, a czas wykonania będzie w granicy kilku sekund...

szatkus
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Postów:227
2

Od lat nie pisałem w Delphi, ale postanowiłem, że sobie zrobię. Szybko okazało, że czytanie plików tekstowych w FPC jest bardzo wolne. I nie ma to za bardzo uzasadnienia, bo nawet klepnięty na szybko skrypt w Pythonie iterował szybciej. Ostatecznie zaimplementowałem to na Streamach. Przy okazji odpaliły mi się znajome neurony, więc możliwe, że już to kiedyś robiłem. Tak że, ten, wygenerowałem 5 plików po 14 milionów linii w podanym wyżej formacie, gdzie pierwsza wartość to losowa liczba z zakresu 1..6, a druga to 1..50000. Odpaliłem to 6-rdzeniowym procesorze, więc żaden wątek nie był przygłodzony i program zliczył wszystko w 4 sekundy. Czyli każdy wątek przerobił ok. 360MB danych w sekundę.

Kopiuj
program LottoDestroyer;
{$mode objfpc}

uses
  Classes, SysUtils;
 
const
  MAX_ROW = 6;
  MAX_POSITION = 50000;
  FILE_COUNT = 5;
  CHUNK_SIZE = 1024 * 1024;

type
  TFileCruncher = class(TThread)
    constructor Create(Filename: String);
    procedure Execute; override;
  public
    Counts: Array[1..MAX_POSITION, 1..MAX_ROW] of Integer;
  private
    Filename: String;
  end;
 
constructor TFileCruncher.Create(Filename: String);
begin
  inherited Create(True);
  self.Filename := Filename;
end;

procedure TFileCruncher.Execute;
var 
  Handler: TFileStream;
  Row, Position: Integer;
  Buffer: Array[1..CHUNK_SIZE] of Char;
  Bytes: LongInt;
  Digits: Array[1..8] of Char;
  InNumber: Boolean;
  Counter: Integer;
  i: Integer;
begin
  Handler := TFileStream.Create(Self.FileName, fmOpenRead);
  repeat
    Bytes := Handler.Read(Buffer, Length(Buffer));
    for i := 1 to Bytes do
    begin

      if Buffer[i] = ']' then
      begin
        InNumber := False;
        Val(Copy(Digits, 1, Counter-1), Row);
      end;

      if Buffer[i] = #10 then
      begin
        InNumber := False;
        Val(Copy(Digits, 1, Counter-1), Position);
        Inc(Self.Counts[Position][Row]);
      end;

      if InNumber and (Ord(Buffer[i]) >= 48) and (Ord(Buffer[i]) <= 57) then
      begin
        Digits[Counter] := Buffer[i];
        Inc(Counter);
      end;

      if Buffer[i] = '[' then
      begin
        InNumber := True;
        Counter := 1;
      end;

      if Buffer[i] = ':' then
      begin
        InNumber := True;
        Counter := 1;
      end;
      
    end;
    
  until Bytes < Length(Buffer)
end;

var
  Threads: Array[1..FILE_COUNT] of TFileCruncher;
  Start: Double;
  i, j, k: Integer;
  Counts: Array[1..MAX_POSITION, 1..MAX_ROW] of Integer;
begin
  Start := Now;

  for i := 1 to FILE_COUNT do
  begin
    Threads[i] := TFileCruncher.Create(IntToStr(i) + '.txt');
    Threads[i].Start;
  end;

  for i := 1 to FILE_COUNT do Threads[i].waitFor;

  for i := 1 to FILE_COUNT do
  begin
    for j := 1 to MAX_POSITION do
    begin
      for k := 1 to MAX_ROW do
      begin
        Counts[j][k] := Counts[j][k] + Threads[i].Counts[j][k];
      end;
    end;
  end;

  Writeln(Counts[6][4]);
  Writeln(Format('%7.2f', [(Now - Start) * 100000]));
end.

Poza tym kisnę z tego deklarowania zmiennych przed kodem :D


𐤃𐤐𐤀
pstmax
Będę złośliwcem dla sportu i zabawy - zrób wstawkę asm i pojedź kodem maszynowym :-)
pstmax
Kto używa języka wyższego rzędu do takich "maszynowych" operacji? Na fałszywych założeniach udowodnisz nawet, że Ziemia jest płaska :-)
szatkus
@pstmax: nie znam asm. Jestem cywilizowanym człowiekiem, który na co dzień pisze w Javie i JS. Artefakty, które udostępniają mi te języki są tak szybkie, że nie muszę schodzić do iterowania po bajtach. Tutaj się nie udało.
pstmax
Nie ma to jak :-)
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Tuchów
  • Postów:12166
1
szatkus napisał(a):

Od lat nie pisałem w Delphi, ale postanowiłem, że sobie zrobię. Szybko okazało, że czytanie plików tekstowych w FPC jest bardzo wolne. I nie ma to za bardzo uzasadnienia […]

IMO jest — ReadLn czyta bajt po bajcie, co w żadnym wypadku nie jest wydajne. ;)

Poza tym kisnę z tego deklarowania zmiennych przed kodem :D

A widzisz, w Delphi można deklarować zmienne jak w C (czyli wszędzie), a we Free Pascalu nie.

I był czas, że pytałem deweloperów kompilatora, czy są plany dotyczące dodania wsparcia dla deklaracji stałych i zmiennych wewnątrz bloków kodu (w końcu FPC jest silnie kompatybilny z Delphi), ale zaczęło się jęczenie użytkowników, że „to takie niepascalowe”, że to „zniszczy czytelność kodu” i tego typu banialuki. Ostatecznie nazwałem ich zamrożonymi w przeszłości „dinozaurami hamującymi rozwój”, ci się obrazili, a wsparcia zmiennych jak nie było tak nie ma i nie zanosi się na to, że kiedykolwiek będzie (dla mnie to bardzo wielka szkoda).

Chociaż tyle dobrze, że trwają prace nad dodaniem wsparcia metod anonimowych. :D


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
Zobacz pozostałe 3 komentarze
szatkus
W ogóle ten mały eksperyment uświadomił mi jak słabym pomysłem jest pisanie czegoś obecnie w Pascalu. Nie przez język. Po prostu wpisując "jak coś zrobić w java[script]" mam od razu mnóstwo wyników, często jakieś wpisy na blogach, które wyjaśniają czego użyć. Szukając rzeczy potrzebnych do napisania tego kodu często dostawałem prawie nic. Forum Lazarusa wydaje się całkiem dobre, ale rozmiar społeczności sprawia, że nie ma tylu rozwiązanych problemów w internetach, na których można bazować.
pstmax
Każdy człowiek jest z natury leniwy - dlatego, tam, gdzie może zrobi "burdel" - a jakie "jęczenie", stękanie i piszczenie jak ma ruszyć "dupsko" albo trochę więcej się wysilić i napisać komentarz w kodzie programu - typowy polski komentarz
flowCRANE
@szatkus: sam jak potrzebuję to szukam rozwiązań dla Delphi, bo jest ich znacznie więcej niż dla Free Pascala. Konkretnie dla Lazarusa szukam tylko wtedy, gdy dany problem jest dla niego specyficzny (lub dla FPC). No i prawie zawsze znajduję pomocne materiały, a jeśli nie to pytam na forum Lazarusa i po godzinie mam kilka odpowiedzi. Tak więc nie mam powodów do narzekania.
szatkus
@furious programming: to tak z perspektywy ludzia, który na codzień pisze w popularniejszych językach. Jak mówiłem, forum Lazarusa jest super, ale dopiero teraz dostrzegłem jak brak dużej społeczności utrudnia pracę z językiem. Jak chcę coś zrobić w Javie to jest duża szansa, że już ktoś się o to zapytał na SO.
flowCRANE
Z tym się zgadzam — im większa popularność tym więcej materiałów. Oczywiście C++, C# i Java biją na głowę Delphi i Free Pascala, nie tylko w kwestii materiałów edukacyjnych, ale też bibliotek i wakatów.
PR
PR
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:204
0

Wydaje mi się że żadna ilość wydajnych implementacji nie przekona autora, że to się da zrobić. Btw - gdzie Twój test z 8GB? Ile to czasu liczy ;) ?

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
1
szatkus napisał(a):

Poza tym kisnę z tego deklarowania zmiennych przed kodem :D

To Ty się na Delphi nie znasz, bo można np. tak:

Kopiuj
for var i := 1 to Bytes do

Także ten, kisnę z Twojego kiśnięcia, cokolwiek to znaczy ;-)

Zobacz pozostałe 3 komentarze
WL
Oj tam nie ma się co obruszać (poważnie), ale to nie ja robiłem sobie heheszki z deklaracji zmiennych. Jak widać, czasem można dostać kijem którym chce się zdzielić psa.
szatkus
@wloochacz: no problem. Po prostu w pierwszym zdaniu nakreśliłem, że uja się znam na Delphi, a ze świecą szukać przykładów, gdzie się używa var, więc myślałem, że się nie da. Zresztą @furious programming wskazał, że chyba się nie da w FPC.
flowCRANE
No bo się nie da we Free Pascalu — na tym polu kompatybilności z Delphi nie było, nie ma i najpewniej nigdy nie będzie.
WL
Oczywiście @szatkus że nie ma problemu, pokisneliśmy odrobinę i tyle ;-)
pstmax
http://docwiki.embarcadero.com/RADStudio/Sydney/en/Main_Page - każdy, kto zaglądnie będzie miał aktualne informacje
Mariusz Bruniewski
Mariusz Bruniewski
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Świecie
0

@wloochacz: sprawdzę i dam znać.


Umysł pozytywny szuka sposobów, jak coś wykonać; umysł negatywny wyszukuje sposoby, by uzasadnić, że czegoś nie można zrobić.
~~ Napoleon Hill ~~
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)