Programozó versenyek

DEIK Regionális Programozó Csapatverseny, egyetemi kategória, 2019. december 8.

2019. december 8. 10:15 – 2019. december 8. 15:15

Sörszámla

A kocsmai számlák már jóval a számítógépek megjelenése előtt a mindennapok részei voltak. Az emberek hajlamosak azt gondolni, hogy miután kiegyenlítettek egy számlát, az már nem több, mint egy idétlen papírdarab, amely nem is érdemel figyelmet. A valóság ezzel szemben az (és ez még az informatikus társadalomnak is elkerüli a figyelmét), hogy a számlán szereplő irkafirka olyan erősen formalizált és gyakran nem triviális szövegeket tartalmaz, amelyek kiválóan felhasználhatók mindenféle formális nyelvi alkalmazásban és elemzésben.

A számlák sorokból, azok pedig karakterekből állnak. Egy sor vagy egy „áras sor”, vagy pedig egy „fésűs sor”. Az áras sor egy pozitív egész számmal (egy étel vagy ital árával) kezdődik, amelyet opcionálisan függőleges vonalak követhetnek. A sor összára az alábbi módon számítható: ha vannak vonalak, akkor a sor összára a sor elején szereplő ár megszorozva a vonalak számával, különben a sor összára egyenlő a sor elején szereplő árral. A fésűs sor kizárólag függőleges vonalakból áll (hasonlóan a fésűs fogakhoz, innen az elnevezés). Minden vonal egy sört jelképez, amelyet a vendég vásárolt. A fésűs sor összára egy sör ára megszorozva a sorban szereplő vonalak számával. Ebben a feladatban egy sör ára 42 egység. A számla végösszege a számlán szereplő sorok árainak az összege.

Az alábbiakban ismertetjük annak az úgynevezett Fésűs számla nyelvnek a formális definícióját, amely tudomásunk szerint az első ilyen nyelv az informatika történetében. Ebben a feladatban a számlák a Fésűs számla nyelven lesznek megadva.

<SZÁMLA>       ::= <SOR> | <SOR><SZÁMLA>
<SOR>          ::= <ÁRAS_SOR><sortörés> | <FÉSŰS_SOR><sortörés>
<ÁRAS_SOR>     ::= <ÁR_SPEC> | <ÁR_SPEC><FÉSŰ>
<FÉSŰS_SOR>    ::= <FÉSŰ>
<ÁR_SPEC>      ::= <KOCSMA_EGÉSZ><vessző><kötőjel>
<FÉSŰ>         ::= <fésűs_fog> | <fésűs_fog><FÉSŰ>
<KOCSMA_EGÉSZ> ::= <jegy_1_9> | <jegy_1_9><JEGY_SOROZAT>
<JEGY_SOROZAT> ::= <jegy_0_9> | <jegy_0_9><JEGY_SOROZAT>
<jegy_1_9>     ::= '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
<jegy_0_9>     ::= '0' | <jegy_1_9>
<fésűs_fog>    ::= '|'          // ASCII 124
<vessző>       ::= ','          // ASCII 44
<kötőjel>      ::= '-'          // ASCII 45
<sortörés>     ::= LF           // ASCII 10, soremelés (line feed)

A fenti specifikációban azok a karakterek, amelyek ténylegesen megjelennek a számlán, aposztrófok között szerepelnek, így különböztetve meg őket a specifikáció többi részétől. A // szimbólum az egysoros megjegyzést vezeti be, nem része a nyelv specifikációjának.

A bemenet specifikációja

A bemenet sorok nem üres sorozata, amelyek egy számlát írnak le. Minden sor vagy egy áras sor, vagy egy fésűs sor. Az áras sor egy 1 000-nél nem nagyobb pozitív egész számmal kezdődik, amelyet közvetlenül követ egy vessző és egy mínuszjel. A mínuszjelet opcionálisan követheti egy vagy több függőleges vonal. A fésűs sor egy vagy több függőleges vonalból áll, semmilyen más szimbólumot nem tartalmaz. A számlán mindenhol a függőleges vonalat a '|' karakter, azaz a 124-es ASCII-kódú karakter reprezentálja. A sorok legfeljebb 1 000 karakterből állnak, és egyik sorban sincs szóköz. A bemenet legfeljebb 1 000 sort tartalmaz, üres sorok nélkül. Minden ár ugyanabban a valutában van kifejezve.

A kimenet specifikációja

A kimenetre egyetlen számot kell kiírni: a számla végösszegét, felkerekítve a következő 10-esre. A számot az <ÁR_SPEC> formátumban kell kiírni, azaz közvetlenül kövesse egy vessző és egy mínuszjel!

1. példa bemenet

  1. ||||
  2. 123,-|||
letöltés szöveges állományként

Az 1. példa bemenethez tartozó kimenet

  1. 540,-
letöltés szöveges állományként

2. példa bemenet

  1. |||
  2. 12,-|
  3. |||
  4. 12,-||
  5. 10,-|
letöltés szöveges állományként

A 2. példa bemenethez tartozó kimenet

  1. 300,-
letöltés szöveges állományként

3. példa bemenet

  1. |
  2. 8,-|
letöltés szöveges állományként

A 3. példa bemenethez tartozó kimenet

  1. 50,-
letöltés szöveges állományként

Eredeti feladat

Czech Technical University Open Contest, 2019

Debreceni Egyetem, Informatikai Kar, v. 2024.09.30.