Fejtörő (2012-2013)

Mókás, de direkt dögnehéz programozási feladványok Spectrumra...
Avatar
stp
Hozzászólások: 32
Csatlakozott: 2012.01.06. 13:39
Tartózkodási hely: Debrecen

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: stp »

csaba írta:Plot-tal kipöttyözni a képernyőre a számokat binárisan?
Azt csinálom, csak elfedem az INK 7-tel.
hpeter
Alapító tag
Hozzászólások: 42
Csatlakozott: 2012.01.06. 23:25

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: hpeter »

Szerintem ezek a megoldások 20 perc alatt nem kivitelezhetőek, viszont bámulatos, ahogyan leküzditek a felmerülő akadályokat.
Az elmúlt évek tapasztalati alapján sokkal egyszerűbb, agyafúrt dologra kellene gondolnunk!
Avatar
Csipetke
Tiszteletbeli tag
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 »

Hát van egy ötletem, de ahhoz nincs sok programírásra szükség. Az idő 23:32, tehát 28 perc van 2013-ig. Egy időzítővel szépen beállítom az egyes kiírások közti időt 2 percre, és szépen egyesével számol a gép még 28 percig. Utána koccintunk, mert már 2013-lesz, és ezzel teljesül is a kívánság! Az egész gyakorlatilag elfér egy parancs-sorban.

PRINT "BUEK" : PRINT 0: PAUSE 6000: PRINT 1: PAUSE 6000: PRINT 2: PAUSE 6000: PRINT 3: PAUSE 6000 : PRINT 2+2: PAUSE 6000: PRINT 5: ....

és így tovább, legalább 14-ig. 1 perc alatt beírható! Üdv. Csipetke
Avatar
Csipetke
Tiszteletbeli tag
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 »

Ha már megírtam, akkor beteszem a második változatomat is, amely vízszintesen írja ki a számokat nullákkal együtt. Space helyett a chr§ 32 használható, a 4 helyett str§ (2+2) vagy a chr§ 52. Az egyes, majd a tízes, százas és ezres helyiértéknek megfelelően írja a soron következő számot. Itt a gépelés tovább tartott, mint kitalálni a megoldást. OVER 1 használatával lehet törölni a régi számot, majd kiírni az újat.

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

