Szorgalmi feladatok

A feladatok megoldásai az admin portálon adhatók be. A szorgalmi feladatokkal egy pontversenyben is részt lehet venni. Alapbeállítás szerint anonim módon jelensz meg a táblázatban. Ha szeretnél névvel megjelenni vagy teljesen eltűnni, az admin portálon beállíthatod.

A verseny állásának megtekintéséhez is be kell jelentkezni.

Mennyi az idő? (115 megoldás)

Az SVG (scalable vector graphics) egy szöveges fájlformátum, amellyel vektorgrafikus rajzok adhatók meg. Ez azt jelenti, hogy a fájlban geometriai formák, körök, egyenesek stb. leírása van. Elterjedten használják weboldalakon (mi is az InfoC-n), mert a böngészőprogramok is meg tudják nyitni.

Egy SVG fájl a következőképpen néz ki:

<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" version="1.1">
  <circle cx="100" cy="50" r="20" stroke="black" fill="yellow" />
  <line x1="100" y1="70" x2="100" y2="90" stroke="black" />
  <circle cx="90" cy="45" r="3" stroke="black" fill="blue" />
  <circle cx="110" cy="45" r="3" stroke="black" fill="blue" />
  <rect x="80" y="80" width="40" height="70" stroke="black" fill="blue" />
  <line x1="90" y1="150" x2="60" y2="190" stroke="black" />
  <line x1="110" y1="150" x2="140" y2="190" stroke="black" />
  <line x1="80" y1="90" x2="40" y2="70" stroke="black" />
  <line x1="120" y1="90" x2="160" y2="70" stroke="black" />
</svg>

Vagyis a kezdő svg és lezáró /svg között különféle formákat lehet megadni:

  • circle = kör cx,cy középponttal, r sugárral és stroke, fill színnel,
  • rect = téglalap, x,y bal felső sarokkal, width,height méretekkel,
  • line = szakasz, x1,y1 ponttól x2,y2 pontig,
  • és még egy csomó egyéb dolgot.

Az SVG-ről itt olvashatsz még: Basic shapes. A fenti fájlból egyébként az alábbi kép lesz.

Példa SVG képe

A feladat egy C program írása, amely három számot vár a szabványos bemenetén, szóközzel elválasztva. Ezek egy időpontot mutatnak: óra, perc és másodperc. A program az ora.svg nevű SVG fájlt hozza létre kimenetként, amelyben minden koordinátát a program maga számolt ki (sin, cos). Az órán legyen meg mindhárom mutató! A mutatók ne mindig pontosan az egész órára és percekre mutassanak! (Ha pl. fél kilenc van, a kismutató a nyolcas és a kilences között van középen. De ilyet a percmutató is csinál.) A számlapról ne hiányozzanak a percenkénti osztások sem, sőt az egész órákhoz tartozó osztások legyenek különbözőek, mint a többi!

A díszes, színes órákat szeretjük (választhatsz saját színeket, vonalvastagságokat stb.), programozóként azonban legfontosabb a specifikáció pontos követése. Figyelj arra, hogy a program kimenete szabályos, szintaktikai hibától (pl. hiányzó idézőjelek) mentes SVG fájlt legyen! Ilyen szempontból is nagyon szigorú a megoldások értékelése. A helyes SVG fájlokat meg tudják nyitni a böngészők is (bár ha ez sikerül, attól még nem biztos, hogy teljesen helyesek). Legyél kritikus a neten talált írásokkal is: az M_PI konstans nincs már benne a C nyelv szabványában!

Fájlkezelésről, fájlok létrehozásáról a honlapon található segédletben olvashatsz.

1 pont a számlap generálás 1 pont a mutatók elhelyezése

Tiltott szavak: system; malloc; transform

Elfogadott megoldások: 115 darab.
Szerezhető: 2 pont. Leadási határidő: 2022-09-18 04:00:00.

BF értelmező (53 megoldás)

A héten nincs ugyan előadás, de szorgalmi van! Jó szórakozást!

++++++++[>++++++++<-]>++.++++. – ez egy Brainfuck (BF) nyelvű program, amelyik kiírja a szabványos kimenetére, hogy „BF”. Ha még nem olvastad volna, akkor nézd meg az algoritmusokról szóló írást és a Brainfuck nyelvről szólót. Ezek kellenek a feladat megértéséhez. Ugyanis a feladat egy BF értelmező írása C-ben: egy olyan programot kell írni, amely le tud futtatni egy BF nyelven írt programot.

