Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> प्रोग्रामिंग

क्रिप्टेरिथमेटिक पहेली हल करना


क्रिप्ट-एरिथमेटिक समस्या में, कुछ अक्षरों का उपयोग अंक असाइन करने के लिए किया जाता है। जैसे दस अलग-अलग अक्षर 0 से 9 तक के अंक मान रखते हैं ताकि अंकगणितीय संक्रियाएं सही ढंग से की जा सकें। दो शब्द दिए गए हैं और एक और शब्द उन दो शब्दों के जोड़ के उत्तर के रूप में दिया गया है।

उदाहरण के लिए, हम कह सकते हैं कि दो शब्द 'BASE' और 'BALL', और परिणाम 'GAMES' है। अब यदि हम BASE और BALL को उनके प्रतीकात्मक अंकों से जोड़ने का प्रयास करते हैं, तो हमें उत्तर GAMES मिलेगा।

नोट - अधिकतम दस अक्षर होने चाहिए, अन्यथा इसे हल नहीं किया जा सकता।

इनपुट और आउटपुट

इनपुट: यह एल्गोरिदम तीन शब्द लेगा। B A S E B A L L ---------- G A M E S आउटपुट: यह दिखाएगा कि कौन सा अक्षर 0-9 से कौन सी संख्या रखता है। इस मामले में यह इस तरह है। क्रिप्टेरिथमेटिक पहेली हल करना B A S E 2 4 6 1 B A L L 2 4 5 5 --------- --------- G A M E S 0 4 9 1 6

एल्गोरिदम

इस समस्या के लिए, हम एक नोड परिभाषित करेंगे, जिसमें एक अक्षर और उसके संबंधित मान होंगे।

isValid(nodeList, count, word1, word2, word3)

इनपुट - नोड्स की एक सूची, नोड सूची में तत्वों की संख्या और तीन शब्द

आउटपुट - True यदि word1 और word2 के मान का योग word3 के मान के समान है

Begin 
  m := 1 
  for each letter i from right to left of word1, do 
    ch := word1[i] 
    for all elements j in the nodeList, do 
      if nodeList[j].letter = ch, then 
        break 
    done 
    val1 := val1 + (m * nodeList[j].value) 
    m := m * 10 
  done 
  m := 1 
  for each letter i from right to left of word2, do 
    ch := word2[i] 
    for all elements j in the nodeList, do 
      if nodeList[j].letter = ch, then 
        break 
    done 
    val2 := val2 + (m * nodeList[j].value) 
    m := m * 10 
  done 
  m := 1 
  for each letter i from right to left of word3, do 
    ch := word3[i] 
    for all elements j in the nodeList, do 
      if nodeList[j].letter = ch, then 
        break 
    done 
    val3 := val3 + (m * nodeList[j].value) 
    m := m * 10 
  done 
  if val3 = (val1 + val2), then 
    return true 
  return false 
End

permutation(nodeList, count, n, word1, word2, word3)

इनपुट - नोड्स की सूची, सूची में आइटम्स की संख्या, असाइन किए गए अक्षरों की संख्या और तीन शब्द

आउटपुट - True जब सभी अक्षरों को योग हल करने के लिए सही ढंग से मान असाइन किए गए हों

Begin 
  if n letters are assigned, then 
    for all digits i from 0 to 9, do 
      if digit i is not used, then 
        nodeList[n].value := i 
        if isValid(nodeList, count, word1, word2, word3) = true 
          for all items j in the nodeList, do 
            show the letter and corresponding values. 
          done 
          return true 
      done 
      return fasle 
  for all digits i from 0 to 9, do 
    if digit i is not used, then 
      nodeList[n].value := i 
      mark as i is used 
      if permutation(nodeList, count, n+1, word1, word2, word3), 
        return true 
      otherwise mark i as not used 
  done 
  return false 
End

उदाहरण

#include  #include using namespace std; vector use(10); //set 1, when one character is assigned previously struct node { char letter; int value; }; int isValid(node* nodeList, const int count, string s1, string s2, string s3) { int val1 = 0, val2 = 0, val3 = 0, m = 1, j, i; for (i = s1.length() - 1; i >= 0; i--) { //find number for first string char ch = s1[i]; for (j = 0; j < count; j++) if (nodeList[j].letter == ch) //when ch is present, break the loop break; val1 += m * nodeList[j].value; m *= 10; } m = 1; for (i = s2.length() - 1; i >= 0; i--) { //find number for second string char ch = s2[i]; for (j = 0; j < count; j++) if (nodeList[j].letter == ch) break; val2 += m * nodeList[j].value; m *= 10; } m = 1; for (i = s3.length() - 1; i >= 0; i--) { //find number for third string char ch = s3[i]; for (j = 0; j < count; j++) if (nodeList[j].letter == ch) break; val3 += m * nodeList[j].value; m *= 10; } if (val3 == (val1 + val2)) //check whether the sum is same as 3rd string or not return 1; return 0; } bool permutation(int count, node* nodeList, int n, string s1, string s2, string s3) { if (n == count - 1) { //when values are assigned for all characters for (int i = 0; i < 10; i++) { if (use[i] == 0) { // for those numbers, which are not used nodeList[n].value = i; //assign value i if (isValid(nodeList, count, s1, s2, s3) == 1) { //check validation cout << "Solution found: "; for (int j = 0; j < count; j++) //print code, which are assigned cout << " " << nodeList[j].letter << " = " << nodeList[j].value; return true; } } } return false; } for (int i = 0; i < 10; i++) { if (use[i] == 0) { // for those numbers, which are not used nodeList[n].value = i; //assign value i and mark as not available for future use use[i] = 1; if (permutation(count, nodeList, n + 1, s1, s2, s3)) //go for next characters return true; use[i] = 0; //when backtracks, make available again } } return false; } bool solvePuzzle(string s1, string s2,string s3) { int uniqueChar = 0; //Number of unique characters int len1 = s1.length(); int len2 = s2.length(); int len3 = s3.length(); vector freq(26); //There are 26 different characters for (int i = 0; i < len1; i++) ++freq[s1[i] - 'A']; for (int i = 0; i < len2; i++) ++freq[s2[i] - 'A']; for (int i = 0; i < len3; i++) ++freq[s3[i] - 'A']; for (int i = 0; i < 26; i++) if (freq[i] > 0) //whose frequency is > 0, they are present uniqueChar++; if (uniqueChar > 10) { //as there are 10 digits in decimal system cout << "Invalid strings"; return 0; } node nodeList[uniqueChar]; for (int i = 0, j = 0; i < 26; i++) { //assign all characters found in three strings if (freq[i] > 0) { nodeList[j].letter = char(i + 'A'); j++; } } return permutation(uniqueChar, nodeList, 0, s1, s2, s3); } int main() { string s1 = "BASE"; string s2 = "BALL"; string s3 = "GAMES"; if (solvePuzzle(s1, s2, s3) == false) cout << "No solution"; }

आउटपुट

Solution found: A = 4 B = 2 E = 1 G = 0 L = 5 M = 9 S = 6
  1. Ruby में N-क्वीन्स चुनौती में महारत: चरण-दर-चरण समाधान Ruby में N-क्वीन्स चुनौती में महारत: चरण-दर-चरण समाधान

    N-क्वीन्स एक दिलचस्प कोडिंग चुनौती है जहां आपको N * N बोर्ड पर N क्वीन्स रखनी होती हैं। यह ऐसा दिखता है: एक क्वीन्स सभी दिशाओं में चल सकती है: वर्टिकल हॉरिजॉन्टल डायगोनल समाधान (कई हो सकते हैं) को बोर्ड पर सभी क्वीन्स रखनी चाहिए और हर क्वीन्स हर दूसरी क्वीन्स की पहुंच से बाहर होनी चाहिए। इस लेख म

  1. पहेली-आधारित शिक्षण के साथ बैश कौशल में महारत हासिल करें पहेली-आधारित शिक्षण के साथ बैश कौशल में महारत हासिल करें

    कंप्यूटर मेरा शौक और मेरा पेशा दोनों हैं। मेरे अपार्टमेंट में लगभग 10 कंप्यूटर बिखरे हुए हैं, सभी लिनक्स चल रहे हैं (मेरे मैक सहित)। चूंकि मुझे अपने कंप्यूटर और कंप्यूटर कौशल को अपग्रेड करने में मजा आता है, जब मुझे सिल्वेन लेरॉक्स की Bash it out मिली, तो मैंने इसे खरीदने का मौका नहीं छोड़ा। मैं डेबि

  1. एक्सेल इक्वेशन सॉल्वर मास्टर करें: 5 व्यावहारिक उदाहरण एक्सेल इक्वेशन सॉल्वर मास्टर करें: 5 व्यावहारिक उदाहरण

    एक्सेल में कई फीचर हैं जो विभिन्न कार्य कर सकते हैं। विभिन्न सांख्यिकीय और वित्तीय विश्लेषण करने के अलावा, हम एक्सेल में समीकरण हल कर सकते हैं। इस लेख में, हम उचित उदाहरणों के साथ एक्सेल में समीकरण हल करने के विभिन्न तरीकों का विश्लेषण करेंगे। एक्सेल में समीकरण कैसे हल करें एक्सेल में समीकरण हल करन