10 CLS : PRINT AT 5,0: PRINT "BUEK": PRINT AT 7,0: OVER 0: PRINT 0: GO SUB 300: GO SUB 900: OVER 0: PRINT 1: GO SUB 300: GO SUB 900: OVER 0: PRINT 200: GO SUB 100: GO SUB 900: OVER 0: PRINT 2010: GO SUB 900: OVER 0: PRINT 2011: GO SUB 900: OVER 0: PRINT 2012: GO SUB 900: OVER 0: PRINT 2013: PAUSE 0: GO TO 9999
100 GO SUB 900: GO SUB 1001: GO SUB 900: GO SUB 1001: GO SUB 900: GO SUB 1003: GO SUB 900: GO SUB 1003: GO SUB 900: GO SUB 1005: GO SUB 900: GO SUB 1005: GO SUB 900: GO SUB 1007: GO SUB 900: GO SUB 1007: GO SUB 900: GO SUB 1009: GO SUB 900: GO SUB 1009: GO SUB 900: GO SUB 1011: GO SUB 900: GO SUB 1011: GO SUB 900: GO SUB 1013: GO SUB 900: GO SUB 1013: GO SUB 900: GO SUB 1015: GO SUB 900: GO SUB 1015: GO SUB 900: GO SUB 1017: GO SUB 900: GO SUB 1017: GO SUB 900: GO SUB 1019: GO SUB 900: GO SUB 1019: RETURN 
200 GO SUB 900: GO SUB 1101: GO SUB 100: GO SUB 900: GO SUB 1101: GO SUB 900: GO SUB 1103: GO SUB 100: GO SUB 900: GO SUB 1103: GO SUB 900: GO SUB 1105: GO SUB 100: GO SUB 900: GO SUB 1105: GO SUB 900: GO SUB 1107: GO SUB 100: GO SUB 900: GO SUB 1107: GO SUB 900: GO SUB 1109: GO SUB 100: GO SUB 900: GO SUB 1109: GO SUB 900: GO SUB 1111: GO SUB 100: GO SUB 900: GO SUB 1111: GO SUB 900: GO SUB 1113: GO SUB 100: GO SUB 900: GO SUB 1113: GO SUB 900: GO SUB 1115: GO SUB 100: GO SUB 900: GO SUB 1115: GO SUB 900: GO SUB 1117: GO SUB 100: GO SUB 900: GO SUB 1117: GO SUB 900: GO SUB 1119: GO SUB 100: GO SUB 900: GO SUB 1119: RETURN 
300 GO SUB 900: GO SUB 1201: GO SUB 200: GO SUB 900: GO SUB 1201: GO SUB 900: GO SUB 1203: GO SUB 200: GO SUB 900: GO SUB 1203: GO SUB 900: GO SUB 1205: GO SUB 200: GO SUB 900: GO SUB 1205: GO SUB 900: GO SUB 1207: GO SUB 200: GO SUB 900: GO SUB 1207: GO SUB 900: GO SUB 1209: GO SUB 200: GO SUB 900: GO SUB 1209: GO SUB 900: GO SUB 1211: GO SUB 200: GO SUB 900: GO SUB 1211: GO SUB 900: GO SUB 1213: GO SUB 200: GO SUB 900: GO SUB 1213: GO SUB 900: GO SUB 1215: GO SUB 200: GO SUB 900: GO SUB 1215: GO SUB 900: GO SUB 1217: GO SUB 200: GO SUB 900: GO SUB 1217: GO SUB 900: GO SUB 1219: GO SUB 200: GO SUB 900: GO SUB 1219: RETURN 
900 PRINT AT 7,0: OVER 1: RETURN 
999 GO TO 9999
1000 REM egyesek kiiratasa
1001 PRINT CHR$ 32+CHR$ 32+CHR$ 32+"0": RETURN 
1003 PRINT CHR$ 32+CHR$ 32+CHR$ 32+"1": RETURN 
1005 PRINT CHR$ 32+CHR$ 32+CHR$ 32+"2": RETURN 
1007 PRINT CHR$ 32+CHR$ 32+CHR$ 32+"3": RETURN 
1009 PRINT CHR$ 32+CHR$ 32+CHR$ 32+STR$ (2+2): RETURN 
1011 PRINT CHR$ 32+CHR$ 32+CHR$ 32+"5": RETURN 
1013 PRINT CHR$ 32+CHR$ 32+CHR$ 32+"6": RETURN 
1015 PRINT CHR$ 32+CHR$ 32+CHR$ 32+"7": RETURN 
1017 PRINT CHR$ 32+CHR$ 32+CHR$ 32+"8": RETURN 
1019 PRINT CHR$ 32+CHR$ 32+CHR$ 32+"9": RETURN 
1100 REM tizesek kiiratasa
1101 PRINT CHR$ 32+CHR$ 32+"0": RETURN 
1103 PRINT CHR$ 32+CHR$ 32+"1": RETURN 
1105 PRINT CHR$ 32+CHR$ 32+"2": RETURN 
1107 PRINT CHR$ 32+CHR$ 32+"3": RETURN 
1109 PRINT CHR$ 32+CHR$ 32+STR$ (2+2): RETURN 
1111 PRINT CHR$ 32+CHR$ 32+"5": RETURN 
1113 PRINT CHR$ 32+CHR$ 32+"6": RETURN 
1115 PRINT CHR$ 32+CHR$ 32+"7": RETURN 
1117 PRINT CHR$ 32+CHR$ 32+"8": RETURN 
1119 PRINT CHR$ 32+CHR$ 32+"9": RETURN 
1200 REM szazasok kiiratasa
1201 PRINT CHR$ 32+"0": RETURN 
1203 PRINT CHR$ 32+"1": RETURN 
1205 PRINT CHR$ 32+"2": RETURN 
1207 PRINT CHR$ 32+"3": RETURN 
1209 PRINT CHR$ 32+STR$ (2+2): RETURN 
1211 PRINT CHR$ 32+"5": RETURN 
1213 PRINT CHR$ 32+"6": RETURN 
1215 PRINT CHR$ 32+"7": RETURN 
1217 PRINT CHR$ 32+"8": RETURN 
1219 PRINT CHR$ 32+"9": RETURN 
9999 :::::::::
A hozzászólást 1 alkalommal szerkesztették, utoljára Csipetke 2013.01.05. 21:28-kor.
Avatar
G.o.D.
Speccyalista
Hozzászólások: 82
Csatlakozott: 2012.01.06. 13:37
Tartózkodási hely: Budapest
Kapcsolat:

Re: Fejtörő (2012-2013)

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

A SCREEN$-os megoldás is megy vízszintesen, mert vessző van, csak pontosvessző nincs. Igaz úgy nem bal oldalon kezdődik.

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

PRINT AT x,y-1: PRINT OVER 1,"   é"
PRINT AT x,y-1: PRINT OVER 1,"  é"
stb.
G.o.D. / AbaddoN
Avatar
stp
Hozzászólások: 32
Csatlakozott: 2012.01.06. 13:39
Tartózkodási hely: Debrecen

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: stp »

god írta:A SCREEN$-os megoldás is megy vízszintesen, mert vessző van, csak pontosvessző nincs. Igaz úgy nem bal oldalon kezdődik.

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

PRINT AT x,y-1: PRINT OVER 1,"   é"
PRINT AT x,y-1: PRINT OVER 1,"  é"
stb.
Ezzel csak az a bajom, mint az összes korábbi esetben, hogy amint a

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

PRINT OVER 1,"   A"
helyére

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

PRINT OVER 1,"   "+SCREEN$(y,x)

kerül, nem fog működni (egy karakter helyett kettőt ír ki, sőt az előtte lévő space-eket is felülírja). Esetleg valami ROM guru megvilágíthatná a jelenség hátterét. :)
Sőt, az OVER 1-et lehetne akár CHR$ 21+CHR$ 1-gyel is helyettesíteni, akkor nem kellene vesszővel a képernyő közepére ugrasztani az írási pozíciót:

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

PRINT CHR$ 21+CHR$ 1+"   "+CHR$ 21+CHR$ 0+"A"
Ahol a CHR$ 21+CHR$ 1 az OVER 1, a CHR$ 21+CHR$ 0 az OVER 0. Így a CHR$ 21+CHR$ 1+" " a pozícionálás, a CHR$ 21+CHR$ 0+"A" a negyedik karakter felülírása. Ami így klasszul működik, de SCREEN$-nel az "A" helyén már nem megy.

De akkor már szebb megoldás lenne a CHR$ 22+CHR$ y+CHR$ x+"SZÖVEG" ami ekvivalens az AT y,x;"SZÖVEG"-gel. De ez is csak addig, amíg nem teszel a szöveg helyére SCREEN$-t... :?

Ugyanúgy nem nem lehet egy kifejezésben felszorozgatni a képernyőn lévő számjegyeket és így megkapni az aktuális számot (hasonlóan a bináris pöttyözős megoldáshoz), mert ez elméletileg jó:

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

PRINT (CODE(SCREEN$(1,0))+COS PI*48)*1000+(CODE(SCREEN$(1,1))+COS PI*48)*100+(CODE(SCREEN$(1,2))+COS PI*48)*10+(CODE(SCREEN$(1,3))+COS PI*48)
Gyakorlatban azonban csak egy SCREEN$-ig működik, ha egynél többet teszel a kifejezésbe, az hibás működést eredményez.

Azt hiszem ennek a kulcsa az lesz, hogy megértjük, hogy a SCREEN$ miért így működik.
Avatar
Zozosoft
Speccyalista
Hozzászólások: 805
Csatlakozott: 2012.01.06. 13:03
Kapcsolat:

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: Zozosoft »

stp írta: Gyakorlatban azonban csak egy SCREEN$-ig működik, ha egynél többet teszel a kifejezésbe, az hibás működést eredményez.

