생일 축하합니다, Raffaele Cecco!


33

라파엘 세코는 생산 프로그래머 일부가장 에 대한 비디오 게임 ZX 스펙트럼 80 년대 후반에 컴퓨터를. 그 중에서도 그는 호평을받은 CybernoidExolon 을 개발 했습니다 .

라파엘레는 2017 년 5 월 10 일에 50 세가되었습니다 . 이 도전은 많은 사람들이 그 훌륭한 게임을하면서 보낸 행복한 시간과 그들이 가져온 동기에 대한 작은 찬사입니다.

도전

사이버 노이드의 메인 메뉴 화면 에서 볼 수 있지만 ASCII 아트에서 영감을 얻은 직사각형 선택 윤곽을 만드는 것이 목적입니다 .

특히, 문자열 "Happy birthday Raffaele Cecco "(마지막 공간 참고)은 12x5 직사각형의 가장자리를 따라 회전하며 스냅 샷간에 일정한 일시 정지 시간이 표시됩니다.

예를 들어, 텍스트가 시계 방향으로 표시되고 시계 반대 방향으로 회전한다고 가정하면 (아래 옵션 참조) 사각형 윤곽의 연속 된 스냅 샷이 3 개 있습니다.

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 초 사이에서 자유롭게 선택할 수 있습니다. 첫 번째 스냅 샷을 표시하기 전에 초기 일시 정지가 허용됩니다.
  • 문자는 대문자, 소문자 또는 대소 문자를 혼합 할 수 있습니다 (위의 예와 같이).
  • 선행 또는 후행 공백이 허용됩니다.

모든 프로그래밍 언어의 프로그램 또는 기능 이 허용 됩니다 . 표준 허점 은 금지되어 있습니다.

가능하면 출력을 보여주는 gif 파일 또는 프로그램 테스트 링크를 제공하십시오.

바이트 단위의 최단 코드가 이깁니다.


4
덮어 쓰기가 불가능하면 어떻게합니까? 99 개의 빨간 풍선을 사용할 수 있습니까?
Titus

@Titus 화면을 효과적으로 지우고 움직이는 텍스트의 느낌을주는 경우에만 (gif 바랍니다!)
Luis Mendo

"이는 화면을 효과적으로 지우기 위해 적절한 수의 줄 바꾸기를 작성하는 등 어떤 방법 으로든 수행 할 수 있습니다." -콘솔 크기에 의존하지 않습니까? 하나의 줄 바꿈이 다음 사각형과 함께 다음 줄이 이전 줄을 대체한다는 것을 의미한다면 (내 작은 콘솔에서) 줄 바꿈을 인쇄 할 수 있습니까?
Jonathan Allan

1
@Jonathan Ok, 효과를보기 위해 콘솔에 gif를 제공하십시오.
Luis Mendo

답변:


8

젤리 , 74  65 바이트

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

6 줄 높이의 cp-65001 콘솔에서 실행되는 Windows 버전입니다.
반복 사이에 0.5 초 (및 평가) 일시 정지가 있습니다.

gif of output

방법?

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


좋아 보인다!
Luis Mendo

@LuisMendo Cybernoid II는 첫 번째 것보다 더 잘 기억하지만 추억을 되살려줍니다. 나는이 효과를 두 개의 cracktros에서도 보았을 것이라고 확신합니다. ;-)
Arnauld

그렇습니다, 나는 또한 두 번째를 선호했습니다 :-)
Luis Mendo

11

ZX 스펙트럼 기본, 187 바이트

필립 (Philip)이 몇 분 동안 나를 이겼다는 것에 짜증이 났다. :-) 같은 숫자 \{15}는 인쇄 할 수없는 제어 코드 이다. 전체 직사각형은 즉시 인쇄되지 않지만 처음 몇 프레임 이후에 제자리에 배치됩니다.

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를 수행하는 대신 프레임 사이에서 화면을 지우면 4 바이트를 절약 할 수 있지만 그 가치가 너무 깜빡입니다 ...

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
아, 그러나 당신은 많은 바이트로 이깁니다 :-)
Philip Kendall

2
PPCG에 오신 것을 환영합니다!
Martin Ender

1
게임에 오신 것을 환영합니다. ZX는 항상보기 좋습니다. 좋은 대답입니다. +1.
ElPedro

10

V, 75 71 70 바이트

@DJMcMayhem 덕분에 4 바이트 절약

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

여기에 TIO 링크가 있지만 프로그램이 무한 반복되므로 TIO에서는 작동하지 않습니다. 온라인으로 사용해보십시오!

이 코드에는 인쇄 할 수없는 항목이 포함되어 있으므로 다음은 16 진 덤프입니다.

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 밀리 초입니다.

giffy


TIO 링크를 줄 수 있습니까?
Rɪᴋᴇʀ

일부 팁 (모두 테스트되지는 않음) : H|-> {. <C-v>êx-> 5L->}
DJMcMayhem

에 중간 세 줄을 변경 : 또한, 귀하의 repchar 명령은 모든 당신이 10 예 (11)를 사용할 수있을 때 9를 사용하는 ±± a, o° y그리고c±±<space>
DJMcMayhem

@DJMcMayhem 모든 것이 작동하지만 5L=> }.
Kritixi Lithos

@Riker Done, 그러나 TIO 링크는 애니메이션을 보여줄 수 없습니다.
Kritixi Lithos

9

ZX 스펙트럼 기본, 274 바이트

누군가가해야 했어요 Pedants는 너무 느리고 애니메이션 사이에 일시 중지가 없기 때문에이 자격을 박탈하려고 할 수도 있지만 여기서 특별한 경우를 주장하고 있습니다 :-)

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 PI위해 1(5 바이트를 저장)하지만 당신은 잊었 NOT PI을 위해 0그리고 VAL... 다른 상수
닐을

1
NOT PI방금보고 싶었어 고의로 VAL느리게 했던 것처럼 의도적으로하지 않았다 VAL.
필립 켄달

1
ZX Basic은 항상 저에게 찬성을 얻습니다. 여기에 교육학이 없습니다. 좋은 시절을 기억합니다. 좋은 대답입니다.
ElPedro

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
... 그리고 그것은 smooooth를 실행합니다 :-)
Luis Mendo

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를 ed 다.

HappyBirthday

언 골프

$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

파이썬 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에서 사용해보십시오

enter image description here


5

파이썬 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 3 :-)에서 사용할 수없는 "버그"를 사용합니다. 언제나처럼 좋은 답변. +1
ElPedro

5

파이썬 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]

제거하여 -18 바이트 str서식

@Uriel 및 @ElPedro 제안 덕분에 -10 바이트

음수 인덱싱을 제거하여 -9 바이트

-5 반전 저장하여 바이트 fvwhile조건

반복


1
당신은 사이의 공백을 줄일 수 while 1:print그 다음 교체 ;(실제) 개행을. 또한 f='H... 또한 f[:1]실제로 f[0]입니다.
Uriel

OP는 시간이 0.1 초에서 1 초 사이가 될 수 있다고 설명합니다. 왜 time.sleep(1)200 이하로 가져 가지 않겠습니까?
ElPedro

3

루비 + GNU 코어 유틸리티, 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

파이썬 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과 1 사이 의 일관된 지연이 발생 하고 가져 오기를 저장 합니다. 64MB RAM이있는 오래된 286 컴퓨터에서 실행하면 1 초가 걸릴 수 있지만 그 일은 일어나지 않을 것이라고 확신합니다. 그렇다면 단순히 1000000을 줄이고 몇 바이트를 절약하십시오 :-)time

편집 2 -6의 마지막 값 누출 파이썬 2에서 그 지능형리스트를 기억하기위한 s나중에 사용할 수 있도록하고 또한 0이 아닌 꽤 잘 아무것도 ""truthy 것을 기억. 버그 또는 기능? 상관 없어 그것은 6 바이트를 저장했습니다 :-)

회전을 수정 하고 조인 내부의 가운데 행에 대해 목록 이해를 사용하고로 변경하여 다른 13을 편집3000000 합니다 40**4. 마지막으로 @FelixDombek에게 감사합니다. 그래도 내 목록 이해 트릭을 잃어 버렸습니다.


1
과학적 표기법이나 강력한 표현을 큰 숫자로 사용할 수 있습니까?
Felix Dombek

1
전원 표현 예, 과학적 표기법 아니요 (float가되기 때문에 문자열을 곱할 수 없음).
L3via5

3
바이트 999999대신 필수 1000000: V
Value Ink

@ValueInk에게 감사하지만 누수 목록 이해 "버그"를 사용하여 실제로 3000000으로 늘려서 여전히 3 바이트를 절약해야했습니다 :-)
ElPedro

불행하게도. @ L3viathan이 바로 그 것입니다.
ElPedro

2

ZX81 Z80 기계 코드 (158) 130 바이트

좋아, 조립 될 때까지 많은 바이트를 가지고 있지만 130 바이트로 떨어집니다. 그것이 규칙을 어기는지 확실하지 않습니까? 첫 번째 게시물이며 손님으로 만 제공됩니다.

이 프로그램은 상단, 오른쪽 세로, 아래쪽 세로 및 왼쪽 세로에 대해 별도의 코드 청크가있는 방식에서 볼 수 있듯이 영리한 기능 사용보다는 메시지를 표시하기 위해 'brute force'를 사용합니다. 애니메이션은 메시지의 내용을 회전시킨 다음 짧은 지연 후에 메시지를 표시합니다. 짧은 지연 후에 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,__

죄송합니다. EightyOne (또는 다른 에뮬레이터) 용 .P 형식의 컴파일 된 프로그램이거나 ZXP가 있거나 이와 비슷한 경우 실제 Zeddy로 컴파일 된 프로그램이므로 실행중인 링크를 게시 할 수 없습니다.

.P는 http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988 에서 다운로드 할 수 있습니다 .


좋은 대답입니다! Z80 기계 코드에서 하나가 누락되었습니다 :-) 그리고 사이트에 오신 것을 환영합니다!
Luis Mendo

실행중인 프로그램의 gif를 제공 할 수 있습니까?
Luis Mendo 1

죄송합니다-소프트웨어를 만드는 GIF가 없습니다!
Lardo Boffin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.