7

私はこの真理値表ジェネレータサイトに出くわし、PHPでそれを模倣しようとしました(ソースコードが利用可能であることに気づきましたが、0 perlを知っています)。

ここでの私の質問は、式の評価ではなく、変数のTとFのすべての組み合わせが表示されるようにテーブルを出力する方法です。

たとえば、3つの変数がある場合、テーブルは次のようになります。

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

と4つの変数で。

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

それを作成するためのロジック/パターンは何ですか?

4

7 に答える 7

4

この再帰関数はどうですか?$count各「行」に要素がある2次元配列を返します。これを使用してテーブルを生成できます。

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));

編集コードパッド、配列をテーブルに変換する関数が追加されています。

于 2012-02-15T11:29:58.857 に答える
3
$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; {
    if ($iBit > 0) {
      echo " | ";
    }
    echo (($i & pow(2, $iBit)) != 0 ? 'Y' : 'N');
  }
  echo "\n";
}
于 2012-02-15T11:18:07.500 に答える
1

そのための小さな関数を作成しました:

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);
于 2012-02-15T11:27:50.370 に答える
1

次のようなことができます。

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>";

少しやり過ぎかもしれませんが、うまくいきます...

于 2012-02-15T11:01:32.903 に答える
1

このコードを試してください。generate($numberOfVariables) は、真理値表を含む配列を返します。各要素は反復可能な文字列です

<?
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>
于 2012-02-15T11:35:13.870 に答える
1

最初に組み合わせの数を計算する必要があります。たとえば、4 つの変数がある場合、16 の組み合わせがあります。すべての変数がそのインデックスを取り、それを i と呼びます。その変数の列には、(n / (2^i)) 回の T グループと F グループの切り替えがあります。ここで、n は変数の可能な値の合計の組み合わせです。

   <?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>");
 ?>
于 2012-02-15T11:04:56.820 に答える
1

このアプローチは醜いかもしれませんが、普遍的なようです:)

$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;
        }
}

出力は次のとおりです

F   F   F   
F   F   T   
F   T   F   
F   T   T   
T   F   F   
T   F   T   
T   T   F   
T   T   T
于 2012-02-15T11:43:53.280 に答える