Doğum günün kutlu olsun, Raffaele Cecco!


33

Raffaele Cecco üretilen bir programcı olan bazı ait en iyi video oyunları ZX Spectrum seksenli yılların sonlarında bilgisayara. Diğerlerinin yanı sıra çok beğenilen Cybernoid ve Exolon'u geliştirdi .

Raffaele 10 Mayıs 2017'de 50 yaşına basıyor . Bu zorluk onun için küçük bir hediye, çoğumuzun bu muhteşem oyunları oynamak için harcadığı mutlu saatler ve getirdikleri motivasyon için.

Meydan okuma

Amaç, Cybernoid'in ana menü ekranında görüldüğü esnada , ancak ASCII sanatında esinlenerek tasarlanmış dikdörtgen bir çerçeve üretmektir .

Spesifik olarak, dize "Happy birthday Raffaele Cecco "(son boşluğu not edin), enstantaneler arasında sabit bir duraklama süresi olan 12 x 5 dikdörtgenin kenarları boyunca dönen gösterilecektir.

Örneğin, metnin saat yönünde gösterildiğini ve saat yönünün tersine döndürüldüğünü varsayarsak (aşağıdaki seçeneklere bakın), dikdörtgen çerçevenin arka arkaya üç anlık görüntüsü:

Happy birthd
           a
o          y
c           
ceC eleaffaR

sonra

appy birthda
H          y

o          R
cceC eleaffa

sonra

ppy birthday
a           
H          R
           a
occeC eleaff

ve bunun gibi.

kurallar

Giriş alınmayacak. Çıktı STDOUT veya eşdeğeri veya bir grafik penceresinde olacaktır.

Çıktı aslında dönen metni göstermelidir; olduğunu, her yeni anlık gerektiğini üzerine hareket izlenimi vermek için bir önceki. Bu, herhangi bir yolla, örneğin ekranı etkin bir şekilde silmek için uygun sayıda yeni satır yazarak yapılabilir. Bunun yalnızca belirli bir ekran boyutu için geçerli olması kabul edilebilir; sadece cevapta belirtin.

Aşağıdaki seçenekler kabul edilir:

  • Metin saat yönünde veya saat yönünün tersinde görüntülenebilir ve saat yönünde veya saat yönünün tersine döndürülebilir (yukarıdaki örnek anlık görüntüler, saat yönünde gösterildiğini ve saat yönünün tersine döndüğünü varsayar).
  • Dönme döngüsel olarak sonsuz bir döngüde devam etmelidir (program durdurulana kadar) ve herhangi bir aşamada başlayabilir.
  • Anlık görüntüler arasında duraklama süresi yaklaşık olarak sabit olmalıdır, ancak 0.1 ve 1 s arasında serbestçe seçilebilir. İlk anlık görüntüyü görüntülemeden önce yapılan ilk duraklama kabul edilebilir.
  • Harfler büyük, küçük veya karışık olabilir (yukarıdaki örnekte olduğu gibi).
  • Önde gelen veya takip eden boş alana izin verilir.

Herhangi bir programlama dilinde programlara veya fonksiyonlara izin verilir . Standart boşluklar yasaktır.

Mümkünse, çıktıyı gösteren bir gif dosyası veya programı test etmek için bir bağlantı verin.

Bayt cinsinden en kısa kod kazanır.


4
Ya üzerine yazmak imkansızsa? 99 tane kırmızı balon kullanabilir miyiz?
Titus

@Titus Yalnızca bu ekranı etkili bir şekilde temizlerse ve hareketli metin izlenimi verirse (lütfen gif!)
Luis Mendo

“Bu, herhangi bir yolla, örneğin ekranı etkin bir şekilde silmek için uygun sayıda yeni satır yazarak yapılabilir.” - Bu konsolun büyüklüğüne bağlı değil mi? Bir sonraki satırın bir sonraki yinelemenin ( küçük konsolumda) yerini alması anlamına gelirse (sonraki dikdörtgenin yanında) bir satırın yazdırılması kabul edilebilir mi?
Jonathan Allan,

1
@Jonathan Tamam, etkisini görmek için o konsolu bir gif verin
Luis Mendo

Yanıtlar:


8

Jöle , 74  65 bayt

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

Windows sürümü 6 satır yüksek cp-65001 konsolunda çalışıyor.
Yinelemeler arasında yarım saniye (artı değerlendirme) duraklaması vardır:

gif of output

