Alles Gute zum Geburtstag Raffaele Cecco!

33

Raffaele Cecco ist ein Programmierer, der Ende der achtziger Jahre einige der besten Videospiele für den ZX Spectrum- Computer produzierte. Unter anderem entwickelte er das hochgelobte Cybernoid und Exolon .

Raffaele wird am 10. Mai 2017 50 Jahre alt . Diese Herausforderung ist eine kleine Hommage an ihn, für die glücklichen Stunden, die viele von uns mit diesen großartigen Spielen verbracht haben, und für die Motivation, die sie mitgebracht haben.

Die Herausforderung

Der Zweck besteht darin, ein rechteckiges Auswahlrechteck zu erstellen, das von dem in Cybernoids Hauptmenübildschirm , jedoch in ASCII- Grafik, inspiriert ist .

Insbesondere wird die Zeichenfolge "Happy birthday Raffaele Cecco "(beachten Sie das letzte Leerzeichen) an den Rändern eines 12 × 5-Rechtecks ​​mit einer konstanten Pausenzeit zwischen den Schnappschüssen rotierend angezeigt.

Angenommen, der Text wird im Uhrzeigersinn angezeigt und gegen den Uhrzeigersinn gedreht (siehe Optionen unten), sind hier drei aufeinander folgende Schnappschüsse des rechteckigen Auswahlrahmens:

Happy birthd
           a
o          y
c           
ceC eleaffaR

dann

appy birthda
H          y

o          R
cceC eleaffa

dann

ppy birthday
a           
H          R
           a
occeC eleaff

und so weiter.

Regeln

Es werden keine Eingaben gemacht. Die Ausgabe erfolgt über STDOUT oder eine entsprechende Option oder in einem grafischen Fenster.

Die Ausgabe sollte tatsächlich den rotierenden Text darstellen. Das heißt, jeder neue Schnappschuss sollte den vorherigen überschreiben , um den Eindruck einer Bewegung zu erwecken. Dies kann beispielsweise durch Schreiben der entsprechenden Anzahl von Zeilenumbrüchen geschehen, um den Bildschirm effektiv zu löschen. Es ist akzeptabel, wenn dies nur für eine bestimmte Bildschirmgröße gilt. Gib es einfach in der Antwort an.

Folgende Optionen werden akzeptiert:

  • Text kann im Uhrzeigersinn oder gegen den Uhrzeigersinn angezeigt und im Uhrzeigersinn oder gegen den Uhrzeigersinn gedreht werden (in den obigen Beispielschnappschüssen wird das Anzeigen im Uhrzeigersinn und das Drehen gegen den Uhrzeigersinn vorausgesetzt).
  • Die Drehung sollte zyklisch in einer Endlosschleife erfolgen (bis das Programm gestoppt wird) und kann in jeder Phase beginnen.
  • Die Pausenzeit zwischen Schnappschüssen sollte ungefähr konstant sein, kann jedoch zwischen 0,1 und 1 s frei gewählt werden. Eine anfängliche Pause vor dem Anzeigen des ersten Schnappschusses ist akzeptabel.
  • Buchstaben können Groß-, Klein- oder Mischbuchstaben sein (wie im obigen Beispiel).
  • Führende oder nachfolgende Leerzeichen sind zulässig.

Programme oder Funktionen sind in jeder Programmiersprache zulässig . Standardlücken sind verboten.

Geben Sie nach Möglichkeit eine GIF-Datei mit der Ausgabe oder einen Link zum Testen des Programms an.

Kürzester Code in Bytes gewinnt.

Luis Mendo
quelle
4
Was ist, wenn das Überschreiben unmöglich ist? Können wir 99 rote Luftballons verwenden, ähm ... Newlines?
Titus
@Titus Nur wenn das den Bildschirm effektiv löscht und den Eindruck von sich bewegendem Text erweckt (gif bitte!)
Luis Mendo
"Dies kann beispielsweise durch Schreiben der entsprechenden Anzahl von Zeilenumbrüchen geschehen, um den Bildschirm effektiv zu löschen." - Ist das nicht abhängig von der Konsolengröße? Ist es akzeptabel, eine neue Zeile (zusammen mit dem nächsten Rechteck) zu drucken, wenn die nächste Iteration die vorherige (in meiner kleinen Konsole) ersetzt?
Jonathan Allan
1
@Jonathan Ok, gib der Konsole ein GIF, um den Effekt zu sehen
Luis Mendo,

Antworten:

8

Jelly , 74  65 Bytes

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

Windows-Version, die in einer 6 Zeilen hohen cp-65001-Konsole ausgeführt wird.
Zwischen den Iterationen liegt eine Pause von einer halben Sekunde (plus Auswertung):

GIF der Ausgabe