Az értelmezőnek mind a nyolc utasítást ismernie kell. A végtelen hosszú szalag helyett 32768 bájtosat kell venni, amely a gép indításakor nullákkal van feltöltve. A cellák egy bájtos, előjeles egész számokat tárolnak. Ezen az olvasó- és írófej bekapcsoláskori pozíciója a nulladik cella. A szalagról egy szabályosan megírt BF programnak nem szabad lelépnie. Ha ilyen pozíciót olvasna vagy írna, akkor a program futását meg kell szakítani. Az értelmezendő programot a C forráskódban kell eltárolni, karaktertömb formájában, amelynek a neve programkod:

char programkod[] = "hello";

A futtatott programnak akkor van vége, amikor az értelmező eléri a programszöveg végét. Az értelmezőnek helyesen kell tudnia kezelni az egymásba ágyazott ciklusokat is.

A BF program kapja meg a C program szabványos bemenetére érkező karaktereket, olyan módon, hogy a fájl vége jelet a szalagra írt −1-es értékre kell lefordítani számára. A C program szabványos kimenete legyen a BF program kimenete. Azon kívül legfeljebb hibaüzenetet írhat ki.

Programozd is a képzeletbeli gépet, amelyet életre keltett az értelmeződ! A C forráskódnak beépítve tartalmaznia kell az alábbi BF programok közül valamelyiket:

  • A keresztnevedet kiíró program.
  • Program, amely beolvassa a teljes bemenetét, utána pedig kiírja azt visszafelé. (Bemenet → tenemeB.)
  • Program, amely beolvas egy szöveget, ésmindentszóköznélkülvisszaírakimenetére.
  • Egyéb, tetszőleges program, ez esetben viszont legyen hozzá magyarázat!

Megjegyzések.

  1. Ha nem fut a Sierpiński-háromszög programja az értelmeződben, akkor biztos nem jól csináltál valamit. Olyan megoldást ne küldj be, amin ez a program nem működik. Ha mégis, akkor csak a határidő után lesz visszautasítva a programod. Itt a kód:
char programkod[]="[ThisprogramprintsSierpinskitriangleon80-columndisplay.]>++++[<++++++++>-]>++++++++[>++++<-]>>++>>>+>>>+<<<<<<<<<<[-[->+<]>[-<+>>>.<<]>>>[[->++++++++[>++++<-]>.<<[->+<]+>[->++++++++++<<+>]>.[-]>]]+<<<[-[->+<]+>[-<+>>>-[->+<]++>[-<->]<<<]<<<<]++++++++++.+++.[-]<]+++++*****Made*By:*NYYRIKKI*2002*****";
  1. Ellenőrizd a fájl vége jel kezelését; ne küldj be olyan megoldást, ahol ez nincs a fentiek szerint elvégezve. Ha kísérletet sem teszel annak a feladatrésznek a megoldására, akkor csak a határidő után lesz visszautasítva a programod. Ha nem tiszta, inkább kérdezz! A getchar függvénnyel lehet jó megoldást csinálni, de mivel az ezzel beküldött megoldások 90%-a hibás szokott lenni, tiltólistán van.

  2. Az Internet tele van BF értelmezőkkel, amelyek forráskódban is elérhetőek. Ezeket ne nézd meg, mert akkor nincs semmi értelme a feladatnak. Megoldásként végképp ne küldj be ilyet! BF nyelvű programokat viszont letölthetsz, és kipróbálhatsz a saját értelmeződdel. Vigyázz, akad pár „nem szabványos”.

  3. Vigyázat! Ne szálljon el a programod, ha a BF program szintaktikai hibás! Például: char programkod[] = "][".

  4. Ne használj globális változókat! A feladat megoldása olyan rövid, hogy ebben globális változóra támaszkodni gyakorlatilag rosszul használt függvényeket jelent. Ne használj rekurziót sem – ellentmondana a feladat mondanivalójának; a rekurzió által olyan, mintha megjelenne egy harmadik szalag, a verem. Ugyanígy, a programon és az adaton kívül további tömbre nincs szükség.

Tiltott szavak: sizeof;malloc;free;calloc;realloc;fopen;fclose;dup2;strlen;szallag;getchar;fgetc;getc

Elfogadott megoldások: 53 darab.
Szerezhető: 2 pont. Leadási határidő: 2022-10-02 04:00:00.