Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: szukanie wyrazu posiadajacego dane litery, slownik scrabble
Forum PHP.pl > Forum > PHP
bercow
Mamy tablice $slowo (na koncu bedzie pewnie duuuuzo wieksza, i jakies wprowadzone litery $litery, jak znalesc wszystkie slowa ktore mozna ulozyc z podanych liter, w tej chwili dostaje 'jak nizej', nie wiem czemu czesc pomija
  1. katarek - a
  2. katarek - a
  3. katarek - r
  4. zak - z
  5. zak - a
  6. rak - r
  7. rak - a
  1. <?php
  2.  
  3. $slowo = array ("katarek", "zak", "rak");
  4. $litery = array ("k", "a", "z", "m", "r");
  5.  
  6. for ($j=0;$j<count($slowo);$j++) {
  7. $litera = $slowo[$j];
  8.  
  9. for ($i=0;$i <= strlen($litera);$i++) {
  10. $key = array_search($litera[$i], $litery);
  11. if ($key == TRUE) {
  12. echo $slowo[$j]." - ".$litera[$i]."<br />";
  13. }
  14. }
  15. }
  16. ?>
Crozin
Podpowiedź: żeby sprawdzić czy dane słowo da się ułożyć z danych liter możesz posortować oba ciągi w porządku alfabetycznym i sprawdzić czy są sobie równe.
bercow
Probowalem juz z posortowaniem, ale mimo iz slowo ulozyc mozna, wyniki nie sa identyczne.
  1. [0] = a [1] = a [2] = e [3] = k [4] = k [5] = r [6] = t
  2. [0] = a [1] = k [2] = m [3] = r [4] = z [0] = a [1] = a [2] = e [3] = k [4] = k [5] = r [6] = t [7] = a [8] = a [9] = a
  3. [0] = a [1] = k [2] = m [3] = r [4] = z [0] = a [1] = a [2] = e [3] = k [4] = k [5] = r [6] = t [7] = a [8] = a [9] = a [10] = e [11] = k [12] = k
  4. [0] = a [1] = k [2] = m [3] = r [4] = z

  1. <?php
  2.  
  3. $slowo = array ("katarek", "zak", "rak");
  4. $litery = array ("k", "a", "z", "m", "r");
  5.  
  6. for ($j=0;$j<count($slowo);$j++) {
  7. $litera = $slowo[$j];
  8.  
  9. for ($i=0;$i <= strlen($litera)-1;$i++) {
  10. $slowo_sort[] = $litera[$i];
  11. // echo $litera[$i]." ";
  12. $key = array_search($litera[$i], $litery);
  13. if ($key == TRUE) {
  14. // echo $slowo[$j]." - ".$litera[$i]."<br />";
  15. }
  16. }
  17.  
  18. sort($slowo_sort);
  19. foreach ($slowo_sort as $key => $val[]) {
  20. echo "[" . $key . "] = " . $val[$key]." ";
  21. }
  22. echo "<br />";
  23. sort($litery);
  24. foreach ($litery as $key_l => $val_l[]) {
  25. echo "[" . $key_l . "] = " . $val_l[$key_l]." ";
  26. }
  27.  
  28. }
  29.  
  30.  
  31. ?>
d3ut3r
pisane na szybko ale powinno działać (trochę testowałem smile.gif ):

  1. $slowa = array (
  2. 'katarek',
  3. 'zak',
  4. 'rak'
  5. );
  6.  
  7. $litery = array (
  8. "k",
  9. "a",
  10. "z",
  11. "m",
  12. "r"
  13. );
  14.  
  15. function checkWord($word,$letters){
  16.  
  17. $lettersInWord=str_split($word);
  18.  
  19. if (count($lettersInWord)>count($letters)){
  20. return false;
  21. }
  22.  
  23. foreach ($lettersInWord as $key=>$letter){
  24.  
  25. $found=false;
  26. $found=array_search($letter,$letters);
  27.  
  28. if ($found===false){
  29. return false;
  30. }
  31.  
  32. unset($letters[$found]);
  33.  
  34. }
  35.  
  36. return true;
  37.  
  38. }
  39.  
  40. if (!checkWord($slowa[2],$litery)){
  41. echo "nie da się";
  42. } else{
  43. echo "da się";
  44. }


minolone
Kiedyś używałem takiej klasy do Szufelki (coś jak scrabble) w której przeszukiwałem słownik "sjp"
Tyle że ona jest bez powtórzeń, i polecam się zastosować do rad ~Crozin-a, robiłem to na takiej samej zasadzie,

Cytat z posta z 2011r.
Cytat
Ja akurat używałem tej klasy do gry "szufelka" generowałem sobie słowa od 3 do 7 liter tak ze to nie robiło jakiegoś strasznego zamulenia, i wszystko było oparte o bazę danych,
skracając wyszukiwanie weź pod uwagę to ze czasami z jednego słowa można ułożyć tez inne, np: masło, słoma, i te literki są już takie same. takich słówek jest w tym słowniku bardzo dużo.
wiec zasada działanie była trochę u mnie inna nie przeszukiwałem słówek lecz miałem słowa ułożone w kolejności alfabetycznej w bazie czyli np: masło to miałem 'ałmos' ze słomy litery są takie same, miałem je zahashowane (sha1) i porobione dowiązania, jeden hash kilka słówek, wyszukując po hashu zaoszczędzałem sporo czasu. możesz pokombinować na różne sposoby, odciążając trochę serwer nie musisz od razu wyszukiwać slow składających się z 3, 4, 5, 6, 7, 8, 9 znaków tylko osobno, weź pod uwagę tez ze w grze w scrabble rzadko układasz bardzo długie słowa, wiec słowa np które maja powyżej 10 czy tam więcej znaków nie będą ci potrzebne wiec możesz je usunąć, a tym samym odchudzisz plik o prawie polowe. zaglądając w ten plik sjp widziałeś pewnie jakie tam są słowa.

  1. <?php
  2. class Combinations implements Iterator
  3. {
  4. protected $c = null;
  5. protected $s = null;
  6. protected $n = 0;
  7. protected $k = 0;
  8. protected $pos = 0;
  9.  
  10. function __construct($s, $k) {
  11. if(is_array($s)) {
  12. $this->s = array_values($s);
  13. $this->n = count($this->s);
  14. } else {
  15. $this->s = (string) $s;
  16. $this->n = strlen($this->s);
  17. }
  18. $this->k = $k;
  19. $this->rewind();
  20. }
  21. function key() {
  22. return $this->pos;
  23. }
  24. function current() {
  25. $r = array();
  26. for($i = 0; $i < $this->k; $i++)
  27. $r[] = $this->s[$this->c[$i]];
  28. return is_array($this->s) ? $r : implode('', $r);
  29. }
  30. function next() {
  31. if($this->_next())
  32. $this->pos++;
  33. else
  34. $this->pos = -1;
  35. }
  36. function rewind() {
  37. $this->c = range(0, $this->k);
  38. $this->pos = 0;
  39. }
  40. function valid() {
  41. return $this->pos >= 0;
  42. }
  43. //
  44. protected function _next() {
  45. $i = $this->k - 1;
  46. while ($i >= 0 && $this->c[$i] == $this->n - $this->k + $i)
  47. $i--;
  48. if($i < 0)
  49. return false;
  50. $this->c[$i]++;
  51. while($i++ < $this->k - 1)
  52. $this->c[$i] = $this->c[$i - 1] + 1;
  53. return true;
  54. }
  55. }
  56.  
  57. $aaa = array('k', 'a', 'z', 'm', 'r');
  58. sort($aaa);
  59.  
  60. //Użycie klasy new Combinations('słówka, literki', 'wynik z ilu liter')
  61.  
  62. foreach(new Combinations($aaa, 3) as $k => $v)
  63. echo $k + 1, ' ', implode(',', $v), "<br />";
  64.  
  65. Co da wynik:
  66. 1 a,k,m
  67. 2 a,k,r
  68. 3 a,k,z
  69. 4 a,m,r
  70. 5 a,m,z
  71. 6 a,r,z
  72. 7 k,m,r
  73. 8 k,m,z
  74. 9 k,r,z
  75. 10 m,r,z
  76. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.