สุขสันต์วันเกิด Raffaele Cecco!


33

Raffaele Ceccoเป็นโปรแกรมที่ผลิตบางส่วนของที่ดีที่สุดวิดีโอเกมสำหรับZX สเปกตรัมคอมพิวเตอร์ในช่วงปลายทศวรรษที่แปดสิบ ท่ามกลางคนอื่น ๆ เขาพัฒนาสะเทือนใจCybernoidและExolon

Raffaele จะเปลี่ยน 50 เมื่อ 10 พฤษภาคม 2017 ความท้าทายนี้เป็นเครื่องบรรณาการเล็กน้อยสำหรับเขาในช่วงเวลาแห่งความสุขที่พวกเราหลายคนใช้เวลาเล่นเกมที่ยอดเยี่ยมเหล่านั้นและเพื่อเป็นแรงบันดาลใจที่พวกเขานำมา

ความท้าทาย

จุดประสงค์คือการผลิตกระโจมสี่เหลี่ยมที่ได้รับแรงบันดาลใจจากสิ่งที่เห็นในหน้าจอเมนูหลักของ Cybernoid แต่เป็นศิลปะ ASCII

โดยเฉพาะอย่างยิ่งสตริง"Happy birthday Raffaele Cecco "(หมายเหตุช่องว่างสุดท้าย) จะแสดงการหมุนไปตามขอบของสี่เหลี่ยม 12 × 5 โดยมีเวลาหยุดชั่วคราวระหว่างสแน็ปช็อตอย่างต่อเนื่อง

ตัวอย่างเช่นสมมติว่าข้อความแสดงตามเข็มนาฬิกาและหมุนทวนเข็มนาฬิกา (ดูตัวเลือกด้านล่าง) นี่คือภาพรวมสามภาพติดต่อกันของปะรำสี่เหลี่ยม:

Happy birthd
           a
o          y
c           
ceC eleaffaR

แล้วก็

appy birthda
H          y

o          R
cceC eleaffa

แล้วก็

ppy birthday
a           
H          R
           a
occeC eleaff

และอื่น ๆ

กฎระเบียบ

ไม่มีการป้อนข้อมูล เอาต์พุตจะผ่าน STDOUT หรือเทียบเท่าหรือในหน้าต่างกราฟิก

ผลลัพธ์ควรแสดงถึงข้อความที่กำลังหมุน นั่นคือสแนปชอตใหม่แต่ละอันควรเขียนทับอันก่อนหน้านี้เพื่อสร้างความประทับใจในการเคลื่อนไหว สามารถทำได้ด้วยวิธีการใด ๆ เช่นโดยการเขียนจำนวนบรรทัดใหม่ที่เหมาะสมเพื่อล้างหน้าจออย่างมีประสิทธิภาพ ยอมรับได้ถ้ามันถูกต้องสำหรับขนาดหน้าจอที่กำหนดเท่านั้น เพียงระบุไว้ในคำตอบ

ยอมรับตัวเลือกต่อไปนี้:

  • ข้อความสามารถแสดงตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาและสามารถหมุนตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา (ภาพรวมตัวอย่างข้างต้นถือว่าแสดงตามเข็มนาฬิกาและหมุนทวนเข็มนาฬิกา)
  • การหมุนควรดำเนินต่อไปเรื่อย ๆ ในวงวนไม่สิ้นสุด (จนกว่าโปรแกรมจะหยุดทำงาน) และสามารถเริ่มต้นได้ทุกเฟส
  • เวลาหยุดชั่วคราวระหว่างสแน็ปช็อตควรประมาณค่าคงที่ แต่สามารถเลือกได้อย่างอิสระระหว่าง 0.1 และ 1 วินาที การหยุดชั่วคราวครั้งแรกก่อนที่จะแสดงสแนปชอตแรกนั้นเป็นที่ยอมรับได้
  • ตัวอักษรสามารถเป็นตัวพิมพ์ใหญ่ตัวพิมพ์เล็กหรือตัวพิมพ์เล็ก (ตามตัวอย่างด้านบน)
  • อนุญาตให้มีช่องว่างนำหน้าหรือต่อท้าย

โปรแกรมหรือฟังก์ชั่นที่ได้รับอนุญาตในการเขียนโปรแกรมภาษา ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

หากเป็นไปได้โปรดระบุไฟล์ gif ที่แสดงผลลัพธ์หรือลิงก์เพื่อทดสอบโปรแกรม

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


4
เกิดอะไรขึ้นถ้ามันเป็นไปไม่ได้ที่จะเขียนทับ? เราสามารถใช้ 99 ลูกโป่งสีแดง ... ขึ้นบรรทัดใหม่ได้หรือไม่
ติตัส

@Titus เฉพาะในกรณีที่ล้างหน้าจอได้อย่างมีประสิทธิภาพและให้ความประทับใจในการย้ายข้อความ (gif ได้โปรด!)
Luis Mendo

"สิ่งนี้สามารถทำได้ด้วยวิธีการใด ๆ เช่นโดยการเขียนจำนวนบรรทัดใหม่ที่เหมาะสมเพื่อล้างหน้าจออย่างมีประสิทธิภาพ" - สิ่งนี้ไม่ได้ขึ้นอยู่กับขนาดคอนโซลหรือไม่ เป็นที่ยอมรับได้หรือไม่ในการพิมพ์บรรทัดใหม่หนึ่งบรรทัดถ้ามัน (พร้อมกับสี่เหลี่ยมถัดไป) หมายความว่าการทำซ้ำครั้งถัดไปแทนที่หนึ่งบรรทัดก่อนหน้า (ในคอนโซลขนาดเล็กของฉัน)?
Jonathan Allan

1
@ โจนาธานโอเคเพียงให้ gif กับคอนโซลนั้นเพื่อดูผลกระทบ
Luis Mendo

คำตอบ:


8

เยลลี่ , 74  65 ไบต์

“ÆÇÐÑ÷øœ‘Ṭœṗ⁸ṙ©-¤4421œ?U0¦;"⁷,⁶ẋ⁵¤¤ṁ9¤ȮœS.®ß
“9ɲcḟ#%⁴1t(ŀȷUCOw⁾»Ç

เวอร์ชัน Windows ทำงานในคอนโซล cp-65001 6 บรรทัดสูง
มีครึ่งวินาที (บวกกับการประเมินผล) หยุดชั่วคราวระหว่างการทำซ้ำ:

gif ของผลลัพธ์

อย่างไร?

“9ɲcḟ#%⁴1t(ŀȷUCOw⁾»Ç - Main link: no arguments
“9ɲcḟ#%⁴1t(ŀȷUCOw⁾»  - compression of [d( Happy)+d( birthday)+d( Raff)+s(aele)+d( Ce)+d(cc)+s(o)] - d=dictionaryLookup, s=stringEncode.
                     -              = " Happy birthday Raffaele Cecco"
                   Ç - call last link (1) as a monad

“ÆÇÐÑ÷øœ‘Ṭœṗ⁸ṙ©-¤4421œ?U0¦;"⁷,⁶ẋ⁵¤¤ṁ9¤ȮœS.®ß - Link 1, rotate, print, recurse: string s
                ¤                            - nilad followed by link(s) as a nilad:
            ⁸                                -   link's left argument (initially s)
               -                             -   literal -1
             ṙ                               -   rotate left -1 (e.g. "blah" -> "hbla")
              ©                              -   copy to register and yield
“ÆÇÐÑ÷øœ‘                                    - literal: [13,14,15,16,28,29,30]
         Ṭ                                   - untruth: [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1]
          œṗ                                 - partition right at truthy indexes of left
                                             -   chops up the rotated string into 8
                                             -   e.g. [" Happy birth",'d','a','y'," Raffaele Ce",'c','c','o'])
             4421œ?                          - get the 4421st permutation of those items
                                             -   e.g. [" Happy birth",'o','d','c','a','c','y'," Raffaele Ce"]
                         ¦                   - apply to indexes:
                        0                    -   0 (right most)
                       U                     -   upend  (e.g. " Raffaele Ce" -> "eC eleaffaR ")
                                     ¤       - nilad followed by link(s) as a nilad:
                                  ¤          -   nilad followed by link(s) as a nilad:
                                 ¤           -     nilad followed by link(s) as a nilad:
                              ⁶              -       literal space
                                ⁵            -       literal 10
                               ẋ             -       repeat: "          "
                            ⁷                -     literal new line
                             ,               -     pair: ['\n',"          "]
                                     9       -   literal 9
                                    ṁ        -   mould like: ['\n',"          ",'\n',"          ",'\n',"          ",'\n',"          ",'\n']
                           "                 - zip with:
                          ;                  -   concatenation
                                             -     e.g. [" Happy birth\n","o          ","d\n","c          ","a\n","c          ","y\n","eC eleaffaR           ","\n"])
                                      Ȯ      - print and yield
                                         .   - literal 0.5
                                       œS    - after sleeping right seconds yield left
                                          ®  - recall value from register (s rotated by 1)
                                           ß - call this link (1) with the same arity (as a monad)

16

HTML + ES6, 200 ไบต์

<pre id=o><script>setInterval(_=>o.innerHTML=(f=k=>k--?f(k)+(k<11?s[k]:k>47?s[74-k]:k%12?++k%12?' ':s[10+k/12]+`
`:s[30-k/12]):'')(60,s=s.slice(1)+s[0]),99,s="Happy birthday Raffaele Cecco ")</script>


มันดูดี!
Luis Mendo

@ LuisMendo ที่นำความทรงจำกลับมาแม้ว่าฉันจะจำ Cybernoid II ได้ดีกว่าอันแรก ฉันแน่ใจว่าฉันได้เห็นเอฟเฟกต์นี้ในแคร็กเกอร์สองสามครั้งเช่นกัน ;-)
Arnauld

ใช่ฉันชอบที่สอง :-)
Luis Mendo

11

ZX Spectrum BASIC, 187 ไบต์

น่ารำคาญที่ฟิลิปเอาชนะฉันไปได้ภายในสองสามนาที :-) ตัวเลขเหมือน\{15}รหัสควบคุมที่ไม่สามารถพิมพ์ได้ - รวบรวมกับzmakebasหากคุณต้องการคนจรจัด โปรดทราบว่าสี่เหลี่ยมผืนผ้าเต็มไม่ได้ถูกพิมพ์ออกมาทันที แต่จะอยู่ในตำแหน่งหลังจากเฟรมสองสามเฟรมแรก

1 let a$=" Happy birthday Raffaele Cecco":dim b$(code"\{15}"):dim c$(pi*pi)
3 let b$=a$(sgn pi)+b$:let a$=a$(val"2" to)+a$(sgn pi):print "\{0x16}\{0}\{0}";a$(to code"\{12}")'b$(sgn pi);c$;a$(val"13")'b$(val"2");c$;a$(code"\{14}")'b$(pi);c$;a$(len b$)'b$(val"4" to):go to pi

ลองที่นี่ (รุ่น JS- จำลองออนไลน์กด Enter เพื่อเริ่ม) ... http://jsspeccy.zxdemo.org/cecco/

นอกจากนี้คุณยังสามารถบันทึกสี่ไบต์ด้วยการล้างหน้าจอระหว่างเฟรมแทนการทำ PRINT AT แต่มันก็ไม่ดีเกินไปที่จะคุ้มค่า ...

1 let a$=" Happy birthday Raffaele Cecco":dim b$(code"\{15}"):dim c$(pi*pi)
3 let b$=a$(sgn pi)+b$:let a$=a$(val"2" to)+a$(sgn pi):cls:print a$(to code"\{12}")'b$(sgn pi);c$;a$(val"13")'b$(val"2");c$;a$(code"\{14}")'b$(pi);c$;a$(len b$)'b$(val"4" to):go to pi

1
อา แต่คุณชนะ bytes มากมาย :-)
Philip Kendall

2
ยินดีต้อนรับสู่ PPCG!
Martin Ender

1
ยินดีต้อนรับสู่เกม ZX ดีต่อการดูอยู่เสมอ คำตอบที่ดี +1
ElPedro

10

V, 75 71 70 ไบต์

บันทึกได้ 4 ไบต์ด้วย @DJMcMayhem

iHappy birthd
±± a
o±° y
c±± 
ceC eleaffaR6ògÓÉ {dêjP2Ljjx1Lp5LxkpGd

นี่คือลิงค์ TIO แต่โปรดทราบว่านี่จะไม่ทำงานบน TIO เพราะโปรแกรมวนซ้ำไม่สิ้นสุด ลองออนไลน์!

เนื่องจากรหัสนี้มี unprintables นี่คือ hexdump

00000000: 6948 6170 7079 2062 6972 7468 640a b1b1  iHappy birthd...
00000010: 2061 0a6f b1b0 2079 0a63 b1b1 200a 6365   a.o.. y.c.. .ce
00000020: 4320 656c 6561 6666 6152 1b36 f267 d3c9  C eleaffaR.6.g..
00000030: 207b 64ea 6a50 324c 166a 6a78 314c 7035   {d.jP2L.jjx1Lp5
00000040: 4c78 6b70 4764                           LxkpGd

เวลาพักเครื่องคือ 500 มิลลิวินาที

giffy


คุณสามารถให้ลิงค์ TIO ได้หรือไม่?
Rɪᴋᴇʀ

เคล็ดลับบางอย่าง (ไม่ได้ทดสอบทั้งหมด): ->H| -> และ->{<C-v>êx5L}
DJMcMayhem

นอกจากนี้คำสั่ง repchar ของคุณทั้งหมดใช้ 9 เมื่อคุณสามารถใช้ 10 หรือ 11 ตัวอย่างเช่นเปลี่ยนกลางสามบรรทัดเพื่อ±± a, o° yและc±±<space>
DJMcMayhem

@DJMcMayhem ทำงานทุกอย่าง แต่=>5L }
Kritixi Lithos

@Riker Done แต่โปรดทราบว่าลิงก์ TIO ไม่สามารถแสดงภาพเคลื่อนไหวได้
Kritixi Lithos

9

ZX Spectrum BASIC ขนาด 274 ไบต์

มีคนต้องทำ Pedants อาจต้องการตัดสิทธิ์สิ่งนี้เนื่องจากช้าเกินไปและไม่มีการหยุดระหว่างภาพเคลื่อนไหว แต่ฉันอ้างสิทธิ์กรณีพิเศษที่นี่ :-)

10 LET m$=" Happy birthday Raffaele Cecco": LET o=0: LET l=LEN m$: LET f=4: LET t=12: LET a=t+f: LET b=27
20 FOR j=SGN PI TO l: LET i=j+o: IF i>l THEN LET i=i-l
40 LET x=(i-SGN PI AND i<=t)+(11 AND i>t AND i<=a)+(b-i AND i>a AND i<=b)
50 LET y=(i-t AND i>t AND i<=a)+(f AND i>a AND i<=b)+(b+f-i AND i>b): PRINT AT y,x;m$(j): NEXT j
80 LET o=o+SGN PI: IF o>=l THEN LET o=o-l
90 GO TO t

ไม่เล่นกอล์ฟมากเช่นกัน 274 ไบต์คือจำนวนไบต์ที่บันทึกโดย Spectrum ไปยังเทปเมื่อบันทึกโปรแกรมนี้


1
คุณไปทุกปัญหาของการใช้SGN PIสำหรับ1(ประหยัด 5 bytes) แต่คุณลืมNOT PIสำหรับ0และVALสำหรับค่าคงที่อื่น ๆ ...
นีล

1
NOT PIฉันเพิ่งพลาด โดยเจตนาไม่ได้ทำVALอย่างที่มันช้าพอเหมือนเดิมและVALช้าอย่างน่ากลัว
Philip Kendall

1
ZX Basic ได้รับ upvote จากฉันเสมอ ไม่มีอวดรู้ที่นี่ ฉันจำวันเก่า ๆ ที่ดีได้ ... คำตอบที่ดี
ElPedro

8

SVG (HTML5), 267 ไบต์

<svg width=200 height=90><defs><path id=p d=M40,20h120v50h-120v-50h120v50h-120v-50></defs><text font-size="19" font-family="monospace"><textPath xlink:href=#p>Happy birthday Raffaele Cecco<animate attributeName=startOffset from=340 to=0 dur=5s repeatCount=indefinite>

มันเป็นรูปสี่เหลี่ยมผืนผ้าและเป็นปะรำและมันก็เป็นข้อความ ASCII ...


1
... และมันทำงานช้ามาก :-)
Luis Mendo

7

PHP, 184 ไบต์

for($r=" ";++$i;sleep(print chunk_split(str_pad($r,96,"
",0),12)),$r=$k="0")for(;$c="ABCDEFGHIJKWco{zyxwvutsrqpdXL@"[$k];)$r[ord($c)-64]="Happy Birthday Raffaele Cecco "[($i+$k++)%30];

พิมพ์ 39 บรรทัดใหม่เพื่อล้างหน้าจอ -nrทำงานด้วย
การหยุดชั่วคราวที่แท้จริงคือ 1 วินาที แต่ฉันเร่งความเร็ว gif

สุขสันต์วันเกิด

ungolfed

$p = "ABCDEFGHIJKWco{zyxwvutsrqpdXL@";  # (positions for characters)+64 to ASCII
$t = "Happy Birthday Raffaele Cecco ";  # string to rotate
for($r=" ";                     # init result to string
    ++$i;                       # infinite loop
    $r=$k="0")                      # 6. reset $r and $k
{
    for(;$c=$p[$k];)                # 1. loop through positions
        $r[ord($c)-64]=                 # set position in result
        $t[($i+$k++)%30];               # to character in string
    sleep(                          # 5. wait 1 second
        print                       # 4. print
            chunk_split(
            str_pad($r,96,"\n",0)   # 2. pad to 96 chars (prepend 36 newlines)
            ,12)                    # 3. insert newline every 12 characters
        );
}


5

Python 3 , 160 ไบต์

import time;s="Happy_birthday_Raffaele_Cecco_"
while[time.sleep(1)]:print(s[:12]+'\n%s%%11s'*3%(*s[:-4:-1],)%(*s[12:15],)+'\n'+s[-4:14:-1]+'\n'*30);s=s[1:]+s[0]

ลองออนไลน์! (ไม่มีภาพเคลื่อนไหว)


ฉันรู้ว่าคุณจะเข้ามาและเอาชนะฉันด้วย Python ฉันทำได้ดีมาก! อย่างน้อยฉันใช้ประโยชน์จาก "บั๊ก" ที่คุณไม่สามารถใช้กับ Python 3 :-) คำตอบที่ดีเช่นเคย +1
ElPedro

5

Python 2, 218 200 190 181 176 ไบต์

import time;f='Happy birthday Raffaele Cecco '
while[time.sleep(1)]:v=f[::-1];print'\n'*90,f[:12],''.join('\n'+a+' '*10+b for a,b in zip(v[:3],f[12:16])),'\n',v[3:15];f=f[1:]+f[0]

-18 ไบต์โดยการลบการstrจัดรูปแบบ

-10 ไบต์ขอขอบคุณ @Uriel และคำแนะนำ @ElPedro

-9 ไบต์โดยลบการจัดทำดัชนีเชิงลบ

-5 ไบต์โดยการจัดเก็บย้อนกลับfเป็นvและwhileเงื่อนไข

repl.it


1
คุณสามารถตัดช่องว่างระหว่างwhile 1:และprintและแทนที่;บรรทัดถัดไปด้วยการขึ้นบรรทัดใหม่ (จริง) f='H..ด้วย ยังf[:1]เป็นจริงf[0]เป็นจริง
Uriel

OP ระบุว่าเวลาสามารถเป็นอะไรก็ได้ระหว่าง 0.1 ถึง 1 วินาทีดังนั้นทำไมไม่time.sleep(1)ลองใช้ต่ำกว่า 200?
ElPedro


3

Python 2, 182 179 173 160 ไบต์

i="Happy birthday Raffaele Cecco "
while[s for s in i*18**4]:print'\n'*99,'\n'.join([i[:12]]+[i[-z]+' '*10+i[11+z]for z in 1,2,3]+[i[15:-3][::-1]]);i=i[1:]+i[0]

ลองใช้ที่ repl.it

ไม่ทำงานบน TIO ดังนั้นความพยายามครั้งแรกของฉันในการใช้repl.it

แก้ไขการใช้ลูป "เสียเวลา" เพื่อนับถึง 1000000 ให้ความล่าช้าที่สอดคล้องกันระหว่าง 0.1 และ 1sบนเครื่องของฉันและบนrepl.itและบันทึกการนำเข้าtimeและช่วยประหยัดการนำเข้าฉันเดาว่าถ้าคุณวิ่งบนคอมพิวเตอร์เก่า 286 ที่มี RAM 64MB มันอาจใช้เวลา 1 วินาที แต่ฉันค่อนข้างแน่ใจว่ามันจะไม่เกิดขึ้น ถ้าเป็นเช่นนั้นก็ลด 1000000 และบันทึกฉันสองสามไบต์ :-)

แก้ไข 2 -6 สำหรับการจดจำรายการนั้นใน Python 2 ทำให้ค่าสุดท้ายรั่วไหลsดังนั้นฉันจึงสามารถใช้งานได้ในภายหลังและยังจำได้ว่าอะไรที่ดีกว่า 0 และ "" นั้นเป็นความจริง ข้อบกพร่องหรือคุณสมบัติ? ไม่แคร์ มันช่วยฉันได้ 6 ไบต์ :-)

แก้ไข 3อีก 13 revering หมุนและโดยใช้ความเข้าใจรายการสำหรับแถวกลางภายในเข้าร่วมและการเปลี่ยนแปลง3000000ไป40**4ไปขอบคุณ @FelixDombek สำหรับคนสุดท้าย ต้องเสียเคล็ดลับความเข้าใจในรายการของฉัน


1
คุณสามารถใช้สัญลักษณ์ทางวิทยาศาสตร์หรือการแสดงออกทางอำนาจสำหรับจำนวนมากได้หรือไม่?
Felix Dombek

1
การแสดงออกของพลังงานใช่สัญกรณ์ทางวิทยาศาสตร์ไม่ใช่ (เพราะมันจะกลายเป็นลอยซึ่งคุณไม่สามารถคูณด้วยสตริง)
L3viathan

3
ข้อผูกมัด999999แทน1000000ไบต์: V
หมึกมูลค่า

ขอบคุณ @ValueInk แต่ด้วยการใช้รายการ "ความผิดพลาด" ที่เข้าใจได้จริงฉันต้องเพิ่มขึ้นเป็น 3000000 และยังคงบันทึกไว้ 3 ไบต์ :-)
ElPedro

น่าเสียดายที่ไม่มี @ L3viathan ถูกต้องกับสิ่งนั้น
ElPedro

2

รหัสเครื่องจักร ZX81 Z80, 158 130 ไบต์

ตกลงดังนั้นจึงมีจำนวนมากไบต์จนกว่าจะประกอบ แต่แล้วก็ลดลงถึง 130 ไบต์ ไม่แน่ใจว่ามันผิดกฎหรือไม่? มันโพสต์แรกของฉันและเฉพาะในฐานะแขก

โปรแกรมใช้ 'กำลังดุร้าย' เพื่อแสดงข้อความแทนที่จะใช้ฟังก์ชั่นที่ชาญฉลาดซึ่งสามารถมองเห็นได้จากวิธีที่มันมีโค้ดแยกต่างหากสำหรับบรรทัดบนสุดแนวตั้งขวามือบรรทัดล่างและแนวตั้งซ้าย อนิเมชั่นทำได้โดยหมุนเนื้อหาของข้อความจากนั้นแสดงหลังจากความล่าช้าสั้น ๆ ซึ่งน่าจะอยู่ที่ประมาณ 0.2 วินาทีเพราะมันรอ 10 เฟรมจากอัตรา 50 (สำหรับสเป็คของสหราชอาณาจักร Zeddys อยู่ดี)

ฉันต้องเครดิต kmurta สำหรับแนวคิดของการหมุนข้อความเพื่อรับภาพเคลื่อนไหว - ที่บันทึกได้ 28 ไบต์ !!!

main    
  ld hl,happyBirthday           ;load the address of the message
  ld de,(D_FILE)                ;load the base of screen memory
  inc de                        ;increase it by one to bypass the $76
  ld bc,12                  ;ready for 12 loops
  ldir                      ;transfer HL to DE 12 times and increase both accordingly
  ex de,hl                  ;put HL into DE (HL was the message position)
  ld b,4                        ;prepare to loop 4 times
  dec hl                        ;decrease HL (screen location) by 1
rightVertical
  push de                       ;save the character position
  ld de,13                  ;load 13 (for the next line)
  add hl,de                 ;add to HL  
  pop de                        ;get the message position back
  ld a,(de)                 ;load the character into A
  ld (hl),a                 ;save it to HL
  inc de                        ;increase the character position
  djnz rightVertical            ;repeat until B = 0
  dec hl                        ;decrease HL (screen location) by 1 to step back from the $76 char
  ld b,11                       ;prepare for 11 loops
lastLine
  ld a,(de)                 ;load the current character into A
  ld (hl),a                 ;save to the screen
  dec hl                        ;decrease the screen position (as we are going backwards)
  inc de                        ;increase character position
  djnz lastLine             ;repeat until B = 0
  ld b,3                        ;get ready for the left vertical
  inc hl                        ;increase the screen position by 1 as we have gone 1 too far to the left and wrapped to the line above
leftVertical
  push de                       ;save the character position
  ld de,13                  ;load 13 (for the next line)
  sbc hl,de                 ;subtract it to move up a line in memory
  pop de                        ;get the character pos back
  ld a,(de)                 ;load the character
  ld (hl),a                 ;save it to the screen
  inc de                        ;next character
  djnz leftVertical         ;repeat until B = 0 
delayCode
  ld   hl,FRAMES                ;fetch timer                 
  ld   a,(hl)                 ;load into A                        
  sub  10                       ;wait 10 full frames (0.2 of a second)
delayLoop        
  cp  (hl)                  ;compare HL to 0
  jr   nz,delayLoop         ;if not 0 then repeat until it is   
shuffleMessage
  ld a, (happyBirthday)     ;load the first character of the message
  push af                       ;save the first character of the message
  ld hl, happyBirthday      ;load the address of the message
  inc hl                        ;increase by one to get the second char
  ld de, happyBirthday      ;load the start of the message
  ld bc, 29                 ;number of times to loop
  ldir                      ;load HL (char 2) into DE (char 1) and repeat
  pop af                        ;get char 1 back    
  ld (de),a                 ;out it at the end of the string
  jr main                       ;repeat
happyBirthday
    DEFB    _H,_A,_P,_P,_Y,__,_B,_I,_R,_T,_H,_D,_A,_Y,__,_R,_A,_F,_F,_A,_E,_L,_E,__,_C,_E,_C,_C,_O,__

ขออภัยฉันไม่สามารถโพสต์ลิงก์ไปยังมันทำงานเนื่องจากเป็นโปรแกรมที่รวบรวมในรูปแบบ. P สำหรับ EightyOne (หรืออีมูเลเตอร์อื่น ๆ ) หรือ Zeddy จริงหากคุณมี ZXPand หรือคล้ายกับโหลด

สามารถดาวน์โหลด. P ได้ที่ http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988


คำตอบที่ดี! ฉันหายไปหนึ่งในรหัสเครื่อง Z80 :-) และยินดีต้อนรับสู่เว็บไซต์!
Luis Mendo

คุณอาจให้ gif ของโปรแกรมที่ทำงานอยู่หรือไม่?
Luis Mendo

ขออภัยฉันไม่มีซอฟต์แวร์สร้าง gif!
Lardo Boffin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.