» »

Digitalna evolucija

Digitalna evolucija

««
3 / 29
»»

Thomas ::

Z xbiteom sva v zasebnih sporočilih naprej ... :D

Ampak sem hotel zdej z vami deliti eno drugo zadevo. In to v Slovenščini, ne v C, da bo bolj zanimivo.

Smo dali za test Critticallu zoptimizirat naslenjo logiko:

Če je mesec Januar (1), je dni 31.
Če je Februar (2), je dni 28.
...
Če je September (9), je dni 30.
....
Če je December (12), je dni 31.

Pravi tkole:

mesec = mesec OR 2
Če je mesec Junij (6) naj bo mesec November (11).
Če je mesec November (11)
    naj bo dni 30,
sicer
    naj bo dni 31
    če je mesec Februar naj bo dni 28.




:))
Man muss immer generalisieren - Carl Jacobi

BigWhale ::

> Ja, bo treba portat. Trenutno nimam pojma, kako zahtevno bi to bilo.
> Če ne prav zelo, potem kmalu.

Nekaj napisano v Cju je 'portljivo' na (skoraj) vsak prdec... ;) Sicer je izpljunek compilerja drugacen... ampak ali ima to dejansko kaj veze?

User interface je pa na *nix masinah tako ali tako command line... :P

Valentin ::

Zanimivo. Sem kar v dvomih, da bi se mi domislili take rešitve...

:\ :D

Thomas ::

Ja ... sem vidu ljudi, ki štejejo kosti na roki, za februar imajo pa ekstra zapomnjeno, kako je z njim.

Nekateri imamo kar celo lookup tabelo zapomnjeno, kar ponavadi "svetujemo" tudi računalniškim programom.

Tale rešitev je pa nehumana, algoritmično pa najboljša so far.

:)
Man muss immer generalisieren - Carl Jacobi

snow ::

Dosti je tega bitnega operiranja. Zgleda da je dosti hitrejše... no to skelpam na podlagi dveh OR-ov.

Hm.. računalnik tud mora delat vse z bitnimi operacijami. Mi lahko kdo predstavi kako računalnik množi... bitno. Na primeru če se da. :\
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Thomas ::

Man muss immer generalisieren - Carl Jacobi

Sergio ::

Izziv za Critticall? Optimizacija bitnega množenja 4-bitnih števil!

Brcam v temo?
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

Thomas ::

Sploh ne brcaš v temo, Sergio.

Napišeš C simulacijo pismenega množenja, kot ga učijo v osnovnih šolah. Ali pa kakšnega drugega. Recimo Beethovnovega. (Pomeni tolikokrat sešteješ, ker Ludwig je edino tako znal.)

Potem ga vržeš v Critticall - in gledaš kaj bo.

Eventualno kaj bo, če je kaj mogoče, se razume. Če algoritem že ni optimalen.

:)
Man muss immer generalisieren - Carl Jacobi

ciki57 ::

A je critticall zmožen tudi recimo tega, da rekurzivni alogoritem zmutira v iterativnega?


A bo možno v program dodajati tudi nove vrste mutacij? Recimo da imaš nek algoritem f(x), ki nekaj naredi s spremenljivko x in se ti zdi da bi to recimo lahko prišlo prav v algoritmu ki ga razvijaš. A je možno to dodati v nek custom seznam gradnikov algoritmov?


Ko si razvijal tisti nov sort...
Zakaj si začel z bubble sortom? Je to bolje, kot če začneš z nekim hitrejšim algoritmom, recimo Quicksortom?

Thomas ::

> A je critticall zmožen tudi recimo tega, da rekurzivni alogoritem zmutira v iterativnega?

Premišljujem še ... Tole z rekurzijo je zgodba zase ...


> A bo možno v program dodajati tudi nove vrste mutacij?

Zaenkrat ni.

> Ko si razvijal tisti nov sort...
Zakaj si začel z bubble sortom? Je to bolje, kot če začneš z nekim hitrejšim algoritmom, recimo Quicksortom?

Po biološko rečeno - preveč specializirani organizmi niso najboljše izhodišče za evolucijo.

Z bolj naivnim programom začneš, boljš je! (Naivno tukaj pomeni, čimbolj brute force, kot da "bi ga pisala tajnica, ki pozna C sintakso".)

:)
Man muss immer generalisieren - Carl Jacobi

asPeteR ::

->A je critticall zmožen tudi recimo tega, da rekurzivni alogoritem zmutira v iterativnega?

Po evolucijskih pravilih in matematicnih lahko. In mislim, da je velika verjetnost, da rekurziva preide v ireracijo. Saj je splosno znano, da je mozno vsako rekurzijo spremeniti v iteracijo. In tudi to, da je iteracija hitrejsa.

8-)

Thomas ::

> Po evolucijskih pravilih in matematicnih lahko.

Ja lahko. Samo nisem prepričan, da bi bilo pametno dopustiti mutiranje rekurzivnega algoritma, brez da bi bil sam rekurzivni klic zamrznjen ...

Še premišljujem ...

:)
Man muss immer generalisieren - Carl Jacobi

snow ::

Dajte hitro neuka (mene) na hitro spomniti kaj je to rekurzija? A je to ono da je prejšni člen podan z prejšnim ali več le teh. (Npr Fibonačijevo zaporedje a(n) = a(n-1) + a(n-2) to so indexi... kak se piše indexe?).
In kaj je to iterativno. :)
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Zgodovina sprememb…

  • spremenilo: snow ()

Thomas ::

Ja to funkcija kliče sama sebe.

Function X
    If A Call X
End Function

I don't like it!

:D
Man muss immer generalisieren - Carl Jacobi

Vesoljc ::

jest tud ne
iter rulz :)
Abnormal behavior of abnormal brain makes me normal...

Fury ::

iterativno = loop rajt?

ciki57 ::

Zaradi rekurzije sem spraševal, ker kolikor jaz razumem evolucija poteka tako, da vsakič zmutira samo delček programa, če spreminjaš iz rekurzije v iteracijo pa moraš spremeniti praktično cel program...
Verjetnost, da se to zgodi v eni mutaciji pa najbrž ni glih velika.

Recimo da imamo za nek rekurzivni algoritem dokazano, da je za določen problem najhitrejši. Če je brute force iterativen, potem s Critticallom ne moremo priti do tega optimalnega algoritma, ker (zaenkrat?) še ni zmožen prehoda med rekurzijo in interacijo.

Zgodovina sprememb…

  • spremenil: ciki57 ()

Thomas ::

Rajt!

Ma tale rekurzija je v ozadju (po compilingu) itak loop. Dokler se stack ne zafila. Samo je pa nekaterim grozno všeč.

Nej gre za Goto stavkom v maloro. Še pred njim!

:D
Man muss immer generalisieren - Carl Jacobi

Thomas ::

> Recimo da imamo za nek rekurzivni algoritem dokazano, da je za določen problem najhitrejši

A veš za primer? Po moje ga ni.

:)
Man muss immer generalisieren - Carl Jacobi

ciki57 ::

Ok, tega ne res ne poznam, da bi bilo to za kakšne algoritem dokazano.

Ampak recimo da je QuickSort (ki je rekurziven) najhitrejši algoritem za sortiranje (če števila niso preveč podobna :D )

Če bi hotel Critticall priti do njega bi moral najprej razviti stack, samo vprašanje, če bi ga sploh lahko razvil, ker prvi koraki pri razvijanju stacka, nebi nič pospeši algoritma... Torej nebi najbrž nikoli prišli do Quicksorta.

Hmm, razen če nebi bil stack že ena od mutacij...

Thomas ::

Zelo težko je predvideti, kam bo evolucija peljala. Ampak vsaj načelno, so ji dostopne vse forme. Ene z manjšo, druge z večjo verjetnostjo.

Bomo kdaj prišli do Quick sorta?

Mene bolj zanima, kam bomo prišli od njega naprej? V kakšni nišni dati, se razume. Ker pri QS smo že bili, je že osvojena zemlja. Terra Incognita je naš pravi cilj.

:)
Man muss immer generalisieren - Carl Jacobi

ciki57 ::

Kaj pa a bi šlo s Critticalom (že danes) recimo tole:

