byt tebou urcite nespoleham na to, ze bude promenna, kam ukladas, vynulovana...
dalsi vec - mohl bys rovnou osetrit dvojku podminkou a v "poli" pak vynechat vsechny jeji nasobky..
ukladat tam jen to, co muze hrat roli.. tj zacit treba 1 3 5 7 9 11 13 15 ...
proste by se vsude vesel dvojnasobek cisel
na co tam mas pak pole jako globalni? pak ho jeste pro jistotu predefinujes uvnitr main
bud nech jen globalni nebo predavej funkci
(pak to muzes pouzit jako "mnozinu")
Příspěvky odeslané z IP adresy 77.237.136.–
to uz jedine hledanim
neco ve stylu: zkusit posledni znak a znak za nim.. pokud je znak za nim mezera tak vypsat a zacit za tou mezerou ..
pokud je tam pismeno tak postupne zmensovat retezec dokud nenarazis na neco co neni znak.. samozrejme musis hlidat delku retezce.. aby ses nedostal za konec
zvyk a mozna taky to ze vzdy rovnou pusu parovou znacku a kdyz to nekdy vynecha nekdy udela a podobne tak se mi vic ztracej ty spravny do paru.. proste je to lehci ohlidat pekne rucne..
zase me vsude silene chybi ctrl-p nebo ctrl-n z VIM .. sice aspon pspad se dal nastavit aby to doplnoval
regularni vyrazy a nahrazovani taktez..
no proste at sem kdekoliv tak ukladam a koncim pomoci <esc>:wq
bude lepsi kouknout na osciloskopu a jednodussi to bude pomoci jedny 74123 ... monostabilni KO..
kdyz udelas cca 3ms impuls tak by se kazdym zakmitem (resp nabeznou nebo sestupnou hranou) prodlouzil cas, po kterej se drzi impuls
mimo jine sou tam mko dva takze se s tim da pohrat
co na tom potrebujes vysvetlit?
co je to HTTP? co je to server? co je to POST request? co je to xml?
takhle trivialni veci se ani poradne vysvetlovat nedaj
mas server, na nem sluzbu co zpracuje xml pozadavek poslany pomoci HTML POST,
podle toho jakou mas ve volani (tj v XML) funkci (resp. jen nazev) a parametry (obvykle xml elementy)
tak se ti zavola funkce (musi byt obvykle registrovana nebo aspon ve jmenem prostoru toho "serveru" - beru podle perlu)
no funkce se zavola neco vrati, to se prevede na xml, posle jako odpoved na HTTP POST pozadavek a to se pak klientem
zpracuje na nejaky vystup nebo chybu...
trosku nechapu proc v napln radek nic nikam nenaplnujes, ale rovnou nacitas z tech retezcu, ktere jeste nejsou nijak naplnene...
potom samozrejme, kdyz mas nove alokovanou pamet, tezko muzes chtit aby v ni bylo neco smysluplneho - je tam proste smeti z programu co bezely pred tim nebo podobne
spis napis co pouzivas..
kdyz mas retezec[] = "abcde";
tak retezec[0] je 'a'
az po 'e' na pozici 4
getc to bere ze standardniho vstupu takze pouzit asi nepujde.. sscanf by mel fungovat.. paznaky to muze hazet pokud neni retezec ukoncenej pomoci znaku '\0'
serial o socketech je na builder.cz
RFC pro SMTP http://www.faqs.org/rfcs/rfc2821.html
takze jedno vlakno na Core 2 Duo notebookovym procesoru - od kazdy variace prvniho sloupce jedno reseni za cca 34s
(akorat to nevypisuju nijak srozumitelne.. jen ty jednotlivy bitovy masky )
bez vypisovani 19s
akorat sem tam neresil pocet variaci.. je to jen pro tento pripad - tj 20264
najdu stejny pocet reseni, pokazde s jinym prvnim sloupcem
pokud sem prochazel vsechny tak kolem 2 milionu sem to stopl .. kombinovalo mozna nekde u poslednich sloupcu
nicmene prvni reseni to zvladne velice rychle
a jeste "kod":
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 7
#define ULLI unsigned long long int
#define SLOUPCU 20264
int reseni = 0;
unsigned int tstart;
int recurse( ULLI * x, ULLI * funkcni, char depth, ULLI logic_sum) {
int i ;
if ( depth == 7 ) {
reseni ++;
printf("Reseni .. %d \n", reseni);
for ( i=0; i<SIZE; i++ ) {
printf(" %016I64X\n", funkcni[i]);
}
return 1;
}
for ( i=0; i < SLOUPCU ; i++ ) {
if ( (logic_sum & x[i]) == 0 ) {
funkcni[depth] = x[i];
int r = recurse( x, funkcni, depth+1, logic_sum | x[i] );
if ( (depth>0) && (r!=0) ) {
return 1;
}
}
}
return 0;
}
int main(int argc, char *argv[])
{
unsigned char all[] = {
7, 5, 0, 16, 15, 2, 5,
5, 3, 19, 9, 3, 8, 3,
9, 1, 12, 12, 1, 10, 5,
3, 3, 21, 6, 4, 6, 7,
2, 14, 11, 3, 11, 1, 8,
7, 13, 0, 2, 8, 16, 4,
4, 12, 1, 0, 26, 5, 2,
};
int i, tmp, sum = 0, cnt=0;
unsigned int a = 0;
unsigned char xx[7] = {0}, l;
ULLI * speed = malloc(sizeof(ULLI) * SLOUPCU);
ULLI * snapshot = malloc( sizeof(ULLI) * SIZE );
for ( a=0; a<823543; a++ ) {
ULLI tmpL = 0;
sum = 0;
i = 0;
tmp = a;
for ( i=0 ; i < 7 ; i++ ) {
l = tmp % 7;
tmpL = (tmpL << 7) | (1 << l);
sum += all[i*7 + l];
xx[i] = all[i*7 + l];
tmp /= 7;
}
if (sum == 50) {
speed[cnt] = tmpL;
cnt++;
}
}
tstart = time(NULL);
recurse(speed, snapshot, 0, 0); // depth=0 mask=0
printf("posledni pocet reseni: %d za cca: %u\n",reseni, time(NULL) - tstart);
return 0;
}
To liborb : prave proto sem zminovat tu bitovou mapu...
mit treba:
1000000 0001000 0010000 1000000 0000010 0000001 0000001
a v druhem sloupci bude
0100000 0010000 0100000 0000010 0100000 0000001 0000010
pak logicky soucin hodi:
0000000 0000000 0000000 0000000 0000000 0000001 0000000 - a rekne ze to ma vyradit...
kdyby se neprekryvaly tak logicky soucet a kontrolovat s tim ... usetrila by se spousta zbytechnejch "podcyklu" - takhle se vsechny uz zpracovany a spravny sloupce promitnou rovnou do srovnavane hodnoty
20tisic moznosti je pocet ruznejch kombinaci jednoho sloupce ktery da soucet 50..
pokud by si to prochazel vsechno v 7mi urovnich tak to da mnohem horsi vysledek.. ale to neni potreba .. do nizsich urovni muzes az pozdeji ... takze se nebudou prochazet vsechny kombinace
optimalizace by byla taky pouzit bitovou mapu pro jednotlive radky a ktere pozice sloupcu uz tam sou .. (pro rychle srovnani jestli to ma cenu pouzit nebo ne) a tak dale (vse se vejde do jednoho 64b cisla) nebo dvou 32 (potrebujes 49bitu)... pokud narazis na nove pridavany ktery je uz uvnitr tak uz vyrazujes moznost protoze stejny cislo 2x v radku mit nemuzes
tak sem zkousel vsechny kombinace radku a vyslo mi 20264 kombinaci (i s duplicitami) sloupcu, ktere daji soucet 50...
ted uz to jen vhodne zkombinovat tak, aby se v reseni nepouzilo stejne cislo vicekrat...
no bude to tak jak tak chtit nejakou vychytavku..
ja sem zatim vyuzil v zivote jen par jazyku: Perl, PHP, C, C++, Pascal (+ SQL a tak) - v poradi podle cetnosti
javu ted moc nedoporucuju.. vlastni ji oracle a ten je znam svoji radostnou chuti vymahat patenty .. takze hrozi ze se od ni lidi odvrati.. (krom toho sem ji nikdy ani nepotreboval :D)
2.) Počet všech možných tabulek, kde bude i součet řádků i součet sloupců roven 50ti
todle ti primo rika ze musis vsechny ty permutace projit.. jinak to nejsi schopen nikdy zjistit
ideal by bylo zrcadleni (coz by predpokladalo v kazdem radku stejne hodnoty)
prvni reseni by bylo asi nejlepsi resit nejakym trochu inteligentnim algoritmem .. napriklad zjistit o kolik se jednotlive sloupce lisi od 50 a vybrat hodnoty, ktere co nejvice priblizi prave k te padesatce... akorat hrozi, ze to nemusi mit reseni.. - mohlo by se to zacyklit bez nejakeho ukladani aspon hodnot sloupcu a hledani zda uz si na takove hodnote nebyl
To palikem : procti si hlavne toto http://msdn.microsoft.com/en-us/library/ff543970.aspx
ci pokud si to chtel jeste podrobneji tak se rozdeli 3 a x .. coz u mocnin jde.. pak se provede derivace.. u nasobku konstanty zustanou.. tj. 3^(na neco) a pak se nasobi tim co je v exponentu u promenne.. to jest dejme tomu 259/1296... a u promenne se od exponentu odecte jednotka.. takze vznikne x^(-1037/1296) no a pak uz se to jen prehodi pod lomitko, aby se zbavilo minusu v exponentu
pravidlo #1: zacinat nejprve zjistovanim jak co funguje..
pokud to neznas nemuzes nikdy vytvorit nic slozitejsiho
nejvetsi zacatecnicka chyba je nenazranost.. kazdej si hned predstavi ze naprogramuje novej UT4 nebo tak..
ale staci mrknout kolik lidi a jak dlouho to delaj (a hlavne jaky maj uz zkusenosti, kdyz to zaclo)
EDIT: pokud te to i tak nepreslo doporucuju napriklad udelat pexeso ... v delphi je to pomerne sranda:)
To Lukas : no spis bych to videl na nacteni nejakeho retezce... nebo rovnou celeho radku
pokud neni nic validniho nacteno
nebo neco takoveho:
puts("Flushing input");
while ((ch = getchar()) != '\n' && ch != EOF);
ale pokud to udelas kdyz tam nic neni, tak se to nejspis zasekne..
To Mayo : no jinak ja delam tak nejak na stridacku C, C++, Perl, PHP, pascal, bash ....
jediny co me stve je hlavne =~ operator z perlu.. nikde jinde nic podobnyho neni .. v PHP musi clovek davat preg_match.. v C/cpp je to uz na hodinu prace.. aspon ze ten pseudopascal co se pouziva v praci ma operator regexp :D
pak je trochu nezvyk ze nekde se musi delat $ pred promennou .. v perlu se dokonce oddeluje $skalar @pole a %hash ...
u pascalu je nebezpecny srovnani pomoci = a prirazeni pomoci := ..
a je toho spousta - ale kdyz to clovek pouziva tak to v pohode udrzi v pameti...
To Mayo : algoritmizace zase nesouvisi s programovacim jazykem.. je to schopnost programatora predstavit si, jak by postupoval pri reseni problemu, kdyby byl pocitac.. predpoklada to samozrejme umet si predstavit ze si nepamatuje nic co si neulozi, a nevi nic co mu programator nerekne explicitne.. typy promennych je lepsi znat.. opacnym smerem je to pak problem
pak samozrejme je dobre mit predstavu, jake funkce ma k dispozici na to reseni ..
ale chce to trochu trenovat
to co resis je principialne uplne mimo OOP ..
princip je takovy, ze kdyz tvrdis ze ma neco vratit string, tak ho taky mas vratit (ze kteryhokoliv rozvetveni...) a to tam ted proste nedelas.. mas cast, kde to skonci, a neexistuje zadna definovana hodnota co to vrati.. (coz si tu ohlida kompilator ) ale v nekterych jinych jazycich to uz muze udelat neskutecnou paseku
To marioff : nemuze byt datum klicove slovo?
jinak netusim co by mohlo byt zle
EDIT: tak ne:
mysql> INSERT INTO kosik (iid,iid_produkt,quantity,datum) VALUES ('18','9','1',now());
ERROR 1364 (HY000): Field 'iid_produkt_atribut' doesn't have a default value
spi interrupt nemusi byt moc dlouhej.. po prijeti si ulozit byte a nastavit priznak ze to mas zpracovat mimo preruseni
to samy u serialu.. tam hodit aspon nejakej kruhovej buffer
pak zalezi na rychlosti serioveho portu a rychlosti procesoru.. pokud budes mit nejakejch 57600 baudu tak pri 12MHz mas hodne casu mezi znaky.. (je to asi 5600 znaku za sekundu.. )
nabizelo by se mozna hardwarove rizeni toku.. .
(no proste vse tam jde udelat pomoci preruseni a kdyz se v nich nebudes zdrzovat zbytecne dlouho tak to bude v klidu)
nejak sem nepochopil co ze to resis za "chybu"
na co sem narazil:
* musis mit ty piny nastaveny jako vstupy - jinak meris napeti vystupu a maximalne muzes pekne zatopit
* vypnout pull-up taky dokaze pekne zamichat s napetim na vstupu..
* linearni potenciometry aby "rychlost zmeny" byla stale stejna... tj. otocim do poloviny, aby byla polovina napeti
To Ronaldo : viz: php manual http://php.net/manual/en/function.ceil.php
tak kdyz ses lepsi jak ja a zvladas to z hlavy tak ty podminky dej z fleku :D
ale doopravdy:
1. musis vedet co to ma delat (to je naprosto nejdulezitejsi)
2. musis to prevest na algoritmus (co musis krok za krokem udelat, aby si ziskal spravny vysledek)
3. prevest algoritmus na program :D
hmm jak by to mohlo byt... delay_ms znamena delay_miliseconds ... pak vime ze se u oznacuje mikro.. damn.. nejak nedokazu zjistit jak se bude jmenovat ta funkce na usekundy ....
z hlavickoveho souboru utils/delay.h _delay_us(double __us)
akorat ten double dokaze pekne zamichat pameti.. tj bude stacit i utils/delay_basic.h:
_delay_loop_1(uint8_t __count)
_delay_loop_2(uint16_t __count) (v poctech strojovych cyklu)
http://cs.wikipedia.org/wiki/Backtracking
je to prohledavani do hloubky.. pokracujes tak hluboku dokud to pravidla umoznuji a pokud ne tak se vratis o jedno vejs a zkousis dalsi moznosti.. pokud cela vetev reseni nema tak se vratis zase o jednu vejs a tam pokracujes dale
no i pwm se da pouzit.. kdyz nevis tak pouzij datovy list - je tam vsechno popsany - chces pwm? podivej se jak se nastavuje, jak se nastavuje aby to hazelo vystup na pin, jestli to ma moznost pouzit vice kanalu naraz... a proste nastav
je to jen o tom, vedet co chces - najit to, nastavit to
To Nemo : ten jtag-ice se da postavit z par soucastek.. jedna mega 16 a krystal.. me teda nefungoval debug (jen programovani) ale nekde sem cetl, ze to nejelo kvuli nejaky stary verzi knihoven na XP (proste sem mel vyply aktualizace systemu)
To Nemo : proste krokovat ... jestli mas jtag-ice nebo dragona ci jtag-ice 2 tak to umi ... nahraje se program a prochazi pekne po instrukcich (nebo prikazech- avr je podle me mnohem lepsi programovat v C - to same x51, pic treba zase je lepsi delat v assembleru.. tam je C trochu overkill)
pravidlo cislo jedna: kdyz neco nejede - zpomal (nejjednodussi je to prave vymenou krystalu ale jde to i primo tema cekacima smyskama)
pokud ani to nezabere zacni poradne hlidat co, kam a jak posilas... posilas to na spravne misto? :)
a kdyz ani to nepomuze tak rucni debug mod.. proste se pauzne procesor a jen menis stavy na vystupu jak by to melo byt
(tady nehrozi zadny problem s casovanim.. casu dost )
a kdyz ani to tak zkusit 8b sbernici :D
prvni radek ctvereckovany je priznak ze neni inicializovan..
pocitas s tim ze potrebujes asi 5 mozna 10 ms po startu a ze mezi vetsinou prikazu musi byt pomerne dlouhy mezery---
pokud to tam zenes i v radech mikrosekund tak je to jeste sakra moc rychle
data jsou zapsana v pocitaci binarne a diky tomu lze snadno delat binarni operace..
takze:
unsigned char neco = 0 ; // 00000000
neco = 20; // 00010100
to same ++neco; // 00010101
++neco; // 00010110
a tak dale...
binarni operace:
bitovy posun 00000001 << 3 = 00001000
"maskovani bitu" neco & (1 << 3) => 0
zatimco neco &(1 << 4) => 16 (00010000) - zustal jen bit na pozici, kde je jednicka
proste:
unsigned char test, i;
for ( test=0 ; ; test++) {
for ( i=0 ; i < 8 ; i++ ) {
printf("%d ", test & (1 << i) ); // vypise jako soucet cifer ( napr. 12 = 0 0 0 0 0 8 4 0 0 )
}
printf("\n");
if ( test == 255 ) break; // pri unsigned int moc dobre nefunguje konstrukce jako test < 256 :) - zadna 256 vlastne neexistuje... uz je to 0 takze by se nikdy neskoncilo
}
samozrejme tobe se pak bude hodit jen 0/1 na dane pozici takze: ( test & (1 << i) ) != 0
sou teda jeste dalsi zajimave zjednoduseni ale toto zatim staci
To jatt : co ti brani to zjistit.. udelej dve tabulky.. v jedne mej 1000 zaznamu a ve druhe pro kazdej zaznam 1000 polozek (samozrejme index nad klicema)
udelej join tak jak si ho napsal (tj. spojit komplet vsechny data)
udelej join s tim, ze vyberes jen jedno ID a k nemu vsechny polozky pripojene
udelej to na jednotlive dotazy..
osobne neznam moc pripadu kdy je potreba pracovat s celou tabulkou
EDIT: tak to trochu testuju a ten dotaz co si dal je zatim naprosto nejpomalejsi ze vsech moznosti.. pres 25s na 1000x1000000 zaznamu..
kdyz sem dal aspon: SELECT * FROM `t1` join (SELECT * From t2 WHERE t1id = 999 ORDER BY rand() ) tt on (t1.id = tt.t1id)
where t1.id = 999; tak se doba zkratila na cca 0.0386
dokonce SELECT * FROM `t1` join t2 on (t1.id = t2.t1id)
where 1 mi trva nejak podezrele kratce.. asi uz je to v cache (a to poprve zabralo asi 0.25s)
umis si neco takoveho predstavit u 1000 uzivatelu kazdej s treba 100 fotkama?
z jakeho duvodu to nemuzes udelat pomoci dvou dotazu? vytahnout treba 10 uzivatelu a k nim pak vytahat po jedne fotce?
Edit: abych to shrnul
- nepracuj s celejma tabulkama WHERE s indexama umi zazraky
- zbytecne nespojuj (a jeste cele tabulky)
- doufam ze "fotka" neni cela fotka v databazi .. (staci vytahnout nazev nebo id a predat jinemu scriptu, ktery ji zobrazi - na to staci jeden dotaz a dobrej index)
- pokud to jde tak se da resit nahodna fotka ciste tim scriptem pro jeji zobrazeni .. tj. zadny joiny nejsou potreba..
a tak dale