fork download
  1. <?php
  2.  
  3. //* Find minimal distance between two given symbols symbols in given string
  4.  
  5. $string = "j8QSid5j558mQgcRcwmYDH8wVLlI1irwLs0r5Ufx";
  6. $symbol1 = "e";
  7. $symbol2 = "t";
  8.  
  9. print_r ("\nMinimal distance is " . findMinDistance($string, $symbol1, $symbol2) . "\n");
  10.  
  11. function findMinDistance($string, $symbol1, $symbol2) {
  12.  
  13. $curr_pos1 = strpos($string, $symbol1, 0);
  14. if ($curr_pos1 === false ) {return false;}
  15. else {echo "First entry of " . $symbol1 . " is " . $curr_pos1 . "\n";}
  16.  
  17. $curr_pos2 = strpos($string, $symbol2, 0);
  18. if ($curr_pos2 === false ) {return false;}
  19. else {echo "First entry of " . $symbol2 . " is " . $curr_pos2 . "\n";}
  20.  
  21. if ($curr_pos1 < $curr_pos2) {$curr_pos = $curr_pos1; $symbol = $symbol2;}
  22. else {$curr_pos = $curr_pos2; $symbol = $symbol1;}
  23.  
  24. $next_pos = strpos($string, $symbol, $curr_pos+1);
  25. if ($next_pos === false ) {return false;}
  26. else {echo "Next entry of " . $symbol . " is " . $next_pos . "\n";}
  27.  
  28. $min_distance = $next_pos - $curr_pos;
  29. echo "Distance is " . $min_distance . "\n";
  30.  
  31. $curr_distance = findNextDistance($string, $curr_pos, $symbol, $min_distance, $symbol1, $symbol2);
  32.  
  33. return --$min_distance;
  34. }
  35.  
  36. function findNextDistance($string, &$curr_pos, $symbol, &$min_distance, $symbol1, $symbol2) {
  37. echo "Looking forward for " . $symbol . " from pos " . $curr_pos . ". ";
  38. $pos = strpos($string, $symbol, $curr_pos+1);
  39. if ($pos === false ) {return false;}
  40.  
  41. $symbol == $symbol1 ? $prev_symbol = $symbol2 : $prev_symbol = $symbol1;
  42. $second_accurance_pos = strpos($string, $prev_symbol, $curr_pos+1);
  43. if ($second_accurance_pos < $pos && $second_accurance_pos != false) {
  44. echo "*** Double accurance of " . $prev_symbol . " at pos " . $second_accurance_pos . "\n";
  45. $curr_pos = $second_accurance_pos;
  46. findNextDistance($string, $curr_pos, $symbol, $min_distance, $symbol1, $symbol2); return true;
  47. }
  48.  
  49. $curr_distance = $pos - $curr_pos;
  50. echo "Got it at pos " . $pos . ", distance " . $curr_distance . "\n";
  51. if ($curr_distance < $min_distance) {$min_distance = $curr_distance;}
  52.  
  53. $curr_pos = $pos;
  54. $symbol == $symbol1 ? $symbol = $symbol2 : $symbol = $symbol1;
  55. //echo "symbol1: " . $symbol1 ." symbol2: " . $symbol2 . " symbol: " . $symbol . "\n";
  56. findNextDistance($string, $curr_pos, $symbol, $min_distance, $symbol1, $symbol2);
  57. }
  58.  
  59.  
Success #stdin #stdout 0.02s 52472KB
stdin
Standard input is empty
stdout
Minimal distance is