Azt hiszem ennek a kulcsa az lesz, hogy megértjük, hogy a SCREEN$ miért így működik.
Itt: viewtopic.php?f=34&t=110#p601
írkáltam javított ROM-okról amit találtam, az egyiknek a leírásában szerepel ilyen: "The 'SCREEN$' error has been corrected by substituting the suggested RET instruction. (at $257D)"
Avatar
G.o.D.
Speccyalista
Hozzászólások: 82
Csatlakozott: 2012.01.06. 13:37
Tartózkodási hely: Budapest
Kapcsolat:

Re: Fejtörő (2012-2013)

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

Zozosoft írta:
stp írta: Gyakorlatban azonban csak egy SCREEN$-ig működik, ha egynél többet teszel a kifejezésbe, az hibás működést eredményez.

Azt hiszem ennek a kulcsa az lesz, hogy megértjük, hogy a SCREEN$ miért így működik.
Elsőre a kilépési vizsgálatba egy sorban OR-okkal akartam megírni a kilépési feltételt, amiben az elemi logikai kifejezésekben egy-egy SCREEN$ volt, és ott sem működöt.

Amúgy van valaki, aki átlagos helyzetben erre használta valamikor is a SCREEN$-t? :)
G.o.D. / AbaddoN
Avatar
stp
Hozzászólások: 32
Csatlakozott: 2012.01.06. 13:39
Tartózkodási hely: Debrecen

Re: Fejtörő (2012-2013)

Hozzászólás Szerző: stp »

Zozosoft írta:"The 'SCREEN$' error has been corrected by substituting the suggested RET instruction. (at $257D)"
Szerintem ezzel ki is húzhatjuk a SCREEN$-es megoldásokat...
god írta:Amúgy van valaki, aki átlagos helyzetben erre használta valamikor is a SCREEN$-t? :)
Őszintén? Én eddig azt se tudtam, hogy mire való. :D
Na jó, azt hittem, hogy csak a LOAD/SAVE "xyz" SCREEN$-hez használatos.
Mondjuk utoljára olyan 12-13 évesen programoztam Spectrum-ot BASIC-ben...
Avatar
Csipetke
Tiszteletbeli tag
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 »

A SCREEN§ egyszer ad csak jó eredményt, de ha ugyan azzal paraméterezve szerepel kétszer, az is használható, hiszen az eredménye azonos, nem okoz hibát. A megoldásomban így használtam, működött. Összetett esetben természetsen már hibát fog eredményezni.

Nekem nagyon tetszik a bináris számlálás, de valamiért nem áll meg 2013 kiírása után, hanem azonnal előről kezdi. Benne van a határ, de mégsem áll meg, nem lesz az INK visszaállítva feketére. Mi ennek az oka?

Más:
Az eredeti szövegből idézem:

"BUEK"-kal köszönt, majd 0-tól folyamatosan, egyesével elszámol 2013-ig! Éjfélig le kell futnia számítógépeden, különben ..."

És miközben felénk int karjával, minden elhalványul, újra elcsendesül a szoba. Döbbenten nézünk körbe, egy pillantás az óránkra: "23:32"

Nem sok időnk maradt,... Eddig az idézet.

Nincs benne szó számlálóról! Csak számlálásról, és meddig? 2013-ig, azaz 28 percen keresztül. Nincs megadva még a számlálás sebessége sem, és ez azt jelenti, hogy történhet akár 5 percenként is a következő szám megjelenítése. Vajon miért adta meg az időpontot?
Ha a ! jel helyett csak vesszőt írt volna, azonnal kidrül a turpisság, de kicsit bezavart engem az "elszámol", mert a csak "számol" pontosabb lett volna. Ez egyben könnyítette volna a megfejtést. Ez a kis "el" igekötő zavart meg, mert automatikusan feltételezi a határt, a 2013-at. Arra viszont még az első olvasáskor nem gondoltam, mert alább írta csak a "23:32" őt, hogy ezt időben érti! --- Nagyon rafinááált! Minden apróságra nagyon kell figyelni Pgyuri feladványaiban! Már nagyon kíváncsi vagyok arra, hogy pontosan mire gondolt?!
Lezárt

Vissza: “Feladványok, fejtörők”