Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Rozmowa Kwalifikacyjna - programista, Sorki za spam
Robert1985
post
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 7
Dołączył: 5.08.2009
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Dla zainteresowanych podaję pytania jakie miałem na rozmowie kwalifikacyjnej , do rozwiązania w dowolnym języku ,można było w PHP.
1.Napisać prosty kalkulator umożliwiający: dodawanie ,odejmowanie, mnożenie, dzielenie.
W przypadku dzielenia przez zero program ma generować błąd.
2.Napisać funkcję ,która zamieni podaną przez użytkownika zmienną typu String na Integer. Wykorzystać ją w programie i zaprezentować wyniki.
3.Napisać program ,który zamnieni w podanym ciągu Duże litery na małe i na odwrót.

Czas około 30 minut.
Jeżeli będzie zainteresowanie udostępnię rozwiązania. Choć zadania nie są trudne. Ale w końcu to przedszkole.
Powód edycji: [erix] przeniosłem
Go to the top of the page
+Quote Post
3 Stron V   1 2 3 >  
Start new topic
Odpowiedzi (1 - 41)
alegorn
post
Post #2





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


chyba tylko 3 jest jakims ciekawszym zadaniem :] jesli dobrze zrozumialem miales za zadanie z CaMela zrobic cAmElA ?

ha, moze maly konkurs w ilu krokach kto sie zmiesci? (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Robert1985
post
Post #3





Grupa: Zarejestrowani
Postów: 84
Pomógł: 7
Dołączył: 5.08.2009
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Dokładnie tylko trzecie wymagało jakiegoś większego zastanowienia ja użyłem wyrażeń regularnych ,ale może ktoś zrobił to inaczej zamieszczam moje rozwiązanie:
  1. <?php
  2. $ciag = $_POST['ciag']; //ciąg z textboxa
  3. $ok = $_POST['ok']; //wartość przeslana przez submita
  4.  
  5. if (isset($ok))
  6. {
  7. //badanie długości
  8. $dlugosc = strlen($ciag);
  9. echo "Zmieniony przez Ciebie ciąg to: ";
  10. for ($i=0;$i<=$dlugosc-1;++$i)
  11. {
  12. $znak = substr($ciag,$i,1);
  13.  
  14.  
  15. if (ereg('[A-Z]',$znak))
  16. $znak[$i] = strtolower($znak);
  17.  
  18. elseif (ereg('[a-z]',$znak))
  19. $znak = strtoupper($znak);
  20.  
  21. echo "$znak";
  22. }
  23. }
  24. ?>
Go to the top of the page
+Quote Post
Fifi209
post
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(alegorn @ 27.08.2009, 15:38:19 ) *
chyba tylko 3 jest jakims ciekawszym zadaniem :] jesli dobrze zrozumialem miales za zadanie z CaMela zrobic cAmElA ?

ha, moze maly konkurs w ilu krokach kto sie zmiesci? (IMG:style_emoticons/default/biggrin.gif)


W jednym... str_replace...

Chyba, że chodzi o coś takiego:

MAŁE -> małe
duże -> DUŻE

strtoupper & strtolower

Ten post edytował fifi209 27.08.2009, 15:53:11
Go to the top of the page
+Quote Post
Robert1985
post
Post #5





Grupa: Zarejestrowani
Postów: 84
Pomógł: 7
Dołączył: 5.08.2009
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Niby dlaczego ,a jak sprawdzisz str_replace czy zczytany znak jest dużą literą czy małą(IMG:style_emoticons/default/questionmark.gif) Zakresy są tylko w wyrażeniach chyba nie?? Nie jestem bardzo zaawansowany w PHP więc mogę się mylic. Pewnie da się inaczej zamieść swoje rozwiązanie ,to może się czegos nauczymy,a nie krytykuj tylko.

Ten post edytował Robert1985 27.08.2009, 15:50:27
Go to the top of the page
+Quote Post
alegorn
post
Post #6





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


  1. $inp = "CaMeL tO WieLeRRoR";
  2. $low = strtolower($inp);
  3. $rew='';
  4. for($c = 0; $c<strlen($inp); ++$c ){
  5. if($inp{$c} === $low{$c}){
  6. $rew .= strtoupper($low{$c});
  7. }
  8. else{
  9. $rew .=$low{$c};
  10. }
  11. }
  12. var_dump($inp,$rew);


edit:: moze jeszcze zwrot dokleje:)
  1. string 'CaMeL tO WieLeRRoR' (length=18)
  2. string 'cAmEl To wIElErrOr' (length=18)


to tak na szybko - mysle ze moglbym jeszcze co nieco zmienic, ale to juz kosztem czytelnosci

Ten post edytował alegorn 27.08.2009, 15:58:31
Go to the top of the page
+Quote Post
Fifi209
post
Post #7





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Co do str_replace - mój błąd (IMG:style_emoticons/default/winksmiley.jpg)

Ale zamiast wyrażeń można tak:
  1. $test = 'tO jEST pRZYKLADOWY tEKST';
  2.  
  3. for ($i=0; $i < strlen($test); $i++) {
  4. $x[] = $test[$i];
  5. }
  6.  
  7. foreach ($x as $l) {
  8. if (ord($l) > 64 && ord($l) < 91) {
  9. echo chr(ord($l)+32);
  10. }else if (ord($l) > 96 && ord($l) < 123) {
  11. echo chr(ord($l)-32);
  12. }else{
  13. echo $l;
  14. }
  15. }

Na pewno za pomysłowość dostałbyś plusa. ;d
Go to the top of the page
+Quote Post
Spawnm
post
Post #8





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Cytat(fifi209 @ 27.08.2009, 16:43:25 ) *
W jednym... str_replace...

Chyba, że chodzi o coś takiego:

MAŁE -> małe
duże -> DUŻE

strtoupper & strtolower


Nadal wystarczy 1 str_replace i tablece z ABCabc , abcABC...
Ale kombinujecie (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Skie
post
Post #9





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

Ostrzeżenie: (0%)
-----


1 i 3 to banał, ale niezbyt rozumiem zbytnio o co chodziło w 2.

Jak ten wprowadzany string miał wyglądać?
1. "1414"
2. "av1vs3"
3. "124asfa"

Czy jak?
Bo jeżeli 1 opcja to wystarczy intval(), a jeżeli 2 lub 3 to wcześniej wyciąć znaki nie-numeryczne i dopiero potem intval()

O to chodziło?
Go to the top of the page
+Quote Post
Fifi209
post
Post #10





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(Spawnm @ 27.08.2009, 16:05:38 ) *
Nadal wystarczy 1 str_replace i tablece z ABCabc , abcABC...
Ale kombinujecie (IMG:style_emoticons/default/tongue.gif)

Powiem Ci, że pisząc posta właśnie tak myślałem... Dlatego napisałem o tej funkcji lecz jak zabrałem się za testowanie - z ciekawości - to zamieniało ale tylko na duże. ;d
(oczywiście alfabety były odwrócone)

Spróbuj tak:
  1. <?php
  2.  
  3. $test = 'tO jEST pRZYKLADOWY tEKST';
  4.  
  5. $male = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
  6. $duze = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
  7.  
  8. echo str_replace(array_merge($male, $duze), array_merge($duze, $male), $test);
  9.  
  10. ?>

I będzie źle...

Ten post edytował fifi209 27.08.2009, 16:18:15
Go to the top of the page
+Quote Post
seth-kk
post
Post #11





Grupa: Zarejestrowani
Postów: 444
Pomógł: 79
Dołączył: 26.05.2009

Ostrzeżenie: (0%)
-----


  1. $test = 'MaLe tO DuZeE';
  2.  
  3. $a = 'qazwsxedcrfvtgbyhnujmikolp';
  4. $b = strtoupper($a);
  5.  
  6. echo strtr($test, $a.$b, $b.$a); //mAlE To dUzEe

ktow wrzocic powyzsze w petle i sprawdzi wydajnosc? <.<
Go to the top of the page
+Quote Post
alegorn
post
Post #12





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


cos w ten desen..?

  1. $txt = "AbC";
  2. $serch = array('a','b','c','A','B','C');
  3. $replace= array('A','B','C','a','b','c');
  4. $rep = str_replace($serch,$replace,$txt);
  5.  
  6. var_dump($txt,$rep);


o ile dobrze mysle kolejnosc elementow w tablicy ma znaczenie.
wiec b zostanie wpierw zmienione na duze, next na male....

oczywiscie o ile dobrze mysle :]
Go to the top of the page
+Quote Post
Fifi209
post
Post #13





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(alegorn @ 27.08.2009, 16:16:59 ) *
cos w ten desen..?

  1. $txt = "AbC";
  2. $serch = array('a','b','c','A','B','C');
  3. $replace= array('A','B','C','a','b','c');
  4. $rep = str_replace($serch,$replace,$txt);
  5.  
  6. var_dump($txt,$rep);


o ile dobrze mysle kolejnosc elementow w tablicy ma znaczenie.
wiec b zostanie wpierw zmienione na duze, next na male....

oczywiscie o ile dobrze mysle :]


Dobrze myślisz, ale ja również podałem taki przykład troszkę wyżej dla Spawna (IMG:style_emoticons/default/winksmiley.jpg) zobacz sobie... ;d

@topic
A co z tym zmienianiem string na int?
Go to the top of the page
+Quote Post
Robert1985
post
Post #14





Grupa: Zarejestrowani
Postów: 84
Pomógł: 7
Dołączył: 5.08.2009
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Nie pamiętam jak to wyglądało , ja nie brałem pod uwagę ciągów '123cośtam' ale to mój błąd zaprezentuje ktoś rozwiązanie z tym trudniejszym przykładem.
Go to the top of the page
+Quote Post
Spawnm
post
Post #15





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Przecież pisałem wystarczy 1 str_replace i tablice z ABCabc , abcABC...
Go to the top of the page
+Quote Post
alegorn
post
Post #16





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


Cytat(Spawnm @ 27.08.2009, 17:38:33 ) *
Przecież pisałem wystarczy 1 str_replace i tablice z ABCabc , abcABC...


hmmm ale str_replace nie zadziala prawidlowo.... a przynajmniej nie tym sposobem jakim ja napisalem..... (IMG:style_emoticons/default/dry.gif)
Go to the top of the page
+Quote Post
Fifi209
post
Post #17





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(Spawnm @ 27.08.2009, 16:38:33 ) *
Przecież pisałem wystarczy 1 str_replace i tablice z ABCabc , abcABC...


Jeżeli jesteś pewien...
  1. $test = 'tO jEST pRZYKLADOWY tEKST';
  2.  
  3. $male = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
  4.  
  5. $duze = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
  6.  
  7. echo str_replace(array_merge($male, $duze), array_merge($duze, $male), $test);

Jak wspominałem nie działa.
Go to the top of the page
+Quote Post
alegorn
post
Post #18





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


a co mi tam.
kazde z rozwiazan dalem do petli * 100 - sprawdzalem kilkukrotnie, kolejnosc wynikow bez zmian


Robert1985 :: 0.0393550395966 // tyle ze o ile dobrze sprawdzilem, cos nie teges zwrot ci wyszedl
ja:: 0.0205841064453
fifi209:: 0.663460016251
seth-kk:: 0.000790119171143 (IMG:style_emoticons/default/party.gif)

sumujac - seth-kk pobil nas o 3 miejsca po przecinku....
no coz, nic dziwnego, skoro rozwiazal zadanie bez petli (hmmmm dyskwalifikacja?(IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/tongue.gif) )

chociaz warto by bylo jeszcze obciazenie pamieci sprawdzic, ale to juz jutro, na dzis spadam do domu.
Go to the top of the page
+Quote Post
Fifi209
post
Post #19





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(alegorn @ 27.08.2009, 17:03:38 ) *
a co mi tam.
kazde z rozwiazan dalem do petli * 100 - sprawdzalem kilkukrotnie, kolejnosc wynikow bez zmian


Robert1985 :: 0.0393550395966 // tyle ze o ile dobrze sprawdzilem, cos nie teges zwrot ci wyszedl
ja:: 0.0205841064453
fifi209:: 0.663460016251
seth-kk:: 0.000790119171143 (IMG:style_emoticons/default/party.gif)

sumujac - seth-kk pobil nas o 3 miejsca po przecinku....
no coz, nic dziwnego, skoro rozwiazal zadanie bez petli (hmmmm dyskwalifikacja?(IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/tongue.gif) )

chociaz warto by bylo jeszcze obciazenie pamieci sprawdzic, ale to juz jutro, na dzis spadam do domu.

Hmm, bardzo ciekawe. (IMG:style_emoticons/default/winksmiley.jpg)
Czym mierzyłeś czasy? (IMG:style_emoticons/default/snitch.gif)

Jak możesz spróbuj jeszcze z tym:
  1. $test = 'tO jEST pRZYKLADOWY tEKST';
  2. $x = strlen($test);
  3. $y=0;
  4.  
  5. while ($y < $x) {
  6. $cache = ord($test[$y]);
  7. if ($cache > 64 && $cache < 91) {
  8. echo chr($cache+32);
  9. }else if($cache > 96 && $cache < 123) {
  10. echo chr($cache-32);
  11. }else{
  12. echo $test[$y];
  13. }
  14. $y++;
  15. }

Interesuje mnie różnica między tym czasem a poprzednim (z pętlą for).
Go to the top of the page
+Quote Post
ultra_18
post
Post #20





Grupa: Zarejestrowani
Postów: 71
Pomógł: 4
Dołączył: 30.10.2008

Ostrzeżenie: (0%)
-----


  1. for($i=0;$i<strlen($text);$i++)
  2. $text[$i] = ($text[$i] == strtoupper($text[$i])) ? strtolower($text[$i]) : strtoupper($text[$i]) ;
Go to the top of the page
+Quote Post
sztosz
post
Post #21





Grupa: Zarejestrowani
Postów: 866
Pomógł: 32
Dołączył: 2.06.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Ma być w dowolnym języku? To ja dam to z tekstem w Pythonie:

[PYTHON] pobierz, plaintext
  1. a = 'JaKis TexT'
  2. print a.swapcase()
[PYTHON] pobierz, plaintext


Od razu piszę że nie działa dla znaków spoza ASCII, nie wiem jak wasze skrypty

dla 100 powtórzeń na moim sprzęcie uruchamiane na szybko z Aptany: 0.0019998550415

