Selamat ulang tahun, Raffaele Cecco!

33

Raffaele Cecco adalah programmer yang menghasilkan beberapa dari yang terbaik video game untuk ZX Spectrum komputer di akhir tahun delapan puluhan. Di antara yang lain, ia mengembangkan Cybernoid dan Exolon yang sangat terkenal .

Raffaele berusia 50 tahun pada 10 Mei 2017 . Tantangan ini merupakan penghargaan kecil baginya, untuk jam-jam bahagia yang banyak dari kita habiskan memainkan game-game hebat itu, dan untuk motivasi yang mereka bawa.

Tantangan

Tujuannya adalah untuk menghasilkan tenda persegi panjang yang terinspirasi oleh yang terlihat di layar menu utama Cybernoid , tetapi dalam seni ASCII.

Secara khusus, string "Happy birthday Raffaele Cecco "(perhatikan ruang terakhir) akan ditampilkan berputar di sepanjang tepi persegi panjang 12 × 5, dengan waktu jeda yang konstan antara foto.

Misalnya, dengan asumsi teks ditampilkan searah jarum jam dan diputar berlawanan arah jarum jam (lihat opsi di bawah), berikut adalah tiga potret berturut-turut tenda persegi panjang:

Happy birthd
           a
o          y
c           
ceC eleaffaR

kemudian

appy birthda
H          y

o          R
cceC eleaffa

kemudian

ppy birthday
a           
H          R
           a
occeC eleaff

dan seterusnya.

Aturan

Tidak ada input yang akan diambil. Output akan melalui STDOUT atau setara, atau dalam jendela grafis.

Keluaran harus benar-benar menggambarkan teks berputar; artinya, setiap snapshot baru harus menimpa yang sebelumnya untuk memberi kesan gerakan. Ini dapat dilakukan dengan cara apa pun, misalnya, dengan menulis jumlah baris baru yang sesuai untuk membersihkan layar secara efektif. Dapat diterima jika ini hanya berlaku untuk ukuran layar tertentu; sebutkan saja dalam jawaban.

Opsi berikut diterima:

  • Teks dapat ditampilkan searah atau berlawanan arah jarum jam, dan dapat diputar searah atau berlawanan arah jarum jam (contoh foto di atas menganggap tampilan searah jarum jam dan berputar berlawanan arah jarum jam).
  • Rotasi harus berjalan secara siklikal dalam infinite loop (hingga program dihentikan), dan dapat dimulai pada fase apa pun.
  • Jeda waktu antara foto harus kira-kira konstan, tetapi dapat dipilih secara bebas antara 0,1 dan 1 detik. Jeda awal sebelum menampilkan foto pertama dapat diterima.
  • Huruf dapat berupa huruf besar, huruf kecil atau campuran (seperti pada contoh di atas).
  • Ruang kosong terkemuka atau tertinggal diizinkan.

Program atau fungsi diizinkan, dalam bahasa pemrograman apa pun . Celah standar dilarang.

Jika memungkinkan, berikan file gif yang memperlihatkan output, atau tautan untuk menguji program.

Kode terpendek dalam byte menang.

Luis Mendo
sumber
4
Bagaimana jika tidak mungkin ditimpa? Bisakah kita menggunakan 99 balon merah er ... baris baru?
Titus
@Titus Hanya jika itu secara efektif membersihkan layar dan memberikan kesan memindahkan teks (gif please!)
Luis Mendo
"Ini bisa dilakukan dengan cara apa pun, misalnya, dengan menulis jumlah baris baru yang sesuai untuk membersihkan layar secara efektif." - bukankah ini tergantung pada ukuran konsol? Apakah bisa mencetak satu baris baru jika (bersama dengan persegi panjang berikutnya) berarti iterasi berikutnya menggantikan yang sebelumnya (di konsol kecil saya )?
Jonathan Allan
1
@ Jonathan Ok, cukup berikan gif konsol itu untuk melihat efeknya
Luis Mendo

Jawaban:

8

Jelly , 74  65 byte

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

Versi Windows berjalan di konsol 6 baris cp-65001 tinggi.
Ada jeda setengah detik (plus evaluasi) antara iterasi:

gif output

Bagaimana?

“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)
Jonathan Allan
sumber
16

HTML + ES6, 200 byte

<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>

Arnauld
sumber
Itu terlihat sangat bagus!
Luis Mendo
@LuisMendo Itu membawa kembali kenangan, meskipun saya ingat Cybernoid II lebih baik daripada yang pertama. Saya yakin saya telah melihat efek ini di beberapa cracktros juga. ;-)
Arnauld
Ya, saya juga lebih suka yang kedua :-)
Luis Mendo
11

ZX Spectrum BASIC, 187 byte

Kesal karena Philip mengalahkan saya dalam beberapa menit :-) Angka-angka seperti \{15}adalah kode kontrol yang tidak dapat dicetak - kompilasi dengan zmakebas jika Anda ingin bermain-main. Perhatikan bahwa persegi panjang penuh tidak segera dicetak, tetapi jatuh ke tempatnya setelah beberapa frame pertama.

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

Cobalah di sini (versi emulasi JS online, tekan enter untuk memulai) ... http://jsspeccy.zxdemo.org/cecco/

Anda juga dapat menyimpan empat byte dengan membersihkan layar di antara bingkai alih-alih melakukan PRINT AT, tetapi terlalu kedipan untuk sia-sia ...

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
tukang gas
sumber
1
Ah, tetapi Anda menang dengan banyak byte :-)
Philip Kendall
2
Selamat datang di PPCG!
Martin Ender
1
Selamat datang di game. ZX selalu baik untuk dilihat. Jawaban bagus. +1.
ElPedro
10

V, 75 71 70 byte

4 byte disimpan berkat @DJMcMayhem

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

Berikut ini adalah tautan TIO, tetapi perhatikan bahwa ini tidak akan berfungsi pada TIO karena programnya loop tanpa batas. Cobalah online!

Karena kode ini mengandung unsintables, inilah 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

Waktu tidur adalah 500 milidetik.

sangat cantik

Kritixi Lithos
sumber
Bisakah Anda memberikan tautan TIO?
R
Beberapa tips (tidak semua diuji): H|-> {. <C-v>êx-> , dan 5L->}
DJMcMayhem
Juga, perintah repchar Anda semua menggunakan 9 ketika Anda bisa menggunakan 10 atau 11. Sebagai contoh: mengubah tiga baris menengah ke ±± a, o° ydanc±±<space>
DJMcMayhem
@DJMcMayhem Semuanya berfungsi tetapi 5L=> }.
Kritixi Lithos
@Riker Selesai, tetapi perhatikan bahwa tautan TIO tidak dapat menampilkan animasi
Kritixi Lithos
9

ZX Spectrum BASIC, 274 byte

Ya, seseorang harus melakukannya. Pedant mungkin ingin mendiskualifikasi ini karena terlalu lambat dan tidak memiliki jeda antara animasi, tapi saya mengklaim kasus khusus di sini :-)

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

Tidak terlalu golf juga. 274 byte adalah jumlah byte yang disimpan oleh Spectrum untuk direkam saat menyimpan program ini.

Philip Kendall
sumber
1
Anda pergi ke semua kesulitan menggunakan SGN PIuntuk 1(menghemat 5 byte) tetapi Anda lupa NOT PIuntuk 0dan VALuntuk konstanta lainnya ...
Neil
1
NOT PISaya baru saja melewatkan. Sengaja tidak melakukan VALapa yang lambat, dan VALsangat lambat.
Philip Kendall
1
ZX Basic selalu mendapat dukungan dari saya. Tidak ada pedantisme di sini. Saya ingat masa lalu yang indah ... Jawaban yang bagus.
ElPedro
8

SVG (HTML5), 267 byte

<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>

Yah, itu adalah persegi panjang, dan itu adalah tenda, dan itu adalah teks ASCII ...

Neil
sumber
1
... dan berjalan lancar :-)
Luis Mendo
7

PHP, 184 byte

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];

mencetak 39 baris baru untuk menghapus layar; jalankan bersama -nr.
Jeda yang sebenarnya adalah 1 detik; tapi aku mempercepat gif.

Selamat ulang tahun

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
        );
}
Titus
sumber
6

Python 2, 230 184 byte

import time
s='Happy birthday Raffaele Cecco '*2
i=0
while[time.sleep(1)]:print'\n'*30+'\n'.join([s[i:i+12]]+[s[i-n]+' '*10+s[i+11+n]for n in 1,2,3]+[s[(i+15)%30:][11::-1]]);i+=1;i%=30

Cobalah di repl.it

masukkan deskripsi gambar di sini

ovs
sumber
5

Python 3 , 160 byte

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]

Cobalah online! (Tidak ada animasi)

Tidak
sumber
Saya agak tahu Anda akan datang dan memukuli saya dengan Python. Saya melakukannya dengan sangat baik! Setidaknya saya menggunakan "bug" yang tidak dapat Anda gunakan dengan Python 3 :-). Jawaban yang bagus seperti biasa. +1
ElPedro
5

Python 2, 218 200 190 181 176 byte

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 byte dengan menghapus str pemformatan

-10 byte, terima kasih atas saran @Uriel dan @ElPedro

-9 byte dengan menghapus pengindeksan negatif

-5 byte dengan menyimpan terbalik fsebagai vdanwhile kondisi

repl.it

Wondercricket
sumber
1
Anda dapat memotong spasi putih di antara while 1:dan printdan mengganti yang berikutnya ;dengan baris (aktual). Juga f='H... Juga f[:1]sebenarnya f[0].
Uriel
OP menyatakan bahwa waktu dapat berkisar antara 0,1 dan 1 detik, jadi mengapa tidak time.sleep(1)mengambilnya di bawah 200?
ElPedro
3

Ruby + GNU Core Utils, 136 byte

s='Happy birthday Raffaele Cecco '
loop{puts`clear`+s[0,12],(0..2).map{|i|s[~i]+' '*10+s[12+i]},s[15,12].reverse
s=s[1,29]+s[0];sleep 1}
Nilai Tinta
sumber
3

Python 2, 182 179 173 160 byte

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]

Cobalah di repl.it

Tidak berfungsi pada TIO jadi upaya pertama saya menggunakan repl.it

Edit Menggunakan loop "membuang-buang waktu" untuk menghitung hingga 1000000 memberikan penundaan yang konsisten antara 0,1 dan 1 pada mesin saya dan pada repl.it dan menyimpan importime . Saya kira jika Anda menjalankannya pada komputer 286 tua dengan RAM 64MB mungkin akan lebih dari 1 detik tapi saya cukup yakin itu tidak akan terjadi. Jika tidak maka cukup kurangi 1000000 dan selamatkan saya beberapa byte :-)

Edit 2 -6 untuk mengingat bahwa daftar pemahaman dalam Python 2 membocorkan nilai terakhirs sehingga saya dapat menggunakannya nanti dan juga mengingat bahwa apa pun selain 0 dan "" benar. Bug atau fitur? Tidak peduli Ini menyelamatkan saya 6 byte :-)

Sunting 3 Lain-lain 13 dengan menghormati rotasi dan dengan menggunakan pemahaman daftar untuk baris tengah di dalam bergabung dan berubah 3000000menjadi 40**4. Terima kasih kepada @FelixDombek untuk yang terakhir. Harus kehilangan trik pemahaman daftar saya.

ElPedro
sumber
1
Bisakah Anda menggunakan notasi ilmiah atau ungkapan kekuatan untuk angka besar?
Felix Dombek
1
Ekspresi kekuatan ya, notasi ilmiah tidak (karena itu menjadi pelampung, yang tidak dapat Anda gandakan dengan string).
L3viathan
3
Wajib 999999alih-alih 1000000untuk byte: V
Nilai Tinta
Terima kasih @ValueInk tetapi dengan menggunakan "bug" daftar bocor Aku benar-benar harus meningkat menjadi 3000000 dan masih menyimpan 3 byte :-)
ElPedro
Sayangnya tidak ada. @ L3viathan benar tentang hal itu.
ElPedro
2

Kode mesin ZX81 Z80, 158 130 byte

OK jadi ia memiliki banyak byte hingga terpasang tetapi kemudian turun menjadi 130 byte. Tidak yakin apakah itu melanggar aturan? Ini adalah posting pertama saya dan hanya sebagai tamu.

Program ini menggunakan 'brute force' untuk menampilkan pesan daripada penggunaan fungsi pintar seperti yang dapat dilihat dari cara ia memiliki potongan kode yang terpisah untuk baris atas, vertikal tangan kanan, garis bawah dan vertikal tangan kiri. Animasi ini dicapai dengan memutar konten pesan dan kemudian hanya menampilkannya setelah jeda singkat yang seharusnya cukup tepat 0,2 detik karena menunggu 10 frame dari kecepatan 50 (untuk spesifikasi Inggris Zeddys tetap).

Saya harus menghargai kmurta untuk konsep memutar pesan untuk mendapatkan animasi - yang menyelamatkan 28 byte !!!

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,__

Maaf saya tidak dapat memposting tautan untuk menjalankannya karena ini adalah program yang dikompilasi dalam format .P untuk EightyOne (atau emulator lain) atau Zeddy yang sebenarnya jika Anda memiliki ZXPand atau sejenisnya untuk memuatnya.

.P dapat diunduh di http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988

Lardo Boffin
sumber
Jawaban bagus! Saya kehilangan satu di kode mesin Z80 :-) Dan selamat datang di situs!
Luis Mendo
Bisakah Anda memberikan gif program yang sedang berjalan?
Luis Mendo
Maaf - Saya tidak memiliki perangkat lunak pembuatan gif!
Lardo Boffin