Fejtörő (2012-2013)

Mókás, de direkt dögnehéz programozási feladványok Spectrumra...
Avatar
Csipetke
Speccyalista
Hozzászólások: 29
Csatlakozott: 2012.10.25. 03:19
Tartózkodási hely: Budapest, Széna tér

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: Csipetke » 2013.01.04. 13:50

"Elsőként G.o.D.-nak gratulálok, aki már a megjelenés napján elküldte működő programját."
Kedves Pgyuri! Nem találom sehol a megoldását! Megtennéd, hogy ide is beteszed, hogy mi is tanulmányozhassuk?! Gratulálok a gyors megoldáshoz, de nagyon kíváncsi lettem, hogy még milyen módozatai lehetségesek. Üdv. Csipetke

Avatar
G.o.D.
Speccyalista
Hozzászólások: 58
Csatlakozott: 2012.01.06. 14:37
Tartózkodási hely: Budapest
Kapcsolat:

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: G.o.D. » 2013.01.04. 14:06

Gyurinak e-mailben küldtem, hogy ne lőjjem le a poént senki elől. Mivel nagyjából ugyanaz a SCREEN$-os megoldás, ami már volt itt, nem láttam értelmét bemásolni ide. Eddig...

Kód: Egész kijelölése

 1 PRINT "BUEK"
 2 PRINT AT 5,0
 3 PRINT "0"
 5 PRINT "0"
 6 PRINT "0"
 7 PRINT "0"
 8 PRINT AT 8,0
 9 IF SCREEN$ (9,0)<"9" THEN PRINT CHR$ (CODE SCREEN$(9,0)+1): GO TO 20
10 PRINT "0"
11 PRINT AT 7,0
12 IF SCREEN$ (8,0)<"9" THEN PRINT CHR$ (CODE SCREEN$(8,0)+1): GO TO 20
13 PRINT "0"
15 PRINT AT 6,0
16 IF SCREEN$ (7,0)<"9" THEN PRINT CHR$ (CODE SCREEN$(7,0)+1): GO TO 20
17 PRINT "0"
18 PRINT AT 5,0
19 PRINT CHR$ (CODE SCREEN$(6,0)+1)
20 IF SCREEN$(6,0)<"2" THEN GO TO 8
21 IF SCREEN$(8,0)<"1" THEN GO TO 8
22 IF SCREEN$(9,0)<"3" THEN GO TO 8
Csatoltam .sna-ban is.
...volna, ha engedélyezett lenne. Bali! Alkalomadtán be lehetne venni az engedélyezett kiterjesztések közé? ;) Zippelve csatoltam.
Csatolmányok
BUEK_2013.ZIP
(1.61 KiB) Letöltve 17 alkalommal.
G.o.D. / AbaddoN

Avatar
Pgyuri
Speccyalista
Hozzászólások: 499
Csatlakozott: 2012.01.06. 13:34

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: Pgyuri » 2013.01.04. 14:16

Üdv,

Szinte teljesen ugyanúgy oldottuk meg G.o.D.-al a feladatot, pár apró különbség van, ami abból fakad, hogy egy programot rengeteg megoldással lehet kivitelezni.

Kód: Egész kijelölése

1 PRINT ,,,,,"B",,"U",,"E",,"K",,"",,"0",,"0",,"0",,"0"
100 PRINT AT 9,0
110 IF SCREEN$ (10,16)<="8" THEN PRINT ,CHR$ (CODE SCREEN$ (10,16)+1): GO TO 1000
120 PRINT ,"0"
200 PRINT AT 8,0
210 IF SCREEN$ (9,16)<="8" THEN PRINT ,CHR$ (CODE SCREEN$ (9,16)+1): GO TO 1000
220 PRINT ,"0"
300 PRINT AT 7,0
310 IF SCREEN$ (8,16)<="8" THEN PRINT ,CHR$ (CODE SCREEN$ (8,16)+1): GO TO 1000
320 PRINT ,"0"
500 PRINT AT 6,0
510 PRINT ,CHR$ (CODE SCREEN$ (7,16)+1)
1000 IF SCREEN$ (7,16)<>"2" THEN GO TO 10
1001 IF SCREEN$ (8,16)<>"0" THEN GO TO 10
1002 IF SCREEN$ (9,16)<>"1" THEN GO TO 10
1003 IF SCREEN$ (10,16)<>"3" THEN GO TO 10
2013 REM 
Picit többet foglalkoztam, hogy szép legyen a kiírás, de pl. nagyon tetszett, hogy G.o.D. nem ellenőrizte a "0"-t a 2013-ban, mert felesleges.

Lényeg, hogy nem jött el az, amit a rejtélyes idegen mondani akart :)

Pgyuri

