用程式解邏輯推理題之「6個G」

edited 十月 2013 in 原創軟體分享區
昨天找到一道邏輯推理題,試著寫程式來解題,並寫成功了。感覺蠻好玩的(感覺寫得很弱智,大家應該有更好的方法吧),特分享之。有與趣的同學也自己來寫寫看吧。

題目:6個G
在下列乘法算式中,每個字母代表0~9的一個數字,且不同的字母代表不同的數字:
  ABCDE
X     F
-------
 GGGGGG
求出各字母對應之數字。

我寫的解答在樓下。

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=4828

評論

  • edited 一月 2010
    <?php


    $A_NUM = array('0','1','2','3','4','5','6','7','8','9') ;
    $B_NUM = array('0','1','2','3','4','5','6','7','8','9') ;
    $C_NUM = array('0','1','2','3','4','5','6','7','8','9') ;
    $D_NUM = array('0','1','2','3','4','5','6','7','8','9') ;
    $E_NUM = array('0','1','2','3','4','5','6','7','8','9') ;
    $F_NUM = array('0','1','2','3','4','5','6','7','8','9') ;

    foreach($A_NUM as $A)
    {
    foreach($B_NUM as $B)
    {
    foreach($C_NUM as $C)
    {
    foreach($D_NUM as $D)
    {
    foreach($E_NUM as $E)
    {
    foreach($F_NUM as $F)
    {
    $result = ($A.$B.$C.$D.$E)*$F ;
    if($result>=100000)
    {
    $v1 = substr($result,0,1) ;
    $v2 = substr($result,1,1) ;
    $v3 = substr($result,2,1) ;
    $v4 = substr($result,3,1) ;
    $v5 = substr($result,4,1) ;
    $v6 = substr($result,5,1) ;
    if($A!=$B && $A!=$C && $A!=$D && $A!=$E && $A!=$F && $A!=$v1 && $B!=$C && $B!=$D && $B!=$E && $B!=$F && $B!=$v1 && $C!=$D && $C!=$E && $C!=$F && $C!=$v1 && $D!=$E && $D!=$F && $D!=$v1 && $E!=$F && $E!=$v1 && $F!=$v1 && $v1==$v2 && $v1==$v3 && $v1==$v4 && $v1==$v5 && $v1==$v6)
    {
    echo "  ".$A.$B.$C.$D.$E."<br/>" ;
    echo "X     ".$F."<br/>" ;
    echo " ".$v1.$v2.$v3.$v4.$v5.$v6."<br/>";
    break 6 ;
    }
    }
    }
    }
    }
    }
    }
    }


    ?>
  • edited 一月 2010
    玩了一下,還挺有趣的,剛好只有一個答案
    <?php
    $stack = range(0,9);
    $currentStack = $answers = array();
    $counter = 0;
    function runLoop() {
        global $stack, $currentStack, $answers, $counter;
        $loopStack = array_diff($stack, $currentStack);
        foreach($loopStack AS $char) {
            $stackBefore = $currentStack;
            $currentStack[] = $char;
            if(count($currentStack) == 7) {
                $number1 = (int)substr(implode('', $currentStack), 0, 5);
                $number2 = (int)str_repeat($currentStack[6], 6);
                if($number1 * $currentStack[5] == $number2) {
                    $answers[] = $currentStack;
                }
                if(++$counter % 1000 == 0)
                    echo implode('|', $currentStack) . chr(10);
                array_pop($currentStack);
                continue;
            }
            runLoop();
            $currentStack = $stackBefore;
        }
    }
    runLoop();
    print_r($answers);
    

    程式會跑很久,我是在指令模式下執行,為了度過無聊的等待時間,每處理 1000 筆資料就會印一次出來 ;)
  • edited 一月 2010
    挺有趣的 , 我也寫一個
    我是用結果反推
    答案是 111111 , 222222 , ... 999999 , 不可能有 000000 , 這樣太多可能性
    於是 F 也不該為 0 , 我的邏輯就是把 GGGGGG 除 F , 判斷 ABCDEFG 是否重複 , 所以迴圈只有 9X10 = 90 次的檢查 ,答案會是 95238 X 7 = 666666

    <?php
    
    function check_all_diff($n) {
    	
    	$len = strlen($n);
    	if($len != 7) {
    		return false;
    	}
    	for($i=0; $i<$len; $i++) {
    		for($j=0;$j<$len;$j++) {
    			if($n[$j] == $n[$i] && $i!=$j) {
    				return false;
    			}
    		}		
    	}
    	return true;
    }
    
    for($i=1; $i<10 ; $i++) {
    	$answer = $i * 111111;
    	for($j=1; $j<10; $j++) {	
    		if($answer % $j == 0) {		
    			$check = $answer / $j;
    			if( check_all_diff( strval($check) . $j . $i) === true ) {
    				echo "<p>$check X $j = $answer</p>";	
    			}
    		}
    	}
    }
    
    
    
    ?>
    
  • edited 一月 2010
    嘻嘻~摸魚一下..抄樓上的程式碼..
    其實有count_chars 可以用啦 XD
    <?php
    
    for ($i = 1; $i < 10 ; $i++) {
        $answer = $i * 111111;
        for ($j = 1; $j < 10; $j++) {
            if($answer % $j == 0) {
                $check = $answer / $j;
                if (strlen(strval($check)) == 5) { // ABCDE
                    if (strlen(count_chars(strval($check) . $j . $i, 3)) == 7) { // ABCDEFG
                            echo $check." x ". $j ." = ". $answer ."\r\n";
                    }
                }
            }
        }
    }
    ?>
    
  • edited 一月 2010
    我老了
    都忘了有這個函數....
  • edited 一月 2010
    cc 我將這個討論寫到我部落格囉..
    一般解法和PIGO的解法
  • edited 一月 2010
    恩,CONAN跟我的看樣子比較辛苦 :)
Sign In or Register to comment.