Nasıl?

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

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


Harika görünüyor!
Luis Mendo

@LuisMendo Cybernoid II'yi birincisinden daha iyi hatırlasam da, bu anıları geri getiriyor. Eminim bu etki birkaç çatlakta da gördüm. ;-)
Arnauld

Evet, ayrıca
ikinciyi

11

ZX Spektrumu BASIC, 187 bayt

Philip'in birkaç dakika beni geçmesi beni rahatsız etti :-) Gibi sayılar \{15}yazdırılamaz kontrol kodlarıdır - incelemek istiyorsanız zmakebas ile derleyin . Tam dikdörtgenin hemen yazdırılmadığını, ancak ilk birkaç kareden sonra yerine düştüğünü unutmayın.

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

Burada deneyin (çevrimiçi JS öykünmüş versiyonu, başlamak için enter tuşuna basın) ... http://jsspeccy.zxdemo.org/cecco/

Ayrıca, bir PRINT AT yapmak yerine ekranı çerçeveler arasında temizleyerek dört bayttan tasarruf edebilirsiniz, ancak buna değmek için çok titrek.

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
Ah, ama çok fazla byte kazandın :-)
Philip Kendall

2
PPCG'ye Hoşgeldiniz!
Martin Ender

1
Oyuna hoş geldin. ZX her zaman görmek iyidir. Güzel cevap +1.
ElPedro

10

V, 75 71 70 bayt

@DJMcMayhem sayesinde 4 bayt kurtarıldı

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

İşte bir TIO bağlantısı, ancak bunun programın sonsuz döngüye girmesi nedeniyle bunun TIO'da işe yaramayacağına dikkat edin. Çevrimiçi deneyin!

Bu kod yazdırılamaz olduğundan, burada bir hexdump bulunmaktadır.

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

Uyku süresi 500 milisaniyedir.

giffy


Bir TIO linki verebilir misin?
Rɪᴋᴇʀ

Bazı ipuçları (tümü test edilmemiş): H|-> {. <C-v>êx-> , ve 5L->}
DJMcMayhem

Orta üç satırı değiştirin: Ayrıca, repchar komutları tüm 10 veya Örneğin 11. kullanabilirsiniz zaman 9 kullanıyorsanız ±± a, o° yvec±±<space>
DJMcMayhem

@DJMcMayhem Her şey çalışıyor ama 5L=> }.
Kritixi Lithos,

@Riker Bitti, ancak TIO bağlantısının animasyonu gösteremediğini unutmayın
Kritixi Lithos

9

ZX Spektrumu BASIC, 274 bayt

Birisi yapmak zorundaydı. Soyguncular bunu çok yavaş olduğu ve animasyonlar arasında duraklamadığı için diskalifiye etmek isteyebilirler, ama burada özel bir durum olduğunu iddia ediyorum :-)

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

Ya da çok golf değil. 274 bayt, Spektrum tarafından bu programı kaydederken teybe kaydetmek için kaydedilen bayt sayısıdır.


1
Kullanarak tüm sorun gitti SGN PIiçin 1(5 bayt kaydeder) ama unuttum NOT PIiçin 0ve VAL... diğer sabitleri için
Neil

1
NOT PISadece özledim. Kasıtlı VALolarak, olduğu gibi yavaştı ve VALçok yavaştı.
Philip Kendall

1
ZX Basic her zaman benden bir şeyler alır. Burada bilgiçlik yok. Eski güzel günleri hatırlıyorum ... Güzel cevap.
ElPedro

8

SVG (HTML5), 267 bayt

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

Eh, o ise dikdörtgen ve olan bir çadır ve bir ASCII metin ...


1
... ve smooooth :-) çalışır
Luis Mendo

7

PHP, 184 bayt

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

ekranı temizlemek için 39 yeni satır yazdırır; ile koş -nr.
Gerçek duraklama 1 saniyedir; ama GIF'i hızlandırdım.

HappyBirthday

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

6

Python 2, 230 184 bayt

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

Repl.it adresinde deneyin

enter image description here


5

Python 3 , 160 bayt

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]

Çevrimiçi deneyin! (Animasyon yok)


Gelip beni Python ile yeneceğini biliyordum. Çok iyi gidiyordum! En azından benimki Python 3 :-) ile kullanamayacağın "böcekleri" kullanıyor. Her zamanki gibi güzel cevap. +1
ElPedro

5

