Backtracking v PHP

Programovacie jazyky, rady, poradňa...
hedyso
Amateur
Amateur
Príspevky: 21
Registrovaný: 08 jún 2005, 21:47

Backtracking v PHP

Príspevok od používateľa hedyso »

Viete mi vyriesit takuto ulohu ?

Kód: Vybrať všetko

Na papieri je napísané dlhé číslo 123456789. Vsuňte medzi niektoré cifry znamienka + alebo - tak, aby ste po vyhodnotení vzniknutého výrazu dostali číslo 100. 
Napríklad: 123-45-67+89 = 100.
Napíšte program, ktorý nájde a vypíše všetky riešenia.
Návod: použite backtracking
vie niekto napisat taky algoritmus v PHP ?
MeanSeriously
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 430
Registrovaný: 14 apr 2012, 15:07

Re: Backtracking v PHP

Príspevok od používateľa MeanSeriously »

Len 2 otázky:
Koľko dáš?
alebo
Koľko resp. čo už máš?

Ak nie si schopný zaplatiť, tak celé ti to nikto neurobí.
Ak nič nemáš urobené, tak ti nikto nepomôže.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Backtracking v PHP

Príspevok od používateľa harrison314 »

To mi pripomina zadanie z UKF, nejake podobne som riesil minulyrok za flasu fernetu :lol:
AK vies co je to pole (alebo zoznam), cyklus a rekurzia, nemal by si mat problem.
hedyso
Amateur
Amateur
Príspevky: 21
Registrovaný: 08 jún 2005, 21:47

Re: Backtracking v PHP

Príspevok od používateľa hedyso »

nech to skusam ako skusam vysledku sa neviem dopracovat :) ak sa mi to nepodari do nedele (13.1.2013) som ochotny poslat na paypal 15€ za vypracovanie :)
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Backtracking v PHP

Príspevok od používateľa harrison314 »

A v com mas konkretne problem?
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Backtracking v PHP

Príspevok od používateľa weroro »

hedyso napísal:nech to skusam ako skusam vysledku sa neviem dopracovat :) ak sa mi to nepodari do nedele (13.1.2013) som ochotny poslat na paypal 15€ za vypracovanie :)
My chceme vidieť ako si to skúšal. Daj sem tvoje pokusné PHP zdrojáky.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Backtracking v PHP

Príspevok od používateľa audiotrack »

ty si v pozícii, že niečo nevieš a potrebuješ to. Takže ty máš prijímať ponuky nás, a nie núkať smiešnych 15€ a ešte k tomu na paypal. Takto nenájdeš asi nikoho. Na druhú stranu, keby rovno povieš že nech si zapýtame čo chceme a že si vyberieš najlepšiu ponuku, tak som si istý, že sa ti tu ozve hneď niekoľko ľudí, lebo na tomto fore je plno šikovných programátorov.
hedyso
Amateur
Amateur
Príspevky: 21
Registrovaný: 08 jún 2005, 21:47

Re: Backtracking v PHP

Príspevok od používateľa hedyso »

takze tu je riesenie v loope avsak chcem to poriesit v rekurzii.

Kód: Vybrať všetko

<?php
$pm  = array("+", "-");
$pmb = array("+", "-", "");
$i=1;
foreach ($pm as $A) {
	foreach ($pmb as $B) {
		foreach ($pmb as $C) {
			foreach ($pmb as $D) {
				foreach ($pmb as $E) {
					foreach ($pmb as $F) {
						foreach ($pmb as $G) {
							foreach ($pmb as $H) {
								foreach ($pmb as $I) {
									//echo $i.": ";
									$val = "{$A}1{$B}2{$C}3{$D}4{$E}5{$F}6{$G}7{$H}8{$I}9";
									eval('$ans = ' . $val . ";");
									if ($ans == 100) {
										echo $val . " = 100<br />\n";
									}else{
										//echo $val . " = $ans<br />\n";
									}
									$i++;
								}
							}					
						}
					}		
				}
			}
		}
	}
}
?>
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Backtracking v PHP

Príspevok od používateľa harrison314 »

Cele zle, co ak tam budes mat tych cisel viac, ako cyklov?
Take ze rozdluj a panuj, nic?
Rad by som poradil co s tym, ale to sa da len zmazat.
hedyso
Amateur
Amateur
Príspevky: 21
Registrovaný: 08 jún 2005, 21:47

Re: Backtracking v PHP

Príspevok od používateľa hedyso »

harrison314 napísal:Cele zle, co ak tam budes mat tych cisel viac, ako cyklov?
Take ze rozdluj a panuj, nic?
Rad by som poradil co s tym, ale to sa da len zmazat.
rozdeluj a panuj mi tu moc nepomoze,
avsak dosahujem uz celkom zaujimave vysledky s rekurzivnou funkciou takze mozno sa mi to podari a skusim to sem pastnut na posudenie :)
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Backtracking v PHP

Príspevok od používateľa harrison314 »

uznavam, nie je to celkom divide at impera, kedze sa rekurziou treba posuvat z lava do prava,
len to nerob natvrdo pre cislo 123456789
teleport
Expert
Expert
Používateľov profilový obrázok
Príspevky: 167
Registrovaný: 01 aug 2012, 16:06
Bydlisko: Bratislava

Re: Backtracking v PHP

Príspevok od používateľa teleport »

hedyso napísal:ak sa mi to nepodari do nedele (13.1.2013) ...
tak ako? mas to hotove?
hedyso
Amateur
Amateur
Príspevky: 21
Registrovaný: 08 jún 2005, 21:47

Re: Backtracking v PHP

Príspevok od používateľa hedyso »

poslal som ti to v sprave pozri ci sa to da spravit aj jednoduhsie spravit
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Backtracking v PHP

Príspevok od používateľa harrison314 »

hedyso napísal:poslal som ti to v sprave pozri ci sa to da spravit aj jednoduhsie spravit
Posli aj mne, som zvedavi.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Backtracking v PHP

Príspevok od používateľa audiotrack »

mne to vyšlo na 13 riadkov, pričom vstupné čísla aj výsledok s ktorým mám overovať sú zadefinované na samostatných riadkoch ako premenné ktoré potom vstupujú ako parameter
hedyso
Amateur
Amateur
Príspevky: 21
Registrovaný: 08 jún 2005, 21:47

Re: Backtracking v PHP

Príspevok od používateľa hedyso »

Ej vsetci to vedia a nik to sem neda, náhodou by ste pomohli ...
Fakt ma mrzi ze to tu takto funguje :( vzdy som si myslel ze programatori si pomahaju

tu je moj finally code

Kód: Vybrať všetko

function result($val){
   eval('$ans = ' . $val . ";");
   if ($ans == 100){
      echo $val . " = 100<br />\n";
   }else{
      //echo $val . " = $ans<br />\n";
   }
}

function greedy($d,$exp,$arr) {
   $x = str_replace(array('+','-'),array('',''),$exp);
   if (strlen($x) > count($arr)-1) {
      result($exp); return false;
   }
   greedy($d+1, $exp.'+'.$arr[$d], $arr);
   greedy($d+1, $exp.'-'.$arr[$d], $arr);
   greedy($d+1, $exp.'' .$arr[$d], $arr);
   return false;
}

$string = "123456789"; 
$arr = str_split($string);
greedy(1,'1',$arr);  
 
Skuste sem dat vase výtvory (teda ak nemate na ten kusok kodu licencne prava)
Ide o klasicky ucebnicový priklad na skolach preto takto mozeme naviest plno programatorov na spravnu cestu (vid ja) chapem zadanie
progamovat viem avsak stacilo mi iba pochopit spravne rekurziu, preto som sa obratil na skusenejsich.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Backtracking v PHP

Príspevok od používateľa audiotrack »

v podstate rovnaká myšlienka, len inak zapísané

Kód: Vybrať všetko

function riesenie($priklad, $zasobnik, $vysledok) {
    if (count($zasobnik) == 0) {                                                //spracoval som celý vstup
        if (eval("return (" . $priklad . ");") == $vysledok)                    //ak sa riešenie príkladu rovná výsledku
            echo $priklad . " = " . $vysledok . " <br />";                      //vypíšem ho
        return;
    }
    riesenie($priklad . '+' . $zasobnik[0], array_slice(($zasobnik), 1), $vysledok);
    riesenie($priklad . '-' . $zasobnik[0], array_slice(($zasobnik), 1), $vysledok);
    riesenie($priklad . $zasobnik[0], array_slice(($zasobnik), 1), $vysledok);
}

$cisla = "123456789";
$vysledok = 100;
riesenie($cisla[0], array_slice(str_split($cisla), 1), $vysledok);
ropman
Medium Professional
Medium Professional
Príspevky: 1250
Registrovaný: 12 apr 2010, 21:07

Re: Backtracking v PHP

Príspevok od používateľa ropman »

ale v ziadnom rieseni nie je pouzity backtracking... neviem sice presne co to je ale obycajny brutoforce to asi nebude... a pamatova naracnost tej rekurzie asi tiez nebude bohvieco
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Backtracking v PHP

Príspevok od používateľa harrison314 »

nazvat tu funkciu greedy mi pride dost vtipne :lol:
ropman napísal:ale v ziadnom rieseni nie je pouzity backtracking... neviem sice presne co to je ale obycajny brutoforce to asi nebude... a pamatova naracnost tej rekurzie asi tiez nebude bohvieco
Je to backtraking, keby nebol brutal forse tak neni uplny (vysvetlujem jeden pojem inym pojmom, dnes mi to nejak nejde ).

//autoeditácia príspevku (15 Jan 2013, 18:02)
Ja som si to riesnie predstvoval cez sekanie rezaca cisel, nie spajania poli.
teleport
Expert
Expert
Používateľov profilový obrázok
Príspevky: 167
Registrovaný: 01 aug 2012, 16:06
Bydlisko: Bratislava

Re: Backtracking v PHP

Príspevok od používateľa teleport »

co poviete na toto?

Kód: Vybrať všetko

$cislo = '123456789';
$vysledok = 100;

function prirad($vstup = '', $pocet = 0){
	global $cislo, $vysledok;
	if ($pocet == strlen($cislo) - 1){
		if (pocitaj($vstup.$cislo[$pocet]) == $vysledok) echo $vstup.$cislo[$pocet].' = '.$vysledok.'<br>';
	} else{
		prirad($vstup.$cislo[$pocet].'+', $pocet+1);
		prirad($vstup.$cislo[$pocet].'-', $pocet+1);
		prirad($vstup.$cislo[$pocet], $pocet+1);
    }
}

function pocitaj($vstup){
	eval('$vypocet = '.$vstup.';');
	return $vypocet;
}

prirad();
Napísať odpoveď