poniedziałek, 12 grudnia 2011

VIP: Inteligentne skalowanie

Obecnie implementuję w C# algorytm Seam Carving. Jest to zaskakująco prosty algorytm "inteligentnego" skalowania. Idea algorytmy polega na usuwaniu szwów o najmniejszej energii, gdzie energię szwu definiuje się ile krawędzi (wysokich częstotliwości) przecina dany szew.
Póki co mam zaimplementowane zmniejszanie i pracuję nad powiększaniem, później dodam możliwość maskowania. Docelowo chciałbym to później przepisać w C++ i Qt.
Stan aplikacji na dziś - po lewej obrazek wejściowy, po prawej - efekt działania programu

niedziela, 11 grudnia 2011

Stara gierka z gimnazjum

Dzisiaj znalazłem źródła mojej staarej gierki zrobionej w konsoli (C++ i WinAPI) w 2 klasie gimnazjum.
Dopiero uczyłem się programować obiektowo w C++ i alokować dynamicznie pamięć :)

Celem gry jest przejechanie jak największej ilości ludzików, omijając niebezpieczne płotki jadąc niezwykle wypasionym samochodem.
Grafika - ASCII art, migotająca bo nie ma podwójnego buforowania a sama rozgrywka jest za wolna - czego wtedy nie potrafiłem rozwiązać, a teraz mi się już nie chce ;)

Źródła do ściągnięcia tutaj, a jak ktoś chce pograć i nie chce mu się kompilować to plik wykonywalny jest tutaj.

środa, 7 grudnia 2011

Zagadka "Skarby" i jej rozwiązanie w prologu


Pierwszym zadaniem na pracownię z programowania było rozwiązanie zagadki "Skarby" z Wiedzy i Życia zaimplementowane w prologu, który idealnie nadaje się do takich zadań.

Treść zadania brzmi tak:

Mamy planszę n x m. Cyfra w danym polu oznacza, w ilu sąsiednich kratkach – stykających się z polem z cyfrą bokiem lub rogiem – znajdują się skarby. W kratkach z cyframi skarbów nie ma. Znajdź wszystkie miejsca gdzie mogą być zakopane skarby.

Jak zatem rozwiązać taki problem w prologu? Standardowo: generuj-sprawdź-nawróć.

Amoeba - eksperymentalny wirus

Postanowiłem podzielić się opisem swojego eksperymentu, który miał miejsce kilka lat temu (~4).
W skrócie - stworzyłem prostego robaka polującego na inne ustrojstwa i wprowadziłem go w "ekosystem".
Udostępniam również kod do wglądu (róbta co chceta, ale nie biorę odpowiedzialności ;)) - kod źródłowy Amoeby (VS2k8, C++ oraz WinAPI).

Dla genezy i opisu eksperymentu zapraszam do czytania dalej.

wtorek, 6 grudnia 2011

Trochę zabawy z C++

Czasem gdy człowiekowi się nudzi, można zacząć wymyślać różne głupiutkie rzeczy. Poniżej poprawny kod w języku C++:
#define __ printf
#define guy int 
#define c(_) = { 0xBAD, 0xBAD, 0xBAD, 0xBAD} 
#define create 
#define with [4] 
#define and = 
#define ever ;;
guy x_X and 0xF00D; 

// ponizszy kod wypisuje w petli nieskonczonej BAD BAD F00D
while ("elvis is alive") // lub for(ever)
{ 
    long long ago = 2; 
    create guy o_O with c(_); 
    3[o_O] = x_X; 
    x_X =3 [o_O];
    o_O[ago--+--ago] = x_X; 
    while (x_X --> 0)__("%X ", (x_X%4)[o_O]);
};

Problem z iteratorem w szablonie

Załóżmy, że mamy kod jak poniżej:
template<typename T>
void foo()
{
  std::vector<t> vec;
  /// (...)
  for (std::vector<t>::iterator it = vec.begin(); it != vec.end(); ++it)
        bar(*it);
}
Jest to w miarę standardowy kod, który powinien działać od ręki. Teoretycznie. Dlaczego ten kod raz się skompiluje a raz nie i kompilator będzie miał problem z określeniem typu it?

Otóż nie wszystkie kompilatory są na tyle sprytne by określić co się tak naprawdę kryje pod szablonem. Wtedy musimy mu podpowiedzieć, że ma do czynienia z typem, czyli napisać:
typename std::vector<t>::iterator it
Wtedy zadowolimy kompilator :)

Na szczęście w C++11 można użyć przyjemnego słówka kluczowego auto, które powinno wybawić nas od takich problemów i uprzyjemnić życie, a jeśli nie możemy skorzystać z dobrodziejstw nowego standardu to lepiej mieć nawyk dopisywania typename.  Zwłaszcza jeśli spodziewamy się, że nasz kod będzie kompilowany na różnych kompilatorach (platformach).

Przy okazji będziemy mieć kolejny powód do narzekania czemu C++ jest fuj fuj :)