Imaš leksikon v digitalni obliki in algotitem, ki deluje tako, da mu kot parameter pošlješ vprašanje (v navadnem jeziku) na katerega lahko odgovor najdeš v tem leksikonu, algoritem ti pa potem vrne nekaj naključnih besed iz leksikona.

Nato vržemo alg. v Critticall in ga testiramo na nekaj 1000 vnaprej pripravljenih vprašanjih, na katere vemo odgovor.

Bi ta algoritem lahko zmutiral do te stopnje, da znal na koncu na 99% vprašanj (ne tistih na katerih smo prej testirali) odgovoriti pravilno? Ali je to prevelik zalogaj?

Thomas ::

Do neke mere že. Do kakšne pa, je pa odvisno od tega, če obstaja "za leksikonom" neka struktura, ki bi jo Critticall lahko zevoluiral.

Naprimer, če bi bila struktura taka, da bi na vprašanje, ki bi bilo število N, bil odgovor N+N. Potem bi to imeli zelo hitro. Če bi bila struktura pa true random, potem ne bi uganil algoritma nikoli.

Ostalo je pa nekje vmes.

Načelno bi moralo iti, ja.

:)
Man muss immer generalisieren - Carl Jacobi

asPeteR ::

Sprasujes, ce bi bil evoluiran program zmozen logicnega povezovanja ... Ne, tega ne bi bil zmozen.

Critticall bi samo optimiziral hitrost postrezbe odgovora, nic vec.

8-)

Thomas ::

Tule se odpira vprašanje - novi ali samo izboljšani algoritem?

Če algoritma sploh nimamo (primer leksikona), potem je navajanje vseh outputov za dani input - že algoritem!

f(0)=0
f(1)=1
f(2)=1
f(3)=2
f(4)=3
f(5)=5
f(6)=8


To je ta, naivni algoritem, ki ga je treba le še optimizirati.

Bo deloval tudi za f(7)=13?

Ja, če smo tako mi, kot Critticall imeli v mislih Fibonaccija.

:)
Man muss immer generalisieren - Carl Jacobi

ciki57 ::

Aha, se pravi da že moramo imeti nek algoritem na začetku? Samo input in output nista dovolj?

Če bi Critticallu uturili takle algoritem:

int Sort(int seznam[1000]) {
return 1;
}


kot input bi imeli neurejen seznam števil, kot pravilen output pa urejen.

Bi Crittical znal razviti algoritem za sortiranje?

Fury ::

iz tega zgoraj nemogoce. ker ze tisto kar si ti napisal kot input in output - se po tej kodi, ki si jo napisu enostavno nebi izslo.

lahko pa bi mu fuknu najbl brute force algoritem za sortiranje in bi ti razvil boljsega.

lahko pa bi mu dal not pac v kodo npr:

array[0] = array[5];
array[7] = array[9];
se kksno pomozno spremenljivko bi ponucu itd.

bla bla.. pac tko vse premestitve, ki jih mora izvest da dobi sortiran array iz tistega, ki bi ga dal kot input

in bi pustu da dela in bi slej ko prej naredu en hitr sort algoritem, ampak zelo verjetno (99.99999%) nebi delal za vse inpute :)

kot je thomas napisu - bolj specializirane vrste imajo slabse evolucijske moznosti :)

bi pa definitivno cez cas prisel do hudo zoptimiziranga algoritma za tocno ta set stevil, ki si ga ti uporabljal

ali se pac motim? :)

Zgodovina sprememb…

  • spremenilo: Fury ()

Thomas ::

Ja - tkole je:

Če imamo input niz (5,4,2) in output niz (2,4,5) si ju lahko tolmačimo kot neurejen in urejen niz. Lahko pa kot niz, kjer sta v drugem primeru prvo in zadnje število zamenjali mesti.

Ni nujno, da bi šel Critticall ustvarjat sort, morda bi šel delat menjavo za števili na začetku in na koncu.

Zato bi mu morali dati več takih nizov. Najprej urejenih, potem neurejenih, za primer. Da bi lahko naredil kaj užitnega.

Te opcije zaenkrat ne bo. Najmanj moraš podati naivni algoritem - vedno.

Naivni algoritem za sort je lahko tudi takle:

Do
    select two random members
    swap them
    check the order
    if it's sorted exit

