¡Feliz cumpleaños, Raffaele Cecco!


33

Raffaele Cecco es un programador que produjo algunos de los mejores videojuegos para la computadora ZX Spectrum a fines de los años ochenta. Entre otros, desarrolló el aclamado Cybernoid y Exolon .

Raffaele cumple 50 años el 10 de mayo de 2017 . Este desafío es un pequeño homenaje a él, por las horas felices que muchos de nosotros pasamos jugando esos juegos fabulosos, y por la motivación que trajeron.

El reto

El propósito es producir una carpa rectangular inspirada en la que se ve en la pantalla del menú principal de Cybernoid , pero en el arte ASCII.

Específicamente, la cadena "Happy birthday Raffaele Cecco "(tenga en cuenta el espacio final) se mostrará girando a lo largo de los bordes de un rectángulo de 12 × 5, con un tiempo de pausa constante entre las instantáneas.

Por ejemplo, suponiendo que el texto se muestre en el sentido de las agujas del reloj y se gire en sentido contrario (consulte las opciones a continuación), aquí hay tres instantáneas consecutivas de la marquesina rectangular:

Happy birthd
           a
o          y
c           
ceC eleaffaR

luego

appy birthda
H          y

o          R
cceC eleaffa

luego

ppy birthday
a           
H          R
           a
occeC eleaff

y así.

Reglas

No se tomará ninguna entrada. La salida será a través de STDOUT o equivalente, o en una ventana gráfica.

La salida en realidad debería representar el texto girando; es decir, cada nueva instantánea debe sobrescribir la anterior para dar la impresión de movimiento. Esto puede hacerse por cualquier medio, por ejemplo, escribiendo el número apropiado de nuevas líneas para borrar la pantalla de manera efectiva. Es aceptable si esto es válido solo para un tamaño de pantalla dado; solo especifícalo en la respuesta.

Se aceptan las siguientes opciones:

  • El texto se puede mostrar en el sentido de las agujas del reloj o en sentido contrario, y se puede girar en el sentido de las agujas del reloj o en sentido contrario (las instantáneas de ejemplo anteriores suponen que se muestran en el sentido de las agujas del reloj y en sentido contrario).
  • La rotación debe continuar cíclicamente en un bucle infinito (hasta que se detenga el programa), y puede comenzar en cualquier fase.
  • El tiempo de pausa entre las instantáneas debe ser aproximadamente constante, pero se puede elegir libremente entre 0.1 y 1 s. Es aceptable una pausa inicial antes de mostrar la primera instantánea.
  • Las letras pueden ser mayúsculas, minúsculas o mixtas (como en el ejemplo anterior).
  • Se permite el espacio en blanco inicial o final.

Se permiten programas o funciones , en cualquier lenguaje de programación . Las lagunas estándar están prohibidas.

Si es posible, proporcione un archivo gif que muestre el resultado o un enlace para probar el programa.

El código más corto en bytes gana.


44
¿Qué pasa si es imposible sobrescribir? ¿Podemos usar 99 globos rojos er ... nuevas líneas?
Tito

@Titus Solo si eso efectivamente limpia la pantalla y da la impresión de texto en movimiento (¡gif, por favor!)
Luis Mendo

"Esto se puede hacer por cualquier medio, por ejemplo, escribiendo el número apropiado de nuevas líneas para borrar la pantalla de manera efectiva". - ¿No depende esto del tamaño de la consola? ¿Es aceptable imprimir una nueva línea si (junto con el siguiente rectángulo) significa que la siguiente iteración reemplaza a la anterior (en mi consola pequeña )?
Jonathan Allan

1
@ Jonathan Ok, solo proporciona un gif con esa consola para ver el efecto
Luis Mendo

Respuestas:


8

Gelatina , 74  65 bytes

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

Versión de Windows que se ejecuta en una consola cp-65001 de 6 líneas de altura.
Hay una pausa de medio segundo (más evaluación) entre iteraciones:

gif de salida

¿Cómo?

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


¡Se ve genial!
Luis Mendo

@LuisMendo Eso trae recuerdos, aunque recuerdo Cybernoid II mejor que el primero. Estoy seguro de que también he visto este efecto en un par de cracktros. ;-)
Arnauld

Sí, también preferí el segundo :-)
Luis Mendo

11

ZX Spectrum BASIC, 187 bytes

Molesto porque Philip me ganó por un par de minutos :-) Los números como \{15}son códigos de control no imprimibles: compile con zmakebas si quiere jugar. Tenga en cuenta que el rectángulo completo no se imprime de inmediato, pero se coloca después de los primeros fotogramas.

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

Pruébelo aquí (versión en línea emulada por JS, presione Intro para comenzar) ... http://jsspeccy.zxdemo.org/cecco/

También puede guardar cuatro bytes limpiando la pantalla entre fotogramas en lugar de hacer una IMPRESIÓN EN, pero es demasiado parpadeante para que valga 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, pero ganas por muchos bytes :-)
Philip Kendall

2
Bienvenido a PPCG!
Martin Ender

1
Bienvenido al juego ZX siempre es bueno de ver. Buena respuesta. +1.
ElPedro

10

V, 75 71 70 bytes

4 bytes guardados gracias a @DJMcMayhem

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

Aquí hay un enlace TIO, pero tenga en cuenta que esto no funcionará en TIO porque el programa realiza un bucle infinito. Pruébalo en línea!

Como este código contiene elementos no imprimibles, aquí hay 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

El tiempo de sueño es de 500 milisegundos.

giffy


¿Puedes dar un enlace TIO?
Rɪᴋᴇʀ

Algunos consejos (no todos probados): H|-> {. <C-v>êx-> , y 5L->}
DJMcMayhem

Además, sus comandos repchar todas usan 9 cuando se podría utilizar 10 o 11. Por ejemplo: cambiar las tres líneas medias a ±± a, o° yyc±±<space>
DJMcMayhem

@DJMcMayhem Todo funciona pero 5L=> }.
Kritixi Lithos

@Riker Hecho, pero tenga en cuenta que el enlace TIO no puede mostrar la animación
Kritixi Lithos

9

ZX Spectrum BASIC, 274 bytes

Bueno, alguien tuvo que hacerlo. Los pendientes pueden descalificar esto por ser demasiado lento y no tener una pausa entre animaciones, pero estoy reclamando un caso especial aquí :-)

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

No muy golfizado tampoco. 274 bytes es el número de bytes guardados por Spectrum en la cinta al guardar este programa.


1
Usted fue a todos los problemas de la utilización SGN PIde 1(ahorra 5 bytes), pero se le olvidó NOT PIpor 0y VALpara las otras constantes ...
Neil

1
NOT PISolo me perdí. Deliberadamente no hizo lo VALque fue lo suficientemente lento como era, y VALes terriblemente lento.
Philip Kendall,

1
ZX Basic siempre recibe un voto positivo de mi parte. No hay pedantismo aquí. Recuerdo los viejos tiempos ... Buena respuesta.
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>

Bueno, es rectangular, y es una marquesina, y es texto ASCII ...


1
... y se ejecuta sin problemas :-)
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];

imprime 39 líneas nuevas para borrar la pantalla; correr con -nr.
La pausa real es de 1 segundo; pero aceleré el gif.

Feliz cumpleaños

sin golf

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

Pruébalo en repl.it

ingrese la descripción de la imagen aquí


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]

Pruébalo en línea! (Sin animación)


Sabía que vendrías y me ganarías con Python. ¡Me estaba yendo tan bien! Al menos el mío usa "errores" que no puedes usar con Python 3 :-). Buena respuesta como siempre. +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 eliminando el strformato

-10 bytes, gracias a las sugerencias de @Uriel y @ElPedro

-9 bytes eliminando la indexación negativa

-5 bytes almacenando invertido fcomo vy whilecondición

repl.it


1
Puede cortar el espacio en blanco entre while 1:y printreemplazar el siguiente ;con una nueva línea (real). También f='H... También f[:1]es en realidad f[0].
Uriel

OP dice que el tiempo puede estar entre 0.1 y 1 segundos, entonces ¿por qué no time.sleep(1)tomarlo por debajo de 200?
ElPedro

3

Ruby + GNU Core Utils, 136 bytes

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

Pruébalo en repl.it

No funciona en TIO, así que mi primer intento de usar repl.it

Editar El uso de un ciclo de "pérdida de tiempo" para contar hasta 1000000 produce un retraso constante de entre 0.1 y 1s en mi máquina y en repl.it y guarda la importación time. Supongo que si lo ejecutó en una vieja computadora 286 con 64 MB de RAM, puede durar más de 1 segundo, pero estoy bastante seguro de que eso no va a suceder. Si es así, simplemente reduzca el 1000000 y ahórreme un par de bytes :-)

Edite 2 -6 para recordar que las comprensiones de listas en Python 2 pierden el último valor de smodo que puedo usarlo más tarde y también recordar que bastante bien cualquier cosa que no sea 0 y "" es verdad. Errores o características? No me importa Me ahorró 6 bytes :-)

Editar 3 Otros 13 invirtiendo la rotación y utilizando una lista de comprensión para las filas del medio dentro de la unión y cambiando 3000000a 40**4. Gracias a @FelixDombek por el último. Sin embargo, tuve que perder mi truco de comprensión de la lista.


1
¿Podría usar notación científica o una expresión de poder para el gran número?
Felix Dombek

1
Expresión de poder sí, notación científica no (porque se convierte en un flotador, que no se puede multiplicar con cadenas).
L3viathan

3
Obligatorio en 999999lugar de 1000000para un byte: V
Value Ink

Gracias @ValueInk, pero al usar el "error" de comprensión de la lista de fugas, tuve que aumentar a 3000000 y aún así
guardé

Lamentablemente no. @ L3viathan tiene razón en eso.
ElPedro

2

Código máquina ZX81 Z80, 158 130 bytes

OK, tiene muchos bytes hasta que se ensambla, pero luego cae a 130 bytes. ¿No está seguro si eso rompe alguna regla? Es mi primer post y solo como invitado.

El programa usa 'fuerza bruta' para mostrar el mensaje en lugar del uso inteligente de funciones, como se puede ver por la forma en que tiene fragmentos de código separados para la línea superior, la vertical derecha, la línea inferior y la vertical izquierda. La animación se logra girando el contenido del mensaje y luego simplemente mostrándolo después de un breve retraso, que debería ser exactamente exactamente 0.2 segundos, ya que espera 10 cuadros de una velocidad de 50 (para Zeddys de especificaciones del Reino Unido de todos modos).

Tengo que dar crédito a kmurta por el concepto de rotar el mensaje para obtener la animación, ¡eso ahorró 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,__

Lo siento, no puedo publicar un enlace en ejecución ya que es un programa compilado en formato .P para EightyOne (u otros emuladores) o un Zeddy real si tiene un ZXPand o similar para cargarlo.

El .P se puede descargar en http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988


¡Buena respuesta! Me faltaba uno en el código de máquina Z80 :-) ¡Y bienvenido al sitio!
Luis Mendo

¿Podrías proporcionar un gif del programa en ejecución?
Luis Mendo

Lo siento, ¡no tengo ningún software de creación de gifs!
Lardo Boffin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.