ASCIIムーンをASCIIバットで飛び回らせる


34

バックグラウンド

これはハロウィーン関連の挑戦です。

私の最後の挑戦からお気づきかもしれませんが、私はアスキーアートアニメーションと呼ぶものがとても好きです。それは単にパターンを描くだけでなく、進行するパターンを描くことです。このアイデアは、数年前にハロウィーンのランダムなアスキーバットを画面上で飛ばすことで(かなり退屈な)プレゼンテーションを盛り上げるように頼まれた後に思いつきました。言うまでもなく、私は当然のことながら義務を負っていました(私はそれを支払われていました)が、ランダムなコウモリよりも生命に多くがあると考えさせられました。これに触発されて、私はこの挑戦を提案したいと思います。

チャレンジ

月の周りにコウモリを飛ばします。

コウモリは次のとおりです。

^o^

ここに月があります:

     mmm         
   mmmmmmm       
  mmmmmmmmm      
   mmmmmmm       
     mmm     

コウモリの飛行のすべての段階を表示する必要があります(出力を参照)。

入力

なし

出力

      ^o^         
      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm         


      mmm^o^      
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm         


      mmm         
    mmmmmmm^o^    
   mmmmmmmmm      
    mmmmmmm       
      mmm         


      mmm         
    mmmmmmm       
   mmmmmmmmm^o^   
    mmmmmmm       
      mmm         


      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm^o^    
      mmm         


      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm^o^      


      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm         
      ^o^         


      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
   ^o^mmm         


      mmm         
    mmmmmmm       
   mmmmmmmmm      
 ^o^mmmmmmm       
      mmm         


      mmm         
    mmmmmmm       
^o^mmmmmmmmm      
    mmmmmmm       
      mmm         


      mmm         
 ^o^mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm         


   ^o^mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm         


      ^o^         
      mmm         
    mmmmmmm       
   mmmmmmmmm      
    mmmmmmm       
      mmm   

ルール

  • 外部ファイルまたはWebサイトからの読み取りはありません
  • 完全なプログラムまたは機能を提出できます
  • 余分なスペースや改行は大丈夫です
  • 通常通り禁止される標準の抜け穴
  • コウモリは月の頂点でフィニッシュする必要があります
  • ご希望であれば、フレーム間で画面をクリアしても構いませんが、これは必須ではありません。上記の出力は問題ありません
  • これはコードゴルフであるため、勝者はバイト数が最も少ない答えになりますが、どんな答えでも歓迎です

サンプル

完全に未使用のPython 2でのリファレンス実装(620バイトですが、それが実行可能であることを証明するためです。後でゴルフをするかもしれません)。

b='^o^'
m=['                     ',
'         mmm         ',
'       mmmmmmm       ',
'      mmmmmmmmm      ',
'       mmmmmmm       ',
'         mmm         ',
'                     ']
p=[(9,12),(12,15),(14,17),(15,18),(14,17),(12,15),(9,12),(6,9),(4,7),(3,6),(4,7),(6,9),(9,12)]
d=0
for z in range(7):
    x=map(str,m[z])
    c="".join(x[:p[z][0]]) + b + "".join(x[p[z][1]:])+"\n"
    print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
for z in range(6)[::-1]:
    x=map(str,m[z])
    c="".join(x[:p[z+6][0]]) + b + "".join(x[p[z+6][1]:])+"\n"
    print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])

結果

@Jonathanは明らかにJellyのバイトカウントで勝ちますが、@ OyarsaからのBrainfuckの回答を純粋に受け入れられた回答としてマークするつもりです。必要なバイト数。これは、ゴルフの言語に問題があるからではありません。疑問がある場合は、メタに関するこれに対する質問への私の答えを参照してください。どんな言語でも貢献してくれたすべての人に感謝と敬意を表します。


@Oliverに感謝します。サンドボックスの後に削除するのを忘れました。
エルペドロ

@daHugLennyタグを追加していただきありがとうございます。私はそのことを考えていませんでした。
エルペドロ

6
リファレンス実装が完全に無制限であると思われる場合、プログラミングプロジェクトであなたと一緒に仕事をしたくありません。
ファンドモニカの訴訟

3
さて、多分少しゴルフ:
ElPedro

回答:


9

Brainfuck、690バイト

これは私の最初のゴルフですので、まだ改善の余地がたくさんあると確信しています

-[-[-<]>>+<]>-<<+++[>+++++++<-]>>>+>>-[<-->-------]<->++++++++>+>+++++>+>+++++>+>+++++++>+>+++++>+>+++++>+>++++++++>+>+>+>>+++[<++++++>-]<+>+>-->+>+>+[<]>[[<+>>-[>]+[[<]>+[>]<+[<]>>>-]<<[->>+<<]>-]>-[->>>>+<<<<]>++]>>>[[-]<]>>>>[>]>>+>+++++++<<<<[<]+<+<<+[[<]++++[>++++<-]>[<+[>]>[-<+>]<[<]>>-]>[>]++++++++++[>]>>>-[<]<<[<]<]<[<]>->-<<<[-]++++++<+<+++[>++++++<-]+<++++[>++++++++<-]---<-[>+<-----]++<----[>+<----]--<-[>+<---]<-[>++<-----]++++<-[>+<---]++<-[>+<-------]---<----[>+<----]<--[>+<++++++]<+++++[>+++++<-]++++++>[[[>]>[>]>>[-<<+>>]<<[<]<[<]>-]>[>]>[>]+++++++[>+++++++++<-]>-[->+>+>+<<<]++++[>>++++<<-]>>+<<<<[<]>[.>]>>[.>]<[<]>[-]>[-]>[-]<+[--<---[->]<]<[->+>+>+<<<]<<[[->>+<<]<]<]

オンラインで試す

読みやすさのためにいくつかのゴルフを解きました:

-[-[-<]>>+<]>-<<+++[>+++++++<-]>>>+>>-[<-->-------]<->++++++++>+>+++++>+>+++++>+>+++++++>+>+++++>+>+++++>+>++++++++>+>+>+>>+++[<++++++>-]<+>+>-->+>+>+
Sets counters for creation of the m's and spaces
[<]>[[<+>>-[>]+[[<]>+[>]<+[<]>>>-]<<[->>+<<]>-]>-[->>>>+<<<<]>++]
Adds the first counter plus two of the character at the second counter to the end of the
current set of cells removes the first two counters on the list then repeats until
it encounters a 254
>>>[[-]<]>>>>[>]>>+>+++++++<<<<[<]
Removes some excess cells then adds a 7 after the end of the set of cells
+<+<<+[[<]++++[>++++<-]>[<+[>]>[-<+>]<[<]>>-]>[>]++++++++++[>]>>>-[<]<<[<]<]
Adds a newline every 16 characters until 7 newlines are added
<[<]>->-<<<[-]++++++<+<+++[>++++++<-]+<++++[>++++++++<-]---<-[>+<-----]++<----[>+<----]--<-[>+<---]<-[>++<-----]++++<-[>+<---]++<-[>+<-------]---<----[>+<----]<--[>+<++++++]<+++++[>+++++<-]++++++
Removes some excess cells then sets indices for the locations of bats
>[[[>]>[>]>>[-<<+>>]<<[<]<[<]>-]>[>]>[>]+++++++[>+++++++++<-]>-[->+>+>+<<<]++++[>>++++<<-]>>+<<<<[<]>[.>]>>[.>]<[<]>[-]>[-]>[-]<+[--<---[->]<]<[->+>+>+<<<]<<[[->>+<<]<]<]
Loops through the indices replacing the spaces at each index with a bat then printing 
the set of cells then changing the bat back to spaces

最初に改行を追加することで、各ステージを両方向に読み取って2つの異なるステージを取得できるという事実を使用したかったのですが、6段階半のフルステージを生成しないと、適切な方法を見つけることができませんでしたすぐに。


2
非常に素晴らしい!私はこれほど大きな頭脳の挑戦に答える忍耐を持っているとは思わない、ハハ。
DJMcMayhem

1
TIOリンクを追加しました。気にしないでください。また、693バイトをカウントするようです。
エミグナ

読みやすさのためにゴルフをしていなかったとしても、読みにくいことで一等賞を受賞します。とても素敵で、答えてくれてありがとう。+1。690バイトの価値があります。
エルペドロ

@Enigma私から、TIOリンクをありがとう。
エルペドロ

@DJMcMayhem、コピー/ペーストを台無しにしてしまったに違いありません。複製されていない[<]が1回しか存在しなかったはずです。今すぐ修正する必要があります。
オヤルサ

23

05AB1E69 62 60バイト

Adnanのおかげで2バイト節約できました。

3ð×…^o^)U13FNV0379730vð5y>;ï-y_+×N(Y-12%_Xè'my×NY-12%_y&XèJ,

オンラインでお試しください!

説明

3ð×…^o^)Uリスト[" ","^o^"]Xに保存します後で使用するためにます。

13FNV13ステージ[0 .. 12]をループし、現在の反復インデックスをYに格納します

0379730v各段の行をループNは、行インデックスであり、yは現在の数であります
m個の

まず、floor(5/(y+1))-(y==0)各行にスペースを追加しますð5y>;ï-y_+×

次に、mの前にコウモリまたは3つのスペースが必要かどうかを判断します。trueの
場合(-N-Y)%12 == 0、バットを追加し、そうでない場合は3スペースを追加します。
この式(N(Y-12%_Xè)はコウモリを段階的に配置し0,6-12ます。

次に、y mをで配置し'my×ます。

ここで、mの後にコウモリが必要か3スペースが必要かを判断します。
コードが真のNY-12%_y&Xè場合((N-Y)%12 == 0) and y!=0はバットを配置し、そうでない場合は3スペースを配置します。
これにより、コウモリがステージ上に配置されます1-5

最後に、行全体を文字列に結合し、改行で印刷しますJ,


5
スズ+1で正確に言うことを行う
ElPedro

1
3ð×…^o^) の代わりに " ^o^"2ä 2バイトを節約する必要があります。
アドナン

@アドナン:ありがとう!なんらかの理由で、私はそれがより長くて、試し3ð×たことさえないと思いました。
エミグナ

20

JavaScript(ES6)、109 144 140 138バイト

f=(k=13,b=y=>(y-k)%12?'   ':'^o^')=>k--?[0,3,7,9,7,3,0].map((n,y)=>' '.repeat(5-n/2+!n)+b(y)+'m'.repeat(n)+b(n?-y:.1)).join`
`+`
`+f(k):''

console.log(f());

アニメーション版


素敵な答えとあなたは私の最後の挑戦のように最初です:)
ElPedro

1
いい答えだ。このように考えて頭を包むことはできません。
zfrisch

15

HTML + JS、153 149バイト

n=setInterval(_=>o.innerText=`zzd
zc3e
 b7f
a9g
 l7h
zk3i
zzj`.replace(/\S/g,c=>parseInt(c,36)-n%12-10?`m`.repeat(c)||`   `:`^o^`,n++),1e3)
<pre id=o>

編集:@RickHitchcockのおかげで大量のバイトを保存しました。配列で13の複数行の文字列を返すだけの退屈なバージョンは132 131バイトです:

_=>[...Array(13)].map((_,n)=>`zza
zl3b
 k7c
j9d
 i7e
zh3f
zzg`.replace(/\S/g,c=>parseInt(c,36)-n%12-10?`m`.repeat(c)||`   `:`^o^`))

私が本当に厳格だった場合、バットはトップで始まらないことを指摘します:)しかし、それは完全な円を行い、意見に応じてルールで指定したすべてでした。最初の完全なアニメーションに対して+1。良い仕事と感謝。
エルペドロ

@ElPedroバットが始まる場所はの結果に依存すると思いますsetInterval。これは私のブラウザでは常に同じですが、他のブラウザでは異なる場合があります。
ニール

