Fejtörő (2014-2015)

Mókás, de direkt dögnehéz programozási feladványok Spectrumra...
Avatar
makranc
Speccyalista
Hozzászólások: 255
Csatlakozott: 2012.01.11. 11:00
Tartózkodási hely: Budapest, III.

Re: Fejtörő (2014-2015)

Hozzászólás Szerző: makranc » 2015.01.19. 11:04

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

kpbendi
Speccyalista
Hozzászólások: 61
Csatlakozott: 2012.01.09. 14:42

Re: Fejtörő (2014-2015)

Hozzászólás Szerző: kpbendi » 2015.01.19. 16:44

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.

Avatar
makranc
Speccyalista
Hozzászólások: 255
Csatlakozott: 2012.01.11. 11:00
Tartózkodási hely: Budapest, III.

Re: Fejtörő (2014-2015)

Hozzászólás Szerző: makranc » 2015.01.19. 17:25

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

Avatar
Asimo
Speccyalista
Hozzászólások: 147
Csatlakozott: 2012.01.09. 18:49

Re: Fejtörő (2014-2015)

Hozzászólás Szerző: Asimo » 2015.01.19. 21:04

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.

Avatar
makranc
Speccyalista
Hozzászólások: 255
Csatlakozott: 2012.01.11. 11:00
Tartózkodási hely: Budapest, III.

Re: Fejtörő (2014-2015)

Hozzászólás Szerző: makranc » 2015.01.20. 01:54

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.
:D :D :D

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!)
;)

kpbendi
Speccyalista
Hozzászólások: 61
Csatlakozott: 2012.01.09. 14:42

Re: Fejtörő (2014-2015)

Hozzászólás Szerző: kpbendi » 2015.01.20. 23:54

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.

Avatar
Bali
Site Admin
Hozzászólások: 2028
Csatlakozott: 2012.01.06. 13:34
Tartózkodási hely: Budapest III.
Kapcsolat:

Re: Fejtörő (2014-2015)

Hozzászólás Szerző: Bali » 2015.01.21. 00:15

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? :)
-= Bali =-
(c) 1983-2017 Evil-Soft

kpbendi
Speccyalista
Hozzászólások: 61
Csatlakozott: 2012.01.09. 14:42

Re: Fejtörő (2014-2015)

Hozzászólás Szerző: kpbendi » 2015.01.22. 11:49

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.

Válasz küldése

Ki van itt

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