2012-12-21 4 views
0

Cross + roads = danger ==> 대답은 ==> 96233 + 62513 = 158746암호 해독 문자 값을 찾는 방법은 무엇입니까?

다른 예를 더 쉽게 찾을 수있는 지침을 찾고 있습니다. 선생님 중 한 명이 트리를 사용해서 찾을 수 있다고했습니다. 그러나 때로는 나무를 사용하여 답을 찾는 것이 불가능합니다.

대개 어떻게 암호 해독 솔루션을 찾으십니까?

+0

이 문제를 해결하는 방법이나 문제를 해결하는 프로그램에 대한 설명을 찾으십니까? http://s4.zetaboards.com/science/topic/7693756/1/ – user15741

+0

예, 암호 해독 문제를 해결하기 위해 이러한 문제를 해결하는 방법과 모든 소스 코드에 대한 설명을 찾고 있습니다. 또한이 링크를 읽기 전에 ==> http://s4.zetaboards.com/science/topic/7693756/1/ –

+0

귀하의 질문은 자매 사이트 인 http://mathematica.stackexchange.com/에 더 적합 할 수 있습니다. . –

답변

1

한 가지 간단한 방법 :

vars = Symbol[#] & /@ ("abc" <> ToString[#] & /@ Range[26]) ; 

준 알파벳의 각 문자에 변수 :

alphabet = Transpose[{CharacterRange["a", "z"], vars}]; 

가 도우미 함수를 작성

가 (단지 편의를 위해) 변수를 정의 문자열을 표현식으로 변환 :

formDigits[astring_] := FromDigits[alphabet[[alphabet[[#, 2]] & /@ 
    Position[alphabet[[All, 1]], #][[1, 1]] & /@ Characters[astring], 2]]] 
,451,515,

예 :

formDigits["cross"] 
(* abc19 + 10 (abc19 + 10 (abc15 + 10 (abc18 + 10 abc3))) *) 

을 "크로스 + 도로 = 위험"대응 연립 방정식을 적는다

equation = formDigits["cross"] + formDigits["roads"] == formDigits["danger"] 

마지막 명백한 제약을 추가로 시스템을 푼다

sol = [email protected][{equation, Sequence @@ Thread[Thread[0 <= vars <= 9]], 
    Not[Apply[And, Thread[vars == 0]]]}, alphabet[[All, 2]], Integers] ; 

확인 :

formDigits["cross"] /. sol 
formDigits["roads"] /. sol 
formDigits["danger"] /. sol 
(* 78644 
    86614 
    165258 *) 
+0

예, +1. 하지만 아마도 _Mathematica_ 태그가 실수로 사용되었습니다 –

+0

@ belisarius 모든 변명은 재미있게하는 것이 좋습니다. –

+0

+10 then ... :) –

0

이것은 자연스럽게 Prolog에서 풀립니다. 또한 Faster implementation of verbal arithmetic in Prolog 참조 :

%% unique selection from narrowing domain 
selectM([A|As],S,Z):- select(A,S,S1),selectM(As,S1,Z). 
selectM([],Z,Z). 

%% a puzzle 
cryp([[C,R,O,S,S]+[R,O,A,D,S]=[D,A,N,G,E,R]]):- 
    Dom=[0,1,2,3,4,5,6,7,8,9], 
    selectM([S],Dom,D0), 
    N1 is S+S,   R is N1 mod 10, R=\=0, 
    selectM([R,D],D0,D1),    D=\=0, 
    N2 is (N1//10)+S+D, E is N2 mod 10, 
    selectM([E,O,A,G],D1,D2), 
    N3 is (N2//10)+O+A, G is N3 mod 10, 
    N4 is (N3//10)+R+O, N is N4 mod 10, 
    selectM([N,C],D2,_), C=\=0, 
    N5 is (N4//10)+C+R, A is N5 mod 10, 
    D is N5//10. 

효율성의 핵심은 점진적으로 숫자의 인스턴스화를 선택하는 것입니다, 하나 하나를 최대한 빨리 잘못된 선택을 폐기하는 즉시 테스트. 이것이 Mathematica로 번역 될 수 있다고 확신합니다.