Tanti auguri, Raffaele Cecco!


33

Raffaele Cecco è un programmatore che ha prodotto alcuni dei migliori videogiochi per il computer ZX Spectrum alla fine degli anni Ottanta. Tra gli altri, ha sviluppato l'acclamato Cybernoid ed Exolon .

Raffaele compie 50 anni il 10 maggio 2017 . Questa sfida è un piccolo omaggio a lui, per gli happy hour che molti di noi hanno trascorso giocando a quei fantastici giochi e per la motivazione che hanno portato.

La sfida

Lo scopo è quello di produrre un riquadro rettangolare ispirato a quello visto nella schermata del menu principale di Cybernoid , ma nell'arte ASCII.

In particolare, la stringa "Happy birthday Raffaele Cecco "(notare lo spazio finale) verrà mostrata ruotando lungo i bordi di un rettangolo 12 × 5, con un tempo di pausa costante tra le istantanee.

Ad esempio, supponendo che il testo sia visualizzato in senso orario e ruotato in senso antiorario (vedere le opzioni di seguito), ecco tre istantanee consecutive del riquadro rettangolare:

Happy birthd
           a
o          y
c           
ceC eleaffaR

poi

appy birthda
H          y

o          R
cceC eleaffa

poi

ppy birthday
a           
H          R
           a
occeC eleaff

e così via.

Regole

Nessun input verrà preso. L'output avverrà tramite STDOUT o equivalente o in una finestra grafica.

L'output dovrebbe effettivamente rappresentare la rotazione del testo; cioè ogni nuova istantanea dovrebbe sovrascrivere la precedente per dare l'impressione di movimento. Questo può essere fatto in qualsiasi modo, ad esempio, scrivendo il numero appropriato di newline per cancellare efficacemente lo schermo. È accettabile se questo è valido solo per una data dimensione dello schermo; basta specificarlo nella risposta.

Sono accettate le seguenti opzioni:

  • Il testo può essere visualizzato in senso orario o antiorario e può essere ruotato in senso orario o antiorario (gli esempi di esempio sopra presuppongono la visualizzazione in senso orario e la rotazione in senso antiorario).
  • La rotazione dovrebbe continuare ciclicamente in un ciclo infinito (fino a quando il programma non viene arrestato) e può iniziare in qualsiasi fase.
  • Il tempo di pausa tra le istantanee dovrebbe essere approssimativamente costante, ma può essere scelto liberamente tra 0,1 e 1 s. È accettabile una pausa iniziale prima di visualizzare la prima istantanea.
  • Le lettere possono essere maiuscole, minuscole o miste (come nell'esempio sopra).
  • Spazio consentito iniziale o finale.

Programmi o funzioni sono consentiti, in qualsiasi linguaggio di programmazione . Sono vietate le scappatoie standard .

Se possibile, fornire un file gif che mostri l'output o un collegamento per testare il programma.

Vince il codice più breve in byte.


4
E se fosse impossibile sovrascrivere? Possiamo usare 99 palloncini rossi e ... newline?
Tito,

@Titus Solo se ciò cancella efficacemente lo schermo e dà l'impressione di spostare il testo (gif, per favore!)
Luis Mendo,

"Questo può essere fatto in qualsiasi modo, ad esempio, scrivendo il numero appropriato di newline per cancellare efficacemente lo schermo." - questo non dipende dalle dimensioni della console? È accettabile stampare una nuova riga se (insieme al rettangolo successivo) significa che la successiva iterazione sostituisce quella precedente (nella mia piccola console)?
Jonathan Allan,

1
@Jonathan Ok, basta fornire una gif con quella console per vedere l'effetto
Luis Mendo,

Risposte:


8

Gelatina , 74  65 byte

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

Versione di Windows in esecuzione in una console cp-65001 alta 6 righe.
C'è una pausa di mezzo secondo (più valutazione) tra le iterazioni:

gif di output

Come?

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


Sembra grandioso!
Luis Mendo,

@LuisMendo Questo riporta i ricordi, anche se ricordo Cybernoid II meglio del primo. Sono sicuro di aver visto questo effetto anche in un paio di cracktros. ;-)
Arnauld

Sì, ho preferito anche il secondo :-)
Luis Mendo

11

ZX Spectrum BASIC, 187 byte

Infastidito dal fatto che Philip mi abbia battuto per un paio di minuti :-) I numeri come \{15}sono codici di controllo non stampabili - compilalo con zmakebas se vuoi armeggiare. Si noti che il rettangolo completo non viene stampato immediatamente, ma si posiziona dopo i primi fotogrammi.

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

Provalo qui (versione online emulata da JS, premi invio per iniziare) ... http://jsspeccy.zxdemo.org/cecco/

Puoi anche salvare quattro byte cancellando lo schermo tra i fotogrammi invece di eseguire una STAMPA AT, ma è troppo sfarfallio per valerne la pena ...

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, ma vinci molti byte :-)
Philip Kendall,

2
Benvenuti in PPCG!
Martin Ender,

1
Benvenuti nel gioco. ZX è sempre bello da vedere. Bella risposta. +1.
ElPedro,

10

V, 75 71 70 byte

4 byte salvati grazie a @DJMcMayhem

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

Ecco un link TIO, ma nota che non funzionerà su TIO perché il programma scorre all'infinito. Provalo online!

Poiché questo codice contiene non stampabili, ecco un 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

Il tempo di sonno è di 500 millisecondi.

GiFFY


Puoi dare un link TIO?
Rɪᴋᴇʀ

Alcuni consigli (non tutti testati): H|-> {. <C-v>êx-> , e 5L->}
DJMcMayhem

Inoltre, i comandi sono tutti repchar utilizzando 9 quando si potrebbe utilizzare 10 o 11. Per esempio: cambiare al centro tre linee a ±± a, o° yec±±<space>
DJMcMayhem

@DJMcMayhem Tutto funziona ma 5L=> }.
Kritixi Lithos,

@Riker Fatto, ma nota che il collegamento TIO non può mostrare l'animazione
Kritixi Lithos,

9

ZX Spectrum BASIC, 274 byte

Bene, qualcuno ha dovuto farlo. I pedanti potrebbero voler squalificare questo per essere troppo lenti e non avere una pausa tra le animazioni, ma sto sostenendo un caso speciale qui :-)

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

Neanche molto golf. 274 byte è il numero di byte salvati dallo spettro su nastro durante il salvataggio di questo programma.


1
Ti sei preoccupato di usare SGN PIfor 1(salva 5 byte) ma ti sei dimenticato NOT PIdi 0e VALper le altre costanti ...
Neil,

1
NOT PIMi mancava da poco. Deliberatamente non ha funzionato VALperché era abbastanza lento com'era ed VALè terribilmente lento.
Philip Kendall,

1
ZX Basic riceve sempre un mio voto. Nessun pedantismo qui. Ricordo i bei vecchi tempi ... Bella risposta.
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>

Bene, è rettangolare, è un riquadro di selezione ed è un testo ASCII ...


1
... e funziona smooooth :-)
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];

stampa 39 nuove righe per cancellare lo schermo; corri con -nr.
La pausa effettiva è di 1 secondo; ma ho velocizzato la gif.

Buon compleanno

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

Provalo su repl.it

inserisci qui la descrizione dell'immagine


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]

Provalo online! (Nessuna animazione)


Sapevo che saresti entrato e mi avresti battuto con Python. Stavo andando così bene! Almeno il mio fa uso di "bug" che non puoi usare con Python 3 :-). Bella risposta come sempre. +1
ElPedro,

5

Python 2, 218 200 190 181 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 rimuovendo la strformattazione

-10 byte, grazie ai suggerimenti di @Uriel e @ElPedro

