Portál AbcLinuxu, 25. října 2025 11:00
.
Myšlenka je jednoduchá. Místo všech kombinací 1,44 MB disket budeme mít prográmek, co dokáže vykreslit 8x8 pixelů velký monochromatický piktogram (tedy aspoň na architekturách, kde je long long int 64bitů). Proč zrovna 8x8? Jednak proto, že se mi to dobře programovalo a taky proto, že na vstupu může být stále celkem zapamatovatelné a vymyslitelné číslo.
Ano číslo, další podstatná věc, která v odkazovaném blogu zazněla. Každá informace se dá převést na číslo a chtěl jsem, aby s ním prográmek umožnil pracovat.
Tak co to vlastně umí: Program může mít jeden volitelný parametr a to právě to číslo, ze kterého vykreslí piktogram. Jinak kdykoliv je možné v programu zmáčknout klávesu [mezerník] co spustí promítání náhodných piktogramů v intervalu jedna sekunda, znovu stisknutím [mezerníku] se to pauzne. Číslo vygenerovaných piktogramů se vypisuje do konsole, i do titulku okna.
Protože některé piktogramy mohou invertovaně působit odlišně, klávesa [I] spustí (a vypne) střídání inverze.
Cože to vlastně může dokázat vykreslit? No máme
.
Náhodné generování pomocí rand() použité v programu ve funkci [mezerník] má bohužel nevýhodu v tom, že je RAND_MAX podstatně menší než LONG LONG INT. Řeším to škálováním, ale tím jsem spoustu kombinací vyřadil
. Lepší by to bylo propojit s /dev/random, nebo /dev/urandom, ale to už se mi (zatím) nechtělo.
Po krátkém testování mi to pár hezkých obrázků vyrobilo, tak je přikládám. Zdroják hodím do prvního komentáře jako přílohu. Přeložit to jde snad všude kde je gcc a nainstalovaná i devel verze sdl (obvykle balíček sdllib-dev). Nemělo by to jakkoliv poškodit počítač ani data
. Překládat takhle:
gcc -o main main.c `pkg-config --cflags --libs sdl`Jinak proč? No potřeba po dlouhé době provětrat znalosti SDL a C. Jsem prasič, takže kód je šílený
.
A jinak, kdyby tam někdo zahlédl odpověď na otázku života, vesmíru a vůbec a podobně, poslat screen
(a nebo projít všechny možné kombinace a poslat ty nejhezčí pixelarty ;)).
Update: pod prvním komentářem najdete soubor vestirna.c, což je vylepšená verze, která čte z /dev/urandom (kdo chce /dev/random, ať změní ve zdrojáku - dík FAtbluNTovi) a navíc opravuje chybku se čtením vstupu (nečetlo správně nejvyšší řády, teď to po zadání maxima - 18446744073709551615 - vykreslí bílou obrazovku.
Tiskni
Sdílej:
. Tady vidím občas hezké obrázky. Prostě mozek v těch pixelech je s trochou fantazie schopný cosi vyčíst, k něčemu si to přiřadit. Což u hromady nesourodých ascii znaků moc nejde
. Kdyby se na to poštval třeba ještě slovník, bylo by to lepší. Ale to by zas nebyl ono (samozřejmě, v obou případech jde pouze o srandu, ale u toho mého programu myslím že člověk vydrží o pár sekund dýl a to se vyplatí ;P).
. Urcite tam vidim vic nez v hromade caje :).
.
if(!Init())
{
SDL_Quit();
return 1;
}
udelat
Init();
Proc netusim, predtim to slo. Je to nejaky rozbity
. Tady jsem to vylepsil na /dev/random (musi se hybat myskou, jinak dojdou nahodna cisla). Viz priloha.
.
Kdyby to nekdo zkousel a neslo mu to, zrusit testovaci podminku kolem Init() na zacatku mainu. Nevim proc, ale aspon mi neprojde
. Pak to jde.
to co tam mate, je IMHO cislo "posledni" kombinace s indexaci od nuly, ale jako pocet vsech kombinaci to nazvat nejde
. Jinak nejak mi to nebezelo, mam divny asi prekladac (na desktopu mam jeste ubuntu, gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4) ;)). Kupodivu se size nechovalo jako globalni, musel sem ho udelat staticke (proc fakt netusim). A doplnil jsem nejake hlavickove soubory.
+--------+ | | || || || || || || || +--------+ 10
Tak mě napadlo, že rand vrací 32bitové čísla, že? Vygeneruj si čísla dvě a vynásob?
Stejne tak kdyz hazes dvemi kostkami a delas soucet, gausova krivka se tomu tusim nadava.Přesně takto se gaussovské rozdělení dělá. Pokud si to ještě dobře pamatuju, tak na použitelnou verzi stačí posčítat dvanác normalizovaných hodnot (tj. z intervalo 0,1) a odečíst šestku, pro nenormalizované funkce (jako je
rand()) je třeba samozřejmě odečíst šestinásobek RAND_MAX a výsledek touto hodnotou ještě podělit (nebo s ním počítat jako s číslem s pevnou řádovou čárkou).
No, mohl bys udelat inverzni diskretni kosinovou transformaci, treba by z toho lezlo neco zajimaveho :)
dd if=/dev/urandom of=/dev/fb0) převést zpět z frekvenční domény do časové. Takže třeba pomocí ImageMagicku (nemám nainstalovanou HDR verzi, takže nemůžu ověřit správnost):convert -size 512x512 rgb:/dev/urandom -size 512x512 rgb:/dev/urandom -ift show:. Jen by se musela nějak normalizovat amplitudová složka aby se výsledek vešel do rozsahu. A klidně by na to šlo použít to pole 8x8. By z toho sice vylezl jen rozmazaný maglajz, ale i tak je větší šance, že v něm mozek uvidí něco víc než v takovém políčku pixelů 8x8.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.