Jump to content
php.lv forumi

eregi un preg_match


_siikais_

Recommended Posts

tātad mēģinu ar eregi pārbaudīt stringu:

eregi('^0+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+0+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+0+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+0', '0111001101110000000100000')

un protams dabūnu atbilstību, bet par cik eregi ir deprecated, mēģinu to pārveidot uz preg_match

preg_match('/^0+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+0+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+0+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+[0-1]+0/i', '0111001101110000000100000')

bet kā par nelaimi viņš sūta dillēs. Kur un kas tieši būtu jāpalabo lai šī nezvēru rinda izpildītos un dabūtu atbilstību?

 

Paldies. ;)

Link to comment
Share on other sites

ir laukums no 120 kvadrātiem dimensijā 8x16 (kolonas x rindas). viņš var būt aizpildīts ar kvadrātiem dažādās dimensijās 1x1, 1x2, 2x2, 2x4, u.t.t.

Pārbaudot eksistējošu kvadrātu atrašanās vietas un pozīcijas, vajag atrast brīvu vietu piemēram laukam 1x4.

tā nu viņš saģenerē skatoties pēc aizpildījumiem eregi patternu un meklējamo stringu, un ja sakrīt tad izdod pozīciju kurā mēs varam ievietot jauno bloku.

 

Var jau būt ka ir kāds tiešām super racionālāks veids kā to īstenot, tad nu lūgtum hintus studijā ;)

Edited by _siikais_
Link to comment
Share on other sites

Mans variants:

<?php

error_reporting(E_ALL);

define('BOARD_MAXW', 8);
define('BOARD_MAXH', 16);

$tofind = "16x1";

$board = array();
list($W, $H) = split('x', $tofind);
$data = file('in.txt');
foreach($data as $line){
   $board[] = ~bindec(trim($line)); # invertē, lai 1 apzīmētu tukšumus
}

function board_search($board, $W, $H)
{
   if(($W > BOARD_MAXW) || ($H > BOARD_MAXH)){
       return false;
   }

   foreach($board as $ri=>$row){
       $mask = pow(2, $W) - 1;
       for($x = 0; $x < BOARD_MAXW - $W + 1; $x++){
  	     $rowmatch = 0;
  	     # Ja konkrētajā vietā rindā ir brīva vieta, pētam nākamajās rindās
  	     if(($row & $mask) == $mask){
  		     $rowmatch++;
  		     for($ri2 = $ri + 1; $ri2 < BOARD_MAXH; $ri2++){
  			     $row2 = $board[$ri2];
  			     if(($row2 & $mask) == $mask) {
  				     $rowmatch++;
  			     } else {
  				     break;
  			     }
  		     }
  		     if($rowmatch == $H){
  			     return array($ri, BOARD_MAXW - $W - $x);
  		     }
  	     }
  	     $mask <<= 1; # "pabīdam" pa kreisi
       }
   }
   return false;
}

if(($ret = board_search($board, $W, $H)) !== false){
   print "FOUND at row=".$ret[0].", col=".$ret[1]."\n";
} elseif(($ret = board_search($board, $H, $W)) !== false){ # "parotējam" meklējamo laukumu
   print "FOUND at row=".$ret[0].", col=".$ret[1]."\n";
} else {
   print "NOT FOUND";
}

 

Nav baisi testēts, kā arī laukuma dimensijām jābūt mazākiem par CPU vai PHP integer bitiem (vairs neatminos, kā tur PHP mainījās max integers atkarībā no 32 bai 64 bit OS/CPU), bet uz šāda maza laukumiņa jau pietiks :D

 

Ā, piemirsu in.txt

11001000
11001000
00001000
00001000
00000000
01111000
01111000
01111000
01111000
01111000
00000000
00000000
00100110
00000110
00000000
00000000

Edited by marrtins
Link to comment
Share on other sites

daGrevis patterns var atšķirties garumā un izskatā, jo viņš tiek ģenerēts atkarībā no esošo kvadrātu/laukumu izvietojumam

 

marrtins tas ir mēģinājums priekš klienta reanimēt spēles scriptu kas meklē vietu iekš bankas jaunu mantu.

p.s. tūlīt patestēšu tavu piemēru.

 

p.s.s. īsti tomēr kkas ņepašet, $tofind="2x2", viņš parāda row=3, col=2, bet ja izmantojam in.txt datus tad vajadzētu būt row=0, col=3 ne ta?

Edited by _siikais_
Link to comment
Share on other sites

Paldies par padomiem, bet noīstenoju pa savam:

1) viss saturs lielā garā virknē ar 1 un 0;

2) cheko pēc kārtas katru pozīciju un substringso konkrēti vajadzīgo garumu attiecīgi tik daudz līnijās cik ir augstums, līdz ar to ja izgriestais strings ir visas 0 tad konkrētajā slotā var ievietot ;)

2 for cikli, 3 ifi un substring, tagad tik atliek uztaisīt pašas eksistējošo mantu string virkni un smartsearch gatavs :)

Edited by _siikais_
Link to comment
Share on other sites

kods darbojas, tieši tā kā tam ir jāstrādā, vnk paskaidroju kāpēc ir tāds $string mainīgais un kāpēc neizvada slotu (ja nu kādam ienāktu prāta testēt ar esošajiem mainīgajirem). Ja pirm divām 0 to prieksā viņam vieninieku aizstāsi ar 0, tad iegūsi slota izvadi. ;)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...