2010-03-04 11 views
9

C'è un post sul blog il commento di Paul codinghorror.com Jungwirth, che comprende un po 'di lavoro di programmazione:Interrogato male o sono stupido?

Avete i numeri 123456789, in questo ordine. Tra ogni numero, non devi inserire nulla, un segno più o un segno di moltiplicazione, in modo che l'espressione risultante sia uguale a 2001. Scrivi un programma che stampi tutte le soluzioni. (Ce ne sono due.)

annoiato, ho pensato, mi piacerebbe avere un andare, ma che io sia dannato se riesco a ottenere un risultato per il 2001. Credo che il codice qui sotto è sana e mi sa che ci sono zero soluzioni che risultano nel 2001. Secondo il mio codice, ci sono due soluzioni per il 2002. Ho ragione o sbaglio?

/** 
* 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"; 
    } 
} 

risposta

12

Proseguendo lungo la stessa pagina si è collegato al .... =)

"Paul Jungwirth ha scritto:

Avete i numeri 123456789, in questo ordine tra i diversi. , si o un segno di moltiplicazione, quindi , quindi l'espressione risultante è uguale a 2001. Scrivere un programma che stampi tutte le soluzioni. (Ce ne sono due.)

penso che si intende 2002 non 2001. :)

(Solo correggendo per chiunque altro come me che cerca ossessivamente di risolvere i piccoli problemi "pratica" come questo uno, e poi ha colpito Google quando il loro Il risultato non corrisponde alla risposta indicata. ;.) Dannazione, alcuni di questi Perl esempi sono brutto)"

+3

e Jungwirth conferma che intendeva 2002 alcuni commenti giù da quel –

+0

che è impressionante –

+2

palle bene, almeno ho capito alcune pratiche di revisione del codice! – jah

3

Il numero è 2002.

soluzione ricorsiva prende undici righe di JavaScript (esclusi valutazione delle espressioni di stringa, che è una funzione standard di JavaScript, tuttavia sarebbe probabilmente prendere un'altra decina di righe di codice per rotolare il proprio per questo scenario specifico):..!

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');  
Problemi correlati