Avagy megvan az "if-nélkül" pattogó labda két kisbajnokságának győztese. Itt volt maga a kiírás: progpater.blog.hu/2011/02/11/elsore_neo_is_az_aszfalt_ala_esett_avagy_emlekek_az_elso_basic_programokrol
A 3 beérkezettből a két utóbbit néztem: működtek. Az első (Joe89) a while(w){ helyett while(1){-el könnyen végteleníthető. Nem így a második (fulibacsi), mert ott gond lehet, ha az állandóan növekedő x, y kifut a tartományából: azaz megszűnik pattogni a laszti, jól látszik ez, ha például a tartomány végének közeléről indítjuk:
#include <limits.h>
...
long int x = LONG_MAX-100, y = LONG_MAX-100;
100-at jól lép, de aztán kékhalál :) Joe89 megoldását is megnézzük közelebbről: -Wall-al fordítva jönnek belőle üzenetek, amiket érdemes javítani. A x, y számokat ellenőriztem, azok jól változnak 1-79 és 1-22 között. Amig "fulibacsi" megoldása inkább a majd általam használt technikára hasonlít (maradékos osztás), addig "Joe89" eredeti módon azt mondja, hogy pl. az x koordináta tekintetében az elején és a végén fordít, hogy milyen előjellel adja hozzá az 1 növekményt. Jól hajlítja a kanalat! Szerintem nyugodtan adhatjuk Neki a 2 kisbajnokságot.
BN megoldása
Szerényen: tökéletes.
#include <stdio.h> #include <stdlib.h> #include <curses.h> #include <unistd.h> int main (void) { int xj = 0, xk = 0, yj = 0, yk = 0; int mx = 80 * 2, my = 24 * 2; WINDOW *ablak; ablak = initscr (); noecho (); cbreak (); nodelay (ablak, true); for (;;) { xj = (xj - 1) % mx; xk = (xk + 1) % mx; yj = (yj - 1) % my; yk = (yk + 1) % my; clear (); mvprintw (0, 0, "--------------------------------------------------------------------------------"); mvprintw (24, 0, "--------------------------------------------------------------------------------"); mvprintw (abs ((yj + (my - yk)) / 2), abs ((xj + (mx - xk)) / 2), "X"); refresh (); usleep (150000); } return 0; }
Annyi az ötlet, hogy megfigyeltem: annak a helynek a koordinátája, ahová ki kellene rajzolni a pattogó lasztit, ilyen formájú, mindjuk az oszlop tekintetében:
0, 1, 2, 3, ... , oszlop_max-2, oszlop_max-1, oszlop_max-2, ... 3, 2, 1, 0, 1, 2 3 és így tovább, ráadásul a két koordináta egymástól függetlenül így változik "ész nélkül". Tehát két olyan számsort kell legyártani folyamatosan, ami 0 és egy max között szépen hullámzik fel-le. A százalékos osztás jó is erre, csak az fűrészfogban változik, szépen növekszik, aztán nullára zuhan. Ezért kell két ilyen hullám és azokat összemosni:
#include <stdio.h> #include <stdlib.h> int main (void) { int xj = 0, xk = 0, yj = 0, yk = 0; int mx = 80 * 2, my = 24 * 2; for (;;) { xj = (xj - 1) % mx; xk = (xk + 1) % mx; yj = (yj - 1) % my; yk = (yk + 1) % my; printf ("%d %d\n", abs ((yj + (my - yk)) / 2), abs ((xj + (mx - xk)) / 2)); } return 0; }