わかりましたが、開始位置が明確に指定されていないと言ったので、setIntervalに決定させても構いません;)興味があるなら、UbuntuでChomeを表示しています。常に先頭の1つ前の位置から始まりますが、それは問題ではありません。素晴らしい解決策とあなたの答えに再び感謝..
ElPedro

1
innerHTML代わりにを使用すると、数バイト節約できますtextContent。そして、別のバイトをに変更repeat(+c)repeat(c)ます。
リックヒッチコック

2
(そして1000なることができ1e3ます。)
リックヒッチコック

14

ゼリー76 69 58 バイト

⁾ mṁ11ż“椿¬®µ‘ŒḄ¤Œṙs⁴Y
_4¢ḣ;“^o^”;¢ṫ⁸¤
“½œ0CSbp\I7'ð½‘Ç€Y

TryItOnline

どうやって?

⁾ mṁ11ż“椿¬®µ‘ŒḄ¤Œṙs⁴Y - Link 1, make a moon (niladic)
⁾ m                     - literal " m"
   ṁ                    - reshape like
    11                  - 11 (interpreted as range(11)) -> " m m m m m "
                 ¤      - nilad followed by links as a nilad
       “椿¬®µ‘         - code page indexes [22,3,11,7,8,9]
               ŒḄ       - bounce -> [22,3,11,7,8,9,8,7,11,3,22]
      ż                 - zip -> [[22,' '],[3,'m'],[11,' '],...]
                  Œṙ    - run length decode -> "                      mmm           mmmmmmm        mmmmmmmmm        mmmmmmm           mmm                      "
                    s   - split into chunks of length
                     ⁴  - l6
                      Y - join with line feeds

_4¢ḣ;“^o^”;¢ṫ⁸¤ - Link 2, a moon with a bat placed: endIndex
_4              - subtract 4 (startIndex)
  ¢              - call last link (1) as a nilad
   ḣ            - ḣead to startIndex
    ;           - concatenate
     “^o^”      - literal "^o^"
          ;     - concatenate
              ¤ - nilad followed by links as a nilad
           ¢    - call last link (1) as a nilad
            ṫ⁸  - tail from endIndex

“½œ0CSbp\I7'ð½‘Ç€Y - Main link (niladic)
“½œ0CSbp\I7'𽑠   - code page indexes [10,30,48,67,83,98,112,92,73,55,39,24,10]
                   -    indices to the right of each bat in a constructed moon
               ǀ  - call last link (2) as a monad for each
                 Y - join on line feeds

非常に素晴らしい。ジェリーをもう少し詳しく調べなければならないと思います。
エルペドロ

素晴らしい説明。ありがとう。
エルペドロ

もし興味があり、時間があるなら、Pythonでこれにどのようにアプローチするかを見るのはクールでしょう。私はいつも学ぶことができてうれしいです。
エルペドロ

12

パイソン2、146の144 138バイト

@Willemのおかげで-2バイト(をcループするのではなく変数を使用しますmap

m='\n'.join(int(a)*' '+int(b)*'m'+3*' 'for a,b in zip('6643466','0379730'))
for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])

repl.it

'6643466' 月の前のスペースの数です(バットがそこに行くので、空の最初と最後の行に6があります)。

'0379730' の数です 'm'各行の月のs。

zipこれらの文字をアンパックaしてb、空に月になり、m、各ライン上の3つの末尾のスペースで、。

最後の行は、月の中でコウモリの位置を横断し、事実上次のとおりです。

for c in(9,22,36,53,68,81,91,75,58,41,27,16,9):print(m[:c-3]+'^o^'+m[c:])

ただし、位置のタプルは印刷可能な文字の序数としてエンコードされ、23が追加されます(9は印刷できないため)。これはとして出力され" -;L[hrbQ@2' "c=ord(b)-23値を抽出するために使用されます。


+1を尊重し、挑戦に立ち上がってくれてありがとう:)今、私はちょうどそれがどのように機能するかを解決しなければなりません...
考え出す必要があり

時々、私は2つの賛成票を出せたらいいのにと思います。
エルペドロ

1
次のように記述することにより、最後の行に2つの文字を保存できますfor b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Willem

7

Autovim85 81バイト

アニメーションはありません、おそらくまだゴルフ可能です...それでも、ブロックの新しい子供にとって悪くはありません!(autovim)

ñ9am␛ÿP2xÿP4xyjGpđp2o
%ce 15
®q=8j$p
®z=6␍"_d3hP
ñğyG12PğÿPC^o^␛v^y6@q==o␛6@z==O

実行するには:

autovim run ascii-bat.autovim -ni

説明

要するに、月を描画し、12回コピーして貼り付け、2つのマクロを使用します。1つは最初の7つの月にバットを追加し、もう1つは最後の6月に追加します。

" Draw the moon
ñ                                 " Normal mode
 9am␛                            " Write 9 `m`
      ÿP                          " Duplicate the line
        2x                        " Delete two characters
          ÿP                      " Duplicate the line
            4x                    " Delete 4 characters
              yj                  " Yank two lines
                Gp                " Paste at the end of the file
                  đp              " inverts the current line with the previous
                    2o            " Add two line breaks

%ce 15                            " Center our moon

" Macros
®q=8j$p                           " Macro `q` jumps 8 lines, and pastes
                                  "   at the end
®z=6␍"_d3hP                      " Macro `z` jumps 6 lines and replaces
                                  "   the previous 3 characters by the default

" Draw all 12 moons and add the bats
                                  "   register's content
ñ                                 " Run in normal mode
 ğyG                              " Copy the moon we just drew
    12P                           " Duplicate the moon 12 times
       ğÿP                        " Duplicate the top line (gets 3 centered `m`)
          C^o^␛                  " Change the mmm by a bat
                v^y               " Copy the bat we just drew
                   6@q            " Add the first 6 bats
                      ==          " Center the bat
                        o␛       " Add a line under the bat
                           6@z    " Add the 6 last bats
                              ==  " Align the last bat in the center
                                O " Add a line over the last moon

1
ダウンロード手順に従って、VIMをインストールし、次のようになりました。 with: "vim -h"今すぐ見る時間はありませんが、今晩プレイします。興味深いプロジェクトのように見えます。
エルペドロ

1
時間があれば、GitHubの問題を開いてください。私の電話(Termux、Linuxディストリビューション)およびGit BashのWindowsで動作しています。どこでも動作するようにしたい!私の推測では、2013年にコンパイルされたVIMは実際には最新バージョンでない可能性あります:)(最新バージョンは8.0)
クリスチャンロンドー

OK。パッケージマネージャーからインストールしたばかりなので、アップグレードオプションを試してみます。何が起こるかお知らせします。
エルペドロ

1
要求に応じてGitHubで発生した問題。アップグレードによって問題が解決されたため、問題と見なさない場合は、無視/拒否してください。
エルペドロ

1
つまり、それは今すぐ機能するということです!すばらしいです!
クリスチャンロンドー

7

PHP、167バイト

PHPで小さなプログラムを作成しました。

<?php foreach([0,3,7,9,7,3,0]as$l)$b.=str_pad(str_repeat('=',$l),15," ",2)."\n";foreach([6,25,43,60,75,89,102,83,65,48,33,19,6]as$x)echo substr_replace($b,'^o^',$x,3);

より詳細なバージョンは次のとおりです。

// width of the moon
$moonsizes = [0,3,7,9,7,3,0];
// position where to place the bat
$positions = [6,25,43,60,75,89,102,83,65,48,33,19,6];
// prepare base moon painting
foreach($moonsizes as $size){
    $basepainting .= str_pad(str_repeat('=',$size),15," ",STR_PAD_BOTH)."\n";
}
// loop frames and place bat
foreach($positions as $position) {
    echo substr_replace($basepainting,'^o^',$position,3);
}