Nie twierdzę że szybko to działa, ale szybciej pisałem kod wraz z wynikiem dla 100 powtórzeń niż ten post na forum (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
LBO
post
Post #22





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Mi osobiście najbardziej podoba się 3 zadanie. Sprawdza, czy programista bierze w ogóle pod uwagę lokalizację (czyli rozwiązaniom z mapami translacji mówimy nie; gratulację dla tych co użyli strtolower, strtoupper) i podstawową optymalizację (ale nie mikro-optymalizację) (IMG:style_emoticons/default/smile.gif)

Moje rozwiązanie (nie pisałem z palca, tylko przerobiłem funkcję @ultra_18... bo mi się spodobała) to

  1. $length = strlen($text); // Wykona się tylko raz, a nie przy każdym obrocie pętli
  2. for($i=0;$i<$length;$i++)
  3. {
  4. $text[$i] = ($text[$i] == ($j = strtoupper($text[$i]))) ? strtolower($j) : $j; // Po co było 2 razy strtoupper()?
  5. unset($j); // dla pedantów
  6. }


Bardzo fajny temat, taki na czasie (IMG:style_emoticons/default/smile.gif)

Pozdrawiam, Alan
Go to the top of the page
+Quote Post
sztosz
post
Post #23





Grupa: Zarejestrowani
Postów: 866
Pomógł: 32
Dołączył: 2.06.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Cytat(LBO @ 27.08.2009, 23:34:38 ) *
Sprawdza, czy programista bierze w ogóle pod uwagę lokalizację (czyli rozwiązaniom z mapami translacji mówimy nie; gratulację dla tych co użyli strtolower, strtoupper)

Ok ja się nie założę, bo akurat PHP mnie w ogóle nie bawi, ale strtolower ani strtoupper nie zmieni Ci poprawnie case'a znaków spoza ASCII, więc nie rozumiem twojego komentarza o lokalizacji.

  1. <?php
  2. print '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
  3. print('ęóąśłżźćń');
  4. print strtoupper('ęóąśłżźćń');
  5. print strtolower('ĘÓĄŚŁŻŹĆŃ')
  6. ?>


daje mi:
  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />ęóąśłżźćńęăąśłżŪćń��������


Ale to może ja coś źle robię.
Go to the top of the page
+Quote Post
seth-kk
post
Post #24





Grupa: Zarejestrowani
Postów: 444
Pomógł: 79
Dołączył: 26.05.2009

Ostrzeżenie: (0%)
-----


ariant dla milosnikow petli (IMG:style_emoticons/default/winksmiley.jpg)
  1. $test = 'MaLe tO DuZeE';
  2.  
  3. $a = strtolower($test);
  4. $c = strtoupper($test);
  5. $b = strlen($a);
  6. while($b--)
  7. {
  8. if($a[$b] == $test[$b])
  9. $a[$b] = $c[$b];
  10. }
Go to the top of the page
+Quote Post
Speedy
post
Post #25





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

Ostrzeżenie: (0%)
-----


Też postanowiłem pokombinować z ascii podobnie, jak jeden z przedmówców. Założyłem, że w ciągu są tylko literki i spacje.
  1. <?php
  2. $array = str_split('tO jEsT TeST');
  3. foreach($array as $value) echo (ord($value) != 32 ) ? ( (ord($value) > 90) ? chr(ord($value) - 32) : chr(ord($value) + 32) ) : ' ';
  4. ?>

btw. Informacja dla osób, które robią tablice $literki = array('a','b','c' ... itd. poczytajcie o funkcji range (IMG:style_emoticons/default/winksmiley.jpg) .

Ten post edytował Speedy 28.08.2009, 00:01:06
Go to the top of the page
+Quote Post
LBO
post
Post #26





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(sztosz @ 28.08.2009, 00:27:28 ) *
Ok ja się nie założę, bo akurat PHP mnie w ogóle nie bawi, ale strtolower ani strtoupper nie zmieni Ci poprawnie case'a znaków spoza ASCII, więc nie rozumiem twojego komentarza o lokalizacji.


No dobra, ale tu chodzi o kodowanie, a nie lokalizacje. Normalnie - dla UTF-8 - to lecą funkcje mb_* do takich rzeczy i nie mam problemu.

Dla tego domyślnego kodowania windows-cośtam funkcje strto* łapią np umlauty i na pewno jeszcze znajdą się "ogonki" dla kilku innych języków.

P.S. Mimo wszystko przyznam, że mnie trochę złapałeś (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Robert1985
post
Post #27





Grupa: Zarejestrowani
Postów: 84
Pomógł: 7
Dołączył: 5.08.2009
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Hmm.. ale rozgorzała dyskusja widzę ,że wam się podoba, moje rozwiązanie działa (nie występują też problemy z literkami i spacjami) rozwiązanie LBO bardzo ładne i zwięzłe, ale czytając ostatnie posty rzeczywiście zauważyłem ,że tylko dla liter [a-z], niestety na polskich ę Ę itp. już nie co w takim przypadku się robi?(IMG:style_emoticons/default/questionmark.gif) ?

Ten post edytował Robert1985 28.08.2009, 04:43:25
Go to the top of the page
+Quote Post
bim2
post
Post #28





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Nie mogłem się powstrzymać (IMG:style_emoticons/default/smile.gif)
  1. <?php
  2. mb_internal_encoding( 'UTF-8');
  3. mb_regex_encoding( 'UTF-8');
  4.  
  5. function convertStr($string)
  6. {
  7. $stop = mb_strlen($string);
  8. $result = '';
  9.  
  10. for($i = 0; $i < $stop; $i++)
  11. {
  12. $t = mb_substr( $string, $i, 1);
  13. if(mb_strtoupper($t, 'utf-8')==$t)
  14. {
  15. $result .= mb_strtolower($t, 'utf-8');
  16. } else {
  17. $result .= mb_strtoupper($t, 'utf-8');
  18. }
  19. }
  20.  
  21. return $result;
  22. }
  23.  
  24. echo convertStr('ąśąśćłóńĄŃŁÓ');
  25. ?>


Ten post edytował bim2 28.08.2009, 04:42:06
Go to the top of the page
+Quote Post
LBO
post
Post #29





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(Robert1985 @ 28.08.2009, 04:53:33 ) *
Hmm.. ale rozgorzała dyskusja widzę ,że wam się podoba, moje rozwiązanie działa (nie występują też problemy z literkami i spacjami) rozwiązanie LBO bardzo ładne i zwięzłe, ale czytając ostatnie posty rzeczywiście zauważyłem ,że tylko dla liter [a-z], niestety na polskich ę Ę itp. już nie co w takim przypadku się robi?(IMG:style_emoticons/default/questionmark.gif) ?


Moje działa, tylko nie dla UTF-8 (IMG:style_emoticons/default/smile.gif) Ale to już wina PHP (IMG:style_emoticons/default/sad.gif)
Jak wspomniałem lepiej użyć funkcji mb_* lub przeładować te standardowe w konfiguracji (osobiście tego nie robiłem, tylko czytałem o tym).

Pozdrawiam
Go to the top of the page
+Quote Post
rzymek01
post
Post #30





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

Ostrzeżenie: (0%)
-----


jak w dowolnym to w C napiszę (IMG:style_emoticons/default/tongue.gif)

Kod
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
  char text[256];
  gets (text);

  int iLength = strlen(text);
  int i;
  for (i = 0; i < iLength; ++i)
    text[i] = ( islower(text[i]) ? toupper(text[i]) : tolower(text[i]) );


  // wyświetlenie czy cóś

  return 0;
}


(IMG:style_emoticons/default/tongue.gif)

Ten post edytował rzymek01 28.08.2009, 08:42:26
Go to the top of the page
+Quote Post
erix
post
Post #31





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Przecież wyszło Ci bardzo podobnie. (IMG:style_emoticons/default/tongue.gif)

Poza tym, to rozmowa o programiście PHP, a nie C(PP). (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Fifi209
post
Post #32





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(erix @ 28.08.2009, 11:02:00 ) *
Przecież wyszło Ci bardzo podobnie. (IMG:style_emoticons/default/tongue.gif)

Poza tym, to rozmowa o programiście PHP, a nie C(PP). (IMG:style_emoticons/default/tongue.gif)

Wyszło mu podobnie, ale założę się, że jest kilka razy szybszy od Nas. ;p

Erix, podaj swoją wersję. ;p (oczywiście nie może się pomysł powtórzyć)
Go to the top of the page
+Quote Post
mike
post
Post #33





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Śledzę ten temat i zastanawiam dlaczego nikt nie zwrócił uwagi, że takie pytanie to tragedia.

Dlaczego pytanie o podstawy myślenia i logiki pada na takiej rozmowie? No chyba, że była to rozmowa, która miała pomóc wyłonić praktykanta lub baaardzo początkującego adepta programowania w czymkolwiek.
Go to the top of the page
+Quote Post
erix
post
Post #34





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Jeśli chodzi o tej jeden konkretny przypadek (http://forum.php.pl/index.php?s=&showt...st&p=654420):
Kod
tO jEST pRZYKLADOWY tEKST

to bym po prostu użył ucwords. (IMG:style_emoticons/default/biggrin.gif) Wykonanie Twojego kodu 1000x zabrało u mnie 1.9124290943146s, ucwords - 0.050964117050171s. (IMG:style_emoticons/default/biggrin.gif)

A jeśli chodzi o zamienianie nieregularne, to zrobiłem to nieco inaczej - zainicjowałem sobie tablicę znaków (coś a'la słownik):
  1. <?PHP
  2. $s = microtime(1);
  3.  
  4. function toChar(&$x){
  5. $x = chr($x);
  6. }
  7.  
  8. $large = range(65, 90);
  9. $small = range(97, 122);
  10.  
  11. array_walk($large, 'toChar');
  12. array_walk($small, 'toChar');
  13.  
  14. $largeToSmall = array_combine($large, $small);
  15. $smallToLarge = array_combine($small, $large);
  16.  
  17. for($i=0;$i<1000;$i++):
  18. $test = 'tO jEST pRZYKLADOWY tEKST';
  19. $out = '';
  20.  
  21. $len = strlen($test);
  22.  
  23. for($c=0;$c<$len;$c++){
  24. if(isset($largeToSmall[$test{$c}])){
  25. $out .= $largeToSmall[$test{$c}];
  26. }else if(isset($smallToLarge[$test{$c}])){
  27. $out .= $smallToLarge[$test{$c}];
  28. }else{
  29. $out .= $test{$c};
  30. }
  31. }
  32.  
  33.  
  34. endfor;
  35.  
  36. var_dump($out);
  37.  
  38. ?>


0.11851811408997s... Przy każdorazowej inicjalizacji tablic jest kilkukrotnie wolniejszy.

A gdyby zawrzeć w funkcji, nawet 1000x wykonywanej, można przecież użyć static:
  1. <?PHP
  2.  
  3. function toChar(&$x){
  4. $x = chr($x);
  5. }
  6.  
  7. function swapCase($str){
  8.  
  9. static $largeToSmall = null;
  10. static $smallToLarge = null;
  11.  
  12. if($largeToSmall===null){
  13. $large = range(65, 90);
  14. $small = range(97, 122);
  15.  
  16. array_walk($large, 'toChar');
  17. array_walk($small, 'toChar');
  18.  
  19. $largeToSmall = array_combine($large, $small);
  20. $smallToLarge = array_combine($small, $large);
  21. }
  22.  
  23. $len = strlen($str);
  24.  
  25. for($c=0;$c<$len;$c++){
  26. if(isset($largeToSmall[$str{$c}])){
  27. $out .= $largeToSmall[$str{$c}];
  28. }else if(isset($smallToLarge[$str{$c}])){
  29. $out .= $smallToLarge[$str{$c}];
  30. }else{
  31. $out .= $str{$c};
  32. }
  33. }
  34.  
  35. return $out;
  36. }
  37.  
  38. $x = microtime(1);
  39.  
  40. for($a=0;$a<1000;$a++){
  41. swapCase('asdASD');
  42. }
  43.  
  44. ?>

0.10412883758545s ;]
Go to the top of the page
+Quote Post
Fifi209
post
Post #35





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Jak Wy tak dokładnie mierzycie czas? (IMG:style_emoticons/default/tongue.gif) Mi PHP powyżej 4 miejsc po przecinku zaczyna wariować...

Ten post edytował fifi209 28.08.2009, 13:14:15
Go to the top of the page
+Quote Post
erix
post
Post #36





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Przecież w każdym listingu napisałem, na końcu. ;d
Go to the top of the page
+Quote Post
Fifi209
post
Post #37





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Ok. O ile przy pierwszej pętli przy 100 wykonaniach mam średni wynik:
0.00250374317169 s

To przy drugiej...
5.25760650635E-5 s

I właśnie to miałem na myśli, mówiąc że PHP szaleje...
Pierwsza pętla wykonuje się moim zdaniem znacznie dłużej niż druga... ;/
Go to the top of the page
+Quote Post
Pawel_W
post
Post #38





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

Ostrzeżenie: (0%)
-----


notacja wykładnicza (IMG:style_emoticons/default/winksmiley.jpg)

dokładniej 5.25760650635 * 10^-5

Ten post edytował Pawel_W 28.08.2009, 13:53:56
Go to the top of the page
+Quote Post
Fifi209
post
Post #39





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Czyli drugi wynik:
5.25760650635E-5

To:
0.000052760650635 s ?

Ten post edytował fifi209 28.08.2009, 13:56:07
Go to the top of the page
+Quote Post
alegorn
post
Post #40





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


hmmm.
a ja poprawilem swoje rozwiazanie

  1. $s = microtime(1);
  2. for($c=1000;$c>0;--$c){
  3. $inp = 'tO jEST pRZYKLADOWY tEKST';
  4. $low = strtolower($inp);
  5. $rew='';
  6. $len = strlen($inp);
  7. $cc=0;
  8. while($len > $cc){
  9. if($inp{$cc} === $low{$cc}){
  10. $rew .= strtoupper($low{$cc});
  11. }
  12. else{
  13. $rew .=$low{$cc};
  14. }
  15. ++$cc;
  16. }
  17. echo $rew;
  18. }


srednio wychodzi jakos tak (*1000):

0.0544149875641

co ciekawe, jesli if'a zapisac w jednej linijce czyli
  1. $rew .= ($inp{$cc} === $low{$cc})? strtoupper($low{$cc}) : $low{$cc} ;

to srednio wynik mam:
0.0692899227142

czyli spora roznica.

zastanawiam sie czy przy uzyciu petli da sie cos wycisnac jeszcze z wyniku
uzycie for - to tak *0,7 do wyniku (szacujac na oko (IMG:style_emoticons/default/biggrin.gif) )


tyle ze i tak rozwiazanie z strtr jest najmniej 5* szybsze.....
ale co dziwnego, wszak na codzien petla sluzy do wieszania (IMG:style_emoticons/default/tongue.gif)

Al.

Ten post edytował alegorn 28.08.2009, 14:18:29
Go to the top of the page
+Quote Post
empathon
post
Post #41





Grupa: Zarejestrowani
Postów: 246
Pomógł: 31
Dołączył: 13.11.2006
Skąd: się znamy?

Ostrzeżenie: (0%)
-----


Ja od dawna do budowy moich aplikacji używam tej zaawansowanej klasy. Przydaje się zwłaszcza przy budowaniu portali społecznościowych.
Gorąco polecam. Licencja MIT.

  1. <?php
  2. class RapeException extends Exception { }
  3.  
  4. class InvertRape {
  5.  
  6. private $wimp;
  7.  
  8. private $re_wimp;
  9.  
  10. public function __construct($wimp)
  11. {
  12. $this->setWimp($wimp);
  13. }
  14.  
  15. public function setWimp($wimp)
  16. {
  17. if(!strlen($wimp)) throw new RapeException('Nothing to rape!');
  18. $this->wimp = $wimp;
  19. }
  20.  
  21. public function getWimp()
  22. {
  23. return $this->wimp;
  24. }
  25.  
  26. public function setReWimp($re_wimp)
  27. {
  28. if(!strlen($re_wimp)) throw new RapeException('Your wimp is exhausted!');
  29. $this->re_wimp = $re_wimp;
  30. }
  31.  
  32. public function getReWimp()
  33. {
  34. return $this->re_wimp;
  35. }
  36.  
  37. public function invert()
  38. {
  39. $upper_split = str_split(mb_strtolower($this->getWimp(), 'UTF-8'));
  40. $lower_split = str_split(mb_strtoupper($this->getWimp(), 'UTF-8'));
  41. $wimp_split = str_split($this->getWimp());
  42.  
  43. $re_wimp = array_diff_assoc($upper_split, $wimp_split) + array_diff_assoc($lower_split, $wimp_split);
  44. ksort($re_wimp);
  45. $this->setReWimp(join($re_wimp));
  46. }
  47.  
  48. public function rapeMeOneOrMoreTimes($times = 1)
  49. {
  50. for($riped = 1; $i <= $times; $riped++){
  51. $this->setWimp($this->getReWimp());
  52. $this->invert();
  53. }
  54. }
  55. }
  56.  
  57. $inverter = new InvertRape('PóKlIkAsZ');
  58. $inverter->invert();
  59. echo $inverter->getReWimp();
Go to the top of the page
+Quote Post
alegorn
post
Post #42





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


empathon:: byc moze cos zle zaimplementowalem...... (ale co skoro ctrl+c & ctrl+v (IMG:style_emoticons/default/questionmark.gif) ) zwrot jaki otrzymuje to.... pklikasz
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 16:28