Wie?

“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
quelle
16

HTML + ES6, 200 Bytes

<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
quelle
Das sieht großartig aus!
Luis Mendo
@ LuisMendo Das weckt Erinnerungen, obwohl ich mich besser an Cybernoid II erinnere als an das erste. Ich bin mir sicher, dass ich diesen Effekt auch bei einigen Cracktros gesehen habe. ;-)
Arnauld
Ja, ich habe auch die zweite vorgezogen :-)
Luis Mendo
11

ZX Spectrum BASIC, 187 Byte

Ärgerlich, dass Philip mich ein paar Minuten geschlagen hat :-) Zahlen wie \{15}sind nicht druckbare Kontrollcodes - kompilieren Sie mit zmakebas, wenn Sie basteln wollen. Beachten Sie, dass das gesamte Rechteck nicht sofort gedruckt wird, sondern nach den ersten Frames einrastet.

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

Probieren Sie es hier aus (Online-JS-emulierte Version, drücken Sie die Eingabetaste, um zu starten) ... http://jsspeccy.zxdemo.org/cecco/

Sie können auch vier Bytes sparen, indem Sie den Bildschirm zwischen den Frames leeren, anstatt ein PRINT AT auszuführen, aber es ist zu flimmernd, um es wert zu sein ...

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
Gasmann
quelle
1
Ah, aber Sie gewinnen mit vielen Bytes :-)
Philip Kendall
2
Willkommen bei PPCG!
Martin Ender
1
Willkommen zum Spiel. ZX ist immer gut zu sehen. Gute Antwort. +1.
ElPedro
10

V, 75 71 70 Bytes

4 Bytes gespart dank @DJMcMayhem

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

Hier ist ein TIO-Link, aber beachten Sie, dass dies auf TIO nicht funktioniert, da das Programm eine Endlosschleife ausführt. Probieren Sie es online!

Da dieser Code nicht druckbare Dateien enthält, handelt es sich um einen 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

Die Ruhezeit beträgt 500 Millisekunden.

schick

Kritixi Lithos
quelle
Können Sie einen TIO-Link geben?
9.
Einige Tipps (nicht alle getestet): H|-> {. <C-v>êx-> und 5L->}
DJMcMayhem
Auch Ihre repchar alle Befehle mit 9 werden , wenn Sie 10 oder 11. Zum Beispiel verwenden: Ändern Sie die mittleren drei Linien ±± a, o° yundc±±<space>
DJMcMayhem
@DJMcMayhem Alles funktioniert aber 5L=> }.
Kritixi Lithos
@Riker Fertig, aber beachten Sie, dass der TIO-Link die Animation nicht
anzeigen
9

ZX Spectrum BASIC, 274 Byte

Nun, jemand musste es tun. Pedanten können dies disqualifizieren, weil sie zu langsam sind und keine Pause zwischen den Animationen machen, aber ich behaupte hier einen Sonderfall :-)

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

Auch nicht sehr golfen. 274 Bytes ist die Anzahl der Bytes, die das Spektrum beim Speichern dieses Programms auf Band speichert.

Philip Kendall
quelle
1
Sie haben sich die Mühe gemacht, SGN PIfor zu verwenden 1(spart 5 Bytes), aber Sie haben NOT PIfür 0und VALfür die anderen Konstanten vergessen ...
Neil
1
NOT PIIch habe es einfach verpasst. Absichtlich nicht getan, VALweil es langsam genug war, wie es war, und VALschrecklich langsam ist.
Philip Kendall
1
ZX Basic bekommt immer eine positive Bewertung von mir. Kein Pedantismus hier. Ich erinnere mich an die guten alten Zeiten ... Schöne Antwort.
ElPedro
8

SVG (HTML5), 267 Bytes

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

Nun, es ist rechteckig, und es ist ein Festzelt, und es ist ASCII-Text ...

Neil
quelle
1
... und es läuft reibungslos :-)
Luis Mendo
7

PHP, 184 Bytes

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

druckt 39 Zeilenumbrüche, um den Bildschirm zu löschen; renn mit -nr.
Die tatsächliche Pause beträgt 1 Sekunde. aber ich habe das GIF beschleunigt.

Alles Gute zum Geburtstag

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

Python 2, 230 184 Bytes

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

Probieren Sie es bei repl.it

Bildbeschreibung hier eingeben

ovs
quelle
5

Python 3 , 160 Bytes

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]

Probieren Sie es online! (Keine Animation)

xnor
quelle
Ich wusste irgendwie, dass du reinkommen und mich mit Python schlagen würdest. Mir ging es so gut! Zumindest meins nutzt "Bugs", die Sie nicht mit Python 3 verwenden können :-). Gute Antwort wie immer. +1
ElPedro
5

Python 2, 218 200 190 181 176 Bytes

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 Bytes durch Entfernen der strFormatierung

-10 Bytes dank @Uriel und @ElPedro-Vorschlägen

-9 Bytes durch Entfernen der negativen Indizierung

-5 Bytes durch Speichern umgekehrt fals vund whileBedingung

repl.it

Wunderkricket
quelle
1
Sie können den Leerraum zwischen while 1:und abschneiden printund den nächsten ;durch einen (tatsächlichen) Zeilenumbruch ersetzen. Auch f='H... f[:1]Ist auch aktuell f[0].
Uriel
OP gibt an, dass die Zeit zwischen 0,1 und 1 Sekunden liegen kann. Warum also nicht time.sleep(1)unter 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}
Wert Tinte
quelle
3

Python 2, 182 179 173 160 Bytes

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]

Probieren Sie es bei repl.it

Funktioniert nicht mit TIO, daher mein erster Versuch, repl.it zu verwenden

Bearbeiten Die Verwendung einer "zeitraubenden" Schleife zum Zählen bis 1000000 führt zu einer konstanten Verzögerung zwischen 0,1 und 1 s auf meinem Computer und auf repl.it und spart das Importieren time. Ich denke, wenn Sie es auf einem alten 286-Computer mit 64 MB RAM laufen lassen, kann es über die 1 Sekunde gehen, aber ich bin mir ziemlich sicher, dass das nicht passieren wird. Wenn doch, dann reduziere einfach die 1000000 und spare mir ein paar Bytes :-)

Bearbeiten Sie 2 -6, um sich daran zu erinnern, dass Listenverständnisse in Python 2 den letzten Wert von s"" verlieren, damit ich ihn später verwenden kann. Bugs oder Features? Ist mir egal Es hat mich 6 Bytes gerettet :-)

Bearbeiten 3 Weitere 13 durch die Drehung ehrend und durch eine Liste Verständnis für die mittleren Reihen mit im Inneren der Verbindung und Wechsel 3000000zu 40**4. Vielen Dank an @FelixDombek für den letzten. Musste allerdings meinen Listenkenntnistrick verlieren.

ElPedro
quelle
1
Könnten Sie eine wissenschaftliche Notation oder einen Potenzausdruck für die große Zahl verwenden?
Felix Dombek
1
Potenzausdruck ja, wissenschaftliche Notation nein (weil es sich um einen Float handelt, den man nicht mit Strings multiplizieren kann).
L3viathan
3
Obligatorisch 999999statt 1000000für ein Byte: V
Value Ink
Vielen Dank @ValueInk, aber durch die Verwendung der undichten Liste Verständnis "Bug" musste ich tatsächlich auf 3000000 erhöhen und trotzdem 3 Bytes gespeichert :-)
ElPedro
Unglücklicherweise nicht. @ L3viathan ist da richtig.
ElPedro
2

ZX81 Z80 Maschinencode, 158 130 Bytes

Okay, es hat eine Menge Bytes, bis es zusammengesetzt ist, aber dann fällt es auf 130 Bytes. Nicht sicher, ob das gegen Regeln verstößt? Es ist mein erster Beitrag und nur als Gast.

Das Programm verwendet 'Brute Force', um die Nachricht anzuzeigen, anstatt eine clevere Funktion zu verwenden, wie aus der Art und Weise ersichtlich ist, in der es separate Codeabschnitte für die obere Zeile, die rechte vertikale, die untere Zeile und die linke vertikale enthält. Die Animation wird erreicht, indem der Inhalt der Nachricht gedreht und nur nach einer kurzen Verzögerung angezeigt wird, die ziemlich genau 0,2 Sekunden betragen sollte, da auf 10 Frames mit einer Rate von 50 gewartet wird (für die britische Spezifikation Zeddys sowieso).

Ich muss kmurta das Konzept der Rotation der Nachricht zuschreiben, um die Animation zu erhalten - das sparte 28 Bytes !!!

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

Es tut mir leid, aber ich kann keinen Link dazu posten, der ausgeführt wird, da es sich um ein kompiliertes Programm im P-Format für EightyOne (oder andere Emulatoren) oder einen tatsächlichen Zeddy handelt, wenn Sie einen ZXPand oder ähnliches zum Laden haben.

Die .P kann unter http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988 heruntergeladen werden

Lardo Boffin
quelle
Gute Antwort! Ich habe einen im Z80-Maschinencode vermisst :-) Und willkommen auf der Seite!
Luis Mendo
Könnten Sie vielleicht ein GIF des laufenden Programms bereitstellen?
Luis Mendo
Entschuldigung - ich habe keine GIF-Erstellungssoftware!
Lardo Boffin