人手不足的银行帐户


13

您正在为银行担任程序员。
您的任务是编写一个程序来处理从一个银行帐户到另一个银行帐户的交易。

该程序应执行以下操作:

  • 在无限循环中运行,等待输入。
    输入由3个数字组成:
    Accountnumber1,Accountnumber2和x金额。
    例如999222 777333 500
  • 检查帐号和x是否有效。
    如果帐号不相同并且存在于数据库中,并且x大于零,则输入有效。
  • 将钱从帐户1转移到帐户2,但前提是帐户1有足够的钱。
    帐户不允许进入负面状态。
  • 如果一切顺利,请打印类似“将x $从number1转移到number2”的内容
  • 如果出现问题(例如,由于帐号无效),请打印错误消息。
  • 如果输入为0,则停止

该数据库包含以下银行帐户:

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

简单的Python 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 $。
您想通过操作程序来改变它:
该程序应该完全按照预期的方式运行,但是还应该将一些免费资金转入您的帐户。

但是您必须要小心。您的主管将查看您的代码,如果他发现任何可疑的内容,他将不满意。他了解标准环孔,所以甚至不要尝试。
另外,您给自己的钱也不应太多。如果您的钱增长太快,那将是可疑的。不要贪心

您的代码应尽可能简单明了,以免造成混乱。

这是一场人气竞赛,投票最多的人获胜。

注意:请在程序结束时输出每个帐户的余额,以便我们可以看到您通过辛勤工作赚了多少钱(只是为了表明您的程序确实做了些事情)。

编辑:澄清
挑战不是编写一个可以处理大型数据库和大量事务的程序。面临的挑战是使程序看起来像只执行应做的事情,而实际上却不行。

例如,如果输入为999222 777333 500
然后,如果可能,将500添加到帐户777333中,然后从帐户999222中减去500。您不必从这些帐户中“窃取”资金。您可以通过在代码中以某种方式增加资金来“产生”您的帐户资金。
多少钱取决于您,但是您可以假设您想赚取至少0.1 $或最高。每个给定输入10 $。如果您的帐户突然有数百万美元,那将是可疑的。您不必担心浮点数不精确,但是您可以使用它来增加您的资金。

每个用户都扮演主管的角色。
如果很难找到答案,请回答。


1
您的自由金钱是什么意思?
Optimizer

19
我认为您使用浮点类型来存储每个帐户中的金额这一事实已经不足为奇了。
Martin Ender 2014年

2
我认为如果使用更大的初始数据库以及一组示例测试输入或生成测试输入的程序,这会更好。我们还需要知道老板能够检测到什么。
millinon 2014年

2
@millinon我相信最终的目标是通过任何一种方法都可以赚钱,但是这样做的方式是没人注意到差异。“您不必从这些帐户中“窃取”资金。您可以通过在代码中以某种方式增加资金来“产生”您的帐户。”
Xrylite 2014年

3
我投票结束这个问题是不合时宜的,因为在这个网站上,不熟练的挑战不再是正题。meta.codegolf.stackexchange.com/a/8326/20469

Answers:


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 $

我什至没有看其余的代码,我猜想它与odb是一个空字典有关。
乔Z.

知道了 由于odb为空但仍声明,因此测试过程的最后一行不会引发错误-它只是默默地更新odb,而不是像应有的那样将预测试值恢复为ndb。因此,所有测试更改都将提交给ndb,因此,jSWlMM每次运行代码时,帐户123456(是的哈希值)都会被记入1美元。
乔Z.

合理的否定性来自周五下午的评论,他可能错过决赛odb机会db。但是,他滑到那里是因为10月20日根本不是星期五-实际上,这是星期一,一周才刚刚开始。为此,我认为这个RJO研究员首先需要进行认真的代码审核,才能在生产数据库上运行测试,即使他后来确实写回了它们也是如此。
Joe Z. 2014年

@Joe Z Haha,是的,在真实代码中“仅仅作为测试”来回转移资金是一个非常糟糕的主意。我试图提出一种可行的方法db[hash('jSWlMM')] += 1。我考虑过命名一个变量jSWlMM,然后以某种方式“意外地”引用它,但这在Python中要比PHP难得多(在$该变量中省略符号会将该变量转换为未定义的常量,然后将其视为字符串文字)。
Remy 2014年

尝试浏览事物很有趣,不过,我会给你。
乔Z.14年

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行,在<module>计数中[-1] + = 1 TypeError:无法连接“ str”和“ int”对象
ErlVolton 2014年

1
我在那里也出现错误。这依赖于字典的顺序,据我所知,字典是Python中未定义的行为。
埃米尔(Emil)2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.