Bon anniversaire, Raffaele Cecco!

33

Raffaele Cecco est un programmeur qui a produit certains des meilleurs jeux vidéo pour l’ ordinateur ZX Spectrum à la fin des années quatre-vingt. Il a notamment développé les très célèbres Cybernoid et Exolon .

Raffaele aura 50 ans le 10 mai 2017 . Ce défi est un petit hommage à lui, pour les heures heureuses que beaucoup d’entre nous ont passées à jouer à ces jeux extraordinaires et pour la motivation qu’ils ont apportée.

Le défi

Le but est de produire un chapiteau rectangulaire inspiré de celui du menu principal de Cybernoid , mais de l’art ASCII.

En particulier, la chaîne "Happy birthday Raffaele Cecco "(notez l'espace final) sera représentée en rotation sur les bords d'un rectangle 12 × 5, avec un temps de pause constant entre les instantanés.

Par exemple, en supposant que le texte soit affiché dans le sens des aiguilles d'une montre et pivoté dans le sens contraire des aiguilles d'une montre (voir les options ci-dessous), voici trois instantanés consécutifs du rectangle de sélection rectangulaire:

Happy birthd
           a
o          y
c           
ceC eleaffaR

puis

appy birthda
H          y

o          R
cceC eleaffa

puis

ppy birthday
a           
H          R
           a
occeC eleaff

etc.

Règles

Aucune entrée ne sera prise. La sortie se fera par STDOUT ou équivalent, ou dans une fenêtre graphique.

La sortie devrait en fait représenter le texte en rotation; c'est-à-dire que chaque nouvel instantané doit écraser le précédent pour donner une impression de mouvement. Cela peut être fait par n'importe quel moyen, par exemple, en écrivant le nombre approprié de nouvelles lignes pour effacer efficacement l'écran. C’est acceptable si cela n’est valable que pour une taille d’écran donnée; spécifiez-le simplement dans la réponse.

Les options suivantes sont acceptées:

  • Le texte peut être affiché dans le sens horaire ou anti-horaire, et tourné dans le sens horaire ou anti-horaire (les exemples d'instantanés ci-dessus supposent un affichage dans le sens horaire et une rotation dans le sens anti-horaire).
  • La rotation doit continuer cycliquement dans une boucle infinie (jusqu'à ce que le programme soit arrêté) et peut commencer à n'importe quelle phase.
  • Le temps de pause entre les instantanés doit être approximativement constant, mais peut être choisi librement entre 0,1 et 1 s. Une pause initiale avant d'afficher le premier instantané est acceptable.
  • Les lettres peuvent être majuscules, minuscules ou mixtes (comme dans l'exemple ci-dessus).
  • Les espaces vides de début ou de fin sont autorisés.

Les programmes ou fonctions sont autorisés, dans n'importe quel langage de programmation . Les échappatoires standard sont interdites.

Si possible, veuillez fournir un fichier gif montrant la sortie, ou un lien pour tester le programme.

Le code le plus court en octets gagne.

Luis Mendo
la source
4
Et s'il est impossible d'écraser? Pouvons-nous utiliser 99 ballons rouges euh ... de nouvelles lignes?
Tite
@Titus seulement si cela efface efficacement l'écran et donne l'impression de texte mobile (gif s'il vous plaît!)
Luis Mendo
"Cela peut être fait par n'importe quel moyen, par exemple, en écrivant le nombre approprié de nouvelles lignes pour effacer efficacement l'écran." - Est-ce que cela ne dépend pas de la taille de la console? Est-il acceptable d'imprimer une nouvelle ligne si cela (avec le rectangle suivant) signifie que la prochaine itération remplace la précédente (dans ma petite console)?
Jonathan Allan
1
@ Jonathan Ok, il suffit de fournir un gif avec cette console pour voir l'effet
Luis Mendo

Réponses:

8

Gelée , 74 à  65 octets

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

Version Windows fonctionnant dans une console haute de 6 lignes cp-65001.
Il y a une pause d'une demi-seconde (plus l'évaluation) entre les itérations:

gif of output

Comment?

“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
la source
16

HTML + ES6, 200 octets

<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
la source
Cela semble très bien!
Luis Mendo
@ LuisMendo Cela me rappelle des souvenirs, même si je me souviens de Cybernoid II mieux que le premier. Je suis sûr que j'ai déjà vu cet effet dans quelques cracktros. ;-)
Arnauld
Oui, j'ai aussi préféré la seconde :-)
Luis Mendo
11

ZX Spectrum BASIC, 187 octets

Ennuyé par le fait que Philip m'y a battu de quelques minutes :-) Les nombres \{15}sont comme des codes de contrôle non imprimables - compilez avec zmakebas si vous voulez bricoler. Notez que le rectangle complet n'est pas imprimé immédiatement, mais il se met en place après les quelques premières images.

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

Essayez-le ici (version en ligne émulée par JS, appuyez sur Entrée pour commencer) ... http://jsspeccy.zxdemo.org/cecco/

Vous pouvez également économiser quatre octets en effaçant l'écran entre les images au lieu de faire une impression sous, mais c'est trop scintillant pour en valoir la peine ...

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
gasman
la source
1
Ah, mais vous gagnez beaucoup d'octets :-)
Philip Kendall
2
Bienvenue chez PPCG!
Martin Ender
1
Bienvenue dans le jeu. ZX est toujours agréable à voir. Bonne réponse. +1
ElPedro
10

V, 75 71 70 octets

4 octets enregistrés grâce à @DJMcMayhem

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

Voici un lien TIO, mais notez que cela ne fonctionnera pas sur TIO car le programme est en boucle infinie. Essayez-le en ligne!

Comme ce code contient des éléments non imprimables, voici 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

Le temps de sommeil est de 500 millisecondes.

giffy

Kritixi Lithos
la source
Pouvez-vous donner un lien TIO?
Rɪᴋᴇʀ
Quelques astuces (pas toutes testées): H|-> {. <C-v>êx-> , et 5L->}
DJMcMayhem
En outre, vos commandes de repchar utilisent tous 9 lorsque vous pouvez utiliser 10 ou 11. Par exemple: modifier les trois lignes à moyen ±± a, o° yetc±±<space>
DJMcMayhem
@DJMcMayhem Tout fonctionne mais 5L=> }.
Kritixi Lithos
@Riker Fait, mais notez que le lien TIO ne peut pas afficher l'animation
Kritixi Lithos
9

ZX Spectrum BASIC, 274 octets

Eh bien, quelqu'un devait le faire. Les pédants voudront peut-être disqualifier cela parce qu'ils sont trop lents et qu'ils n'ont pas de pause entre les animations, mais je réclame un cas particulier ici :-)

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

Pas très golfé non plus. 274 octets est le nombre d'octets enregistrés par le spectre sur bande lors de l'enregistrement de ce programme.

Philip Kendall
la source
1
Vous avez eu la peine d'utiliser ( SGN PIpour 1économiser 5 octets), mais vous avez oublié NOT PIpour 0et VALpour les autres constantes ...
Neil
1
NOT PIJe viens de manquer. Délibérément n'a pas fait VALcomme il était assez lent, et VALest horriblement lent.
Philip Kendall
1
ZX Basic reçoit toujours un vote positif de ma part. Pas de pédantisme ici. Je me souviens du bon vieux temps ... Bonne réponse.
ElPedro
8

SVG (HTML5), 267 octets

<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 bien, il est rectangulaire, et il est un chapiteau, et il est du texte ASCII ...

Neil
la source
1
... et ça fonctionne bien :-)
Luis Mendo
7

PHP, 184 octets

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 nouvelles lignes pour effacer l'écran; courir avec -nr.
La pause réelle est de 1 seconde; mais j'ai accéléré le gif.

HappyBirthday

non-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
        );
}
Titus
la source
6

