Неправильно спрошенный или действительно ли я глуп?

Существует комментарий сообщения в блоге к codinghorror.com Paul Jungwirth, который включает немного задачи программирования:

У Вас есть числа 123456789 в том порядке. Между каждым числом необходимо вставить или ничего, знака "плюс" или знака умножения, так, чтобы получающееся выражение равнялось 2001. Запишите программу, которая печатает все решения. (Существуют два.)

Скучающий, я думал, я буду делать попытку, но я буду проклят, если я могу получить результат на 2001. Я думаю, что код ниже является звуковым, и я считаю, что существуют нулевые решения тот результат в 2001. Согласно моему коду, на 2002 существует два решения. Я прав или являюсь мной неправильно?

/**
 * Take the numbers 123456789 and form expressions by inserting one of ''
 * (empty string), '+' or '*' between each number.
 * Find (2) solutions such that the expression evaluates to the number 2001
 */

$input = array(1,2,3,4,5,6,7,8,9);

// an array of strings representing 8 digit, base 3 numbers
$ops = array();
$numOps = sizeof($input)-1; // always 8
$mask = str_repeat('0', $numOps); // mask of 8 zeros for padding

// generate the ops array
$limit = pow(3, $numOps) -1;
for ($i = 0; $i <= $limit; $i++) {
    $s = (string) $i;
    $s = base_convert($s, 10, 3);
    $ops[] = substr($mask, 0, $numOps - strlen($s)) . $s;
}

// for each element in the ops array, generate an expression by inserting
// '', '*' or '+' between the numbers in $input.  e.g. element 11111111 will
// result in 1+2+3+4+5+6+7+8+9
$limit = sizeof($ops);
$stringResult = null;
$numericResult = null;
for ($i = 0; $i < $limit; $i++) {
    $l = $numOps;
    $stringResult = '';
    $numericResult = 0;
    for ($j = 0; $j <= $l; $j++) {
        $stringResult .= (string) $input[$j];
        switch (substr($ops[$i], $j, 1)) {
            case '0':
                break;
            case '1':
                $stringResult .= '+';
                break;
            case '2':
                $stringResult .= '*';
                break;
            default :
        }
    }

    // evaluate the expression

    // split the expression into smaller ones to be added together
    $temp = explode('+', $stringResult);
    $additionElems = array();
    foreach ($temp as $subExpressions)
    {
        // split each of those into ones to be multiplied together
        $multplicationElems = explode('*', $subExpressions);
        $working = 1;
        foreach ($multplicationElems as $operand) {
            $working *= $operand;
        }
        $additionElems[] = $working;
    }
    $numericResult = 0;
    foreach($additionElems as $operand)
    {
        $numericResult += $operand;
    }

    if ($numericResult == 2001) {
        echo "{$stringResult}\n";
    }
}

9
задан rekire 2 May 2012 в 18:48
поделиться

2 ответа

Далее на той же странице, на которую вы ссылались .... =)

"Пол Юнгвирт написал:

У вас есть числа 123456789 в этом порядке. Между каждым числом вы {{ 1}} не должно вставлять ничего, знак плюса или знак умножения, чтобы полученное выражение было равно 2001. Напишите программу, которая печатает все решения. (Там - два.)

Думаю, вы имели в виду 2002 год, а не 2001 год. :)

(Просто поправлю для кого-то еще вроде меня, кто навязчиво пытается решить небольшие "практические" проблемы вроде этот , а затем нажмите Google, когда их результат не соответствует заявленному ответу.;) Черт, некоторые из этих примеров Perl уродливы. ) "

12
ответ дан 4 December 2019 в 13:47
поделиться

Число - 2002.

Рекурсивное решение требует одиннадцати строк JavaScript (исключая оценку строкового выражения, которая является стандартной функцией JavaScript, однако, вероятно, потребуется еще десять или около того строк кода, чтобы выполнить собственную проверку для этой конкретной сценарий):

function combine (digit,exp) {                    
     if (digit > 9) {                             
        if (eval(exp) == 2002) alert(exp+'=2002');
        return;                                   
     }                                            
     combine(digit+1,exp+'+'+digit);              
     combine(digit+1,exp+'*'+digit);              
     combine(digit+1,exp+digit);                  
     return;                                      
}                                                 
combine(2,'1');     
3
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: