2013-02-27 22 views
5

कहो आप तहखाने-गणित पहेली दिया जाता है के साथ एक क्रिप्ट-अंकगणित पहेली को सुलझाने:रिलेशनल डेटाबेस

भेजें + MORE = पैसे

लक्ष्य पत्र के लिए संख्याओं (0-9) से प्रतिस्थापित करने का है , ताकि अतिरिक्त काम बाहर हो।

मैं समझता हूं कि समस्या को गणितीय रूप से कैसे पहुंचाया जाए, लेकिन मुझे यकीन नहीं है कि इसे रिलेशनल डेटाबेस के साथ कैसे हल किया जाए।

इस समस्या से निपटने के लिए एक स्कीमा कैसे डिज़ाइन किया जाएगा?

एक SQL क्वेरी कैसे देखेंगे जो इस समस्या को हल करने का प्रयास करेगी?

संपादित करें: कुछ बाधाओं के होते हैं:

  1. एक ही नंबर, किसी दिए गए पत्र के लिए इस्तेमाल किया जाना चाहिए भर। उदाहरण के लिए, यदि आपको अक्षर ई के लिए "5" लगता है, तो ई को सभी स्थानों पर मान "5" प्राप्त करना चाहिए।
  2. अलग पत्र अलग नंबरों मिलना चाहिए, जैसे, आप असाइन नहीं कर सकते "4" एम
  3. दोनों ई करने के लिए और करने के लिए संख्या (शब्द) की
  4. कोई भी किसी भी प्रमुख शून्य
+0

क्या शब्दों की लंबाई के लिए अधिकतम सीमा है? –

+0

एक समय में हल करने के लिए केवल एक पहेली होगी ताकि विशेष रूप से उस प्रयास के लिए तालिकाओं को बनाया/संशोधित किया जा सके। पहेली सभी स्वरूप लंबाई (4) + लंबाई (4) = लंबाई (5) – wilco

+1

आपका पहला संपादन असंभव है, 10 से अधिक विभिन्न पत्र हैं। प्रत्येक का अपना अंक –

उत्तर

4

लेखक बना हुआ हो सकता है दो अलग-अलग समस्याएं

यह समस्या है कि उत्पन्न किया जाता है, से अधिक + प्रवाह = स्टैक जहां प्रत्येक चरित्र जरूरी एक अनूठा अंकों और 10 से अधिक वर्ण नहीं है शामिल हो सकता है

  • वहाँ एक शर्त प्रत्येक चरित्र वह यह है कि उत्तर देता है एक अद्वितीय अंक प्राप्त करें, लेकिन + फ्लो + स्टैक के लिए यह असंभव है क्योंकि बहुत सारे अक्षर हैं।

कुछ इस तरह काम कर सकते हैं जहां Digits तालिका एक स्तंभ है, जहां earch रिकॉर्ड (यदि आप चाहें 9 के माध्यम से या 0) 1 से 9 के बीच एक पूर्णांक शामिल हैं।

क्रॉस जॉइन बहुत बुरा, प्रदर्शन-वार हैं, लेकिन यह एक प्रारंभिक बिंदु हो सकता है।

select 
    top 5 
    O.num as O, 
    V.num as V, 
    E.num as E, 
    R.num as R, 
    F.num as F, 
    L.num as L, 
    W.num as W, 
    S.num as S, 
    T.num as T, 
    A.num as A, 
    C.num as C, 
    K.num as K, 
    (O.num * 1000 + V.num * 100 + E.num * 10 + R.num) as [OVER], 
    (F.num * 1000 + L.num * 100 + O.num * 10 + W.num) as FLOW, 
    (O.num * 1000 + V.num * 100 + E.num * 10 + R.num) + (F.num * 1000 + L.num * 100 + O.num * 10 + W.num) as OVER_plus_FLOW, 
    (S.num * 10000 + T.num * 1000 + A.num * 100 + C.num * 10 + K.num) as STACK 
from 
    Digits as O 
    cross join digits as V 
    cross join digits as E 
    cross join digits as R 
    cross join digits as F 
    cross join digits as L 
    cross join digits as W 
    cross join digits as S 
    cross join digits as T 
    cross join digits as A 
    cross join digits as C 
    cross join digits as K 
where 
    (O.num * 1000 + V.num * 100 + E.num * 10 + R.num) 
    + (F.num * 1000 + L.num * 100 + O.num * 10 + W.num) 
    = (S.num * 10000 + T.num * 1000 + A.num * 100 + C.num * 10 + K.num) 

समस्या की मेरी समझ के आधार पर, कई समाधान हैं। यहाँ पहले 5 है कि इस कोड मिला:

enter image description here

मैं 0 से हटाया क्योंकि आप शून्य के साथ प्रत्येक अक्षर की जगह और एक सस्ते जवाब (अपने प्रारंभिक सवाल संशोधन पर आधारित) मिल सकता है।

यह केवल तालिका Digits

enter image description here

6

इस उपयोगकर्ता से उत्पन्न अन्य समस्या का जवाब देता है।

भेजें + अधिक = पैसा जहां प्रत्येक चरित्र का एक अद्वितीय अंक होता है और कोई शब्द शून्य से शुरू नहीं होता है।

select 
    top 1 
    S.num as S, 
    E.num as E, 
    N.num as N, 
    D.num as D, 
    M.num as M, 
    O.num as O, 
    R.num as R, 
    Y.num as Y, 
    (S.num * 1000 + E.num * 100 + N.num * 10 + D.num) as [SEND], 
    (M.num * 1000 + O.num * 100 + R.num * 10 + E.num) as MORE, 
    (S.num * 1000 + E.num * 100 + N.num * 10 + D.num) + (M.num * 1000 + O.num * 100 + R.num * 10 + E.num) as SEND_plus_MORE, 
    (M.num * 10000 + O.num * 1000 + N.num * 100 + E.num * 10 + Y.num) as [MONEY] 

from 
    Digits as S 
    join digits as E on E.num <> S.num 
    join digits as N on N.num <> S.num and N.num <> E.num 
    join digits as D on D.num <> S.num and D.num <> E.num and D.num <> N.num 
    join digits as M on M.num <> S.num and M.num <> E.num and M.num <> N.num and M.num <> D.num 
    join digits as O on O.num <> S.num and O.num <> E.num and O.num <> N.num and O.num <> D.num and O.num <> M.num 
    join digits as R on R.num <> S.num and R.num <> E.num and R.num <> N.num and R.num <> D.num and R.num <> M.num and R.num <> O.num 
    join digits as Y on Y.num <> S.num and Y.num <> E.num and Y.num <> N.num and Y.num <> D.num and Y.num <> M.num and Y.num <> O.num and Y.num <> R.num 

where 
    (S.num * 1000 + E.num * 100 + N.num * 10 + D.num) 
    + (M.num * 1000 + O.num * 100 + R.num * 10 + E.num) 
    = (M.num * 10000 + O.num * 1000 + N.num * 100 + E.num * 10 + Y.num)  
    and S.num <> 0 and M.num <> 0 

मैं कहां खंड अद्वितीय अंक को लागू करने में कुछ के बारे में सोचा है, लेकिन मेरा मानना ​​है कि इस संसाधन समाप्त होता है कहां खंड चेक किया गया है से पहले भी कई क्रमपरिवर्तन।

चूंकि हम केवल 10 अंकों तक काम कर रहे हैं, मुझे लगता है कि गति की चिंताओं के बजाय लंबे समय तक चलने के लिए सबसे अच्छा है।

यहां पर पागल ऑन क्लॉज के बिना + WHERE क्लॉज है। यह मेरे सर्वर पर एक बहुत धीमी गति से चलाता है।

from 
    Digits as S 
    cross join digits as E 
    cross join digits as N 
    cross join digits as D 
    cross join digits as M 
    cross join digits as O 
    cross join digits as R 
    cross join digits as Y 

where 
    (S.num * 1000 + E.num * 100 + N.num * 10 + D.num) 
    + (M.num * 1000 + O.num * 100 + R.num * 10 + E.num) 
    = (M.num * 10000 + O.num * 1000 + N.num * 100 + E.num * 10 + Y.num)  
    and S.num <> 0 and M.num <> 0 

     and (select max(B.Count) from 
       (select COUNT(*) as Count from 
        (select S.num, 's' as letter -- the letters are included to make sure the unions do not merge equivalent rows 
        UNION select E.num, 'e' 
        UNION select N.num, 'n' 
        UNION select D.num, 'd' 
        UNION select M.num, 'm' 
        UNION select O.num, 'o' 
        UNION select R.num, 'r' 
        UNION select Y.num, 'y') as A 
        group by A.num 
       ) as B 
      ) = 1 
संबंधित मुद्दे