Python 2, 230 184 octets

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

Essayez-le sur repl.it

enter image description here

ovs
la source
5

Python 3 , 160 octets

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]

Essayez-le en ligne! (Pas d'animation)

Xnor
la source
Je savais que tu viendrais me battre avec Python. J'allais si bien! Au moins le mien utilise des "bugs" que vous ne pouvez pas utiliser avec Python 3 :-). Bonne réponse comme toujours. +1
ElPedro
5

Python 2, 218 200 190 181 176 octets

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 octets en supprimant le strformatage

-10 octets, grâce aux suggestions de @Uriel et @ElPedro

-9 octets en supprimant l'indexation négative

-5 octets en stockant l'inverse en ftant vque whilecondition

repl.it

Wondercricket
la source
1
Vous pouvez couper les espaces entre while 1:et printet remplacer le suivant ;par une nouvelle ligne (réelle). Aussi f='H... Aussi f[:1]est actuellement f[0].
Uriel
OP indique que le temps peut être compris entre 0,1 et 1 seconde, alors pourquoi ne time.sleep(1)pas le prendre en dessous de 200?
ElPedro
3

Ruby + GNU Core Utils, 136 octets

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}
Valeur d'encre
la source
3

Python 2, 182 179 173 160 octets

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]

Essayez-le sur repl.it

Ne fonctionne pas sur TIO donc ma première tentative d'utilisation repl.it

Modifier l' aide d' une boucle « perte de temps » à compter de 1000000 donne un retard constant de entre 0,1 et 1 s sur ma machine et sur repl.it et enregistre l'importation time. J'imagine que si vous utilisiez un vieil ordinateur 286 doté de 64 Mo de RAM, il pourrait dépasser la seconde, mais je suis à peu près sûr que cela ne se produira pas. Si c'est le cas, réduisez simplement le 1000000 et sauvez-moi quelques octets :-)

Modifier 2 6 pour se souvenir de cette liste dans Python 2 contiennent la dernière valeur de safin que je puisse l’utiliser plus tard et je me souviens aussi que presque tout ce qui est autre que 0 et "" est la vérité. Bugs ou fonctionnalités? Ne t'en fais pas. Cela m'a sauvé 6 octets :-)

Edit 3 Another 13 en revenant sur la rotation et en utilisant une liste de compréhension pour les lignes du milieu à l'intérieur de la jointure et en passant 3000000à 40**4. Merci à @FelixDombek pour le dernier. J'ai dû perdre mon tour de compréhension de liste cependant.

ElPedro
la source
1
Pourriez-vous utiliser la notation scientifique ou une expression de pouvoir pour le grand nombre?
Felix Dombek
1
Expression de pouvoir oui, notation scientifique non (parce que cela devient un float, que vous ne pouvez pas multiplier avec des chaînes).
L3viathan
3
Obligatoire 999999au lieu d' 1000000un octet: V
Value Ink
Merci @ValueInk mais en utilisant le "bug" de la compréhension de la liste qui fuit, je devais en fait passer à 3000000 et encore économiser 3 octets :-)
ElPedro
Malheureusement non. @ L3viathan a raison sur ce point.
ElPedro
2

ZX81 Code machine Z80, 158 130 octets

OK, donc il a beaucoup d'octets jusqu'à ce qu'il soit assemblé, mais tombe ensuite à 130 octets. Vous ne savez pas si cela enfreint les règles? C'est mon premier post et seulement en tant qu'invité.

Le programme utilise la «force brute» pour afficher le message plutôt que l’utilisation intelligente de fonctions, comme il ressort de la façon dont il dispose de fragments de code distincts pour la ligne supérieure, la verticale à droite, la ligne inférieure et la verticale à gauche. L'animation est obtenue en faisant pivoter le contenu du message, puis en l'affichant juste après un court délai, ce qui devrait prendre 0,2 seconde exactement, car il attend 10 images sur un taux de 50 (pour les spécifications britanniques Zeddys de toute façon).

Je dois créditer à kmurta le concept de rotation du message pour obtenir l'animation - qui a économisé 28 octets !!!

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

Désolé, je ne peux pas publier de lien en cours d'exécution car il s'agit d'un programme compilé au format .P pour EightyOne (ou d'autres émulateurs) ou d'un Zeddy réel si vous avez un ZXPand ou similaire pour le charger.

Le fichier .P peut être téléchargé à l’ adresse http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988.

Lardo Boffin
la source
Bonne réponse! Il me manquait un code machine Z80 :-) Et bienvenue sur le site!
Luis Mendo
Pourriez-vous peut-être fournir un gif du programme en cours d'exécution?
Luis Mendo
Désolé, je n'ai pas de logiciel de création gif!
Lardo Boffin