2012-02-15 11 views
6

Przebiegłem to truth table generator site i próbowałem naśladować to w PHP (zdaję sobie sprawę, że kod źródłowy jest dostępny, ale znam 0 perli).Wypuszczanie tabeli prawdy w PHP

Teraz moje pytanie jest nie o ocenę ekspresji, ale jak do wyjścia stołu tak, że każda kombinacja T i F dla zmiennych jest pokazany

Na przykład, z 3 zmiennych, tabela będzie wyglądać takie jak:

i 4 zmiennych ..

a | b | c | d 
------------- 
T | T | T | T 
T | T | T | F 
T | T | F | T 
T | T | F | F 
T | F | T | T 
T | F | T | F 
T | F | F | T 
T | F | F | F 
F | T | T | T 
F | T | T | F 
F | T | F | T 
F | T | F | F 
F | F | T | T 
F | F | T | F 
F | F | F | T 
F | F | F | F 

Co jest logika/wzorzec do Cr zjadać to?

+0

You może po prostu użyć zagnieżdżonych dla pętli, po jednej dla każdej zmiennej? Ale te "tablice prawdy" naprawdę nic nie znaczą; to tylko lista wszystkich możliwych kombinacji T's i F's? –

+0

Tak. Uzyskanie połączenia jest tym, co mnie poturbowało. – sqram

Odpowiedz

4

Jak o tej funkcji rekurencyjnej? Zwraca dwuwymiarową tablicę, gdzie każdy "wiersz" ma elementy $count. Możesz użyć tego do wygenerowania tabeli.

function getTruthValues($count) { 
    if (1 === $count) { 
     // true and false for the first variable 
     return array(array('T'), array('F')); 
    } 

    // get 2 copies of the output for 1 less variable 
    $trues = $falses = getTruthValues(--$count); 
    for ($i = 0, $total = count($trues); $i < $total; $i++) { 
     // the true copy gets a T added to each row 
     array_unshift($trues[$i], 'T'); 
     // and the false copy gets an F 
     array_unshift($falses[$i], 'F'); 
    } 

    // combine the T and F copies to give this variable's output 
    return array_merge($trues, $falses); 
} 

function toTable(array $rows) { 
    $return = "<table>\n"; 
    $headers = range('A', chr(64 + count($rows[0]))); 
    $return .= '<tr><th>' . implode('</th><th>', $headers) . "</th></tr>\n"; 

    foreach ($rows as $row) { 
     $return .= '<tr><td>' . implode('</td><td>', $row) . "</td></tr>\n"; 
    } 

    return $return . '</table>'; 
} 

echo toTable(getTruthValues(3)); 

EDIT: Codepad z dodatkiem funkcji konwersji tablicę do tabeli.

+1

Bardziej rozsądna kolejność jest tworzona przy użyciu metody array_unshift zamiast array_push: http: //codepad.org/lMlWJfRl – cmbuckley

+0

Witam. Spędziłem ostatnie kilka godzin (około 7) badając ten kod, ponieważ zawsze zmagałem się z funkcjami rekursywnymi. Chociaż teraz rozumiem logikę i proces, w jaki sposób działa kod, moje pytanie brzmi, w twojej głowie, jaki jest twój wzór, który chciałeś, aby kod podążał za nim? (przepraszam, jeśli pytanie nie jest zbyt jasne) – sqram

+1

Zauważyłem, że zaczyna się od T i F dla jednej zmiennej, a następnie druga zmienna pobierałaby 2 kopie pierwszego wyjścia, jedna by połączyć z wartością T i jedną z jego wartość F. Trwa to dla każdej zmiennej. To nie jest strasznie wydajne, ale działa dobrze. Dodam kilka komentarzy do kodu. – cmbuckley

1

można zrobić coś takiego:

echo "<table>"; 
for($a=0; $a<=1; $a++){ 
    for($b=0; $b<=1; $b++){ 
     for($c=0; $c<=1; $c++){ 
      for($d=0; $d<=1; $d++){ 
       echo "<tr><td>$a</td><td>$b</td><td>$c</td><td>$d</td></tr>"; 
      } 
     } 
    } 
} 
echo "</table>"; 

może trochę przesada, ale działa ...

1

Najpierw należy obliczyć liczbę kombinacji, na przykład, jeśli masz 4 zmiennych następnie będziesz miał 16 kombinacji. Dla każdej zmiennej weź jej indeks, nazwij go i. W kolumnie tej zmiennej będziesz miał (n/(2^i)) czasy przełączania grup T i F, gdzie n jest całkowitą kombinacją możliwych wartości zmiennych.

<?php 
     $numberOfVariables = 5; 
     $totalCombinations = pow(2, $numberOfVariables); 

     for ($i = 0; $i < $numberOfVariables; $i++) 
     { 
      $subGroupCount = $totalCombinations/pow(2, $i); 
      $lettersPerGroup = $totalCombinations/$subGroupCount; 

      $toggler = true; 
      for($j=0; $j<$subGroupCount; $j++) 
      { 
       for($k=0; $k < $lettersPerGroup; $k++) 
        $array[$i][$j*$lettersPerGroup + $k] = ($toggler ? "T" : "F"); 
       $toggler = !$toggler; 
      } 
     } 

     echo("<table border='1' bgcolor='yellow'>"); 
     for ($k=0;$k<$totalCombinations;$k++) 
     { 
      echo("<tr>"); 
      for ($j=$numberOfVariables-1;$j>=0;$j--) 
        echo("<td>".$array[$j][$k]."</td>"); 
      echo("</tr>"); 
     } 
     echo("</table>"); 
?> 
+0

Mogę przekonwertować to do PHP. Ale próbuję zrozumieć twoje wyjaśnienie ... jest to dobre, ale nie w pełni go rozumiem. Trzymaj się – sqram

+1

Teraz myślę, że działa tak, jak chciałeś. Możesz to sprawdzić? Mam nadzieję, że to pomoże. – Juvanis

+0

Niezupełnie. Ale blisko i dobre podejście! – sqram

2
$nbBooleans = 5; // change to whatever you want 

// show header 

for($i = 0; $i < $nbBooleans ; $i++) 
{ 
    if ($i > 0) 
    echo " | "; 
    echo chr($i + 65); // 1 => A, 2 => B etc. 
} 

// separator line (dynamic size) 

echo "\n".str_repeat("-", ($nbBooleans - 1) * 3 + $nbBooleans)."\n"; 

// show combinations 

$nbInterations = pow(2, $nbBooleans); 

for($i = 0; $i < $nbInterations; $i++) 
{ 
    for ($iBit = 0; $iBit < $nbBooleans; $iBit++) 
    { 
    if ($iBit > 0) 
     echo " | "; 
    echo (($i & pow(2, $iBit)) != 0 ? 'Y' : 'N'); 
    } 
    echo "\n"; 
} 
+0

Pracowałem też nad czymś takim, jako alternatywą dla mojej brzydkiej odpowiedzi :) +1 –

+1

9 kombinacji z 3 vars i dwiema możliwymi wartościami dla każdego var ??: -/ –

+0

usunięcie ostatniego komentarza ... przeliczyłem się. teraz to widzę. dzięki! – sqram

1

Wykonane trochę funkcję, że:

function printTruth($vars) { 
$rows = array(); 
$max = pow(2, $vars); 

// Lines and Letters 
$arr = array(); 
for($i=97;$i<(97+$vars);$i++) { $arr[] = chr($i); } 

$rows[] = implode(' | ', $arr); 
$rows[] = str_repeat('-', $vars*3); 

// Variables 
for($i=0;$i<$max;$i++) { 
    $oneRow = ''; 
    for ($j=0;$j<$vars;$j++) { 
    if($j>0) 
      $oneRow .= " | "; 
    $oneRow .= (($i & pow(2,$j)) != 0 ? 'T' : 'F'); 
    } 
    $rows[] = strrev($oneRow); 
} 

return implode("<br>", $rows); 
} 

echo printTruth(3); 
+0

Narfs, wydaje się, że powinienem uderzyć w F5 przed wysłaniem. Było trochę za wolno :) Przynajmniej masz teraz funkcję do tego. –

+0

Im więcej, tym lepiej. Chociaż nie próbuję jedynie kopiować i wklejać, staram się również uzyskać głębokie zrozumienie logiki/koncepcji, a im więcej kodu, tym lepiej :) – sqram

1

Spróbuj tego kodu. generate ($ numberOfVariables) zwraca tablicę z tabelą prawdy. Każdy element jest ciągiem znaków, które można iterować

<? 
function generate($var=3){ 
$number= pow(2,$var)-1; 

$array=array(); 
while($number>=0){ 
$str=decbin($number); 

$number--; 

while(strlen($str)<$var) 
{ 

$str="0".$str; 
} 
array_push($array,$str); 
} 

return $array; 
}?> 
<pre> 
<?print_r(array_reverse(generate(3))); 
?> 
</pre> 
+0

ten jest interesujący – sqram

1

takie podejście może być brzydki, ale to wydaje się być uniwersalny :)

$length = 3; 


for($i=0;$i<pow(2,$length);$i++){ 
     $bin = decbin($i); 
     _add($bin, $length); 
     _out($bin, $length); 
} 


function _out($str, $length){ 
     for ($i=0; $i<$length; $i++) 
       echo ($str[$i] == 0 ? 'F' : 'T')."\t"; 

     echo "\n"; 
} 

function _add(&$bin, $length){ 
     $add = ''; 
     if (strlen($bin) < $length){ 
       for($j=0;$j<($length - strlen($bin));$j++){ 
         $add.='0'; 
       } 
       $bin = $add.$bin; 
     } 
} 

wyjście jest następująco

F F F 
F F T 
F T F 
F T T 
T F F 
T F T 
T T F 
T T T 
Powiązane problemy