生日快乐,拉斐尔·塞科(Raffaele Cecco)!


33

拉斐尔切科是谁制作了一个程序员的一些最好的视频游戏为ZX频谱在八十年代末计算机。他开发了广受赞誉的Cyber​​noidExolon

Raffaele 将于2017年5月10日50岁。挑战对他是微不足道的,对于我们许多人度过了那些精彩的游戏所带来的欢乐时光,以及他们带来的动力。

挑战

目的是产生一个矩形的字幕,该字幕的灵感来自Cyber​​noid 主菜单屏幕,但采用ASCII艺术。

具体来说,将显示字符串"Happy birthday Raffaele Cecco "(注意最终空间)沿12×5矩形的边缘旋转,并且快照之间的暂停时间恒定。

例如,假设文本按顺时针方向显示并逆时针旋转(请参见下面的选项),则这是矩形选框的三个连续快照:

Happy birthd
           a
o          y
c           
ceC eleaffaR

然后

appy birthda
H          y

o          R
cceC eleaffa

然后

ppy birthday
a           
H          R
           a
occeC eleaff

等等。

规则

没有输入。输出将通过STDOUT或等效输出,或在图形窗口中。

输出实际上应该描述旋转的文本。也就是说,每个新快照都应覆盖前一个快照,以给人留下动感的印象。这可以通过任何方式完成,例如,编写适当数量的换行符以有效清除屏幕。如果这仅对给定的屏幕尺寸有效,则可以接受;只需在答案中指定即可。

接受以下选项:

  • 文本可以顺时针或逆时针显示,也可以顺时针或逆时针旋转(上面的示例快照假定顺时针显示,逆时针旋转)。
  • 旋转应无限循环进行(直到程序停止),并且可以在任何阶段开始。
  • 快照之间的暂停时间应大致恒定,但可以在0.1到1 s之间自由选择。在显示第一个快照之前的初始暂停是可以接受的。
  • 字母可以是大写,小写或混合大小写(如上例所示)。
  • 允许前导或尾随空格。

允许使用任何编程语言编写程序或功能。禁止出现标准漏洞

如果可能的话,请提供显示输出的gif文件或测试程序的链接。

以字节为单位的最短代码获胜。


4
如果无法覆盖怎么办?我们可以使用99个红色气球er ...换行符吗?
泰特斯

@Titus只有这样才能有效地清除屏幕并给人留下移动文本的印象(请给gif!)
Luis Mendo

“这可以通过任何方式完成,例如,编写适当数量的换行符以有效地清除屏幕。” -这不取决于控制台的大小吗?如果打印一个换行符(以及下一个矩形)意味着下一个迭代替换了上一个(在我的小型控制台中),可以接受吗?
乔纳森·艾伦

1
@Jonathan Ok,只需提供带有该控制台的gif即可查看效果
Luis Mendo

Answers:


8

果冻74  65 个字节

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

Windows版本在6行高cp-65001控制台中运行。
迭代之间有半秒(加上评估)的暂停:

输出的gif

怎么样?

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

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


看起来不错!
路易斯·门多

@LuisMendo尽管我记得Cyber​​noid II比第一个更好,但它带回了回忆。我敢肯定,我也在几个cracktros中也看到了这种效果。;-)
Arnauld

是的,我也喜欢第二个:-)
路易斯·门多

11

ZX Spectrum BASIC,187字节

菲利普(Philip)在几分钟前就击败了我,这让他很生气:-)像这样\{15}的数字是无法打印的控制代码- 如果您想修改,请使用zmakebas进行编译。请注意,并不是立即打印出完整的矩形,而是在前几帧后将其固定到位。

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

在此处尝试(在线JS仿真版本,请按Enter键开始)... http://jsspeccy.zxdemo.org/cecco/

您也可以通过清除帧之间的屏幕而不是执行PRINT AT来节省四个字节,但这太忽悠了,不值得。

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
啊,但是你赢了很多字节:-)
菲利普·肯德尔

2
欢迎来到PPCG!
马丁·恩德

1
欢迎来到游戏。ZX总是很高兴看到。好答案。+1。
ElPedro

10

V,75 71 70字节

@DJMcMayhem节省了4个字节

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

这是一个TIO链接,但是请注意,这在TIO上将不起作用,因为程序会无限循环。在线尝试!

由于此代码包含不可打印的内容,因此这里是一个十六进制转储。

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

睡眠时间为500毫秒。

轻浮的


你能给一个TIO链接吗?
Rɪᴋᴇʀ

一些技巧(并非全部经过测试):H|-> {<C-v>êx-> 5L->}
DJMcMayhem

此外,您repchar命令都使用9时,你可以使用10或11例如:改变中间三线±± ao° y以及c±±<space>
DJMcMayhem

@DJMcMayhem一切正常,但5L=> }
Kritixi Lithos'5

@Riker完成,但请注意,TIO链接无法显示动画
Kritixi Lithos

9

ZX Spectrum BASIC,274字节

好吧,有人必须这样做。踩脚者可能希望取消此速度,因为它太慢并且在动画之间没有暂停,但是我在这里要求特殊情况:-)

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

也不太打高尔夫球。274字节是频谱在保存此程序时保存到磁带的字节数。


1
麻烦使用SGN PIfor 1(节省5个字节),但是您忘了NOT PIfor 0VAL其他常量……
Neil

1
NOT PI我只是想念。故意没有做,VAL因为它足够慢,而且VAL非常慢。
菲利普·肯德尔

1
ZX Basic总是得到我的支持。这里没有学究。我记得过去的美好时光...很好的答案。
ElPedro'5

8

SVG(HTML5),267字节

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

好吧,它矩形,一个字幕,它 ASCII文本...


1
...并且运行顺畅:-)
路易斯·门多

7

PHP,184字节

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

打印39条换行符以清除屏幕;与运行-nr
实际暂停时间为1秒;但我加快了gif的速度。

生日快乐

不打高尔夫球

$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个字节

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

在repl.it上尝试

在此处输入图片说明


5

Python 3,160个字节

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]

在线尝试!(无动画)


我有点知道您会进来并用Python击败我。我做得很好!至少我的使用了您无法在Python 3中使用的“错误” :-)。一如既往的好答案。+1
ElPedro '17

5

Python 2中,218个 200 190 181 176字节

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]

删除str格式为-18个字节

-10个字节,感谢@Uriel和@ElPedro建议

删除负索引可减少-9个字节

通过存储反转的fas vwhilecondition来获得-5字节

代表


1
您可以在while 1:和之间剪切空格,并用(实际)换行符print替换下;一个。也f='H..。也f[:1]就是actualy f[0]
Uriel'5

OP指出时间可以在0.1到1秒之间,所以为什么不time.sleep(1)将其设置为200以下呢?
ElPedro'5

3

Ruby + GNU Core Utils,136个字节

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

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]

在repl.it上尝试

在TIO上不起作用,所以我第一次尝试使用repl.it

编辑使用“浪费时间”循环计数到1000000可以在我的机器和repl.it产生0.1到1s的一致延迟。并节省导入time。我猜如果您在具有64MB RAM的旧286计算机上运行它,可能会花费1秒以上的时间,但是我敢肯定这不会发生。如果确实如此,则只需减少1000000并为我节省几个字节即可:-)

编辑2 -6来记住Python 2中的列表s推导泄漏了最后一个值,因此我以后可以使用它,并且还记得除0和“”以外的其他内容都是正确的。错误或功能?不在乎 它为我节省了6个字节:-)

编辑3另一个13,方法是旋转,并对联接中的中间行使用列表推导并将其更改300000040**4。感谢@FelixDombek的最后一个。虽然不得不失去我的列表理解技巧。


1
您可以对大量数字使用科学计数法或幂表示吗?
Felix Dombek

1
幂表达式是,科学计数法否(因为它变成浮点数,不能与字符串相乘)。
L3viathan '17

3
强制性的,999999而不是1000000一个字节的:V
值墨水

感谢@ValueInk,但是通过使用泄漏列表理解“ bug”,我实际上不得不增加到3000000,并且仍然保存了3个字节:-)
ElPedro

很不幸的是,不行。@ L3viathan是正确的那个。
ElPedro

2

ZX81 Z80机器码 158个 130字节

好的,所以它有很多字节,直到组装好为止,然后下降到130个字节。不确定是否违反任何规则?这是我的第一个帖子,并且仅作为来宾。

该程序使用“蛮力”来显示消息,而不是巧妙地使用功能,这从它的顶行,右手垂直,底行和左手垂直具有单独的代码块的方式可以看出。动画是通过旋转消息的内容,然后在短暂的延迟后才显示它来实现的,该延迟应该恰好是0.2秒,因为它以50的速率等待10帧(无论如何对于英国规格的Zeddys)。

我不得不将kmurta归因于旋转消息以获取动画的概念-节省了28个字节!!!

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

抱歉,我无法发布运行的链接,因为它是.P格式的已编译程序,适用于AugyOne(或其他仿真器),或者如果您具有ZXPand或类似的加载程序,则它是实际的Zeddy。

可以从http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988下载.P


好答案!我在Z80机器代码中缺少一个:-)欢迎来到该网站!
路易斯·门多

您能否提供正在运行的程序的gif图像?
路易斯·门多

抱歉-我没有任何gif创建软件!
拉多·博芬(Lardo Boffin)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.