Avatar
Csipetke
Speccyalista
Hozzászólások: 29
Csatlakozott: 2012.10.25. 03:19
Tartózkodási hely: Budapest, Széna tér

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: Csipetke » 2013.01.04. 14:26

Ez gyors volt! Elegánsabb és rövidebb is a <"9" megoldás, mint amit én írtam. Én sem ellenőriztem a "0"-át, mert felesleges. De vajon a SCREEN§ -os megoldással hogyan lehetne mégis vízszintesen kiírni az évszámokat, ez még egy nagy kérdés! Egyáltalán lehet-e? A másik, amin gondolkodtam sokat, hogy hogyan lehet értéket adni egy változónak az = jel hiányával? Szerintem sehogy, de vajon más is így látja? A feladvány viszont érdekes volt, és jól megmozgatta mindenki fantáziáját, a dícséret Pgyurit illeti érte! Végül a megoldás szerintem legtömörebb, legelegánsabb megjelenési módra átlakított SCREEN§ -os változatát mutatom. Minden megoldásból került bele ötlet! Remélem, az idén is lesz valami hasonlóan érdekes feladvány! Üdv. Csipetke

Kód: Egész kijelölése

10 CLS: PRINT ,,,"B",,"U",,"E",,"K",,,,"0",,"0",,"0",,"0"
50 PRINT AT 8,0: IF SCREEN$ (9,16)<"9" THEN PRINT ,CHR$ (CODE SCREEN$ (9,16)+1): GO TO 100
60 PRINT ,0,AT 7,0: IF SCREEN$ (8,16)<"9" THEN PRINT ,CHR$ (CODE SCREEN$ (8,16)+1): GO TO 100
70 PRINT ,0,AT 6,0: IF SCREEN$ (7,16)<"9" THEN PRINT ,CHR$ (CODE SCREEN$ (7,16)+1): GO TO 100
80 PRINT ,0,AT 5,0: PRINT ,CHR$ (CODE SCREEN$ (6,16)+1)
100 IF SCREEN$ (6,16)<>"2" THEN GO TO 50
110 IF SCREEN$ (8,16)<>"1" THEN GO TO 50
120 IF SCREEN$ (9,16)<>"3" THEN GO TO 50
2013 REM
A hozzászólást 1 alkalommal szerkesztették, utoljára Csipetke 2013.01.04. 19:27-kor.

Avatar
G.o.D.
Speccyalista
Hozzászólások: 58
Csatlakozott: 2012.01.06. 14:37
Tartózkodási hely: Budapest
Kapcsolat:

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: G.o.D. » 2013.01.04. 18:46

Nem lehet valahogy USR és POKE nélkül gép kódot futtatni? Mert ha ez megoldható, akkor PLOT-ozzuk ki a gépi kódot a képernyőre, és úgy bármit meg tudunk oldani. :)
G.o.D. / AbaddoN

Avatar
Csipetke
Speccyalista
Hozzászólások: 29
Csatlakozott: 2012.10.25. 03:19
Tartózkodási hely: Budapest, Széna tér

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: Csipetke » 2013.01.04. 19:38

A feladat Basic programozást kívánt, és ebbe már nem férne bele a gépi kód, még akkor sem, ha plottolva beviszik és futtatják. Szerintem a lényegét venné el, tehát nem is volt kérdés részemre, hogy milyen módon futtatható USR hiányában egy kód. Az már egy másik feladvány lenne, szerintem megoldhatatlan!
Sajnos a beépített Basic hibásan működik bizonyos esetekben, és ezeknek a hibáknak a kikerülése nehézkes, vagy megoldhatatlan. Viszont a SCREEN§ -os megoldás esetében talán érdemes lenne próbálkozni trükkel, hogy egy sorba kerüljön az évszám kiírása. Hogy ez vajon megoldható-e, vagy sem, az még kérdés lehet! Üdv. Csipetke

Avatar
stp
Speccyalista
Hozzászólások: 31
Csatlakozott: 2012.01.06. 14:39
Tartózkodási hely: Debrecen

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: stp » 2013.01.04. 21:52

god írta:Nem lehet valahogy USR és POKE nélkül gép kódot futtatni? Mert ha ez megoldható, akkor PLOT-ozzuk ki a gépi kódot a képernyőre, és úgy bármit meg tudunk oldani. :)
Értem én a finom célzást. :)
Abból indultam ki, hogy nincs változónk. Eredetileg én is a képernyőre kiírt szöveget és a SCREEN$-t akartam felhasználni változó gyanánt (vagy karakterenként, vagy az összeset egy értékként mint végül a pontozós változatban), de nem akartam elhinni, hogy nem lehetséges vízszintesen kiírni az évszámot. Tulajdonképpen a képernyő 10 pontját használtam fel változónak gépi kód használata nélkül, szerintem ez nem annyira csúnya megoldás, bár kétségkívül a legcsúnyább és a leglassabb mind közül, főleg hogy még az INK-kel is variálni kell.
Egyébként éppen azon gondolkodtam, hogy az egy bájtos decimális<->bináris konverziónak szerintem ez a leggyorsabb módja BASIC-ben. Ha osztogatva számolom ki a bináris számjegyeket, sokkal lassabban kapom meg, mintha pl. POKE 16384,x-el beírom, és POINT-tal leolvasom a képernyőről.

