আন্ডারহ্যান্ডেড ব্যাংক অ্যাকাউন্ট [বন্ধ]


13

আপনি একটি ব্যাংকের প্রোগ্রামার হিসাবে কাজ করছেন।
আপনার কাজ হ'ল একটি প্রোগ্রাম লিখুন যা এক ব্যাংক অ্যাকাউন্ট থেকে অন্য ব্যাঙ্কে লেনদেন পরিচালনা করে।

প্রোগ্রামটি নিম্নলিখিত করা উচিত:

  • ইনপুটটির জন্য অপেক্ষা করে অসীম লুপে চালান। ইনপুটটিতে
    3 টি সংখ্যা রয়েছে:
    অ্যাকাউন্টনম্বার 1, অ্যাকাউন্টনম্বার 2 এবং এক্স টাকার পরিমাণ।
    যেমন 999222 777333 500
  • অ্যাকাউন্ট নম্বর এবং এক্স বৈধ কিনা তা পরীক্ষা করে দেখুন।
    যদি অ্যাকাউন্ট নম্বরগুলি একই না থাকে এবং আপনার ডাটাবেজে উপস্থিত থাকে এবং যদি x শূন্যের চেয়ে বড় হয় তবে ইনপুটটি বৈধ,
  • অ্যাকাউন্ট 1 থেকে অ্যাকাউন্ট 2 এ অর্থ স্থানান্তর করুন, তবে কেবল যদি অ্যাকাউন্ট 1 এ পর্যাপ্ত টাকা থাকে।
    অ্যাকাউন্টগুলিকে নেতিবাচক অবস্থায় যেতে দেওয়া হয় না।
  • সবকিছু ঠিকঠাক থাকলে "ট্রান্সফারড x x থেকে নম্বর 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)!"


টুইটার : আপনার ব্যাঙ্ক অ্যাকাউন্ট নম্বরটি 123456।
আপনার অ্যাকাউন্টে ঠিক 0.0 have রয়েছে।
আপনি আপনার প্রোগ্রামটি পরিচালনা করে তা পরিবর্তন করতে চান:
প্রোগ্রামটি যা করা উচিত তা ঠিক করা উচিত, তবে আপনার অ্যাকাউন্টে কিছু নিখরচায় অর্থ স্থানান্তর করা উচিত।

আপনি যদিও সাবধান হতে হবে। আপনার সুপারভাইজার আপনার কোডটি দেখবে এবং সন্দেহজনক কিছু দেখলে সে সন্তুষ্ট হবে না। তিনি স্ট্যান্ডার্ড লুপ হোল সম্পর্কে জানেন , তাই চেষ্টাও করবেন না।
এছাড়াও, আপনি নিজের হাতে যে অর্থ দেন তা খুব বেশি হওয়া উচিত নয়। আপনার অর্থ খুব দ্রুত বৃদ্ধি পেলে এটি সন্দেহজনক হবে। লোভী হবেন না।

আপনার কোডটি যতটা সম্ভব সহজ এবং পরিষ্কার হওয়া উচিত, ভারী অবসারণ এড়াতে চেষ্টা করুন।

এটি একটি জনপ্রিয়তা প্রতিযোগিতা, সর্বাধিক উত্তরের সাথে উত্তর জিতল।

দ্রষ্টব্য: দয়া করে আপনার প্রোগ্রামের শেষে প্রতিটি অ্যাকাউন্টের ভারসাম্য আউটপুট করুন, যাতে আপনার পরিশ্রমের মাধ্যমে আপনি কত অর্থ উপার্জন করেছেন তা আমরা দেখতে পারি (কেবল আপনার প্রোগ্রামটি আসলে কিছু করেছে তা দেখানোর জন্য)।

সম্পাদনা: স্পষ্ট করে তোলা
চ্যালেঞ্জটি এমন একটি প্রোগ্রাম লিখতে নয় যা একটি বৃহত ডাটাবেস এবং প্রচুর লেনদেন পরিচালনা করতে পারে। চ্যালেঞ্জটি হ'ল প্রোগ্রামটিকে দেখতে এমনভাবে দেখানো উচিত যা করা উচিত বলে মনে হয় তবে বাস্তবে তা হয় না।

উদাহরণস্বরূপ যদি ইনপুটটি হয় 999222 777333 500:
তারপরে, সম্ভব হলে 500 অ্যাকাউন্টে 777333 যুক্ত করুন এবং অ্যাকাউন্টটি 999222 থেকে 500 টি বিয়োগ করুন those আপনাকে এই অ্যাকাউন্টগুলি থেকে অর্থ "চুরি" করতে হবে না। আপনি নিজের কোডটিতে কোনওভাবে বাড়িয়ে আপনার অ্যাকাউন্টের জন্য অর্থ "উত্পন্ন" করতে পারেন।
আপনার উপর কতটা নির্ভরশীল তবে আপনি ধরে নিতে পারেন আপনি কমপক্ষে 0.1 0.1 এবং সর্বোচ্চ উপার্জন করতে চান। প্রতিটি প্রদত্ত ইনপুট জন্য 10।। আপনার অ্যাকাউন্টে হঠাৎ লক্ষ লক্ষ টাকা থাকলে এটি সন্দেহজনক হবে। আপনার ভাসমান পয়েন্ট অসম্পূর্ণতা নিয়ে চিন্তা করার দরকার নেই, তবে আপনি আপনার অর্থ বাড়াতে এটি ব্যবহার করতে পারেন।

প্রতিটি ব্যবহারকারী সুপারভাইজারের ভূমিকা পালন করে।
কৌতুকটি যদি উত্তরটি স্পট করা শক্ত হয় তবে।


1
নিখরচায় অর্থ বলতে কী বোঝ?
অপ্টিমাইজার

19
আমি মনে করি আপনি প্রতিটি অ্যাকাউন্টে অর্থের পরিমাণ সঞ্চয় করতে ভাসমান-পয়েন্টের ধরণগুলি ব্যবহার করছেন তা যথেষ্ট পরিমাণে আন্ডারডেন্ড করা হয়েছে।
মার্টিন এন্ডার

2
আমি মনে করি এটি অনেক বড় প্রাথমিক ডাটাবেস এবং পরীক্ষার ইনপুটগুলি উত্পাদন করার জন্য উদাহরণস্বরূপ টেস্ট ইনপুট বা একটি প্রোগ্রামের সাহায্যে আরও অনেক ভাল কাজ করবে। আমাদের বসও সনাক্ত করতে সক্ষম কি তাও আমাদের জানতে হবে।
মিলিনন

2
@ মিলিনন আমি বিশ্বাস করি চূড়ান্ত লক্ষ্য হ'ল যে কোনও পদ্ধতিতে অর্থ উপার্জন করা, তবে এমনভাবে করা যাতে কেউ পার্থক্য লক্ষ্য করে না। "আপনাকে এই অ্যাকাউন্টগুলি থেকে অর্থ" চুরি "করতে হবে না You আপনি নিজের অ্যাকাউন্টে কোনও অর্থ কোনও কোড বাড়িয়ে নিজের অর্থের জন্য" উত্পন্ন "করতে পারেন" "
ক্রাইলাইট

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 $

এমনকি কোডটি বাকী দিকে না তাকিয়েও আমি অনুমান করছি এটি একটি শূন্য অভিধান হওয়ায় অডব্ল্যান্ডের সাথে কিছু করার আছে।
জো জেড।

ঠিক আছে আমি বুঝতে পেরেছি. যেহেতু বৈকল্পিক ফাঁকা রয়েছে তবে তবুও ঘোষণা করা হয়েছে, আপনার পরীক্ষার পদ্ধতির চূড়ান্ত লাইনটি কোনও ত্রুটি ছুঁড়ে না - এটি প্রাক-পরীক্ষার মানগুলি এনডিবি-তে পুনরুদ্ধার করার পরিবর্তে চুপচাপ হালকাভাবে আপডেট করে। এ কারণে, সমস্ত পরীক্ষার পরিবর্তনগুলি এনডিবিতে প্রতিশ্রুতিবদ্ধ হয় এবং এর মতো অ্যাকাউন্ট 123456 (যা হ্যাশ হয় jSWlMM) প্রতিবার কোড চালানোর সময় এক ডলার জমা হয়।
জো জেড।

শুক্রবার বিকেলে যে মন্তব্যটি করা হয়েছিল তাতে তার প্রশংসনীয় অস্বীকারযোগ্যতা এসেছে, যেখানে তিনি ফাইনালের odbসুযোগটি মিস করতে পারতেন db। যাইহোক, তিনি সেখানে পিছলে গেলেন 20 অক্টোবর শুক্রবার মোটেও ছিল না - বাস্তবে, এটি সোমবার এবং সপ্তাহটি শুরু হয়েছিল। এই বিষয়টির জন্য, আমি মনে করি এই আরজেও সহকর্মীর পক্ষে প্রথমে কোনও প্রোডাক্ট ডেটাবেজে পরীক্ষা চালানোর জন্য একটি গুরুতর কোড অডিট প্রয়োজন হবে, এমনকি যদি সে ঠিক পরে লিখেছে।
জো জেড।

@ জো জে হা হা, হ্যাঁ, "পরীক্ষার মতোই" অর্থের চারপাশে সরিয়ে নেওয়া রিয়েল কোডের একটি সত্যই খারাপ ধারণা। আমি চেষ্টা করার চেষ্টা করছিলাম একটি করণীয় উপায়ে করতে 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

ট্রেসব্যাক (সর্বশেষতম কলটি শেষ): ফাইল "টেস্ট.পি", লাইন 12, <মডুল> গণনা [-1] + = 1
টাইপ এরর:

1
আমিও সেখানে ত্রুটি পেয়েছি। এটি একটি অভিধানের ক্রম উপর নির্ভর করে যা পাইথনের অপরিবর্তিত আচরণ (যা আমি জানি)
এমিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.