Krótkie programiki

Strona główna

Treść

Liczby zmiennoprzecinkowe (floating-point)

approx.c [2004-04-07]
Aproksymacja pierwiastka liczby zmiennoprzecinkowej. Działa podobnie do rozkazów SSE (brana jest jakaś liczba starszych bitów, która indeksuje tablice z prekalkulowanymi wartościami).

Algorytmy

atoi.c
implementacja funkcji atoi
big_fact.c
silnia z dużych liczb w C
big_fact2.c
silnia z dużych liczb w C (podejście drugie)
gcd.c
największy wspólny dzielnik
lcm.c
największa wspólna wielokrotność
powint.cpp
efektywne potęgowanie

Algorytmy kompresji LZxx

  • LZ77.py — implementacja algorytmu LZ77 (wolne)
  • LZSS.py — implementacja algorytmu LZSS (wolne)
  • LZ77-2.py, LZSS-2.py — modyfikacja powyższych: wyszukiwanie podciągów tylko w obrębie słownika
  • LZ78.py — implementacja algorytmu LZ78 (szybkie)
  • LZW.py — implementacja algorytmu LZW (szybkie)
poly_root.py [2007-03-23]
pierwiastki wielomianów 1., 2., 3. stopnia

Niskopoziomowe

count_cpu.c [2008-06-25]
Program returns number of available CPUs or enumerate them.
env.cpp
Dodawanie nowej globalnej zmiennej środowiskowej w DOS-ie (kompilator DJGPP).
sn-bios.c
Program próbuje wyciągnąć numer seryjny BIOS; przesłane na listę asm@hydepark.pl.
termsize.c
Sposób odczytu rozmiaru terminala w Linuxie.
console.tgz
niektóre funkcje z conio.h zrealizowane z użyciem kodów sterujących terminala (man console_codes)

Różności

vargs.c
sposób użycia funkcji o zmiennej liczbie parametrów (ku pamięci)
myassert.c

bardziej rozbudowana funkcja assert korzystająca z dobrodziejstw preprocesora. Np.:

f = fopen(filename, 'w');
Assert(f != NULL, ("File %s not found", filename))
wordlist2userdic.c [2004-08-05], wordlist2userdic.awk (nie obsługuje „polskich liter”)

[en] Program converts a list of words saved in a text-file into format recognized by OO (tested in OO 1.0 and 1.1.1). It also converts a polish diacritical characters — simply define PL on compilation.

[pl] Program konwertuje listę słów (każde słowo w jednym wierszu) na słownik użytkownika dla programu OpenOffice; testowane na OO 1.0, 1.1. Słownik należy skopiować do katalogu {OO}/user/wordbook i ponownie uruchomić OO.

Użycie:

$ wordlist2userdic lista_słów openoffice.dic
$ wordlist2userdic.awk < lista_słów > openoffice.dic

Kompilacja:

$ gcc wordlist2userdic.c -o wordlist2userdic
$ gcc -DPL wordlist2userdic.c -o wordlist2userdic # polskie litery
conv.c [2009-02-25]
[en] Simple iso-8850-2 to UTF-8 convert. Program is faster around 30-40% than naive approach i.e. char by char — it tries to process 4 chars at the same time. Program is also faster than GNU iconv, speedup depends on file input. On my machnine I've measured speedup from 70% to 270%.

Grafika

See the repository

triangulation.py
triangulacja dowolnego wielokąta (używa metody ear clipping)
aabb2D.py
biblioteczka: działania na dwuwymiarowych pudełkach otaczających typu AABB

Algorytm Sutherlanda-Hodgmana

Wielomianowe krzywe Beziera
SVG + Javascipt
refine_polyline.py
Upraszczanie łamanych aproksymujących wykresy funkcji, patrz artykuł
3d.svg
3D model of truncated octahedron — Javascript + SVG

Ocaml

myhash.ml
dodatkowe funckje działające na tablicach asocjacyjnych
mylist2.ml
dodatkowe funkcje działające na listach (wzorowane na Heskellu)
mylist.ml
dodatkowe funkcje działające na listach (wzorowane na SML-u)
mystring.ml
dodatkowe funkcje działające na łańcuchach znaków (wzorowane na metodach znanych z Pythona)

Python [2007-06-15]

filter2.py
Funkcja zwraca krotki pasujące do pewnego wzorca, np. takie które na pierwszym miejscu mają liczbę 100, a wartości pozostałych elementów są nieistotne.
unzip.py
odwrotnego działanie do wbudowanej funkcji zip
group_elements.py [2007-03-14]

Funkcja grupuje kolejne elementy list, dla których funkcja value zwróci tę samą wartość.

>>> L = [1, 1, 1, 1, 2, 3, 3, 4, 4, 4, 4]
>>> group_elements(L)
[(1, [1, 1, 1, 1]), (2, [2]), (3, [3, 3]), (4, [4, 4, 4, 4])]
>>>
>>> L = ["aaa", "aab", "bba", "bab", "bca"]
>>> group_elements(L, lambda x: x[0])
[('a', ['aaa', 'aab']), ('b', ['bba', 'bab', 'bca'])]
>>>

Zwraca listę par (wspólny element, lista elementów).

Funkcję fields (z bodajże SML-a), która działa podobnie do split, ale zostawia na liście pola białych znaków można bardzo zgrabnie wyrazić za pomocą group_elements:

def fields(string, pred=lambda x: x.isspace()):
        tmp = group_elements(string, pred)
        return [(p, ”.join(cl)) for p, cl in tmp]
walk_dir.py

W pliku znajdują się dwie funkcje: find_file oraz find_all_files.

Funkcja find_file zwraca pierwszy plik, dla którego predykat pred jest prawdziwy, natomiast find_all_files zwraca listę wszystkich plików spełniających predykat. Funkcja pred przyjmuje dwa argumenty: nazwę bieżącego katalogu oraz nazwę pliku.

Funkcje wyszukują pliki w katalogu, bądź na liście katalogów.

Obie funkcje przechodzą katalogi wszerz; o tym czy katalog zostanie odwiedzony decyduje funkcja enterdir (domyślnie każdy katalog jest odwiedzany). Funkcja enterdir przyjmuje dwa argumenty: nazwę bieżącego katalogu oraz poziom w drzewie katalogów (liczony od zera).

Wyszukanie pliku nie uwzględniając rozmiaru liter:

filename = 'Text.TXT'

def pred(p, f):
        return f.lower() == filename.lower()

f = find_file(['.', '/home/'], pred)

Wyszukanie plików .py we wszystkich katalogach oprócz CVS, .svn i tmp:

def pred(p, f):
        return f.endswith('.py')

def enterdir(p, l):
        return not p.endswith('/CVS')  and \
                   not p.endswith('/.svn') and \
                   not p.endswith('/tmp')

fl = find_all_files('.',  pred, enterdir)
partition.py
podobne do split, ale zostawia ciągi separujące
msplit.py [2007-03-01]
split na znakach z podanego zbioru (lub dopełnienia zbioru)
trie.py [2007-03-23]
drzewa trie w Pythonie (powstało przy okazji udoskonalania rozszerzeń do reST)
reduce-samples.py [2007-03-14]
Przykłady zastosowań wbudowanej funkcji reduce.
replace.py [2007-06-15]
Funkcja replace z callbackami — zainspirowałem się rozwiązaniem z JavaScript. Zastępowane są albo zwykłe łańcuchy znaków albo wyrażenia regularne.
pred_split.py [2007-06-15]
Podobne do wybudowanej metody split, ale o miejscu podziału decyduje wartość predykatu (funkcji).

Asembler

See the repository for more programs.

mmx_string.c [2007-06-24]
Funkcje ze string.h: strcmp, strlen i strchr wykorzystujące rozkazy MMX. Więcej w osobnym artykule.
saturated_add.c [2007-07-04]

Demonstracja dwóch metod dodawania z nasyceniem pikseli 16bpp (metody 1: x86 i 3: MMX).

Program możne działać albo wsadowo i wówczas wykonuje wybraną procedurę n razy (profilowanie, pomiar wydajności) albo interaktywnie — ładuje wskazany obrazek PPM, wyświetla w oknie (X Window) i wykonuje dodawanie z nasyceniem. Do kompilacji dla X Window wymaga dodatkowo bibliotek loadppm oraz Xscr, źródło zawiera opis kompilacji.