अंडरहैंड बैंक खाता [बंद]


13

आप एक बैंक के लिए एक प्रोग्रामर के रूप में काम कर रहे हैं।
आपका कार्य एक प्रोग्राम लिखना है जो एक बैंक खाते से दूसरे में लेनदेन को संभालता है।

कार्यक्रम को निम्नलिखित करना चाहिए:

  • इनपुट के इंतजार में एक अनंत लूप में दौड़ें।
    इनपुट में 3 नंबर होते हैं:
    Accountnumber1, Accountnumber2 और x की राशि।
    जैसे 999222 777333 500
  • जांचें कि क्या खाता संख्या और x मान्य हैं।
    इनपुट मान्य है यदि खाता संख्याएँ समान नहीं हैं और आपके डेटाबेस में मौजूद हैं और यदि x शून्य से अधिक है, तो
  • पैसे को अकाउंट 1 से अकाउंट 2 में ट्रांसफर करें, लेकिन केवल तभी अकाउंट 1 में पर्याप्त पैसा हो।
    खातों को नकारात्मक में जाने की अनुमति नहीं है।
  • अगर सब कुछ ठीक हो जाता है तो "नंबर 1 से नंबर 2 पर स्थानांतरित एक्स $" जैसे कुछ प्रिंट करें
  • यदि कुछ गलत हो जाता है, उदाहरण के लिए क्योंकि खाता नंबर अमान्य हैं, तो एक त्रुटि संदेश प्रिंट करें।
  • यदि इनपुट 0 है तो रुकें

डेटाबेस में निम्नलिखित बैंक खाते शामिल हैं:

  • 999222: 10000.56$
  • 888333: 335.13$
  • 555222: 56.0$
  • 222111: 123.55$
  • 123456: 0.0$

सरल अजगर 2 उदाहरण:

account_numbers = ["999222", "888333", "555222", "222111", "123456"]
account_money   = [10000.56,   335.13,     56.0,   123.55,      0.0]


while True:
    #input in the form of: 999222 777333 500
    input = raw_input()

    if input == "0": break

    number1, number2, x = input.split()

    x = float(x)
    if x <= 0:
        print "Invalid request!"
        continue

    if number1 in account_numbers and number2 in account_numbers and number1 != number2:
        index1 = account_numbers.index(number1)
        index2 = account_numbers.index(number2)

        if account_money[index1] >= x:
            account_money[index1] -= x
            account_money[index2] += x
            print "Transferred %.2f$ from %s to %s" % (x, number1, number2)
        else:
            print "Not enough money in account %s!" % (number1)

    else:
        print "Invalid account number(s)!"

TWIST:
आपका बैंक खाता संख्या 123456 है
। आपके खाते में बिलकुल 0.0 $ है।
आप अपने कार्यक्रम में हेरफेर करके इसे बदलना चाहते हैं:
कार्यक्रम को वही करना चाहिए जो वह करने वाला है, लेकिन अपने खाते में कुछ मुफ्त पैसे भी स्थानांतरित करना चाहिए।

आपको हालांकि सावधान रहना होगा। आपका पर्यवेक्षक आपके कोड को देखेगा और यदि वह कुछ भी संदिग्ध देखता है तो वह प्रसन्न नहीं होगा। वह स्टैंडर्ड लूप होल्स के बारे में जानता है , इसलिए कोशिश भी नहीं करता।
इसके अलावा, आपके द्वारा दिया गया पैसा बहुत अधिक नहीं होना चाहिए। अगर आपका पैसा बहुत तेज़ी से बढ़ता है तो यह संदेहास्पद होगा। लालची मत बनो।

आपका कोड यथासंभव सरल और स्पष्ट होना चाहिए, भारी आक्षेप से बचने का प्रयास करें।

यह एक लोकप्रियता की प्रतियोगिता है, सबसे उत्थान के साथ उत्तर जीतता है।

नोट: कृपया अपने कार्यक्रम के अंत में प्रत्येक खाते के शेष राशि का उत्पादन करें, ताकि हम यह देख सकें कि आपने अपनी मेहनत से कितना पैसा कमाया (केवल यह दिखाने के लिए कि आपके कार्यक्रम ने वास्तव में कुछ किया है)।

EDIT: स्पष्ट करने के
लिए चुनौती एक ऐसे प्रोग्राम को लिखना नहीं है जो एक बड़े डेटाबेस और बहुत सारे लेनदेन को संभाल सके। चुनौती यह है कि कार्यक्रम को वैसा ही बनाया जाए जैसा वह करना चाहता है, लेकिन वास्तव में ऐसा नहीं है।

उदाहरण के लिए यदि इनपुट है 999222 777333 500:
तो जोड़ें, यदि संभव हो तो, खाते में 777333 पर 500 और खाते से 500 को 999222 तक घटाएं। आपको उन खातों से पैसे "चोरी" करने की आवश्यकता नहीं है। आप अपने खाते के पैसे को अपने कोड में किसी तरह बढ़ाकर "उत्पन्न" कर सकते हैं।
आप पर कितना निर्भर है, लेकिन आप यह मान सकते हैं कि आप कम से कम 0.1 $ और अधिकतम अर्जित करना चाहते हैं। प्रत्येक दिए गए इनपुट के लिए 10 $। यह संदिग्ध होगा यदि आप अचानक आपके खाते में लाखों होंगे। आपको फ़्लोटिंग पॉइंट इंप्रेशन के बारे में चिंता करने की ज़रूरत नहीं है, लेकिन आप इसका उपयोग अपने पैसे को बढ़ाने के लिए कर सकते हैं।

प्रत्येक उपयोगकर्ता पर्यवेक्षक की भूमिका निभाता है।
अगर चाल जवाब देने के लिए मुश्किल है।


1
मुफ्त पैसे से आपका क्या मतलब है?
अनुकूलक

19
मुझे लगता है कि आप प्रत्येक खाते में धन की मात्रा को संग्रहीत करने के लिए फ्लोटिंग-पॉइंट प्रकारों का उपयोग कर रहे हैं।
मार्टिन एंडर

2
मुझे लगता है कि यह बहुत बड़े प्रारंभिक डेटाबेस के साथ बहुत बेहतर काम करेगा और या तो उदाहरण परीक्षण इनपुट का एक सेट या परीक्षण इनपुट उत्पन्न करने के लिए एक कार्यक्रम होगा। हमें यह भी जानना होगा कि बॉस का पता लगाने में क्या सक्षम है।
मिलिनन

2
@millinon मेरा मानना ​​है कि अंतिम लक्ष्य किसी भी विधि के माध्यम से पैसा प्राप्त करना है, लेकिन इस तरह से ऐसा करना कि कोई भी अंतर को नोटिस न करे। "आपको उन खातों से धन" चोरी "करने की आवश्यकता नहीं है। आप अपने कोड में किसी भी तरह से इसे बढ़ाकर अपने खाते के लिए धन" उत्पन्न "कर सकते हैं।"
Xrylite

3
मैं इस प्रश्न को ऑफ़-टॉपिक के रूप में बंद करने के लिए मतदान कर रहा हूँ क्योंकि इस साइट पर अंडरहैंड चुनौतियाँ अब ऑन-टॉपिक नहीं हैं। meta.codegolf.stackexchange.com/a/8326/20469
बिल्ली

जवाबों:


3

मैंने यहां वास्तविक दुनिया की बड़ी प्रणालियों की विशेषताओं का अनुकरण करने की कोशिश की है। मैं अलग-अलग ऑपरेशन को संभालने के लिए एनकैप्सुलेशन और एब्स्ट्रेक्शन का उपयोग करता हूं, जैसे अकाउंट बैलेंस हासिल करना और पैसे ट्रांसफर करना। कोड में उन कार्यों के लिए एक मूल परीक्षण सूट भी है। हालांकि, एक प्रोग्रामर ने प्रत्येक इनपुट के साथ अपने खाते में $ 1 जोड़ने के लिए परियोजना आवश्यकताओं में हाल के बदलावों का लाभ उठाया है। यहां तक ​​कि प्रशंसनीय विकृतीकरण भी है।

# {account number: balance in USD}
ndb = {
    999222: 10000.56,
    888333: 335.13,
    555222: 56.0,
    222111: 123.55,
    123456: 0.0
}

# {hashed account ID: balance in USD}
# (hash the IDs because integer-based hash tables are fast, and a
# bunch of strcmp's would be slow)
# 2014-10-20: phased out alphabetic account IDs for numeric ones
# keeping the old data here because Murphy's Law guarantees we'll
# need it right after it's deleted. -- RJO
odb = {
#   hash('mEYjxG'): 42.0,
#   hash('lDCIqp'): 1337.0,
#   hash('QDxkwD'): 123456.0,
#   hash('jSWlMM'): 0.0,
#   hash('siYWKC'): 20.14
}

def balance(a, db):
    try:
        return db[hash(a)]
    except:
        raise ValueError('no such account:', a)

def credit(a, n, db):
    if n <= 0:
        raise ValueError('invalid amount: ' + str(n))
    try:
        db[hash(a)] += n
    except:
        raise ValueError('no such account:', a)

# 2012-10-20: parameterizing the database ops to handle both
# old and new databases is a pain in the neck. -- RJO

def debit(a, n, db):
    if n <= 0:
        raise ValueError('invalid amount: ' + str(n))
    if balance(a, db) < n:
        raise ValueError('insufficient funds: below ' + str(n))
    try:
        db[hash(a)] -= n
    except:
        raise ValueError('no such account', a)

def transfer(a, b, n, db):
    if a == b:
        raise ValueError('same account', a)
    debit(a, n, db)
    credit(b, n, db)

# 2014-10-20: tests need to be updated with new account IDs, but
# it's Friday afternoon. -- RJO
def test(db):
    # back up database prior to changes
    bdb = db.copy()
    # test database functions
    try:
        # test 'balance'
        account = 'does not exist'
        try:
            bal = balance(account, db)
            assert(db[hash(account)] == bal)
        except ValueError:
            assert(hash(account) not in db)
        # test 'credit'
        account = 'jSWlMM'
        start = balance(account, db)
        delta = 1
        credit(account, delta, db)
        assert(balance(account, db) == start + delta)
        # test 'debit'
        account = 'lDCIqp'
        start = balance(account, db)
        delta = 1337
        try:
            debit(account, delta, db)
            assert(balance(account, db) == start - delta)
        except ValueError:
            assert(balance(account, db) < delta)
        # test 'transfer'
        account1 = 'mEYjxG'
        account2 = 'siYWKC'
        start1 = balance(account1, db)
        start2 = balance(account2, db)
        delta = 123
        try:
            transfer(account1, account2, delta, db)
            assert(balance(account1, db) == start - delta)
            assert(balance(account2, db) == start + delta)
        except ValueError:
            assert(balance(account1, db) < delta)
    except Exception as ex:
        # log errors
        print ex.message
    finally:
        # roll back all changes
        odb.update(bdb)

# interactive transfers
while True:
    # test everything
    test(ndb)
    # get input
    print 'Transfer $N from A to B:'
    line = raw_input('Enter "A B N" or 0: ')
    # check for exit
    if line == '0':
        print 'Exit'
        # print account balances
        for a in ndb:
            print 'Account', a, 'has', balance(a, ndb), '$'
        break
    # parse input
    try:
        a, b, n = line.split()
        a = int(a)
        b = int(b)
        n = float(n)
    except:
        print 'Bad input!'
        continue
    # make transfer
    try:
        transfer(a, b, n, ndb)
        print 'Transferred', n, '$ from account', a, 'to', b
    except ValueError as e:
        print e

और यहाँ एक नमूना रन:

Transfer $N from A to B:
Enter "A B N" or 0: 999222 222111 500
Transferred 500.0 $ from account 999222 to 222111

Transfer $N from A to B:
Enter "A B N" or 0: 555222 888333 12
Transferred 12.0 $ from account 555222 to 888333

Transfer $N from A to B:
Enter "A B N" or 0: 222111 555222 14
Transferred 14.0 $ from account 222111 to 555222

Transfer $N from A to B:
Enter "A B N" or 0: 0
Exit
Account 555222 has 58.0 $
Account 123456 has 4.0 $
Account 888333 has 347.13 $
Account 999222 has 9500.56 $
Account 222111 has 609.55 $

बाकी कोड को देखे बिना भी मैं यह अनुमान लगा रहा हूं कि ओडब के खाली शब्द होने से इसका कुछ लेना-देना है।
जो जेड।

ठीक है मैं समझ गया। चूंकि ओडब खाली है, लेकिन फिर भी घोषित किया गया है, आपके परीक्षण प्रक्रिया में अंतिम पंक्ति एक त्रुटि नहीं फेंकती है - यह सिर्फ पूर्व-परीक्षण मानों को पुनर्स्थापित करने के बजाय ओडब को अपडेट करता है जैसे कि इसे एनडीबी को करना चाहिए। इस वजह से, सभी परीक्षण परिवर्तन ndb के लिए प्रतिबद्ध हो जाते हैं, और इस तरह, खाता 123456 (जो कि हैश है jSWlMM) को हर बार एक डॉलर का श्रेय जाता है जब कोड चलाया जाता है।
जो जेड।

और शुक्रवार की दोपहर टिप्पणी से प्रशंसनीय इनकार आता है जिसमें वह इसे चूकने के लिए अंतिम चूक सकता odbथा db। हालाँकि, वह वहां फिसल गया कि 20 अक्टूबर शुक्रवार नहीं था - वास्तव में, यह सोमवार था और सप्ताह अभी शुरू हुआ था। उस मामले के लिए, मुझे लगता है कि इस आरजेओ साथी को पहली बार किसी प्रोडक्शन डेटाबेस पर परीक्षण चलाने के लिए एक गंभीर कोड ऑडिट की आवश्यकता होगी, भले ही उसने उन्हें ठीक से लिखा हो।
जो जेड।

@Joe Z Haha, हाँ, "सिर्फ एक परीक्षण के रूप में" के आसपास पैसा बढ़ाना वास्तविक कोड में एक बहुत बुरा विचार है। मैं करने के लिए एक सुखद तरीका के साथ आने की कोशिश कर रहा था db[hash('jSWlMM')] += 1। मैंने एक चर jSWlMMऔर "दुर्घटनावश" नामकरण को किसी भी तरह से उद्धृत करने पर विचार किया , लेकिन यह पीएचपी की तुलना में पायथन में करना बहुत कठिन है (जहां छोड़े जाने से $चर को अपरिभाषित स्थिर में बदल जाता है, जिसे बाद में एक स्ट्रिंग शाब्दिक माना जाता है)।
रेमी

यह मजेदार था चीजों के माध्यम से देखने की कोशिश कर रहा था, हालांकि, मैं आपको वह दूंगा।
जो जेड।

1

इस बारे में क्या ?

account_numbers = ["999222", "888333", "555222", "222111", "123456"]
account_money   = [10000.56,   335.13,     56.0,   123.55,      0.0]

counting=locals()[locals().keys()[2]]

while True:
    #input in the form of: 999222 777333 500
    input = raw_input()

    if input == "0": break

    counting[-1]+=1
    number1, number2, x = input.split()

    x = float(x)
    if x <= 0:
        print "Invalid request!"
        continue

    if number1 in account_numbers and number2 in account_numbers and number1 != number2:
        index1 = account_numbers.index(number1)
        index2 = account_numbers.index(number2)

        if account_money[index1] >= x:
            account_money[index1] -= x
            account_money[index2] += x
            print "Transferred %.2f$ from %s to %s" % (x, number1, number2)
        else:
            print "Not enough money in account %s!" % (number1)

    else:
        print "Invalid account number(s)!"


for i in range(len(account_numbers)):
    print "Money in account '%s' is %s" % (account_numbers[i], account_money[i])

परीक्षा:

999222 222111 500
Transferred 500.00$ from 999222 to 222111
555222 888333 12
Transferred 12.00$ from 555222 to 888333
222111 555222 14
Transferred 14.00$ from 222111 to 555222
0
Money in account '999222' is 9500.56
Money in account '888333' is 347.13
Money in account '555222' is 58.0
Money in account '222111' is 609.55
Money in account '123456' is 3.0

ट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "test.py", पंक्ति 12, में <मॉड्यूल> गिनती [-1] + = 1 टाइप करें: 'str' और 'int' ऑब्जेक्ट्स को नहीं
मिटा सकते

1
मुझे वहाँ भी त्रुटि मिलती है। यह एक शब्दकोश के आदेश पर निर्भर करता है, जो कि (जहां तक ​​मुझे पता है) पायथन में अपरिभाषित व्यवहार है।
एमिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.