Avatar
Pgyuri
Speccyalista
Hozzászólások: 499
Csatlakozott: 2012.01.06. 13:34

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: Pgyuri » 2013.01.05. 11:08

Üdv,

Az elmúlt időben azzal foglalkoztam, hogy teljesen megértsem a SCREEN$ függvény hibás működését, ezáltal bizonyítani tudjam, hogy ezzel megírható-e a soros számláló kiíratás.

Egyértelműen kijelenthetem, hogy NEM írható vízszintes számláló, ha kizárólag a SCREEN$ függvény kerül felhasználásra a számláló értékének kialakításához.

Indoklás:

A BASIC amikor kiértékel bármilyen függvényt, utasítást, akkor egy külön munkaterületen hajtja végre a kívánt eredmény kialakítását. Legyen az utasítás egy egyszerű PRINT "BUEK"+SCREEN$(0,0)+" 2013" és a 0,0 pozíción egy felkiáltójel szerepeljen, így a programsor elvárható eredménye ez lenne:

BUEK! 2013

|
Munkaterület kezdete

Értelmezve, hogy kiírás kezdődik, a "BUEK" részig a munkaterület így néz ki:

| "BUEK"+

jelezve, hogy még folytatódik a kiértékelés. Érkezik a SCREEN$, ami hibás működése miatt a munkaterületet tönkre teszi:

| !+!+

folytatva a további résszel (addigra kiértékelődik az első összefűzés)

| !!+" 2013"

és az összefűzést követően a képernyőn megjelenik a

!! 2013

felirat.

Vagyis működéséből adódóan a SCREEN$ mindent megeszik, ami előtte szerepel az összefűzendő elemekből. És mivel a számláló 4 számjegyből állna a vízszintes kiíráshoz, ezért az utolsó, negyedik SCREEN$ megeszi az első 3 eredményét és a vége mindig csak egy hibás, duplázott utolsó karakter.

Mivel a SCREEN$ mindig dupla karaktert ad vissza - tehát a kiemelt karaktert kétszer - így csak véletlen, hogy programjaink működtek. Erre gondolok:

IF SCREEN$(0,0)<"9" THEN ..... működik, mert mondjuk "11"<"9"

de fordítva

IF "9">SCREEN$(0,0) THEN ..... nem működik, mert a SCREEN$ megeszi a "9"> munkaterületen

várakozó eredményt a kiértékeléshez, így nincs összehasonlítás.


Eddig tehát bizonyítva lett, hogy a SCREEN$ elé semmit nem lehet írni, így a kiírás pozícionálásához nem használható vezető SPACE vagy bármi egyéb vezérlőkarakter. Már csak azt kell bizonyítani, hogy PRINT AT vagy TAB utasítással nem lehet megoldani a karakterenkénti egymás mellé kiírást.

Ez szintén teljesen egyértelműen bizonyítható, mivel a PRINT utasítás csak akkor folytatódik a következő karakteren, ha ; zárja a kiírást:

PRINT AT 5,3;

után a következő PRINT -mondjuk SCREEN$(0,0)- a megfelelő pozícióra ír, de sajnos a pontosvessző az "O" betűn van, ami épp nem működik.

A kiírások elválasztása történhet pontosvesszővel, ekkor a következő karakterre kerül a kiírás (ez ugye most nem használható), történhet vesszővel, ekkor a 0 vagy 16 pozíción folytatódik a kiírás attól függően, hogy mi a soron következő az aktuális pozíciótól, végül következhet egy olyan karakter is, amit valószínűleg soha senki nem használt, mégpedig a felsővessző, amely a következő sor elejétől folytatja a kiírást, azaz

PRINT AT 5,3;"BUEK"
PRINT AT 5,3,"BUEK"
PRINT AT 5,3'"BUEK"

a három lehetséges elválasztás.

Így tehát a feladat SCREEN$ alkalmazásával csak függőleges számlálóval oldható meg. A véletlenek különös alakulása is kellett ehhez.

Pgyuri

Avatar
Csipetke
Speccyalista
Hozzászólások: 29
Csatlakozott: 2012.10.25. 03:19
Tartózkodási hely: Budapest, Széna tér

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: Csipetke » 2013.01.05. 20:10

