BobbyK - znajdowanie wag regon14 - list 1

Dnia wto 9. grudnia 2003 18:16, napisałeś:

R> Witam,
R>
R>   BARDZO DOBRZE
R>
R>   Ciekaw jestem jak długo i jaki szybki komputer znajdował
R>   właściwe wagi ?
R>   Podobne zadanie dla numerów IACS (kolczyki dla krów) zajęło
R>   mojemu komputerowi kilka minut. Tzn miałem kilka numerów
R>   kolczyków i znalazłem możliwe współczynniki wagowe.
R>   Każdy dodatkowy numer (ale nie kolejny numer) zmniejszał
R>   liczbę możliwości o jakiś procent.
R>   Niestety jeden numer kolczyka był pomylony i program skreślił
R>   prawdziwy zestaw numerów wagowych - co ciekawe ten zestaw sam
R>   ręcznie sprawdzałem jako jeden z pierwszych najbardziej
R>   oczywistych czyli 13131313 itd
R>
R>   Gratuluję jeszcze raz wysokiego IQ :)

Prawde mowiac, to samo TO wlasciwe szukanie zajelo mi kilka minut  na pIII 
pod windows - skrypt w php ... wlasciwie to nie jestem pewny , bo wyszedlem 
zrobic sobie cos do jedzenia... (wlasnie puscilem to sobie jeszcze raz zeby 
mi pokazalo timestampy i wiem ze 23 minuty)  juz mialem sie zabierac do 
poprawiania byka, bo cos krotko mi sie wydalo, ale sprawdzilem sobie 
wygenerowane liczby i zauwazylem, ze jedna za nic w swiecie nie chce zostac 
odrzucona... 

Ale od poczatku...
Jest mi to potrzebne do serwisu w php ... wiec zeby juz sobie nie komplikowac 
napisalem skrypt w php ktorym mialem zamiar przeleciec wszystkie liczby od 
1111111111111 do 9999999999999 i sprawdzac je na podobienstwo regon9 - 
z wykluczaniem oczywistych rzeczy ... jak "0"!!!! , te same cyfry kolo 
siebie... itp... i takie tam matematyczne rzeczy..
(suma mod 11) mod10 ... pomyslalem sobie ... troche to potrwa ... ale az tak 
bardzo mi sie nie spieszy
... ale jak mozesz sie domyslac - liczylo sie wolniej niz mi sie poczatkowo 
zdawalo i wywalalo cala mase wag nawet przy jakis 15 poprawnych 
regonach ... ... wiec dopisalem sobie kilka nieprawidlowych i sprawdzalem tez 
liczby zeby moich warunkow nie spelnialy... zadzialalo tak dobrze, ze w koncu 
stanelo na tym, ze zaczalem sprawdzac 5 dobrych i 2 zle ... okazalo sie, ze 
znajduje mniej wag niz w pierwszym przypadku - z 15-ma poprawnymi 
regonami ... i co najwazniejsze chodzi szybciej ... :)
Potem zaczalem kombinowac z rozproszonym liczeniem ... wiec zaczalem normalnie 
po http serwowac odpowiednie pule liczb do przeliczenia ... dla dwoch 
serwerow dosc szybkich na ktorych mam shelle ...  jeden freebsd 4.9 z dwoma 
prockami 1.7GHz 1Gb Ram - wiec sobie w dwoch instancjach zaposcilem :) ... 
jeden slackware na (nie pamietam juz jaki) ... i dodatkowo liczylem u siebie 
na routerku - freebsd celeronek - 233Mhz 128 RAM :) ... i dwoch moich  
workstacjach w nocy - freebsd 5.1 - celeronek 450MHz 256 RAM 
i windzina XP - PIII 500 256 RAM... Jak mozesz sobie wyobrazic ... moj 
archaiczny sprzet mial raczej nikly udzial ... w projekcie ;)... ale ten 
pozal sie boze cluster przerobil liczby od 1111. do ok 2000.. od niedzieli do 
dzisiaj rana ... kiedy to zauwazylem, ze cos mi sie wywalilo ... i szybkie 
komputery nie mogly pobrac swoich dzialek do sprawdzania ... bo mi lacze 
padlo ... 
Wscieklem sie ... i pomyslalem, ze tak to byc nie moze ... wskoczylem na Twoja  
strone i powoli i dokladnie od dechy do dechy przeczytalem co napisales o 
regon14 ... walnalem sie w glowe ... bo przez moje lenistwo i 
niedoczytywanie ... po prostu nie skorzystalem wczesniej z Twoich 
wskazowek... w mgnieniu oka poprawilem skrypciki, zeby zostawialy 0 na 5-ej 
wadze ... zabralem sie za programik pesel ... i przy okazji wpadlo mi do 
glowy ze przeciez sie musza te cyferki powtarzac ... wiec ... sprawdzilem 
sobie na chlopski rozum zamieniajac je miejscami  przy zachowaniu 
prawidłowego regon9 ... i sie dowiedzialem  ze 1=11 , 2=12,  3=13 i 
zbudowalem skrypcik na nowo i uruchomilem go sobie przed wyjsciem z 
pokoju ... zeby sprawdzic czy wogole zadziala na windzinie ... i jak wrocilem 
po pol godzinie napisal mi ze koniec ... bylem w szoku ... i myslalem ze 
gdzies mi sie cos pokielbasilo ... bo ten kod wyglada jakby sie ktos na niego 
zhaftowal .. ale zanim skasowalem wynik ... sprawdzilem ... i wyszlo mi ze to 
te cyferki ... napisalem sobie generator tych regonow ... wygenerowalem chyba 
z 10 000 i wkleilem do 'pesel'-a ... i gapilem sie oczekujac na jakies 'nie 
zgadza'... ale sie nie doczekalem ... wiec w trymigi napisalem do Ciebie, 
zeby wybadac czy jest tak jak mysle ... 

... gdyby nie Ty i Twoja strona to bym tego jeszcze chyba do swiat szukal ... 

Serdeczne dzieki ... 
-- 
BobbyK
< bobbyk@z.pl >

PS. 
Aha ponizej zamieszczam skrypciki, ktore napisalem pod Twoim kierunkiem... 
moze Ci sie do czegos przydadza ... mozesz je udostepniac...  sam bym 
opublikowal algorytm ... ale nie wiem czy to legalne ... bo jak piszesz na 
stronie - jesli GUS niebardzo sie do tego przychyla (Pewnie przez to 0 na 
5-tym miejscu :) ) to co sie bede z nimi klucil... 

< ? php // Skrypt generujacy wagi regon14 na podstawie kilku prawidłowych i //nieprawidłowych regonow14 //(c) 2003 -BobbyK <bobbyk@z.pl> set_time_limit(0); $czas_start=time(); echo date('Y-m-d [H:i]')."\n"; $spr=array('35793578357931','79357935975398','59009645434564', '52363894723456','12345678512347'); // dobre regony $bad=array('79357935975393','35793578357935'); // zle regony while(list($ckk,$ckv)=each($spr)){ $ck[$ckk]=substr($ckv,13,1); echo "sprawdzanie wag dla cyfry kontrolnej: ".$ck[$ckk]." w regonie: ". $spr[$ckk]."\n"; } while(list($ckk,$ckv)=each($bad)){ $ckb[$ckk]=substr($ckv,13,1); echo "sprawdzanie czy zla cyfra kontrolna: ".$ckb[$ckk]." w regonie: ". $bad[$ckk]."\n"; } function elim_wyst($waga,$ile) { if (substr_count($waga,'0')>1) return false; if (substr_count($waga,'1')>$ile) return false; if (substr_count($waga,'2')>$ile) return false; if (substr_count($waga,'3')>$ile) return false; if (substr_count($waga,'4')>$ile) return false; if (substr_count($waga,'5')>$ile) return false; if (substr_count($waga,'6')>$ile) return false; if (substr_count($waga,'7')>$ile) return false; if (substr_count($waga,'8')>$ile) return false; if (substr_count($waga,'9')>$ile) return false; return 1; } # pierwsza liczba for ($aa=1;$aa<10;$aa++) { $wag=''; $wag[1]=$aa; # druga liczba for ($bb=1;$bb<10;$bb++) { $wag[2]=$bb; $wag[3]='';$wag[4]='';$wag[5]=0;$wag[6]='';$wag[7]='';$wag[8]=''; $wag[9]='';$wag[10]='';$wag[11]='';$wag[12]='';$wag[13]=''; if (!elim_wyst(join('',$wag),1)) continue; # trzecia liczba for ($cc=1;$cc<10;$cc++) { $wag[3]=$cc; $wag[4]='';$wag[5]=0;$wag[6]='';$wag[7]='';$wag[8]='';$wag[9]=''; $wag[10]='';$wag[11]='';$wag[12]='';$wag[13]=''; if (!elim_wyst(join('',$wag),1)) continue; # 4 liczba for ($dd=1;$dd<10;$dd++) { $wag[4]=$dd; $wag[5]=0; $wag[6]='';$wag[7]='';$wag[8]='';$wag[9]='';$wag[10]=''; $wag[11]='';$wag[12]='';$wag[13]=''; if (!elim_wyst(join('',$wag),1)) continue; # 5 liczba for ($ff=1;$ff<10;$ff++) { $wag[6]=$ff; $wag[7]='';$wag[8]='';$wag[9]='';$wag[10]='';$wag[11]=''; $wag[12]='';$wag[13]=''; if (!elim_wyst(join('',$wag),1)) continue; # 7 liczba for ($gg=1;$gg<10;$gg++) { $wag[7]=$gg; $wag[8]='';$wag[9]='';$wag[10]='';$wag[11]='';$wag[12]=''; $wag[13]=''; if (!elim_wyst(join('',$wag),1)) continue; # 8 liczba for ($hh=1;$hh<10;$hh++) { $wag[8]=$hh; $wag[9]='';$wag[10]='';$wag[11]='';$wag[12]='';$wag[13]=''; if (!elim_wyst(join('',$wag),1)) continue; # 9 liczba for ($ii=1;$ii<10;$ii++) { $wag[9]=$ii; $wag[10]='';$wag[11]='';$wag[12]='';$wag[13]=''; if (!elim_wyst(join('',$wag),1)) continue; # 10 liczba for ($jj=1;$jj<10;$jj++) { $wcounter++; if ($wcounter==100000){ echo date('Y-m-d [H:i]')." Ostatnia sprawdzona to: ".$wagi."\n"; $wcounter=0; } $wag[10]=$jj; $wag[11]=$wag[1]; $wag[12]=$wag[2]; $wag[13]=$wag[3]; $wagi=join('',$wag); if (!elim_wyst($wagi,2)) continue; reset($spr); while(list($k,$v)=each($spr)){ //sprawdzanie dobrych $suma=0; for ($cyfr=0;$cyfr<14;$cyfr++) { $cw=substr($wagi,$cyfr,1); $sw=substr($v,$cyfr,1); $suma=$suma+($cw*$sw); } $suma=fmod(fmod($suma,11),10); if ($suma==10){ $suma=0; }; if ($suma!=$ck[$k]) continue 2; } reset($bad); while(list($k,$v)=each($bad)){ //eliminowanie przy zlych $suma=0; for ($cyfr=0;$cyfr<14;$cyfr++) { $cw=substr($wagi,$cyfr,1); $sw=substr($v,$cyfr,1); $suma=$suma+($cw*$sw); } $suma=fmod(fmod($suma,11),10); if ($suma==$ckb[$k]) continue 2; } $fhw=fopen('znalezione.wag',"a"); fwrite($fhw,$wagi."\n"); fclose($fhw); echo "Wagi ".$wagi." zapisane do pliku.\n"; }}}}}}}}} $czas_stop=time(); echo "Czas rozpoczęcia: ".date('Y-m-d[H:i]', $czas_start)."\n"; echo "Czas zakończenia: ".date('Y-m-d[H:i]', $czas_stop)."\n"; $czas_pr_H=floor(($czas_stop-$czas_start)/3600); $czas_pr_m=round(($czas_stop-$czas_start-($czas_pr_H*3600))/60); echo "Czas pracy: ".$czas_pr_H." godzin ".$czas_pr_m." minut.\n"; ?> < ? php // Skrypt sprawdzajacy poprawnosc wag dla regon14 // zeby zagescic pule do 1 dobrego wyniku //(c) 2003 -BobbyK <bobbyk@z.pl> set_time_limit(0); $spr=array( '22512522779897','80911525744792','86582145449775','59929818891907', '61516315706332','78827593349532','77168175033695','67574812960440', '54703341506780','85418015686220',); $wagi_=file('znalezione.wag'); while(list($ckk,$ckv)=each($spr)){ $ck[$ckk]=substr($ckv,13,1); echo "sprawdzanie wag dla cyfry kontrolnej: ".$ck[$ckk]." w regonie: ". $spr[$ckk]." "; } while(list($k,$wagi)=each($wagi_)){ $wagi=trim($wagi); reset($spr); while(list($k,$v)=each($spr)){ $suma=0; for ($cyfr=0;$cyfr<14;$cyfr++) { $cw=substr($wagi,$cyfr,1); $sw=substr($v,$cyfr,1); $suma=$suma+($cw*$sw); } $suma=fmod($suma,11); if ($suma==10){ $suma=0; }; if ($suma!=$ck[$k]) continue 2; } $fhw=fopen('zageszczone.wag',"a"); fwrite($fhw,$wagi."\n"); fclose($fhw); echo "Wagi ".$wagi." zapisane do pliku\n"; } ?>



[poprzedni ] [następny list]

 

ciąg dalszy


          Licznik = (od 20 grudnia 2003)
          ostatnie poprawki

Valid HTML 4.01!