-9 byte rimuovendo l'indicizzazione negativa

-5 byte memorizzando invertiti fcome ve whilecondizione

repl.it


1
È possibile tagliare lo spazio tra while 1:e printe sostituire il successivo ;con una (nuova) riga. Inoltre f='H... Inoltre f[:1]è davvero f[0].
Uriel,

OP afferma che il tempo può essere compreso tra 0,1 e 1 secondi, quindi perché non time.sleep(1)impiegarlo a meno di 200?
ElPedro

3

Utilità Ruby + GNU Core, 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}

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]

Provalo su repl.it

Non funziona su TIO, quindi il mio primo tentativo di utilizzare repl.it

Modifica L' utilizzo di un ciclo "che fa perdere tempo" per contare fino a 1000000 genera un ritardo costante tra 0,1 e 1 s sulla mia macchina e su repl.it e salva l'importazione time. Immagino che se lo avessi eseguito su un vecchio computer 286 con 64 MB di RAM, potrebbe andare oltre 1 secondo, ma sono abbastanza sicuro che non accadrà. Se lo fa, riduci semplicemente il 1000000 e risparmiami un paio di byte :-)

Modifica 2 -6 per ricordare che la comprensione dell'elenco in Python 2 perde l'ultimo valore in smodo che io possa usarlo in seguito e anche ricordare che qualsiasi cosa diversa da 0 e "" è vera. Bug o funzionalità? Non importa. Mi ha salvato 6 byte :-)

Modifica 3 Un altro 13 riverendo la rotazione e usando una comprensione dell'elenco per le file centrali all'interno del join e cambiando 3000000in 40**4. Grazie a @FelixDombek per l'ultimo. Ho dovuto perdere il mio trucco di comprensione della lista però.


1
Potresti usare la notazione scientifica o un'espressione di potenza per il grande numero?
Felix Dombek,

1
Espressione di potenza sì, notazione scientifica no (perché diventa un float, che non si può moltiplicare con le stringhe).
L3viathan,

3
Obbligatorio 999999invece che 1000000per un byte: V
Value Ink

Grazie @ValueInk ma usando il "bug" per la comprensione dell'elenco che perde, in realtà ho dovuto aumentare a 3000000 e ho comunque salvato 3 byte :-)
ElPedro,

Sfortunatamente no. @ L3viathan ha ragione su quello.
ElPedro,

2

ZX81 Codice macchina Z80, 158 130 byte

OK, quindi ha molti byte fino a quando non viene assemblato ma poi scende a 130 byte. Non sei sicuro se questo infrange qualche regola? È il mio primo post e solo come ospite.

Il programma usa la 'forza bruta' per visualizzare il messaggio piuttosto che l'uso intelligente delle funzioni, come si può vedere dal modo in cui ha blocchi di codice separati per la linea superiore, la verticale destra, la linea inferiore e la verticale sinistra. L'animazione si ottiene ruotando il contenuto del messaggio e quindi semplicemente visualizzandolo dopo un breve ritardo che dovrebbe essere praticamente esattamente 0,2 secondi mentre attende 10 frame su una velocità di 50 (comunque per le specifiche Zeddys nel Regno Unito).

Devo dare credito a kmurta per il concetto di rotazione del messaggio per ottenere l'animazione - che ha risparmiato 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,__

Spiacenti, non posso pubblicare un link in esecuzione poiché è un programma compilato in formato .P per EightyOne (o altri emulatori) o un vero Zeddy se hai un ZXPand o simile per caricarlo.

Il .P può essere scaricato all'indirizzo http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988


Bella risposta! Mi mancava uno nel codice macchina Z80 :-) E benvenuto nel sito!
Luis Mendo,

Potresti forse fornire una gif del programma in esecuzione?
Luis Mendo,

Siamo spiacenti, non ho software per la creazione di GIF!
Lardo Boffin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.