お誕生日おめでとう、ラファエル・チェッコ!


33

ラファエル・セコは生産プログラマであるいくつか最高のためのビデオゲームをZXスペクトラム 80年代後半には、コンピュータ。とりわけ、彼は高い評価を得ているCyber​​noidExolonを開発しました

Raffaeleは2017年5月10日に50歳になります。私たちの多くがこれらの素晴らしいゲームをプレイして過ごした幸せな時間と、彼らがもたらしたモチベーションのために、この挑戦​​は彼への小さな敬意です。

チャレンジ

目的は、Cyber​​noidのメインメニュー画面に見られるものに触発されたが、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それが効果的に画面をクリアし、動くテキストの印象を与える場合のみ(gifください!)
ルイスメンドー

「これは任意の手段で行うことができます。例えば、適切な数の改行を書いて画面を効果的にクリアします。」-これはコンソールのサイズに依存していませんか?(次の長方形と一緒に)1つの改行を印刷することは、次の反復が(私の小さなコンソールで)前の反復を置き換えることを意味する場合、受け入れられますか?
ジョナサンアラン

1
@ジョナサンOK]をクリックして、ちょうど効果を参照しているコンソールとのGIFを提供
ルイス・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>


いいね!
ルイスメンドー

@LuisMendoこれで思い出がよみがえりますが、Cyber​​noid IIは最初のものよりもよく覚えています。私は、この効果をいくつかのクラックトロでも見たことがあると思います。;-)
Arnauld

はい、私も2番目を好んだ:
ルイス・メンドー

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を実行する代わりにフレーム間で画面をクリアすることで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
ああ、でもたくさんのバイトで勝ちます:
フィリップケンドール

2
PPCGへようこそ!
マーティンエンダー

1
ゲームへようこそ。ZXはいつでも見ることができます。いい答えだ。+1。
エルペドロ

10

V、75 71 70バイト

@DJMcMayhemのおかげで4バイト節約

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

真ん中の3行を変更します。あなたが例えば10または11を使用することができたときにも、あなたのrepcharコマンドは、すべての9を使用している±± ao° yc±±<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ため0VAL...他の定数のために
ニール・

1
NOT PI私はちょうど逃した。VAL十分に遅いため、意図的に実行しませんでしたVAL。恐ろしく遅いです。
フィリップケンドール

1
ZX Basicは常に私から賛成票をもらいます。ここには教訓はありません。古き良き時代を覚えています...いい答えです。
エルペドロ

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をスピードアップしました。

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

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で試してください

enter image description here


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
エルペドロ

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]

strフォーマットを削除して-18バイト

-10バイト、@ Urielおよび@ElPedroの提案のおかげ

負のインデックス付けを削除して-9バイト

-5逆格納することによって、バイトfとしてv、およびwhile条件

repl.it


1
あなたは、間に空白を切ることができるwhile 1:printして次を置き換える;(実際の)改行で。またf='H..。またf[:1]実際にf[0]です。
ウリエル

OPは、時間は0.1〜1秒の範囲であると述べているので、time.sleep(1)200未満にしないのはなぜですか。
エルペドロ

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〜1秒の一貫した遅延が発生します。、インポートが保存されtimeます。64MB RAMを搭載した古い286コンピューターで実行した場合、1秒以上かかる可能性がありますが、それは起こらないと確信しています。もしそうなら、単に1000000を減らして、数バイト節約してください:-)

編集2 -6の最後の値漏れるのPython 2とリストの内包表記を覚えるためにs、私はそれを後で使用できるようにしても、0以外とかなりよく何かが「」truthyであることを思い出します。バグまたは機能?気にしないで。6バイト節約できました:-)

回転を尊重し、結合内の中央の行にリストの内包表記を使用して、次のように変更3000000することにより、別の13を編集します。40**4ます。最後の@FelixDombekに感謝します。しかし、私のリストの理解のトリックを失う必要がありました。


1
大きな数字に科学表記法やパワー表現を使用できますか?
フェリックスドンベック

1
パワー表現はい、科学表記法はありません(フロートになり、文字列で乗算できないため)。
L3viathan

3
必須999999の代わりに、1000000バイトのために:V
バリューインク

@ValueInkに感謝しますが、リーキーリストの理解「バグ」を使用することで、実際に3000000に増やす必要があり、それでも3バイトを節約できました:-)
ElPedro

残念だけど違う。@ L3viathanはその1つです。
エルペドロ

2

ZX81 Z80マシンコード、158 130バイト

それで、組み立てられるまで多くのバイトを持っていますが、それから130バイトに落ちます。それがルールに違反しているかどうかわからない?その最初の投稿とゲストとしてのみ。

プログラムは、トップライン、右手縦線、ボトムライン、左手縦線に別々のコードチャンクがある方法からわかるように、巧妙な関数使用ではなく「ブルートフォース」を使用してメッセージを表示します。アニメーションは、メッセージの内容を回転させて、50のレートのうち10フレームを待機するので、ちょうど0.2秒の短い遅延の後に表示するだけで実現されます(とにかく英国仕様のZeddysの場合)。

アニメーションを取得するためにメッセージを回転させるというコンセプトをkmurtaにクレジットしなければなりません。

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形式でコンパイルされたプログラムであるか、ZXPandなどをロードする実際のZeddyであるため、実行中のリンクを投稿できません。

.Pはhttp://www.sinclairzxworld.com/viewtopic.php?f=11&t=2376&p=24988#p24988からダウンロードできます


いい答えだ!Z80マシンコードに1つ欠けていました:-)そして、このサイトへようこそ!
ルイスメンドー

実行中のプログラムのgifを提供してもらえますか?
ルイスメンドー

申し訳ありません-GIF作成ソフトウェアはありません!
ラルドボフィン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.