С днем ​​рождения, Раффаэле Чекко!


33

Раффаэль Чекко программист , который произвел некоторые из лучших видеоигр для ZX Spectrum компьютера в конце восьмидесятых годов. Среди прочего он разработал широко известный киберноид и экзолон .

Рафаэле исполняется 50 лет 10 мая 2017 года . Этот вызов - небольшая дань ему за счастливые часы, которые многие из нас потратили, играя в эти потрясающие игры, и за мотивацию, которую они принесли.

Соревнование

Цель состоит в том, чтобы создать прямоугольный шатер, вдохновленный тем, что можно увидеть на экране главного меню 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!)
Луис Мендо

«Это можно сделать любым способом, например, написав соответствующее количество новых строк, чтобы эффективно очистить экран». - это не зависит от размера консоли? Допустимо ли печатать одну новую строку, если она (вместе со следующим прямоугольником) означает, что следующая итерация заменяет предыдущую (в моей маленькой консоли)?
Джонатан Аллан

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 лучше, чем первый. Я уверен, что я видел этот эффект также в паре сумасшедших. ;-)
Арно

Да, я тоже предпочел второе :-)
Луис Мендо

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, потому что программа зацикливается бесконечно. Попробуйте онлайн!

Поскольку этот код содержит непечатаемые, здесь есть 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

Время сна составляет 500 миллисекунд.

GiFFY


Можете ли вы дать ссылку TIO?
Rɪᴋᴇʀ

Несколько советов (не все проверены): H|-> {. <C-v>êx-> и 5L->}
DJMcMayhem

Кроме того , ваши команды repchar все используют 9 , когда вы могли бы использовать 10 или 11. Например: изменение среднего три строки ±± a, o° yиc±±<space>
DJMcMayhem

@DJMcMayhem Все работает, но 5L=> }.
Критиси Литос

@Riker Готово, но обратите внимание, что ссылка
TIO

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для других констант ...
Нил

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 :-)
Луис Мендо

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 секунду; но я ускорил гифку.

С Днем рожденья

ungolfed

$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

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]

-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

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 дает постоянную задержку от 0,1 до 1 с на моей машине и на repl.it и экономит импорт time. Я предполагаю, что если вы запустили его на старом компьютере 286 с 64 МБ ОЗУ, он может пройти более 1 секунды, но я уверен, что этого не произойдет. Если это так, просто уменьшите 1000000 и сэкономьте мне пару байтов :-)

Отредактируйте 2-6, чтобы помнить, что списочные выражения в Python 2 пропускают последнее значение, sтак что я могу использовать его позже, а также помните, что все, что угодно, кроме 0 и "", является правдой. Ошибки или особенности? Не волнует Это спасло меня 6 байтов :-)

Отредактируйте еще 3 , изменив вращение и используя понимание списка для средних рядов внутри объединения и изменив 3000000на 40**4. Спасибо @FelixDombek за последний. Пришлось потерять мой трюк с пониманием списка.


1
Не могли бы вы использовать научное обозначение или степенное выражение для большого числа?
Феликс Домбек

1
Степенное выражение да, научное обозначение нет (потому что он становится плавающей точкой, которую нельзя умножить на строки).
L3viathan

3
Обязательный 999999вместо 1000000байта: V
Value Ink

Спасибо @ValueInk, но с помощью «ошибки» понимания неплотного списка мне фактически пришлось увеличить до 3000000 и все еще сохранить 3 байта :-)
ElPedro

К сожалению нет. @ 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 запущенной программы?
Луис Мендо

Извините - у меня нет программного обеспечения для создания картинок!
Лардо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.