これは私の最初のcodegolfです、何か提案があれば私は聞いて満足です:)


PPCGへようこそ!いい最初の答え。ありがとう。
エルペドロ

7

Python 2、112バイト

b=['   ','^o^']
for k in range(91):r=k%7;print(b[k/7+r==12]*(r%6>0)+(r*(6-r)*8/5-5)*'m'+b[k/7%12==r]).center(15)

写真を印刷します。各行には3つの部分があります

  • 左側の潜在的なコウモリ
  • m月のためのいくつかの
  • 右側の潜在的なコウモリ

これらのパーツは連結され、間隔を空けるためにサイズ15のボックスの中央に配置されます。コウモリが中心を移動するのを避けるため、行方不明のコウモリは同じ長さの3つのスペースです。月の上または下にあるコウモリの場合、左のバースロットは省略され、右のスロットは占有されます。

91行があります。13行の画像ごとに7行の画像です。これらは、divmodを経由してカウントアップされています通りkからのカウント091(k/7, k%7)行きます

(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(0, 5)
(0, 6)
(1, 0)
(1, 1)
 ....
(12, 5)
(12, 6)

最初の値k/7を写真に、2番目の値を撮影するr=k%7を画像内の行番号として、これは最初に画像ごとにカウントアップし、次に各画像内の行番号でカウントアップします。両方とも0から始まります。

多数のm行番号と月の変更にS」r=k%7として[0,3,7,9,7,3,0]。これにインデックスを付けるのではなく、式は短くなりました。便利な自由度は、0に任意の負の値を設定できることmです。これにより、を乗算しても空の文字列が得られます。放物線をいじり、床を分割することで式が得られましたr*(6-r)*8/5-5

次に、どちらの側にコウモリを描くか空のスペースを描くかを選択します。配列b=[' ','^o^']にはオプションが含まれています。

図0の行0のコウモリ(上)、図1の行1(右)、図6の行6(上)。そのため、行番号と画像番号が等しいかどうかを簡単に確認できます。k/7==rます。しかし、ピクチャ0のように見えるためにピクチャ12も必要なので、ピクチャ番号をモジュロ12から先に取得します。

左側は似ています。コウモリr=5,4,3,2,1は写真の列に左側に表示されます7,8,9,10,11。そこで、我々は12の行と画像数の合計が、我々はまた、確認して、行に3つのスペースではなく、何を描くないかどうかをチェック0して6-右のバットスロットはバットを描画します、と私たちはその心まで混乱してはなりません。


1
@xnorの簡単な説明はありますか?私はそれを実行しましたが、それは確かに動作しますので、説明は必要ありませんが、時間と傾斜がある場合は教育目的のために興味深いでしょう:)
ElPedro

「放物線をいじり、床を分割する」ための+1-推測しなければならない場合、そのフレーズがPPCGで使用されるのは初めてです... :-)
zmerch

@xnorに感謝します。素晴らしい説明。私はこれを研究するのにいくらか時間を費やさなければならないでしょう:)
ElPedro

6

C#、 615 582 337バイト

これは、これらのいずれかでの最初の(まだ読みにくい)試みであるため、数百バイトを削る提案を歓迎します!リストの一番上にあるのは、月の配列を作成する簡単な方法です。

void M(){string[]m={"","      mmm","    mmmmmmm","   mmmmmmmmm","    mmmmmmm","      mmm",""};var b="^o^";for(int x=0;x<13;x++){var a=(string[])m.Clone();int n=x>6?12-x:x;int[] j={0,1,3,6};a[n]=!a[n].Contains("m")?"      "+b:x<=n?a[n]+b:new string(' ',j[Math.Abs(9-x)])+b+a[n].Replace(" ","");foreach(var c in a){Console.WriteLine(c);}}}

Ungolfed(ループを含む!)

class Program {
    public static string[] moon = new string[] { "               ", "      mmm      ", "    mmmmmmm    ", "   mmmmmmmmm   ", "    mmmmmmm    ", "      mmm      ", "               " };

