OldComp.cz https://oldcomp.cz/ |
|
Programovací cvičení, porovnání jazyků https://oldcomp.cz/viewtopic.php?f=113&t=7752 |
Stránka 1 z 1 |
Autor: | lukz [ 14.10.2019, 16:10 ] |
Předmět příspěvku: | Programovací cvičení, porovnání jazyků |
Na 8bitech lidé dřív často programovali v BASICU, ostatně na 16bitech pak asi taky. Přitom ale dialekt jazyka se na různých počítačích lišil, a kolikrát i na jedné platformě bylo víc různých dialektů. A člověk, který zná jeden počítač, nemusí vůbec vědět, jaké možnosti nabízí programování na jiném systému. Napadlo mě tedy, pokud o to bude zájem, udělat takovou výstavku řešení stejného problému na různých platformách - jazycích. Mohlo by to proběhnout tak, že si zadáme jednotnou úlohu, nebo dvě, a každý kdo zná nějaký systém a chce se zapojit, napíše jméno počítače, na kterém program odzkoušel (emulátory se povolují také), název jazyka (pokud jich je na platformě víc, tak aby čtenář věděl pro který je daný program napsaný) a text programu. Jazyk může být i jiný než BASIC, platforma by neměla být moderní PC ať už na x86 nebo na ARMu (tam je pak jazyků ohromné množství), s PC bychom mohli skončit u i8086, u ostatních platforem bez omezení. Také by to mělo být něco, co je možné přeložit nebo interpretovat na daném stroji, ne cross-compilation z PC. Ještě přidejme možnost, že pogram může být vložen buď jako text, nebo screenshot obrazovky stroje (nebo dvou obrazovek, když je dlouhý). |
Autor: | Panda38 [ 14.10.2019, 17:48 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
Nabízím program LINES, který jsem kdysi (1987) psal na SHARP MZ-800, jazyk BASIC MZ1Z-016. Program vytváří pohyblivé čárové obrazce a jeho funkce je celkem jednoduchá: Vykreslí se čára mezi krajními body (120 a 130) a souřadnice se posunou o inkrement (170). Když některá souřadnice přesáhne okraj, odrazí se náhodnou rychlostí opačným směrem (200-230) - tj. vygeneruje se náhodný inkrement s opačným znaménkem (90). Barva čáry se mění po náhodném počtu kroků (110, 270). Souřadnice se ukládají do pole (240) a nejstarší čára se přemaže (150, 160) (černou barvou, nebo jako tady ANDováním původní barvy). (proč se souřadnice inkrementují 2x, tak to fakt už netuším, asi amatérismus ) Příloha: lines.png [ 5.98 KiB | Zobrazeno 9587 krát ] Příloha: screen.png [ 7.04 KiB | Zobrazeno 9586 krát ] |
Autor: | Busy [ 14.10.2019, 18:11 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
Panda38 píše: Nabízím program LINES... A odo mna nieco podobne: https://busy.speccy.cz/tvorba/superlin.htm (releasnute 14.06.1994) |
Autor: | Panda38 [ 14.10.2019, 18:23 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
Busy píše: Kde se tam řeší práce s barvou, určení barevného atributu čáře? Ptám se protože jsem do ATmega8 implementoval Spectrovský videorežim a přemýšlím jak bych tam takový program realizoval (=jak rozhodovat o barvách barevného atributu).
|
Autor: | Busy [ 14.10.2019, 19:54 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
Panda38 píše: Busy píše: https://busy.speccy.cz/tvorba/superlin.htm Kde se tam řeší práce s barvou, určení barevného atributu čáře?(releasnute 14.06.1994) https://busy.speccy.cz/download/sil1kbas.rar Kód: 1 LET z=NOT PI: LET j=SGN PI: POKE VAL "23693",VAL "7": INVERSE z: OVER j: BORDER NOT PI: CLS : PRINT #z;" SIL 1k in ZX basic by BUSY": RESTORE : LET r=VAL "10": LET p=CODE "2": LET c=p: LET d=j+j: LET t=INT PI: LET s=d+d: LET k=PEEK PI: LET l=PEEK SGN PI: DIM s(c,s): DIM m(c): DIM b(s): DIM d(s): DIM h(s): FOR u=j TO s: READ b(u),d(u),h(u): NEXT u: LET m=z: LET a=j: LET b=s: LET n=z: LET v=z Nejake vysvetlivky:2 FOR i=j TO c: IF m THEN INK s+s: GO SUB VAL "9": INK b 3 LET n=n+j: IF n>r THEN LET n=z: LET b=VAL "(a<7)*(7-a)+(a>6)*(a-5)": INK b: LET a=a+j: IF a>t*s THEN LET a=j: LET v=v+j: IF v>t THEN LET v=z 4 FOR u=j TO s 5 LET b(u)=b(u)+d(u): IF b(u)<z OR b(u)>h(u) THEN LET d(u)=-d(u): GO TO d+t 6 LET s(i,u)=b(u): NEXT u: LET m(i)=v: GO SUB VAL "9": NEXT i: IF NOT m THEN LET m=j 7 GO TO d 8 LET y=l-y: LET f=-f: RETURN 9 LET w=m(i): LET x=s(i,j): LET y=s(i,d): LET e=s(i,t)-x: LET f=s(i,s)-y: IF w=j THEN GO TO VAL "13" 10 IF w=d THEN GO SUB VAL "15": GO SUB s+s: GO TO VAL "15" 11 IF w=t THEN GO SUB VAL "15": GO SUB s+s: GO TO VAL "14" 12 GO SUB VAL "13": GO SUB s+s 13 GO SUB VAL "15" 14 LET x=k-x: LET e=-e 15 PLOT x,y: DRAW e,f: RETURN 16 DATA p,t,k,r,s,l,r,t,k,p,d,l POKE 23693,7 ... nastavi cierny podklad a biele pismo (ciary) NOT PI ... usporne zapisana hodnota 0 SGN PI ... usporne zapisana hodnota 1 PEEK PI ... usporne zapisana hodnota 255 (vodorovne rozlisenie obrazovky) PEEK SGN PI ... usporne zapisana hodnota 175 (zvisle rozlisenie obrazovky) Relacne operatory vracaju false ako ciselnu hodnotu 0 a true ako 1 |
Autor: | faraon [ 14.10.2019, 22:35 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
Já bych porovnání jazyků viděl maličko jinak. Na počátku byl vývojový diagram... Jako první podle něj vznikl program pro ZX81: Kód: 9 REM ------------ 10 REM HRA ZX81 NIM 11 REM ------------ 20 GOSUB 1000 30 GOSUB 5000 40 GOSUB 3000 50 PRINT ,,,,"HRU HRAJE CLOVEK PROTI POCITACI,STRIDAVE ODEBIRAJI ZAPALKY PODLESTANOVENEHO MAXIMA. TEN, NA KOHOZUSTANE POSLEDNI, PROHRAVA.",,,,,"STISKNI NEJAKOU KLAVESU..." 60 LET R=RND 70 IF INKEY$="" THEN GOTO 70 80 RANDOMIZE 99 REM ------------- 100 REM HLAVNI CYKLUS 101 REM ------------- 110 GOSUB 5000 120 IF O=0 THEN GOTO 400 199 REM ------------- 200 REM HRAJE POCITAC 201 REM ------------- 210 GOSUB 3000 220 IF P>1 THEN GOTO 270 230 PRINT "VITEZI CLOVEK." 240 LET V=V+1 250 GOSUB 4000 260 GOTO 200 270 LET O=(P-1)-(M+1)*INT ((P-1)/(M+1)) 280 IF O=0 THEN LET O=INT (RND*M)+1 290 IF O>(P-1) THEN GOTO 280 300 PRINT "POCITAC BERE ";O;"." 310 LET P=P-O 399 REM ------------ 400 REM HRAJE CLOVEK 401 REM ------------ 410 GOSUB 3000 420 IF P>1 THEN GOTO 460 430 PRINT "VITEZI POCITAC." 440 GOSUB 4000 450 GOTO 400 460 PRINT "MUZES VZIT 1 AZ ";M;", KOLIK BERES?" 470 INPUT O 480 LET O=INT O 490 IF O<1 OR O>M OR O>=P THEN GOTO 470 500 LET P=P-O 510 GOTO 100 999 REM ---------------------- 1000 REM POCATECNI INICIALIZACE 1001 REM ---------------------- 1010 LET H=0 1020 LET V=0 1030 LET O=0 1999 REM ---------------- 2000 REM GENERATOR NAHODY 2001 REM ---------------- 2010 LET P=2*INT (RND*6)+17 2020 LET M=INT (RND*4)+2 2030 LET H=H+1 2040 RETURN 2999 REM ------------------ 3000 REM NAKRESLENI ZAPALEK 3001 REM ------------------ 3010 PRINT 3020 FOR R=1 TO 4 3030 FOR S=1 TO P 3040 PRINT CHR$ 133; 3050 NEXT S 3060 PRINT 3070 NEXT R 3080 LET Q=(P-10*INT (P/10))*(P<10 OR P>20) 3090 LET K$="EK" 3100 IF Q>1 AND Q<5 THEN LET K$="KY" 3110 IF Q=1 THEN LET K$="KA" 3120 PRINT ,,"NA STOLE LEZI ";P;" ZAPAL";K$;"," 3130 RETURN 3999 REM ----------------- 4000 REM VOLBA POKRACOVANI 4001 REM ----------------- 4010 PRINT ,,"HER:",H 4020 PRINT "VYHER:",V 4030 PRINT ,,"CHCES HRAT ZNOVU? (A/N)" 4040 IF INKEY$="A" THEN GOTO 4070 4050 IF INKEY$="N" THEN NEW 4060 GOTO 4040 4070 GOSUB 5000 4080 GOTO 2000 4999 REM ----------------- 5000 REM SMAZANI OBRAZOVKY 5001 REM ----------------- 5010 CLS 5020 PRINT "ZX81 NIM (C)2015 FARAON" 5030 RETURN O něco později přišel na řadu FORTRAN 66: Kód: PROGRAM NIM MAIN01
INTEGER VYHER,POCET,MAXIM,ODBER MAIN02 LOGICAL KONEC MAIN03 CHARACTER*60 NAVOD(5) MAIN04 COMMON /UDAJE/VYHER,POCET,MAXIM,KONEC MAIN05 COMMON /TEXT/NAVOD MAIN06 CALL INICI MAIN07 C VYPIS NAVODU MAIN08 PRINT 600,(NAVOD(I),I=1,5) MAIN09 READ * MAIN10 C HRAJE CLOVEK MAIN11 1 CALL ZOBRAZ(POCET) MAIN12 IF (POCET.GT.1) GOTO 2 MAIN13 PRINT 100 MAIN14 CALL UKONC MAIN15 IF (KONEC) GOTO 9 MAIN16 GOTO 1 MAIN17 C DOTAZ NA ODBER MAIN18 2 PRINT 200,MAXIM MAIN19 READ 300,ODBER MAIN20 ODBER=INT(ODBER) MAIN21 IF (ODBER.LT.1.OR.ODBER.GT.MAXIM.OR.ODBER.GE.POCET) GOTO 2 MAIN22 POCET=POCET-ODBER MAIN23 C HRAJE POCITAC MAIN24 3 CALL ZOBRAZ(POCET) MAIN25 IF (POCET.GT.1) GOTO 4 MAIN26 PRINT 400 MAIN27 VYHER=VYHER+1 MAIN28 CALL UKONC MAIN29 IF (KONEC) GOTO 9 MAIN30 GOTO 3 MAIN31 C VYPOCET ODBERU MAIN32 4 ODBER=MOD(POCET-1,MAXIM+1) MAIN33 IF (ODBER.GT.0) GOTO 5 MAIN34 6 ODBER=MOD(NAHODA(),MAXIM)+1 MAIN35 IF (ODBER.GE.POCET) ODBER=POCET-1 MAIN36 IF (ODBER.LT.POCET) GOTO 5 MAIN37 GOTO 6 MAIN38 C PROVEDENI ODBERU MAIN39 5 PRINT 500,ODBER MAIN40 POCET=POCET-ODBER MAIN41 GOTO 1 MAIN42 100 FORMAT (16H VITEZI POCITAC!,/) MAIN43 200 FORMAT (16H MUZES VZIT 1 AZ,I2,15H, KOLIK BERES? ) MAIN44 300 FORMAT (I10) MAIN45 400 FORMAT (15H VITEZI CLOVEK!,/) MAIN46 500 FORMAT (13H POCITAC BERE,I2/) MAIN47 600 FORMAT (1A60) MAIN48 9 END MAIN49 C VYPIS VYSLEDKU A VOLBA POKRACOVANI NEBO UKONCENI UKONC01 SUBROUTINE UKONC UKONC02 INTEGER HER,VYHER,POCET,MAXIM UKONC03 LOGICAL KONEC UKONC04 CHARACTER VOLBA UKONC05 COMMON /UDAJE/VYHER,POCET,MAXIM,KONEC UKONC06 PRINT 100,HER,VYHER UKONC07 1 PRINT 200 UKONC08 READ 300,VOLBA UKONC09 IF (VOLBA.EQ.'A'.OR.VOLBA.EQ.'a') GOTO 2 UKONC10 IF (VOLBA.NE.'N'.AND.VOLBA.NE.'n') GOTO 1 UKONC11 KONEC=.TRUE. UKONC12 GOTO 2 UKONC13 C POCATECNI INICIALIZACE PROMENNYCH UKONC14 ENTRY INICI UKONC15 HER=0 UKONC16 VYHER=0 UKONC17 KONEC=.FALSE. UKONC18 C VYGENEROVANI NAHODNYCH HODNOT UKONC19 2 POCET=MOD(NAHODA(),6)*2+17 UKONC20 MAXIM=MOD(NAHODA(),4)+2 UKONC21 HER=HER+1 UKONC22 RETURN UKONC23 100 FORMAT (7H HER: ,I8/,7H VYHER:,I8) UKONC24 200 FORMAT (25H0CHCES POKRACOVAT? [A/N] ) UKONC25 300 FORMAT (A1) UKONC26 END UKONC27 C NAKRESLENI ZAPALEK NA STOLE ZOBRAZ01 SUBROUTINE ZOBRAZ(POC) ZOBRAZ02 INTEGER Q,POC,KON,ZAP ZOBRAZ03 CHARACTER RADEK(60) ZOBRAZ04 CHARACTER*2 KONCOVKA(3) ZOBRAZ05 DATA KONCOVKA/2HKA,2HKY,2HEK/ ZOBRAZ06 C HLAVICKY ZOBRAZ07 DO 10 ZAP=1,27 ZOBRAZ08 RADEK(ZAP*2)=' ' ZOBRAZ09 IF (ZAP.LE.POC) RADEK(ZAP*2)='0' ZOBRAZ10 10 CONTINUE ZOBRAZ11 PRINT 100,RADEK ZOBRAZ12 C DRIVKA ZOBRAZ13 DO 20 ZAP=1,27 ZOBRAZ14 RADEK(ZAP*2)=' ' ZOBRAZ15 IF (ZAP.LE.POC) RADEK(ZAP*2)='|' ZOBRAZ16 20 CONTINUE ZOBRAZ17 PRINT 100,((RADEK),I=1,3) ZOBRAZ18 C VYPOCET KONCOVKY ZOBRAZ19 IF (POC.GE.10.AND.POC.LE.20) GOTO 3 ZOBRAZ20 Q=MOD(POC,10) ZOBRAZ21 KON=2 ZOBRAZ22 IF (Q.EQ.1) KON=1 ZOBRAZ23 IF (Q.GT.4) KON=3 ZOBRAZ24 GOTO 2 ZOBRAZ25 3 KON=3 ZOBRAZ26 2 PRINT 200,POC,KONCOVKA(KON) ZOBRAZ27 RETURN ZOBRAZ28 100 FORMAT (60A1) ZOBRAZ29 200 FORMAT (14H0NA STOLE LEZI,I3,6H ZAPAL,A2,1H,) ZOBRAZ30 END ZOBRAZ31 C GENERATOR PSEUDONAHODNEHO CISLA NAHODA01 FUNCTION NAHODA() NAHODA02 INTEGER NAHODA,SEED NAHODA03 SAVE SEED NAHODA04 C INICIALIZACE SEEDU NAHODA05 IF (SEED.GT.0) GOTO 1 NAHODA06 CALL GETDAT(I,J,K) NAHODA07 SEED=I*365+J*12+K NAHODA08 CALL GETTIM(I,J,K,L) NAHODA09 SEED=MOD(SEED+I*3600+I*60+K,134456) NAHODA10 1 SEED=MOD(8121*SEED+28411,134456-1) NAHODA11 NAHODA=SEED NAHODA12 RETURN NAHODA13 END NAHODA14 C NAPLNENI NAVODU DATA01 BLOCK DATA DATA02 COMMON /TEXT/NAVOD DATA03 CHARACTER*60 NAVOD(5) DATA04 DATA NAVOD/ DATA05 1 27H FORTRAN NIM (C)2015 FARAON, DATA06 2 33H0HRU HRAJE CLOVEK PROTI POCITACI,, DATA07 3 53H STRIDAVE ODEBIRAJI ZAPALKY PODLE STANOVENEHO MAXIMA., DATA08 4 41H TEN, NA KOHO ZUSTANE POSLEDNI, PROHRAVA., DATA09 5 17H0STISKNI ENTER.../ DATA10 END DATA11 |
Autor: | faraon [ 14.10.2019, 22:38 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
Další bylo na řadě ANSI C: Kód: #include <stdio.h> #include <stdlib.h> #include <time.h> int her,vyher,pocet,maximum; /* vygenerování náhodných hodnot */ void nahoda(void) { pocet=2*(rand()%6)+17; maximum=rand()%4+2; ++her; } /* počáteční inicializace proměnných */ void inicializace(void) { her=vyher=0; srand(time(NULL)); nahoda(); } /* výpis výsledků a volba pokračování nebo ukončení */ int ukonceni(void) { char konec; printf("\nHer:\t%d\nVýher:\t%d\nChceš hrát znovu? [A/N] ",her,vyher); do { while (!scanf("%1[aAnN]",&konec)) getchar(); if ('n'==konec||'N'==konec) return 1; } while ('a'!=konec&&'A'!=konec); nahoda(); return 0; } /* výpočet koncovky */ char *koncovka(n) { if (n<10||20<n) { if (1==(n%=10)) return "ka"; else if (n<5) return "ky"; } return "ek"; } /* nakreslení zápalek na stole */ void zobraz(void) { static int radek,sloupec; putchar('\n'); for (radek=0;radek<5;++radek) { for (sloupec=0;sloupec<pocet;++sloupec) printf("%c ",radek?'|':'O'); putchar('\n'); } printf("\nNa stole leží %d zápal%s.\n",pocet,koncovka(pocet)); } int main(void) { int odber; inicializace(); /* výpis návodu */ printf("\n C NIM (C)2016 FARAON\n\n" " Hru hraje člověk proti počítači,\n" "střídavě odebírají zápalky podle stanoveného maxima.\n" " Ten, na koho zůstane poslední, prohrává.\n\n" " Stiskni Enter..."); getchar(); /* hlavní cyklus */ for (;;) { /* hraje člověk */ zobraz(); if (pocet>1) { do { /* dotaz na odběr */ printf("Můžeš vzít 1 až %d, kolik bereš? ",maximum<pocet?maximum:pocet-1); while (!scanf("%d",&odber)) getchar(); } while (odber<1||odber>maximum||odber>=pocet); pocet-=odber; loop: zobraz(); /* hraje počítač */ if (pocet>1) { /* výpočet odběru */ odber=(pocet-1)%(maximum+1); if (!odber) do odber=(rand()%maximum)+1; while (odber>=pocet); printf("Počítač bere %d\n",odber); pocet-=odber; } else { printf("Vítězí člověk!\n"); ++vyher; if (ukonceni()) break; goto loop; } } else { printf("Vítězí počítač!\n"); if (ukonceni()) break; } } return 0; } A nakonec verze pro ZX Spectrum, vzniklá prostým doplněním toho úplně prvního programu o schopnosti Spectra: Kód: 9 REM ------------
10 REM HRA ZX82 NIM 11 REM ------------ 20 GOSUB 1000 30 GOSUB 5000 40 GOSUB 3000 50 PRINT ''"Hru hraje ";CHR$ 150;"lov";CHR$ 151;"k proti po";CHR$ 150;CHR$ 148;"ta";CHR$ 150;"i,st";CHR$ 152;CHR$ 148;"dav";CHR$ 151;" odeb";CHR$ 148;"raj";CHR$ 148;" z";CHR$ 146;"palky podlestanoven";CHR$ 147;"ho maxima. Ten, na kohoz";CHR$ 155;"stane posledn";CHR$ 148;", prohr";CHR$ 146;"v";CHR$ 146;"."''"Stiskni n";CHR$ 151;"jakou kl";CHR$ 146;"vesu..." 60 LET r=RND 70 IF INKEY$="" THEN GOTO 70 99 REM ------------- 100 REM HLAVNI CYKLUS 101 REM ------------- 110 GOSUB 5000 120 IF o=0 THEN GOTO 400 199 REM ------------- 200 REM HRAJE POCITAC 201 REM ------------- 210 GOSUB 3000 220 IF p>1 THEN GOTO 270 230 PRINT "V";CHR$ 148;"t";CHR$ 151;"z";CHR$ 148;" ";CHR$ 150;"lov";CHR$ 151;"k." 240 LET v=v+1 250 GOSUB 4000 260 GOTO 200 270 LET o=(p-1)-(m+1)*INT ((p-1)/(m+1)) 280 IF o=0 THEN LET o=INT (RND*m)+1 290 IF o>(p-1) THEN GOTO 280 300 PRINT "Po";CHR$ 150;CHR$ 148;"ta";CHR$ 150;" bere ";o;"." 310 LET p=p-o 399 REM ------------ 400 REM HRAJE CLOVEK 401 REM ------------ 410 GOSUB 3000 420 IF p>1 THEN GOTO 460 430 PRINT "V";CHR$ 148;"t";CHR$ 151;"z";CHR$ 148;" po";CHR$ 150;CHR$ 148;"ta";CHR$ 150;"." 440 GOSUB 4000 450 GOTO 400 460 PRINT "M";CHR$ 155;CHR$ 154;"e";CHR$ 153;" vz";CHR$ 148;"t 1 a";CHR$ 154;" ";m;", kolik bere";CHR$ 153;"?" 470 INPUT "beru ";o 480 LET o=INT o 490 IF o<1 OR o>m OR o>=p THEN GOTO 470 500 LET p=p-o 510 GOTO 100 999 REM ---------------------- 1000 REM POCATECNI INICIALIZACE 1001 REM ---------------------- 1010 LET h=0 1020 LET v=0 1030 LET o=0 1040 DIM x(8) 1050 RANDOMIZE: RESTORE 1099 REM ----------- 1100 REM SEMIGRAFIKA 1101 REM ----------- 1110 LET a=USR "a" 1120 FOR i=0 TO 15 1130 READ p: POKE a,p 1140 LET a=a+1 1150 NEXT i 1160 DATA 28,62,62,127,127,127,62,62 1170 DATA 28,28,28,28,28,28,28,28 1199 REM ------- 1200 REM CESTINA 1201 REM ------- 1210 LET m=PEEK 23607*256+PEEK 23606 1220 READ x(1),x(2) 1230 FOR i=0 TO 9: PAPER i: CLS 1240 READ p: LET m=m+p 1250 FOR j=1 TO 8 1260 LET p=PEEK m: IF j=2 THEN LET p=0 1270 POKE a,p+x(j): LET a=a+1: LET m=m+1 1280 NEXT j 1290 IF i=3 THEN READ x(1) 1300 IF i=8 THEN READ x(1),x(2),x(3) 1310 NEXT i 1320 DATA 12,8,776,24,24,120 1330 DATA 20,-184,8,96,0,48 1340 DATA 8,20,8,-48 1999 REM ---------------- 2000 REM GENERATOR NAHODY 2001 REM ---------------- 2010 LET p=2*INT (RND*6)+17 2020 LET m=INT (RND*4)+2 2030 LET h=h+1 2040 RETURN 2999 REM ------------------ 3000 REM NAKRESLENI ZAPALEK 3001 REM ------------------ 3010 PRINT 3020 FOR r=1 TO 4 3030 FOR s=1 TO p 3035 IF r=1 THEN PRINT INK 0; CHR$ 144;: GOTO 3050 3040 PRINT INK 6; CHR$ 145; 3050 NEXT s 3060 PRINT 3070 NEXT r 3080 LET q=(p-10*INT (p/10))*(p<10 OR p>20) 3090 LET K$="ek" 3100 IF q>1 AND q<5 THEN LET K$="ky" 3110 IF q=1 THEN LET K$="ka" 3120 PRINT '"Na stole le";CHR$ 154;CHR$ 148;" ";BRIGHT 1;p;BRIGHT 0;" z";CHR$ 146;"pal";K$;"," 3130 RETURN 3999 REM ----------------- 4000 REM VOLBA POKRACOVANI 4001 REM ----------------- 4010 PRINT '"Her:",INVERSE 1;h 4020 PRINT "V";CHR$ 149;"her:",PAPER 2*(INT ((h+1)/2/(v+1))<1);FLASH 1;v 4030 PRINT '"Chce";CHR$ 153;" hr";CHR$ 146;"t znovu? (a/N)" 4040 IF INKEY$="a"OR INKEY$="A" THEN GOTO 4070 4050 IF INKEY$="N" THEN NEW 4060 GOTO 4040 4070 GOSUB 5000 4080 GOTO 2000 4999 REM ----------------- 5000 REM SMAZANI OBRAZOVKY 5001 REM ----------------- 5010 INK 9: PAPER 1: FLASH 0: BRIGHT 0: OVER 0: INVERSE 0: BORDER 1: CLS 5020 PRINT BRIGHT 1; "ZX82 NIM (C)2015/2018 FARAON" 5030 RETURN |
Autor: | lukz [ 14.10.2019, 23:26 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
Úloha LINES vypadá pěkně, i když možná už je to až moc komplikované. V zájmu usnadnění portování na co nejvíc systémů bych to tedy zjednodušil (stačí kreslit černobíle, použití barev je volitelné) a specifikoval v pseudokódu pro ty, co to těžko přečtou z BASICu. Tedy cílem je napsat program, který vykreslí 59x2 čar na obrazovku, vždy dvě čáry jsou navzájem symetrické podle svislé osy, aby výsledný obrazec byl symetrický. Když potom jsou čáry přidávány, tak dřívější musí být umazávány, abychom stále udržovali na obrazovce 59x2 čar. Kód: proměnné: S=T=U=V=0 Pro úpravu souřadnic bodů nechám volnost, buď je možné použít původní postup odO=P=Q=R=-1 fronta F (prázdná) Opakuj stále: Vlož čtveřici (S, T, U, V) do fronty F Kresli čáru mezi body (S, T) a (U, V) Kresli zrcadlový obraz předchozí čáry podle svislé osy Uprav hodnoty S, T, U, V zvětšením nebo zmenšením o malou hodnotu s podmínkou, že nová hodnota S, T, U, V musí odpovídat viditelné části obrazovky Pokud F má 60 prvků: Vyzvedni čtveřici (O, P, Q, R) z fronty F Smaž čáru mezi body (O, P) a (Q, R) Smaž zrcadlový obraz předchozí čáry podle svislé osy Panda38 nebo i něco trochu jiného. Výsledek může vypadat nějak takto (přizpůsobený ovšem rozlišení daného stroje) https://gistcdn.githack.com/lukq/c067c1 ... /lines.htm . Chceme získat porty na co nejvíc strojů a co nejvíc jazyků. |
Autor: | Busy [ 15.10.2019, 18:39 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
lukz píše: vždy dvě čáry jsou navzájem symetrické podle svislé osy, aby výsledný obrazec byl symetrický. Navrhujem obe ciary este zozrkadlit aj podla vodorovnej osi, vznikne este zaujimavsi obrazec.A popripade zmensit pocet ciar, ono aj 32 ciar je na nizkych rozliseniach osembitov uplne bohate-prebohate. Ale zalezi od kroku o ktory sa zmenia suradnice bodov po kazdej ciare (a ich zrkadleniach). |
Autor: | Panda38 [ 15.10.2019, 18:56 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
Zrcadlení i podle vodorovné osy raději nedoporučuji - měl jsem i takovou verzi (se 4 čárami), ale byla nudnější, nebyl tam tak výrazný ten efekt běhání obrazce po obrazovce. Jo také zkouším že u nízkého rozlišení je potřeba menší počet čar - pro 112x96 to je tak na 20. Počet čar naopak zvýšit je zajímavé v případě, když hardware umí čáry ztmavovat - pak to vytváří zajímavý prostorový 3D efekt. https://www.shutterstock.com/video/clip ... mless-loop (ale to už je asi mimo schopnosti 8-bitů) |
Autor: | Panda38 [ 16.10.2019, 00:10 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
Zkusil jsem si to v C v ATpad (procesor ATmega). Není to sice historický počítač, ale je to 8-bit s dost omezenou RAM, rozlišení 112x104 pixelů s barevnými atributy jako ZX Spectrum, tak snad to nikoho nepohorší. Kód: #define LINES 20 // number of lines #define W (WIDTH*8) // width in pixels #define H (HEIGHT*8) // height in pixels // lines history char X1[LINES], Y1[LINES], X2[LINES], Y2[LINES]; // random direction char RandDir(char old) { char dir = RandByteMinMax(1, 4); if (old >= 0) dir = -dir; return dir; } // main function void main() { // initialize hardware Init(); // variables char x1, y1, x2, y2; // coordinates x1 = W/2-1; x2 = W/2+1; y1 = H/2-1; y2 = H/2+1; char dx1, dy1, dx2, dy2; // increments dx1 = dy1 = dx2 = dy2 = -1; int i = 0; // line index char col = COLOR(WHITE, BLACK); // color char colnum = 10; // color counter for (i = 0; i < LINES; i++) X1[i] = Y1[i] = X2[i] = Y2[i] = 0; while (1) { // clear old lines ResLine(X1[i], Y1[i], X2[i], Y2[i]); ResLine(W-1-X1[i], Y1[i], W-1-X2[i], Y2[i]); // shift coordinates x1 += dx1; if ((x1 < 0) || (x1 >= (char)W)) { x1 -= dx1; dx1 = RandDir(dx1); x1 += dx1; } x2 += dx2; if ((x2 < 0) || (x2 >= (char)W)) { x2 -= dx2; dx2 = RandDir(dx2); x2 += dx2; } y1 += dy1; if ((y1 < 0) || (y1 >= (char)H)) { y1 -= dy1; dy1 = RandDir(dy1); y1 += dy1; } y2 += dy2; if ((y2 < 0) || (y2 >= (char)H)) { y2 -= dy2; dy2 = RandDir(dy2); y2 += dy2; } // new color if (--colnum == 0) { colnum = RandByteMinMax(10, 50); col = COLOR(RandByteMinMax(1,15), BLACK); } // draw new lines SetLine(x1, y1, x2, y2, col); SetLine(W-1-x1, y1, W-1-x2, y2, col); // save new coordinates X1[i] = x1; Y1[i] = y1; X2[i] = x2; Y2[i] = y2; // increase line index i = (i + 1) % LINES; // delay 1/10 seconds WaitFrameNum(6); } } Příloha:
|
Autor: | Busy [ 16.10.2019, 08:41 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
Panda38 píše: Zrcadlení i podle vodorovné osy raději nedoporučuji - měl jsem i takovou verzi (se 4 čárami), ale byla nudnější, nebyl tam tak výrazný ten efekt běhání obrazce po obrazovce. Mne zase pride ovela nudnejsie zrkadlenie iba po jednej osi, preto by som symetriu podla oboch osi jednoznacne doporucil. A ani efekt behania po obrazovke neutrpi ked sa zvoli spravny pocet ciar - pri zrkadleni podla oboch osi treba tych ciar samozrejme menej.Alebo idealne je ak sa zrkadlenia rozne striedaju, potom si kazdy pride na svoje Priklad efektu pre typicke 8-bitove rozlisenie 256x256 a 36 ciar na obrazovke: Efekt v rozliseni 64x96, pocet ciar 8 (uplne staci): A este len cisto pre porovnanie, rozlisenie 1600x1200. V tomto pripade by boli ciary prilis tenke a nevyrazne, tak su hrube 4 pixely. Takze teoreticke virtualne rozlisenie je akoze 400x300, a pocet ciar ktory sa mi k tomu hodil je 64. |
Autor: | Panda38 [ 16.10.2019, 09:05 ] |
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků |
No jo to už jsou trochu vyšší levely, když to přechází plynule mezi různými typy symetrií a barvy se mění podle duhového gradientu. |
Autor: | lukz [ 16.10.2019, 12:46 ] | ||
Předmět příspěvku: | Re: Programovací cvičení, porovnání jazyků | ||
Příspěvky jsou tu pěkné. Abychom ale nezamluvili to zkoušení různých jazyků. Našel jsem na Scav nějaký X basic compiler, tak jsem udělal malý pokus v něm. Počítač: Sharp MZ-800, Jazyk: XBC F 1.02 for MZ-7/800 (soubor X-Basic_Compiler.mzf)
|
Stránka 1 z 1 | Všechny časy jsou v UTC + 1 hodina [ Letní čas ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |