Autor Wątek: Szybki konkurs - rysowanie szachownicy na ekranie.  (Przeczytany 11429 razy)

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #15 dnia: 2014.12.08, 10:08:11 »
dzięki za udział w tym szybkim konkursie.
Oto nadesłane procedurki posortowane względem wielkości oraz kolejności podsyłania.

zenek:
Cytuj
org 33000
        ld hl,16384   ; 3
        ld a,170   ; 2
        ld b,24      ; 2
loop:
        ld (hl),a   ; 1
        inc l      ; 1
        jr nz, loop   ; 2
        rlca      ; 1
        inc h      ; 1
        djnz loop   ; 2
        ret         ; 1
               ; 16

matofesi:
Cytuj
   ld hl,$4000     ; 3
   ld a,%10101010  ; 2
   ld b,24         ; 2
loop:
   ld (hl),a       ; 1
   inc l           ; 1
   jr nz,loop      ; 2
   inc h           ; 1
   cpl             ; 1
   djnz loop       ; 2
   ret             ; 1
               ; 16

Phonex:
Cytuj
   LD HL, $5800   ; 3
   LD A, $55      ; 2
L05: LD B, L      ; 1
L06: DEC HL         ; 1
   LD (HL), A      ; 1
   DJNZ L06         ; 2
   CPL            ; 1
   BIT 6, H         ; 2
   JR NZ, L05      ; 2
   RET            ; 1
               ; 16


Tygrys:
Cytuj
   ld   a,%10101010   ; 2
   ld   hl,$5700   ; 3
_loop:
   dec   l         ; 1
   ld   (hl),a      ; 1
   jr   nz,_loop   ; 2
   cpl            ; 1
   dec   h         ; 1
   bit   6,h         ; 2
   jr   nz,_loop   ; 2
   ret            ; 1
               ; 16


RafalM:
Cytuj
   LD HL,16384      ; 3
   LD BC,24      ; 3
   LD A,85         ; 2
L1   LD (HL),A      ; 1
   INC HL         ; 1
   DJNZ L1         ; 2
   CPL            ; 1
   DEC C         ; 1
   JR NZ,L1      ; 2
   RET            ; 1
               ; 17



A to zwycięska praca, nadesłana na konkurs na facebooku.
Autorem jest Allan Hoiberg
Cytuj
   LD BC,22272      ; 3
   LD A,85         ; 2
LoopB:
   Bit 6,B         ; 2
   RET Z         ; 1
LoopC:
   DEC C         ; 1
   LD (BC),A      ; 1
   JR NZ,LoopC      ; 2
   CPL            ; 1
   DJNZ loopB      ; 2
               ; 15

Kolejne 15 bajtów, tym razem introspec.
Cytuj
   ld hl,16384+6143 ; 3
filloop5:
   ld a,h         ; 1
   rra            ; 1
   sbc a,a         ; 1
   xor %01010101   ; 2
   ld (hl),a      ; 1
   dec hl         ; 1
   bit 6,h         ; 2
   jr nz,filloop5   ; 2
   ret            ; 1
               ; 15


Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #16 dnia: 2014.12.08, 11:21:52 »
Introspec - mistrz! Najbardziej mi się podoba ta procedura.

No dobra... Ile bym się nie wgapiał w ten problem to nic poniżej 21 bajtów nie chce mi wyjść. Podzielisz się sztuczką czy mam dalej żyć w niepewności? ;)

Pewnie. Cieszyłem się całą niedzielę. ;D
Sztuczką podzielił się rafamiga: zamiast DEC HL, DEC BC można użyć CPD! To załatwia też test końca pętli
;szachownica 2x2
        LD HL, $57FF
        LD A, $33
L05:    LD BC, $0200
L08:    LD (HL), A
        CPD
        JP PE, L08
        CPL
        BIT 6, H
        JR NZ, L05
        RET

To 20 bajtów, tylko jeden bajt mniej. Za to czasowo się opłaca - 10 taktów mniej na każdym obiegu pętli. Ale żeby uzyskać 17, sztuczka niepotrzebna - trzeba wpaść na pomysł z bitami H.
;szachownica 2x2, 4x4
        LD HL, $57FF
L03:    LD A, $33    ;$0F dla 4x4
        BIT 1, H     ;BIT 2, H dla 4x4,  BIT 0, H dla 1x1
        JR NZ, L0A
        CPL
L0A:    LD (HL), A
        DEC HL
        BIT 6, H
        JR NZ, L03
        RET

Z tą wersją dla 1x1 byłem blisko procedury introspeca ;) Gdybym wpadł jak zastąpić JR ...

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #17 dnia: 2014.12.08, 12:23:50 »
No to już wiem, czemu nie przyszło mi do głowy takie rozwiązanie... testowanie bitów jest wolne i jakoś tak nie potrafię się przemóc, żeby używać wolnych rozkazów ;)
A na CPD w ogóle bym nie wpadł - to jeden z najbardziej bezużytecznych rozkazów - jak się okazuje nie zawsze ;)

Kod introspeca jest fajny ale znowu... strasznie woooolny. Ale faktycznie spełnia wymogi - nie było powiedziane, że ma być szybko ;)

Poza wszystkim innym - fajnie jest popatrzeć jak inni kombinują :)

Poproszę więcej takich zagadek :D

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #18 dnia: 2014.12.08, 13:16:39 »
Kod introspeca podoba mi się, bo obliczanie A jest bez skoków! Ale zgoda - jest wolny przez to że ciągle oblicza A.

Mój 2x2 wolny? W takim razie:
        LD HL, $5800
        LD A, $33
L03:    LD B, L
L04:    DEC HL
        LD (HL), A
        DEC HL
        LD (HL), A
        DJNZ L04
        CPL
        BIT 6, H
        JR NZ, L03
        RET

18 bajtów. ;)
4x4 w ten sposób wyjdzie niestety 22.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #19 dnia: 2014.12.08, 13:31:34 »
A ja nie mówiłem, że twój jest wolny - wolne są tylko (stosunkowo - 8 cykli zużywanych wyłącznie na ostawienie flagi) rozkazy testowania bitów :)

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #20 dnia: 2014.12.08, 13:36:40 »
Ale jest wolny, bo też dla każdego HL wyznacza A.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #21 dnia: 2014.12.08, 13:51:22 »
No kod Introspeca jest wyjątkowo wolny - jak się go odpala to widać jak wypełnia ekran. Każdy bajt to 52 cykle co daje prawie 320000 cykli na cały ekran. Dla porównania twój konkursowy kod 1x1 wykonuje się ~160300 cykli a mój trochę mniej niż 142000 :)
Wiem, że nie to było tematem konkursu, ale jakoś tak nie umiem się powstrzymać ;)


ZbyniuR

  • *****
  • Wiadomości: 3333
  • Miejsce pobytu:
    Carlisle w UK
  • CPC AGA PSX
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #22 dnia: 2014.12.09, 12:19:30 »
A gdyby wykorzystać procedury z ROMu to o ile by się skróciło?
- Jeśli masz w domu światło i wodę, tzn. że masz światłowód. ;)

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #23 dnia: 2014.12.09, 12:51:55 »
Wcale. Nie ma procedur, które pozwalałyby zrobić to krótko. Trzeba by albo przedefiniować znak i drukować tekst albo stawiać punkty. Oba rozwiązania to znaaaacznie dłuższy kod.

trojacek

  • *****
  • Wiadomości: 6846
  • Miejsce pobytu:
    Warszawa
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #24 dnia: 2014.12.09, 13:04:38 »
Raczej chodzi o kod przypadkowy, typu:

LD HL, 16384
XOR A
RET

...i oszczędzasz jeden bajt ;)

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Szybki konkurs - rysowanie szachownicy na ekranie.
« Odpowiedź #25 dnia: 2014.12.11, 10:06:31 »
Osoby zainteresowane wyzwaniami programistycznymi, proszone są o zapoznanie się z wątkiem, który istnieje od 2 miesięcy: http://speccy.pl/forum/index.php/topic,1635.0.html