    public static string bat = "^o^";

    static void Main(string[] args) {
        while (true) {
            Fly();
        }
    }

    static void Fly() {
        int times = (moon.Length * 2) - 1;
        for (int x = 0; x < times; x++) {
            string[] temp = (string[])moon.Clone(); //create a new array to maintain the original

            int index = x >= moon.Length ? times - x - 1 : x;

            if (!temp[index].Contains("m")) {
                temp[index] = new string(' ', 6) + bat + new string(' ', 6);
            } else if (x <= index) {
                int lastM = temp[index].LastIndexOf('m') + 1;
                temp[index] = temp[index].Insert(lastM, bat);
            } else {
                int firstM = temp[index].IndexOf('m');
                char[] src = temp[index].ToCharArray();
                int i = firstM - bat.Length;
                src[i] = bat[0];
                src[i + 1] = bat[1];
                src[i + 2] = bat[2];

                temp[index] = new string(src);
            }

            for (int y = 0; y < temp.Length; y++) {
                Console.WriteLine(temp[y]);
            }
            Thread.Sleep(100);
            Console.Clear();
        }            
    }
}

編集:

配列宣言の末尾のスペースを削除して、21バイトを取り出しました。15文字幅のグリッドではなく、各行はバットが収まるのに十分な幅です。不要なstring [] argsの別の12を削除しましたMain()宣言。

編集2:

245バイトを削除して、ほとんどのロジックを書き直しました!コメントからの提案された変更を含みます。ありがとう!

コメントから、これをM()以前のMain()方法ではなく関数に変えました-したがって、今、これは外部で呼び出す必要があります。


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

ようこそ、素敵な最初の努力!ご回答有難うございます。自分でAC#の専門家ではないので、おそらくあなたはあまり助けられませんが、喜んで助けてくれる多くのコミュニティメンバーを見つけるでしょう。
エルペドロ

2
new string[]from mを削除してを置くだけで、数バイト節約できますstring[]m={...}
ポケチュウ

2
缶の安全な使用していくつかのより多くのバイトがvar「のような場所でねstring[]w=(string[])m.Clone();- var w=(strin[])m.Clone();
MX D

1
@ElPedro確かに、私はそれを取るでしょう!確かに、望ましい結果を生成する呼び出し可能な関数として機能します。逸話的に、私はこれをもう一度書き直してみて、かなり「賢い」解決策を見つけました。残念ながら、現在のバイトカウントから+1になったので、ここに残しておくと思います-本当に楽しいチャレンジをありがとう!これは確かにいくつかの新しいことを教えてくれました。
-levelonehuman

6

Python 2、299 300 290バイト

もう少しゴルフの経験を積んで270までゴルフをしました。

321で下がったリファレンス実装 320 330バイト。きれいでもエレガントでもありません。総当たり文字列とリストスライスを使用します。しかし、バイトカウントを減らすのは楽しかったですが、本格的な競合他社にとっては、このアプローチは完全に間違っていたと思います。

私はこの答えが真剣に受け止められるとは思わないので、下票しないでください。私は質問で、リファレンス実装をゴルフしようとすると言いましたが、これはまさにそれです。楽しみのために投稿しました。

c,e,n=' ','m','\n';f,g=c*9+e*3+c*9,c*7+e*7+c*7;h=9,12;i=12,15;j=6,9;k=13,17;l=4,7;m=c*21,f,g,c*6+e*9+c*6,g,f,c*21;p=h,i,k,(15,18),k,i,h,j,l,(3,6),l,j,h;w=0
for z in map(int,'0123456543210'):print n.join(m[:z])+n+m[z][:p[w][0]]+'^o^'+m[z][p[w][1]:]+n+n.join(m[z+1:]);w+=1

オンラインでお試しください!


3

ルビー、164 156バイト

puts Zlib.inflate Base64.decode64 "eNqlkrUVAAEMQvtMcZP9DfLYvzo3qhNSxQ2GVRC1ad29ar1JXaoHbul16Yig+p6BCKqtFBFU+1IE1famoHrX/jZBvN8e8f5tiE94Ib4SBREwNKH5BNJy2QM="

