Oldal: 7 / 7
Re: Fejtörő (2014-2015)
Elküldve: 2015.01.19. 10:04
Szerző: makranc
csaba írta:
50 LET C$="aiemckgobjfndlhp"
55 LET A=(CODE c$((a-16*INT (A/16))+1-97)*16+CODE c$(INT (A/16)+1)-97[/b]
Nekem tetszik, mert innovatív, egyedi megoldás.
Kimaradt egy bezáró zárójel a +1 és -97 között:
55 LET A=(CODE c$((a-16*INT (A/16))+1)-97)*16+CODE c$(INT (A/16)+1)-97
Re: Fejtörő (2014-2015)
Elküldve: 2015.01.19. 15:44
Szerző: kpbendi
Kód: Egész kijelölése
45 IF PEEK(48000+A)<>0 THEN POKE f,PEEK(48000+A): NEXT F
49 LET C=A: LET B=0
50 IF C>127 THEN LET C=C-128: LET B=1
51 IF C>63 THEN LET C=C-64: LET B=B+2
52 IF C>31 THEN LET C=C-32: LET B=B+4
53 IF C>15 THEN LET C=C-16: LET B=B+8
54 IF C>7 THEN LET C=C-8: LET B=B+16
55 IF C>3 THEN LET C=C-4: LET B=B+32
56 IF C>1 THEN LET C=C-2: LET B=B+64
57 IF C>0 THEN LET A=A+128
59 POKE (48000+A),B: LET A=B
Kicsit csiszoltam még a kódon és töröltem a 43-as sort (a 3-asok átugrását). Ezzel a megoldás elméletileg megfelel a feladat kiírásnak, mert így 'a' értéke bármilyen egy byte-os szám lehet. A sebesség így 820 (386-ról indulva), ami számomra elfogadható kompromisszumnak tűnt, mivel a kód így is átlátható és érthető maradt.
Re: Fejtörő (2014-2015)
Elküldve: 2015.01.19. 16:25
Szerző: makranc
kpbendi írta:45 IF PEEK(48000+A)<>0 THEN POKE f,PEEK(48000+A): NEXT F
Javaslom a 48000 helyett kisebb szám, mondjuk 32000 használatát, mert így 16k-s gépen nem fut.
Elírtad, 57-es sorban a=a+128 szerepel b=b+128 helyett
Re: Fejtörő (2014-2015)
Elküldve: 2015.01.19. 20:04
Szerző: Asimo
makranc írta:kpbendi írta:45 IF PEEK(48000+A)<>0 THEN POKE f,PEEK(48000+A): NEXT F
Javaslom a 48000 helyett kisebb szám, mondjuk 32000 használatát, mert így 16k-s gépen nem fut.
32000 túl alacsony. Az eredeti program is kb. 31000-ig ér a memóriában (sajnos a DATA a legkevésbé hatékony módja az adattárolásnak), így a program módosítására már nem is marad hely. Kis kísérletezgetéssel simán túl lehet lépni 40000-en.
Re: Fejtörő (2014-2015)
Elküldve: 2015.01.20. 00:54
Szerző: makranc
Asimo írta:32000 túl alacsony. Az eredeti program is kb. 31000-ig ér a memóriában
Ha így van, akkor lehet, hogy egyedül az egysoros programom fut MINDEN gépen.
Kiegészítés:
Szerencsére nincs így, kpbendi programja például simán fut 16-os módban 32000-rel is.
Legalább takarékosan kell bánni a memóriával, és kilőve az összes előre megadott értékkel működő program.
Csak számolni lehet, azt is takarékosan! Bár sajna 256 elemes tömb létrehozására sincs így elég memória.
(Azért kíváncsi lennék Gyuri véleményére is!)

Re: Fejtörő (2014-2015)
Elküldve: 2015.01.20. 22:54
Szerző: kpbendi
Kód: Egész kijelölése
45 POKE F, PEEK (32000+A): IF PEEK F=0 THEN GOTO 49
47 NEXT F
49 LET C=A: LET B=0
50 IF C>127 THEN LET C=C-128: LET B=1
51 IF C>63 THEN LET C=C-64: LET B=B+2
52 IF C>31 THEN LET C=C-32: LET B=B+4
53 IF C>15 THEN LET C=C-16: LET B=B+8
54 IF C>7 THEN LET C=C-8: LET B=B+16
55 IF C>3 THEN LET C=C-4: LET B=B+32
56 IF C>1 THEN LET C=C-2: LET B=B+64
57 IF C>0 THEN LET B=B+128
59 POKE (32000+A),B: LET A=B
Találtam még egy módszert, ami tovább gyorsítja a kódot (45-ös sor), így az eredmény 794. Érdekes egyébként, hogy néha a bénábbnak tűnő, helypazarló megoldás a gyorsabb. Pl. a sok IF használata gyorsabb, mintha egy rövidebb kód összetettebb számításokat végezne.
Kód: Egész kijelölése
42 POKE F, PEEK (32000+A) : IF PEEK F=0 THEN GOTO 49
44 NEXT F
46 LET I = 128 : LET B = 0 : LET C = A
50 LET N = C >= I : LET B = B + (N * (128 / I)) : LET C = C - ( I * N)
53 IF I > 1 THEN LET I = I / 2 : GOTO 50
55 POKE (32000 + A), B: LET A = B
Ez pl. sokkal elegánsabb megoldás, mégis 1183 alatt fut le.
Re: Fejtörő (2014-2015)
Elküldve: 2015.01.20. 23:15
Szerző: Bali
Hátha még a +1 lépést is megspórolta volna, akkor lett volna végletekig optimalizált, de sajnos a GO TO 1 nem jó megoldás. Bár nem szerepelt a RUN-al indítás, de nem is szerepelt benne, hogy bármilyen előkészület vagy egyéb instrukció engedélyezett lett volna.
Mondjuk, ami nincs tiltva, az engedélyezett, nem?

Re: Fejtörő (2014-2015)
Elküldve: 2015.01.22. 10:49
Szerző: kpbendi
Kód: Egész kijelölése
42 POKE F, PEEK (32000+A) : IF PEEK F=0 THEN GOTO 49
44 NEXT F
46 LET I = 128 : LET B = 0 : LET C = A
50 IF C >= I : LET B = B + (128 / I) : LET C = C - I
53 IF I > 1 THEN LET I = I / 2 : GOTO 50
55 POKE (32000 + A), B: LET A = B
Újabb példa az egyszerűsítésre, így már 1004 alatt fut le, de ez még mindig 210-el több mint a csúnyább megoldás. Jobban belegondolva érthető, mert ez a módszer két osztást is tartalmaz az összeadások és kivonások mellett, miközben a feltétel vizsgálatok száma ugyanannyi.