stp írta:Végül valami ilyesmit találtam ki. Biztos lehet szebbet is:
10 PRINT "BUEK"
20 PRINT AT 0,0
30 INK 0
50 PRINT POINT(0,0)*512*2+POINT(0,1)*512+POINT(0,2)*256+POINT(0,3)*128+POINT(0,2*2)*32*2+POINT(0,5)*32+POINT(0,6)*16+POINT(0,7)*8+POINT(0,8)*2*2+POINT(0,9)*2+POINT(0,10)
60 INK 7
70 PLOT OVER 1,0,10
80 IF NOT POINT (0,10) THEN PLOT OVER 1,0,9: IF NOT POINT (0,9) THEN PLOT OVER 1,0,8: IF NOT POINT (0,8) THEN PLOT OVER 1,0,7: IF NOT POINT (0,7) THEN PLOT OVER 1,0,6: IF NOT POINT (0,6) THEN PLOT OVER 1,0,5: IF NOT POINT (0,5) THEN PLOT OVER 1,0,2*2: IF NOT POINT (0,2*2) THEN PLOT OVER 1,0,1: IF NOT POINT (0,1) THEN PLOT OVER 1,0,0
90 IF POINT(0,0)*512*2+POINT(0,1)*512+POINT(0,2)*256+POINT(0,3)*128+POINT(0,2*2)*32*2+POINT(0,5)*32+POINT(0,6)*16+POINT(0,7)*8+POINT(0,8)*2*2+POINT(0,9)*2+POINT(0,10)<1007*2 THEN GOTO 20
100 INK 0
Itt bizony hiba van! 127-ről 512-re ugrik, majd 639-ről 1024-re, késöbb 1151-ről 1536-ra, és végül 1663-ról 0-ra vált. Ezért soha nem áll meg, amit már írtam! Nem kerül a vezérlés az utolsó sorba. Vajon mi a hiba?

Megzavart a 2*2? Ja ilyen előfordul! Javítsad ki a fájlt is, mert szerintem abban is hibás lehet! Üdv. Csipetke

Kód: Egész kijelölése

10 CLS : PRINT AT 10,0,"BUEK"
20 INK 0: PRINT AT 11,0, POINT (0,0)*512*2+POINT (0,1)*512+POINT (0,2)*256+POINT (0,3)*128+POINT (0,2*2)*32*2+POINT (0,5)*32+POINT (0,6)*16+POINT (0,7)*8+POINT (0,8)*2*2+POINT (0,9)*2+POINT (0,10)
30 INK 7: PLOT OVER 1,0,10: IF NOT POINT (0,10) THEN PLOT OVER 1,0,9: IF NOT POINT (0,9) THEN PLOT OVER 1,0,8: IF NOT POINT (0,8) THEN PLOT OVER 1,0,7: IF NOT POINT (0,7) THEN PLOT OVER 1,0,6: IF NOT POINT (0,6) THEN PLOT OVER 1,0,5: IF NOT POINT (0,5) THEN PLOT OVER 1,0,2*2: IF NOT POINT (0,2*2) THEN PLOT OVER 1,0,3: IF NOT POINT (0,3) THEN PLOT OVER 1,0,2: IF NOT POINT (0,2) THEN PLOT OVER 1,0,1: IF NOT POINT (0,1) THEN PLOT OVER 1,0,0
50 IF POINT (0,0)*512*2+POINT (0,1)*512+POINT (0,2)*256+POINT (0,3)*128+POINT (0,2*2)*32*2+POINT (0,5)*32+POINT (0,6)*16+POINT (0,7)*8+POINT (0,8)*2*2+POINT (0,9)*2+POINT (0,10)<1007*2 THEN GO TO 20
2013 INK 0
[/hide]

Avatar
stp
Speccyalista
Hozzászólások: 31
Csatlakozott: 2012.01.06. 14:39
Tartózkodási hely: Debrecen

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: stp » 2013.01.05. 20:55

Csipetke írta:Itt bizony hiba van! 127-ről 512-re ugrik, majd 639-ről 1024-re, késöbb 1151-ről 1536-ra, és végül 1663-ról 0-ra vált. Ezért soha nem áll meg, amit már írtam! Nem kerül a vezérlés az utolsó sorba. Vajon mi a hiba?

Megzavart a 2*2? Ja ilyen előfordul! Javítsad ki a fájlt is, mert szerintem abban is hibás lehet! Üdv. Csipetke
Mivel az emulátorból nem lehet kivágni-beszúrni, így ide begépeltem újra a kódot. A jelek szerint elírtam. Viszont eszerint te vagy az egyetlen a fórumon, aki begépelte. ;) A tzx jó. Annyi hiba van benne, hogy a 90-es sor végén GOTO 20 helyett GOTO 10-et írtam, így a számláló alá fehér tintaszínnel újra kiírja, hogy "BUEK". De ahogy néztem, nem sokat számít sebességben, GOTO 20-al is ugyanolyan csiga.

Lezárt

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég