二进制的可能组合

时间:2017-11-09 11:34:15

标签: php binary

问题陈述如下:

我们称之为“MysteryCode”的一种特殊编码是一种二进制编码系统,其中两个连续值恰好相差一位,即连续实体之间的汉明距离为1.这种编码是通常用于数字通信系统以进行纠错。

LetMysteryCodes(N)表示N比特的MysteryCode列表。

MysteryCodes(1)= 0,1(按顺序排列1-bitcodes列表)

MysteryCodes(2)= 00,01,11,10(按顺序排列的2-bitcodes列表)

MysteryCodes(3)= 000,001,011,010,110,111,101,100(3-bitcodes列表,按此顺序)

存在一种技术,通过该技术可以从(N) - 比特生成(N + 1)个bitcode的列表。

  1. 获取给定订单中的N bitcodes列表并将其命名为“List-N
  2. 反转上面的列表(List-N),并命名新的反映列表:Reflected-List-N
  3. 将原始列表(List-N)的每个成员前缀为0,并将此新列表命名为“A”
  4. 将新列表(Reflected-List-N)的每个成员前缀为1并将此新列表称为“B”
  5. N + 1位的代码列表是列表A和B的串联。
  6. 以上步骤的演示:从2-BitMysteryCodes生成3-bitMysteryCodes列表

    1. 2位代码列表:00,01,11,10

    2. 反向/反映以上列表:10,11,01

    3. 使用0:000,001,011,010前缀旧条目

    4. 前缀反射列表1:110,111,101,100
    5. 连接最后两个步骤中获得的列表:000,001,011,010,110,111,101,100
    6. 你的任务

      你的任务是从神秘码列表中显示N位的最后N个“神秘码”。如果可能,尝试确定以更有效的方式生成此列表的方式,而不是迭代上述所有生成步骤。 更高效或优化的解决方案将获得更高的信誉。

      输入格式

      单个整数N.

      输出格式

      N行,每行有二进制数N位。这些是N比特的MysteryCodes列表中的最后N个元素。

      输入约束1 = N = 65

      示例输入1 1

      示例输出1 1

      样本1的说明 由于N = 1,这是1比特长度的MysteryCodes列表中的(一个)最后一个元素。

      示例输入2 2

      示例输出2 11 10

      样本2的说明由于N = 2,因此这些是2位长度的MysteryCodes列表中的最后两个元素。

      示例输入3 3

      示例输出3 111 101 100

      $listN = 25;
      $bits = array('0','1');
      
      //check if input is valid or not
      if(!is_int($listN))
      {
          echo "Input must be numeric!";
      }
      
      if($listN >= 1 && $listN <=65){
          if($listN == 1){
              echo '1'; exit;
          }
      
          ini_set('memory_limit', -1);
      
          for($i=1; $i<=($listN - 1); $i++){
             $reverseBits = array_reverse($bits);
      
             $prefixBit = preg_filter('/^/', '0', $bits); 
      
             $prefixReverseBits = preg_filter('/^/', '1', $reverseBits);           
      
             $bits = array_merge($prefixBit, $prefixReverseBits);
      
             unset($prefixBit, $prefixReverseBits, $reverseBits);
          }
      
          $finalBits = array_slice($bits, -$listN);
      
          foreach($finalBits as $k=>$v){
              echo $v."\n";
          }
      }
      else{
          echo "Invalid input!";
      }
      

      我已经尝试过上面的解决方案,但是对于大于20的输入没有用。 例如。如果输入是21,我得到“无法分配内存”错误。

      如果有人想出优化的解决方案,那将会很棒......

1 个答案:

答案 0 :(得分:3)

数字遵循我转换为代码的模式。 说给定的数字是N. 然后创建一个N×N矩阵并用1&#39;填充它的第一列 以及所有其他具有0的单元格 从最右边的列开始,直到第二列。

对于任何列X,从最底部的行和填充值开始,如下所示:

  1. 用0&#39;填充2 ^(N - X + 1)/ 2行。
  2. 用1&#39; s填充2 ^(N - X + 1)行,然后用0&#39; s填充。
  3. 重复步骤2直到我们到达最上面的一排。
  4. 通过连接每行中的值来打印N x N矩阵。

    <?php
    
    $listN = 3;
    
    $output = [];
    
    for ($i = 0; $i < $listN; $i++) {
        $output[$i] = [];
        for ($j = 0; $j < $listN; $j++) {
            $output[$i][$j] = 0;
        }
    }
    
    $output[$listN - 1][0] = 1;
    for ($column = 1; $column < $listN; $column++) {
        $zeroFlag = false;
        for ($row = $listN - 1; $row >= 0;) {
            $oneZero = 1;
            if (!$zeroFlag) {
                for ($k = 1; $k <= pow(2, $column) / 2 && $row >= 0; $k++) {
                    $output[$row][$listN - $column] = 0;
                    $row--;
                    $zeroFlag = true;
                }
            }
    
            for ($k = 1; $k <= pow(2, $column) && $row >= 0; $k++) {
                $output[$row][$listN - $column] = $oneZero;
                $row--;
            }
            $oneZero = 0;
    
            for ($k = 1; $k <= pow(2, $column) && $row >= 0; $k++) {
                $output[$row][$listN - $column] = $oneZero;
                $row--;
            }
        }
    }
    
    for ($i = 0; $i < $listN; $i++) {
        $output[$i][0] = 1;
    }
    
    for ($i = 0; $i < $listN; $i++) {
        print(join('', $output[$i]));
        print("\n");
    }