Python 2, 218 200 190 181 176 bayt

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 bayt kaldırarak str biçimlendirme

-10 bayt, @Uriel ve @ElPedro önerileri sayesinde

-9 negatif indeksleme kaldırarak bayt

-5 ters depolayarak bayt folarak vve whiledurumu

repl.it


1
Sen arasında boşluk kesebilir while 1:ve printbir sonraki yerini ;bir (gerçek) yeni satır ile. Ayrıca f='H... Ayrıca f[:1]gerçektir f[0].
Uriel

OP, zamanın 0.1 ile 1 saniye arasında herhangi bir şey olabileceğini, bu yüzden neden time.sleep(1)200'ün altında sürmüyor?
ElPedro

3

Ruby + GNU Core Utils, 136 bayt

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}

3

Python 2,182 179 173 160 bayt

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

TIO üzerinde çalışmadığı için repl.it kullanmaya başladım.

Düzenleme 1000000'e kadar saymak için bir "zaman kaybediyor" döngü kullanmak, tutarlı bir gecikme sağlar , makinemde ve repl.it'te 0.1 ile 1s arasında ve içe aktarma işleminden tasarruf sağlar time. Sanırım 64 MB RAM'e sahip eski bir 286 bilgisayarda çalıştırırsanız 1 saniyeden fazla sürebilir ancak bunun gerçekleşmeyeceğinden eminim. Olursa, 1000000'ü azaltın ve birkaç bayt kurtarın :-)

Düzenleme 2 -6 son değerini sızıntı Python 2 için ortaya Liste comprehensions hatırlamak için sdaha sonra kullanabilirsiniz böylece ve ayrıca 0 dışında ve oldukça iyi şey "" truthy olduğunu hatırlayarak. Hatalar veya özellikler? Umurunda değil Beni 6 bayt kurtardı :-)

Düzenleme 3 rotasyonu revering tarafından ve katılmak içindeki orta sıralar için bir liste kavrayışa ve değiştirerek başka 13 3000000kadar 40**4. Sonuncusu için @FelixDombek'e teşekkürler. Yine de listem anlama becerisini kaybetmek zorunda kaldım.


1
Büyük sayı için bilimsel gösterimi veya bir güç ifadesini kullanabilir misiniz?
Felix Dombek

1
Güç ifadesi evet, bilimsel gösterim yok (çünkü dizelerle çarpılamayacağınız bir kayan nokta haline gelir).
L3viathan

3
Bir bayt 999999yerine zorunlu 1000000: V
Değerli Mürekkep

Thanks @ValueInk ama sızdıran listesi anlama "hata" kullanarak aslında ben aslında 3000000 artırmak zorunda kaldı ve yine de 3 byte kaydetti :-)
ElPedro

Ne yazık ki hayır. @ L3viathan bu konuda haklı.
ElPedro

2

ZX81 Z80 makine kodu, 158 130 bayt

Tamam, böylece toplanana kadar çok sayıda bayt var, ancak sonra 130 bayta düşer. Bunun herhangi bir kuralı ihlal ettiğinden emin değil misin? Bu benim ilk gönderim ve sadece misafir olarak.

Program, akıllı fonksiyon kullanımı yerine mesajı görüntülemek için 'kaba kuvvet' kullanır; üst satır, sağ el dikey, alt satır ve sol el dikey için ayrı kod parçaları görüldüğü gibi görülebilir. Animasyon, mesajın içeriği döndürülerek ve kısa bir gecikmeden sonra sadece 50 saniyelik 10 kareyi beklerken neredeyse tam 0,2 saniye sürmesiyle görüntülenmesiyle elde edilir (yine de İngiltere özel Zeddys için).

Animasyonu almak için mesajı döndürme kavramı için kmurta'ya kredi vermem gerekiyor - bu 28 bayt kurtardı !!!

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

Maalesef EightyOne (veya diğer emülatörler) için .P biçiminde derlenmiş bir program veya yüklemek için ZXPand kullanıyorsanız veya gerçek bir Zeddy olduğu için çalışan bir bağlantı gönderemiyorum.

.P, http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988 adresinden indirilebilir.


Güzel cevap! Z80 kodunda bir tane eksik vardı :-) Ve sitemize hoş geldiniz!
Luis Mendo,

Çalışan program hakkında bir gif verebilir misiniz?
Luis Mendo

Maalesef, hiçbir yazılım oluşturma yazılımım yok!
Lardo Boffin,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.