З днем ​​народження, Raffaele Cecco!


33

Раффаель Чекко програміст , який справив деякі з кращих відеоігор для ZX Spectrum комп'ютера в кінці вісімдесятих років. Серед іншого, він розробив дуже популярна Cybernoid і EXOLON .

10 травня 2017 року Raffaele виповнилося 50 років . Цей виклик - це невелика данина йому за ті щасливі години, які багато з нас проводили, граючи в ті приголомшливі ігри, та за мотивацію, яку вони принесли.

Змагання

Мета полягає у створенні прямокутного накиду, натхненного тим, що бачиться на екрані головного меню Cybernoid , але в мистецтві 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 с. Початкова пауза перед відображенням першого знімка є прийнятною.
  • Букви можуть бути великими, малими або змішаними (як у наведеному вище прикладі).
  • Порожній простір для провідних чи задніх дозволений.

Програми або функції дозволені на будь- якій мові програмування . Стандартні лазівки заборонені.

Якщо можливо, надайте файл gif із зображенням результатів чи посилання для тестування програми.

Виграє найкоротший код у байтах.


4
Що робити, якщо неможливо перезаписати? Чи можемо ми використовувати 99 червоних повітряних кульок ... нові лінії?
Тіт

@Titus Тільки якщо це ефективно очищає екран і створює враження рухомого тексту (gif please!)
Луїс Мендо

"Це можна зробити будь-якими способами, наприклад, написавши відповідну кількість нових рядків для ефективного очищення екрана." - Це не залежить від розміру консолі? Чи прийнятно друкувати один новий рядок, якщо він (разом із наступним прямокутником) означає, що наступна ітерація замінить попередню (на моїй маленькій консолі)?
Джонатан Аллан

1
@Jonathan Добре, просто надайте gif з цією консоллю, щоб побачити ефект
Луїс Мендо

Відповіді:


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 Це повертає спогади, хоча я пам'ятаю Cybernoid II краще, ніж перший. Я впевнений, що бачив цей ефект і в декількох cracktros. ;-)
Арнольд

Так, я також віддав перевагу другому :-)
Луїс Мендо

11

ZX Spectrum BASIC, 187 байт

Роздратовано, що Філіп побив мене до нього за пару хвилин :-) Числа начебто \{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 байт

4 байти збережено завдяки @DJMcMayhem

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. Наприклад: зміна середнього три рядки ±± a, o° yіc±±<space>
DJMcMayhem

@DJMcMayhem Все працює, але 5L=> }.
Kritixi Lithos

@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 байти - це кількість байтів, збережених Spectrum на стрічці під час збереження цієї програми.


1
Ви пішли на всі проблеми використання SGN PIдля 1(економія 5 байт) , але ви забули NOT PIдля 0і VALдля інших констант ...
Neil

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
... і він працює плавно :-)
Луїс Мендо

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
        );
}


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 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форматування

-10 байт, завдяки пропозиціям @Uriel та @ElPedro

-9 байт шляхом видалення негативної індексації

-5 байт шляхом збереження зворотної , fяк vі whileумова

repl.it


1
Ви можете вирізати пробіл між while 1:і printзамінити наступний ;(фактичним) новим рядком. Також f='H... Також f[:1]актуально f[0].
Уріель

ОП заявляє, що час може становити що завгодно від 0,1 до 1 секунди, то чому б не time.sleep(1)взяти його менше 200?
ElPedro


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 дає послідовну затримку між 0,1 та 1 секундою на моїй машині та на repl.it та економить імпорт time. Я думаю, якщо ви запустили його на старий комп'ютер 286 з 64 Мб оперативної пам’яті, можливо, це піде за 1 секунду, але я впевнений, що цього не відбудеться. Якщо так, то просто зменшіть 1000000 і заощадите мені пару байтів :-)

Редагувати 2 -6, щоб запам’ятати, що розуміння списку в Python 2 просочує останнє значення, sтому я можу його використовувати пізніше, а також пам’ятаючи, що досить добре все, крім 0 та „„, є правдою. Помилки чи функції? Не байдуже. Це врятувало мене 6 байтів :-)

Змініть 3 Ще 13, повернувши обертання та використовуючи розуміння списку для середніх рядків всередині з'єднання та змінивши 3000000на 40**4. Дякуємо @FelixDombek за останній. Довелося втратити мій трюк із розуміння списку.


1
Чи можете ви використовувати наукові позначення або сильний вираз для великої кількості?
Фелікс Домбек

1
Вираз сили так, наукових позначень немає (тому що він стає плаваючою, яку ви не можете помножити на рядки).
L3viathan

3
Обов’язкове 999999замість 1000000байту: V
Значення чорнила

Дякую @ValueInk, але, використовуючи проникливий список розуміння "помилка", я фактично повинен був збільшити до 3000000 і все-таки
зберег

На жаль, немає. @ L3viathan прямо на цьому.
ElPedro

2

Код машини ZX81 Z80, 158 130 байт

Добре, щоб у нього було багато байтів, поки він не збирається, але потім він опускається до 130 байт. Не впевнені, чи це порушує якісь правила? Це мій перший пост і лише як гість.

Програма використовує "грубу силу" для відображення повідомлення, а не розумного використання функції, як видно з того, як у нього є окремі фрагменти коду для верхнього рядка, правої вертикалі, нижньої та лівої вертикальної. Анімація досягається обертанням вмісту повідомлення, а потім просто відображенням його після невеликої затримки, яка повинна бути майже рівною 0,2 секунди, оскільки вона чекає 10 кадрів із швидкості 50 (для британських специфікацій 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 для EightyOne (або інших емуляторів) або власне Zeddy, якщо для завантаження у вас є ZXPand.

.P можна завантажити за адресою http://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988


Гарна відповідь! Мені не вистачало одного з машинного коду Z80 :-) І ласкаво просимо на сайт!
Луїс Мендо

Не могли б ви надати gif програми, що працює?
Луїс Мендо

Вибачте - у мене немає програм для створення gif!
Лардо Боффін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.