非常にシンプルなプログラム。もっと取り組むことができます。コメントにヒントを残してください。


いい答えだ。私は現在、ルビーで遊んでいますが、ゴルフに関してはPythonよりもはるかに冗長に見えます。
エルペドロ

3
@ElPedroこれは、末尾の空白、zlib圧縮、base64エンコードされたテキストだけです。どこにも魔法のRubyアクションはありません。
dkudriavtsev

それでも、誰かが私を間違っていることを証明したいのでなければ、このアプローチはPythonの方がずっと重いと思います(@Jonathanおそらく?:))
ElPedro

Welp、私はいくつかのライブラリを含めるのを忘れていました、そして、SEは私にそれをさせません。誰かができるだけ早くライブラリbase64zlibライブラリを含めて、バイトカウントに追加してください。
-dkudriavtsev

との間に違いはputsありsayますか?私はRubyに詳しくありません。
ローマングラフ


2

おたふく風邪、223バイト

これはInterSystems Cache Mumpsを使用しています-ループの周りにブレースを許可し、1行のネストされたループに便利です。

S X="09121415141209060403040609",R="097679",L="037973",S=-14 F Y=1:1:13 S S=S+2 F C=1:1:7 S F=$E(X,Y*2-1,Y*2),(M,T)="",$P(T," ",21)="" F A=1:1:$E(L,C){S M=M_"m"} S $E(T,$E(R,C))=M S:C=$S(Y<8:Y,1:Y-S) $E(T,F,F+2)="^o^" W T,!

おそらくもっとゴルフができるかもしれないし、もっと時間があればそれで遊ぶかもしれない。さらに9バイトを追加すると、アニメーション化されます[['H 1 W#'の追加により、->が1秒間停止し、画面がクリアされます。

S X="09121415141209060403040609",R="097679",L="037973",S=-14 F Y=1:1:13 S S=S+2 H 1 W # F C=1:1:7 S F=$E(X,Y*2-1,Y*2),(M,T)="",$P(T," ",21)="" F A=1:1:$E(L,C){S M=M_"m"} S $E(T,$E(R,C))=M S:C=$S(Y<8:Y,1:Y-S) $E(T,F,F+2)="^o^" W T,!

正しい「do」ステートメントとドットループを使用した、(アニメーションバージョンの)無償版/説明版を次に示します。

 S X="09121415141209060403040609"
 S R="097679",L="037973",S=-14              ; Initialize Variablex
 F Y=1:1:13 D                               ; Set up our main loop of 13 cels
 . S S=S+2                                  ; set up secondary counter, for start char.
 . H 1                                      ; halt for 1 second
 . W #                                      ; clear screen
 . F C=1:1:7 D                              ; set up our per-line loop
 . . S F=$E(X,Y*2-1,Y*2)                    ; set F to 2-digit "start of bat"
 . . S (M,T)=""                             ; set our "builder" lines to empty strings
 . . S $P(T," ",21)=""                      ; then reset our main 'line string' to 21 spaces.
 . . F A=1:1:$E(L,C){S M=M_"m"}             ; make our 'moon' text.
 . . S $E(T,$E(R,C))=M                      ; and insert our 'moon' into the empty line
 . . S:C=$S(Y<8:Y,1:Y-S) $E(T,F,F+2)="^o^"  ; find the start character for our 'bat' and insert.
 . . W T,!                                  ; and write the line and a CR/LF.

「圧縮してからBase-64エンコード」ジャズを試してみて、どうなるかを確認しましたが、エンコードされた文字列はプログラム自体よりも少し長くなりました。それと、Cacheの圧縮とbase64エンコーディングのシステムコールは非常に長いです。たとえば、base64をデコードするシステムコールは次のとおりです。 $ System.Encryption.Base64Decode(STRING)

その方法は、プログラムを300文字以上に「膨張させる」と思います...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.