Нашому новому банку потрібна система транзакцій з касиром, але є проблема. На нашому сервері залишилось лише кілька сотень байт місця, тому вам доведеться написати дуже компактний код.
База даних
На щастя, наша база даних дуже проста (її побудував син школяра президента нашого банку), і у нас поки що лише кілька клієнтів.
файл Bank.data
:
Account Firstname Lastname Balance Date
123 Maree Jones 346.22 2014-12-13
035 Thomas Breakbone 3422.02 2015-01-03
422 Henrietta Throsby-Borashenko 277847.74 2014-11-21
501 Timmy Bongo 7.95 2014-11-04
105 William Greene 893.00 2015-01-06
300 Mary Galoway 1228.73 2014-12-28
203 Samantha Richardson 2055.44 2014-11-01
151 Bruce Wayne 956119.66 2014-10-09
166 Chip Stonesmith 266.71 2014-12-15
888 Alexandria Cooper 1299.82 2014-12-30
Специфікація програми
Наш банківський додаток повинен реалізовувати такі команди:
open <firstname> <lastname>
Створює (відкриває) новий рахунок, друкуючи унікальний 3-значний номер рахунку.
withdraw <account> <amount>
Зняти суму з рахунку.
deposit <account> <amount>
Сума депозиту на рахунок.
close <account>
Закрийте обліковий запис, якщо порожній.
report <fieldname>
Роздрукувати звіт бази даних, відсортований за назвою поля. Перемістіть стовпчик імені поля на перше місце. Кожна ширина стовпця буде максимальною з найширших ширини даних та імені поля, розділених одним пробілом. Першим рядком будуть заголовки полів. Баланси повинні бути правильно виправдані провідним $
знаком.
print <account>
Роздрукуйте назви полів та записуйте для цього облікового запису, сформованого як звіт.
Щоразу, коли запис змінюється, Date
поле в записі повинно оновлюватися до поточної дати.
Додаток покаже підказку "#" під час очікування команди. Якщо команда не працює (наприклад, операція на невідомому рахунку або недостатня кількість коштів), програма повинна надрукувати інформаційне повідомлення про помилку "не вдалося". Програма повинна записувати зміни назад у файл після кожної зміни, і читати з файлу кожної команди, оскільки у світі багато програм, які працюють над файлом одночасно (нам не потрібно блокування файлів - це може знизити продуктивність).
EDIT: Рядкові поля - це прості ASCII (az, AZ, -) без пробілу, і сума завжди буде від 0,00 до 1000000000,00 (1 мільярд) доларів з двома знаками після коми, що вказують центи. Дата буде в місцевому часі на кожному відділенні (просте рішення, але пізніше це може призвести до деяких проблем ...).
Вихідні дані
Відповіді потрібно буде продемонструвати, що вони відповідають специфікації. Будь ласка, додайте висновок із вашої програми після обробки наступних команд:
report Balance
open Clark Kent
print 001
deposit 001 4530
withdraw 105 893
close 105
report Date
Переконайтеся, що ви використовуєте оригінал копії Bank.data
файлу, наведеного вище.
Оцінка балів
Це код-гольф, тому ваш рахунок буде рахунком байтів вашого коду. Стандартні лазівки заборонені.
<firstname>
а <lastname>
також в діапазоні та точності <amount>
? (Наприклад, можливі деякі оптимізації, якщо <amount>
завжди є точно два десяткових знаки - або ви хочете, щоб програма використовувалась у відділенні Близького Сходу, де більшість валют використовують три десяткових знаки).
<firstname>
і <lastname>
як тільки використовувати a-zA-Z
, але навіть просте твердження , що вони ніколи не містять символи табуляції дозволяє використовувати TSV. Якщо вони можуть бути будь-якою послідовністю символів ASCII, необхідна якась форма втечі або розмежування, яка відрізняється від однозначного роздільника.