Loop

Tega bomo mogoče vključili v defaultne primere.

:)
Man muss immer generalisieren - Carl Jacobi

Fury ::

Do

select two random members
swap them
check the order
if it's sorted exit


Loop


Hihihihihihi, to pa je sort 8-) 8-O

Thomas ::

Tole mormo čimprej probat in dat v paket ...

:D
Man muss immer generalisieren - Carl Jacobi

Thomas ::

Nja - smo probal in dal tale algoritem v mašino!

Najprej je najdu, da se lahko znebi enega randoma! Tam kjer se določata oba random elementa.

Potem je ugotovil, da ni treba kontrolirati celega niza, če je že našel, da je nekje neposortan.

Nato je počasi iznašel, da če sta indeksa elementov manjši in večji in če sta elementa večji in manjši - da šele in samo takrat, ju gre zamenjat.

Potem je ugotovil, da se mu splača delat preverbo posortanosti samo, kadar je kaj zamenjal.

Potem pa je raztopil še drugi random.

Po kakšni dobri uri, je bil iznajden nekakšen buuble sort.

8-)
Man muss immer generalisieren - Carl Jacobi

Double_J ::

Okej, jz se na te reči sicer ne spoznam.

Ampak v principu, bi moral programčku dajat več povsem različnih nalog. Predvsem takšnih, ki bi ga spodbujale, da bi iz enega primera lahko znanje prenesel na drugega in ga s tem rešil-sklepanje. Najprej bi mu dajal očitne stvari, preko katerih bi se izpopolnil. Potem pa bolj kompleksne.

Potem bi ga pa samo še priklopil na Google in pustil nekaj časa laufat in program bi ugotovil zakaj so stvari takšne kot so.
Podatkov je ogromno, in ko bi jih začel povezovati oziroma bi ugotovil algoritme povezovanja, bi bržkone dobili AI.

Zgodovina sprememb…

  • spremenil: Double_J ()

Thomas ::

Jest bom dal zadevo v promet, spustil ga bom v divjino. Potem bom pa čakal kaj bo. A bo jedrska vojna, al pa bo Singularnost kakšno leto prej. >:D

Mislim pa, da zaenkrat se da učinkovito samo algoritme (re)izumljat in spidirat.

Kar pa po mojem, ne bo prav dolgo trajalo.

:D
Man muss immer generalisieren - Carl Jacobi

Vesoljc ::

realease date?
Abnormal behavior of abnormal brain makes me normal...

Thomas ::

Še bomo ujeli "začetek Junija". To je enkrat do petnajstega. Junija 2003.

:)
Man muss immer generalisieren - Carl Jacobi

Thomas ::

Tkole je zdej trenutno stanje za tiste mesece in njih dni, omenjene zgoraj, vendar napisano brez deklariranih mesecev, da je razumljivejše: >:D

mesec&=-3;
if (mesec==4) {
dni=30;
} else {
if (mesec==0) {
dni=28;
} else {
dni=31
if (mesec==9) dni--;
}
}

;)

Ja no, če je mesec 2, v prvi liniji postane 0.
Man muss immer generalisieren - Carl Jacobi

Zgodovina sprememb…

  • spremenil: Thomas ()

OwcA ::

@Thomas: <pre>koda</pre>, krej lahko delaš poljubno velik zamik s presledki je veliko bolj berljiv kot pa ___...___ :)
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

Thomas ::

OwcA,

Hvala. S pridom uporabil in popravil.

Tako koda izgleda še bolj zlovešča. >:D
Man muss immer generalisieren - Carl Jacobi

noraguta ::

mnja tale critical je nuporaben za kompleksnejse algoritme. ker niso dokazani temvec tamaljijo le ne identicnem vzorcu rezultatov.

Fury ::

ajde, da vidmo kako te thomas zatre :D

Thomas ::

> je nuporaben za kompleksnejse algoritme.

Nu, poraben! Handla 20 krat "if gnezden" algoritem, brez posebnih težav. Me prav zanima, kateri človek si ga je zmožen izmisliti ali izboljšati!

Oziroma, kateri čovek je sposoben izboljšati algoritem napisan višje. Za mesece in njih dneve. Da postane nekaj takega:


mes&=-3;
if (mes>4) {
if (mes==9) {
dni=30;
} else {
dni=31;
}
} else {
if (mes==4) {
dni=30;
} else {
dni=28;
if (mes!=0) {
dni+=3;
}
}
}


Kdo sploh vidi, da je boljši od zgornjega? To pa vsak, ki se poglobi.

;)
Man muss immer generalisieren - Carl Jacobi

snow ::

Beštija zmešana! :))

Koda vedno bolj zapletena... in hitra.

Na prvi pogleda zgleda koda počasnejša, mal premisleka pa vidiš da tisti začetni if(mes>4) prihrani veliko korakov, gleda na on zgornji način.

Kak zgleda -3 binarno? Mal gruntal.. ampak ne vem:)
Nekaj takega: xxxxxx11111101 ?
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Zgodovina sprememb…

  • spremenilo: snow ()

Thomas ::

Ja, tako zgleda -3 in tako ga razume velika večina programskih jezikov.

Kalkulatorji pa ni nujno. Tisti od Windowsow že ne! Pri izpisu ja, pri AND pa ne! Ampak to je njihov problem.

Drugače je bila pa analiza narejena z uniformno distribucijo verjetnosti mesecev. Jasno. 2/3 jih potem obdela z if/else, tam kjer bi se utegnil skrivati februar, je pa rahlo zamudnejše, ampak ni sile.

Jasno pa, da je to samo primer kode, ki naj bi bila čimširše razumljiva.

:)
Man muss immer generalisieren - Carl Jacobi

Vesoljc ::

release date? >:D
Abnormal behavior of abnormal brain makes me normal...

kopernik ::

Thomas:
končno sem si vzel čas za to temo in jo prebral.

Izjemno, nimam kaj reči. Da je prišel do tistega sorta, je res fantastično. Zelo me zanima, kako stvar deluje:) . No, upam, da boš to stvar še naprej razvijal. Tisti algoritem za dni v mesecu je pa res tak, da ga sam nebi nikoli pogruntal. Oziroma bi ga naredil popolnoma drugače. Če bi že šel delati algoritem za tako stvar (navadno imaš mesece in dneve kar v enem arrayu).

kako zna delati s kompleksnejšimi zadevami (strukture, unije, arrayi, pointerji...) ? sprašujem zato, če bi bil uporaben pri pravih programih, ki so bolj kompleksni in ravno pri kompleksnih programih navadno programerji delamo nepotrebne napake in brez potrebe kompliciramo.

naveza na zgornje vprašanje: kaj se zgodi, če je algoritem napačen oz. že zasnovan tako, da ob morebitnih čudnih podatkih odpove? Ali bo criticalova rešitev to slabost še potencirala ali ne?

Sicer pa...odlično

lp

Thomas ::

Vesoljc,

Ta teden, naj bi ga nekateri že imeli, če na kar vsi, ki si bodo to želeli.

Zdej pa res! >:D

janko,

Zaenkrat je tako, da je treba vse povedati v "strict C/Java kodi". To pomeni, da ni dovoljeno niti:

TAB[100]=50;

pač pa mora biti:

index=100;
value=50;
TAB[index]=value;

Naslavljanje (samo enodimenzionalnih!) tabel preko spremenljivk - in ne direktno.

Tudi ni mogoče reči:

if ((a==b) & (c<d)) { ... }

Pač pa je treba if stavek vedno formulirati kot:

if (value1 .. value1) { ... }

kjer je namesto .. lahko:

<, <=, ==, >=, >

value1 in value2 pa je treba definirati prej.

Vendar se VSAK algoritem ali programski segment na ta način lahko izrazi.

Koliko dodatnih stvari in katere, bo pa Critticall razumel, je pa stvar prihodnega razvoja. Katere strukture in načine je smiselno - mu še definirati.

:)
Man muss immer generalisieren - Carl Jacobi

Zgodovina sprememb…

  • spremenil: Thomas ()

snow ::

Aha zato je one=1; in six=6;

Sem že mislil, da je Critticall vzel kakšen slovar mimogrede v roke. :D

Program, ki dela programe...zadeva je fascinantna in one step closer to AI. To super AI. :))
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Thomas ::

Hvala za prijazne besede, no! :))

Tole je tak programski segment:


//The array of zeros
$dimension sieve[1000]

// up to where primes should be denoted
$rinvar upto (1,999)

//Output variable is sieve[1000] - upto(1,999) elements of sieve[] array.
$retvar sieve[]

//The enhanced program should have no more than (2 * original number of lines) + 10
$minimize lines on

//Sound when better program is found is ON.
$sound on


//the beginning of the program segment
two=2;
index=0;
sieve[index]=two; // special status of 0
index=1;
sieve[index]=two; // special status of 1
index=0;prim=2;
arr256[index]=prim;

index=1;prim=3;
arr256[index]=prim;

index=2;prim=5;
arr256[index]=prim;

index=3;prim=7;
arr256[index]=prim;




//Beginning of the enhancing segment. Program lines above, will not be enhanced.
$bes
primecandidate=2; //the first or seed prime
one=1; //one (1)

while (primecandidate<upto) {
nonprime=primecandidate+primecandidate;
while (nonprime<=upto) {
sieve[nonprime]=one;
nonprime=nonprime+primecandidate;
}
primecandidate++;
}

//End of the enhancing segment.
$ees


Potem gre zadeva v obdelavo in bold konec se spremeni takole:




// The algorithm has been enhanced for 81.0648%

$DIMENSION sieve[1000]
$MINIMIZE LINES 128
$SOUND ON
$RINVAR upto(1,999)
$RETVAR sieve[]

// int sieve[1000]; int arr256[256];int two=0;int index=0;int prim=0;int primecandidate=0;int one=0;int upto=0;int nonprime=0;int critticall1=0;int critticall2=0;int critticall3=0;int critticall4=0;

two=2;
index=0;
sieve[index]=two;
index=1;
sieve[index]=two;
index=0;
prim=2;
arr256[index]=prim;
index=1;
prim=3;
arr256[index]=prim;
index=2;
prim=5;
arr256[index]=prim;
index=3;
prim=7;
arr256[index]=prim;
$BES
one=1;
nonprime=two+two;
while (nonprime<=upto) {
sieve[nonprime]=one;
nonprime=nonprime+two;
}
nonprime=index*index;
while (nonprime<=upto) {
primecandidate=nonprime/index;
sieve[nonprime]=one;
nonprime=nonprime+index;
nonprime=nonprime+index;
primecandidate++;
while (nonprime<=upto) {
sieve[nonprime]=one;
nonprime=nonprime+index;
nonprime=nonprime+index;
}
primecandidate++;
nonprime=primecandidate*primecandidate;
while (nonprime<=upto) {
sieve[nonprime]=one;
nonprime=nonprime+primecandidate;
nonprime=nonprime+primecandidate;
}
primecandidate++;
primecandidate++;
nonprime=primecandidate*primecandidate;
index=primecandidate;
if (nonprime<upto) {
sieve[nonprime]=one;
primecandidate=primecandidate+index;
nonprime=nonprime+primecandidate;
}
}

$EES




Čeprav je tukaj bold konec precej večji, se izvede dobrih 5X manj ukazov. Lahko bi ga kuhal še dlje ... ampak prepuščam uporabnikom.



:)
Man muss immer generalisieren - Carl Jacobi

snow ::

In uporabniki ga dobimo v roke kdaj? :D (Hmm moram optimizirat moje algoritme, ki kar vpijejo: Enhance me! Enhance me!)
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Thomas ::

Koncem tedna pa že ... :)
Man muss immer generalisieren - Carl Jacobi
««
3 / 29
»»


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Najhitrejši programski jezik? (strani: 1 2 )

Oddelek: Programiranje
757451 (5271) Senitel
»

Funkcija z logičnimi operaterji.... (strani: 1 2 )

Oddelek: Programiranje
905184 (4530) CaqKa
»

Petaflopsu naproti (strani: 1 2 3 )

Oddelek: Novice / Procesorji
1058272 (8272) Marjan
»

cene permutacij help please

Oddelek: Programiranje
261963 (1570) Sergio
»

kako definirtati prastevilo

Oddelek: Programiranje
143692 (3497) ooux

Več podobnih tem