Wszystkiego najlepszego, Raffaele Cecco!

33

Raffaele Cecco jest programistą, który pod koniec lat osiemdziesiątych wyprodukował jedne z najlepszych gier wideo dla komputera ZX Spectrum . Między innymi, rozwinął się dużym uznaniem Cybernoid i Exolon .

Raffaele kończy 50 maja 10 maja 2017 r . To wyzwanie jest dla niego małym hołdem dla szczęśliwych godzin, które wielu z nas spędzało, grając w te wspaniałe gry, oraz dla motywacji, jaką przynieśli.

Wyzwanie

Celem jest stworzenie prostokątnej markizy inspirowanej tym, co widać na głównym ekranie menu Cybernoida , ale w sztuce ASCII.

W szczególności łańcuch "Happy birthday Raffaele Cecco "(zwróć uwagę na ostatnią spację) będzie obracał się wzdłuż krawędzi prostokąta 12 × 5, ze stałym czasem przerwy między migawkami.

Na przykład, zakładając, że tekst jest wyświetlany zgodnie z ruchem wskazówek zegara i obracany przeciwnie do ruchu wskazówek zegara (patrz opcje poniżej), oto trzy kolejne migawki prostokątnej markizy:

Happy birthd
           a
o          y
c           
ceC eleaffaR

następnie

appy birthda
H          y

o          R
cceC eleaffa

następnie

ppy birthday
a           
H          R
           a
occeC eleaff

i tak dalej.

Zasady

Nie zostaną pobrane żadne dane wejściowe. Dane wyjściowe będą przesyłane przez STDOUT lub równoważne, lub w oknie graficznym.

Dane wyjściowe powinny faktycznie przedstawiać obracający się tekst; to znaczy, każda nowa migawka powinna zastąpić poprzednią, aby sprawiać wrażenie ruchu. Można to zrobić w dowolny sposób, na przykład pisząc odpowiednią liczbę znaków nowej linii, aby skutecznie wyczyścić ekran. Jest to dopuszczalne, jeśli jest to ważne tylko dla danego rozmiaru ekranu; po prostu podaj to w odpowiedzi.

Akceptowane są następujące opcje:

  • Tekst może być wyświetlany zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara i może być obracany zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara (przykładowe migawki powyżej zakładają wyświetlanie zgodnie z ruchem wskazówek zegara i obracanie w lewo).
  • Obracanie powinno następować cyklicznie w nieskończonej pętli (aż do zatrzymania programu) i może rozpocząć się w dowolnej fazie.
  • Czas pauzy między migawkami powinien być w przybliżeniu stały, ale można go dowolnie wybierać między 0,1 a 1 s. Dopuszczalna jest początkowa pauza przed wyświetleniem pierwszej migawki.
  • Litery mogą być dużymi, małymi lub mieszanymi (jak w powyższym przykładzie).
  • Wiodące lub końcowe puste miejsce jest dozwolone.

Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.

Jeśli to możliwe, podaj plik gif przedstawiający dane wyjściowe lub link do przetestowania programu.

Najkrótszy kod w bajtach wygrywa.

Luis Mendo
źródło
4
Co jeśli niemożliwe jest zastąpienie? Czy możemy użyć 99 czerwonych balonów ... nowych linii?
Tytus
@Titus Tylko jeśli to skutecznie wyczyści ekran i sprawi wrażenie poruszającego się tekstu (gif, proszę!)
Luis Mendo
„Można to zrobić w dowolny sposób, na przykład pisząc odpowiednią liczbę znaków nowej linii, aby skutecznie wyczyścić ekran.” - czy to nie zależy od wielkości konsoli? Czy można wydrukować jeden nowy wiersz, jeśli (wraz z następnym prostokątem) oznacza, że ​​następna iteracja zastępuje poprzednią (w mojej małej konsoli)?
Jonathan Allan
1
@Jonathan Ok, po prostu podaj gif z tą konsolą, aby zobaczyć efekt
Luis Mendo

Odpowiedzi:

8

Galaretka , 74  65 bajtów

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

Wersja systemu Windows działająca w 6-liniowej konsoli cp-65001.
Pomiędzy iteracjami trwa pół sekundy (plus ocena):

gif produkcji

W jaki sposób?

“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
źródło
16

HTML + ES6, 200 bajtów

<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
źródło
Wygląda świetnie!
Luis Mendo,
@LuisMendo To przywraca wspomnienia, chociaż pamiętam Cybernoid II lepiej niż pierwsze. Jestem pewien, że widziałem ten efekt również w kilku cracktrosach. ;-)
Arnauld
Tak, wolałem też drugi :-)
Luis Mendo
11

ZX Spectrum BASIC, 187 bajtów

Zirytowany, że Philip pobił mnie do tego o kilka minut :-) Numery takie jak \{15}to nie drukowalne kody kontrolne - skompiluj ze zmakebas, jeśli chcesz majstrować. Zauważ, że pełny prostokąt nie jest drukowany natychmiast, ale wpada na miejsce po kilku pierwszych klatkach.

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

Wypróbuj tutaj (wersja emulowana JS online, naciśnij Enter, aby rozpocząć) ... http://jsspeccy.zxdemo.org/cecco/

Możesz także zapisać cztery bajty, czyszcząc ekran między ramkami zamiast DRUKOWAĆ AT, ale jest zbyt migotliwy, aby był tego wart ...

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
monter
źródło
1
Ach, ale wygrywasz dużo bajtów :-)
Philip Kendall
2
Witamy w PPCG!
Martin Ender
1
Witamy w grze. ZX jest zawsze dobrze widoczny. Niezła odpowiedź. +1.
ElPedro
10

V, 75 71 70 bajtów

4 bajty zapisane dzięki @DJMcMayhem

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

Oto link do TIO, ale pamiętaj, że to nie zadziała w TIO, ponieważ program zapętla się w nieskończoność. Wypróbuj online!

Ponieważ ten kod zawiera niedrukowalne, oto zrzut heksowy.

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

Czas snu wynosi 500 milisekund.

giffy

Kritixi Lithos
źródło
Czy możesz podać link do TIO?
Rɪᴋᴇʀ
Kilka wskazówek (nie wszystkie przetestowane): H|-> {. <C-v>êx-> i 5L->}
DJMcMayhem
Również twoje polecenia repchar są za pomocą 9, gdy można użyć 10 lub 11. Na przykład: zmiana środkowe trzy linie ±± a, o° yic±±<space>
DJMcMayhem
@DJMcMayhem Wszystko działa, ale 5L=> }.
Kritixi Lithos
@Riker Gotowe, ale zauważ, że link TIO nie może wyświetlić animacji
Kritixi Lithos
9

ZX Spectrum BASIC, 274 bajty

Cóż, ktoś musiał to zrobić. Pedanci mogą chcieć zdyskwalifikować to za zbyt powolne działanie i brak przerwy między animacjami, ale tutaj zgłaszam specjalny przypadek :-)

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

Nie bardzo golfa. 274 bajtów to liczba bajtów zapisanych przez Spectrum na taśmie podczas zapisywania tego programu.

Philip Kendall
źródło
1
Masz problem z używaniem SGN PIdla 1(zapisuje 5 bajtów), ale zapomniałeś NOT PIdla 0i VALdla innych stałych ...
Neil
1
NOT PIWłaśnie tęskniłem. Celowo nie zrobił tego, VALponieważ był wystarczająco powolny i VALbył strasznie wolny.
Philip Kendall,
1
ZX Basic zawsze otrzymuje ode mnie opinię. Tutaj nie ma pedantyzmu. Pamiętam stare dobre czasy ... Ładna odpowiedź.
ElPedro,
8

SVG (HTML5), 267 bajtów

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

Cóż, jest prostokątny i jest namiotem, i jest tekstem ASCII ...

Neil
źródło
1
... i działa smooooth :-)
Luis Mendo
7

PHP, 184 bajty

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

drukuje 39 nowych linii, aby wyczyścić ekran; biegać z -nr.
Rzeczywista pauza wynosi 1 sekundę; ale przyspieszyłem gif.

Wszystkiego najlepszego

bez golfa

$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
        );
}
Tytus
źródło
6

Python 2, 230 184 bajtów

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

Wypróbuj w repl.it

wprowadź opis zdjęcia tutaj

ovs
źródło
5

Python 3 , 160 bajtów

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]

Wypróbuj online! (Bez animacji)

xnor
źródło
Wiedziałem, że wejdziesz i pobijesz mnie Pythonem. Tak dobrze mi szło! Przynajmniej moje używa „błędów”, których nie można używać w Pythonie 3 :-). Dobra odpowiedź jak zawsze. +1
ElPedro
5

Python 2, 218 200 190 181 176 bajtów

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 bajtów przez usunięcie strformatowania

-10 bajtów, dzięki sugestiom @Uriel i @ElPedro

-9 bajtów poprzez usunięcie ujemnego indeksowania

-5 bajtów przez przechowywanie odwróconych fjako vi whilewarunków

repl.it

Wondercricket
źródło
1
Możesz wyciąć białe znaki między while 1:i printzastąpić następną ;(rzeczywistą) nową linią. Również f='H... Tak f[:1]naprawdę jest f[0].
Uriel
OP stwierdza, że ​​czas może wynosić od 0,1 do 1 sekundy, więc dlaczego nie time.sleep(1)wziąć go poniżej 200?
ElPedro
3

Ruby + GNU Core Utils, 136 bajtów

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}
Wartość tuszu
źródło
3

Python 2, 182 179 173 160 bajtów

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]

Wypróbuj w repl.it

Nie działa na TIO, więc moja pierwsza próba użycia repl.it

Edycja Używanie pętli „marnowania czasu” do zliczenia do 1000000 daje spójne opóźnienie między 0,1 a 1 s na mojej maszynie i repl.it i oszczędza importowania time. Myślę, że jeśli uruchomiłeś go na starym komputerze 286 z 64 MB pamięci RAM, może to potrwać 1 sekundę, ale jestem pewien, że tak się nie stanie. Jeśli tak, po prostu zmniejsz 1000000 i zaoszczędź mi kilka bajtów :-)

Edytuj 2-6, aby zapamiętać, że wyrażenia z listy w Pythonie 2 przeciekają ostatnią wartość, swięc mogę użyć jej później, a także pamiętam, że całkiem dobrze wszystko inne niż 0 i „” jest prawdziwe. Błędy lub funkcje? Nie obchodzi mnie to. Zaoszczędziło mi to 6 bajtów :-)

Edytuj 3 Kolejne 13, odwracając obrót i korzystając ze zrozumienia listy dla środkowych rzędów w złączeniu i zmieniając 3000000na 40**4. Dzięki @FelixDombek za ostatni. Musiałem jednak stracić moją sztuczkę ze zrozumieniem listy.

ElPedro
źródło
1
Czy możesz użyć notacji naukowej lub wyrażenia potęgowego dla dużej liczby?
Felix Dombek
1
Wyrażenie mocy tak, notacja naukowa nie (ponieważ staje się liczbą zmiennoprzecinkową, której nie można pomnożyć przez łańcuchy).
L3viathan
3
Obowiązkowe 999999zamiast 1000000bajtu: V
Wartość tuszu
Dzięki @ValueInk, ale używając nieszczelnego listu rozumiejącego „błąd” faktycznie musiałem zwiększyć do 3000000 i nadal zaoszczędzić 3 bajty :-)
ElPedro
Niestety nie. @ L3viathan ma rację w tej sprawie.
ElPedro,
2

Kod maszynowy ZX81 Z80, 158 130 bajtów

OK, więc ma dużo bajtów, dopóki się nie zmontuje, ale potem spada do 130 bajtów. Nie jesteś pewien, czy to łamie jakieś zasady? To mój pierwszy post i tylko jako gość.

Program używa „brutalnej siły” do wyświetlenia komunikatu, a nie sprytnego użycia funkcji, co widać po sposobie, w jaki ma oddzielne fragmenty kodu dla górnej linii, prawej pionowej, dolnej i lewej pionowej. Animację uzyskuje się poprzez obrócenie zawartości wiadomości, a następnie wyświetlenie jej po krótkim opóźnieniu, które powinno wynosić dokładnie dokładnie 0,2 sekundy, ponieważ czeka na 10 klatek z szybkością 50 (w każdym razie w przypadku Zeddys z Wielkiej Brytanii).

Muszę wyrazić uznanie dla kmurty za obrócenie wiadomości w celu uzyskania animacji - dzięki temu zaoszczędzono 28 bajtów !!!

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

Niestety nie mogę opublikować linku do niego działającego, ponieważ jest to skompilowany program w formacie .P dla EightyOne (lub innych emulatorów) lub rzeczywistego Zeddy, jeśli masz ZXPand lub podobny do ładowania.

Plik .P można pobrać ze strony http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988

Lardo Boffin
źródło
Niezła odpowiedź! Brakowało mi jednego w kodzie maszynowym Z80 :-) I witam na stronie!
Luis Mendo
Czy możesz podać gif uruchomionego programu?
Luis Mendo
Przepraszamy - nie mam oprogramowania do tworzenia gifów!
Lardo Boffin