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.

Sakktábla (283 megoldás)

Adott az alábbi, sakktáblát kirajzoló program:

#include <stdio.h>

int main() {
    printf("XX..XX..XX..XX..\n");
    printf("XX..XX..XX..XX..\n");
    printf("..XX..XX..XX..XX\n");
    printf("..XX..XX..XX..XX\n");
    printf("XX..XX..XX..XX..\n");
    printf("XX..XX..XX..XX..\n");
    printf("..XX..XX..XX..XX\n");
    printf("..XX..XX..XX..XX\n");
    printf("XX..XX..XX..XX..\n");
    printf("XX..XX..XX..XX..\n");
    printf("..XX..XX..XX..XX\n");
    printf("..XX..XX..XX..XX\n");
    printf("XX..XX..XX..XX..\n");
    printf("XX..XX..XX..XX..\n");
    printf("..XX..XX..XX..XX\n");
    printf("..XX..XX..XX..XX\n");
    return 0;
}

Végezz el ezen két módosítást!

  • Szüntesd meg a sormintát! Ahol látsz bármilyen ismétlést, azt mind tüntesd el a programból!
  • Jelenleg minden mező 2 egység széles: két darab X és . van vízszintesen és függőlegesen is. Oldd meg, hogy a felhasználó adhassa meg ezt a számot, vagyis hogy beállítható legyen a sakktábla mérete!

Elfogadott megoldások: 283 darab.
Szerezhető: 1 pont. Leadási határidő: 2019-09-17 04:00:00.

Kismutató, nagymutató (199 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ámított 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 is). Legyél kritikus a neten talált írásokkal is: az M_PI konstans nincs 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.

Tiltott szavak: system; malloc; transform

Elfogadott megoldások: 199 darab.
Szerezhető: 1 pont. Leadási határidő: 2019-09-24 04:00:00.

BF értelmező (20 megoldás)

++++++++[>++++++++<-]>++.++++. – 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"; /* 5+1=6 elemű karaktertömb */

A C a sztringeket karaktertömbként kezeli, azok nagyon kényelmesen használhatóak erre a célra. Azt is ki lehet használni, hogy C-ben ezek végjeles sorozatok, nulla zárja le őket. Vagyis a fenti példában programkod[0] == 'h' és programkod[5] == 0. 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 −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. 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”.

  2. 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 az a program nem működik. Itt a kód:

char programkod[]="[ThisprogramprintsSierpinskitriangleon80-columndisplay.]>++++[<++++++++>-]>++++++++[>++++<-]>>++>>>+>>>+<<<<<<<<<<[-[->+<]>[-<+>>>.<<]>>>[[->++++++++[>++++<-]>.<<[->+<]+>[->++++++++++<<+>]>.[-]>]]+<<<[-[->+<]+>[-<+>>>-[->+<]++>[-<->]<<<]<<<<]++++++++++.+++.[-]<]+++++*****Made*By:*NYYRIKKI*2002*****";
  1. Ez a feladat nehéznek tűnik ELSŐRE, de a megoldás egyszerű, 30-40 sor. Egyedül a bezáró (vagy nyitó) zárójelpár megkeresésének algoritmusa nem triviális. Ötlet: Ha keressük egy [ bezáró párját, akkor addig kell menni, amíg meg nem találjuk az első ] karaktert. De ha közben újabb [ karakterrel találkozunk, akkor már a második ]-t keressük. Tehát kell egy változó, amelyik azt tárolja, hányadik ]-t keressük (vagy amikor ugrunk egy ciklus elejére, hányadik [-t).

  2. Vigyázat! Ne szálljon el a programod akkor sem, ha a BF program szintaktikai hibás! char programkod[] = "][".

  3. Ne használj globális változókat, legfeljebb a két szalaghoz! 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 (ha már tanultál róla régebben esetleg). Az ellentmond a feladat mondanivalójának; a rekurzió által olyan, mintha egy megjelenne egy harmadik szalag, a verem.

  4. 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.

Jó szórakozást!

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

Elfogadott megoldások: 20 darab.
Szerezhető: 1 pont. Leadási határidő: 2019-10-01 04:00:00.