きれいなボックスを出力する


17

あなたの課題は、次のボックスを正確に出力することです。

..................................................
..................................................
..                                              ..
..                                              ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..                                              ..
..                                              ..
..................................................
..................................................

ボックスの高さと幅は50、スペースは2つです。

文字列を出力または返すが、入力を受け取らない関数またはプログラムを作成する必要があります。

最少バイト数が勝ちます!


4
一番内側の+ボックスの上下に1つのレイヤーしかない理由は何ですか?これにより、最も内側の2つのレイヤーが正確に正方形ではないことを意味するため、アルゴリズムベースの回答が多少長くなります。
ETHproductions

@Pavel OK。閉票撤回:)
デジタル外傷

4
完全なプログラムに制限があるのはなぜですか?
Rɪᴋᴇʀ

1
@Pavelなんで?それは本当に挑戦に何も追加しません。
Rɪᴋᴇʀ

1
@Pavel .....いいえ そういう人もいますが、それはKGチャレンジの要件/標準ではありません。
Rɪᴋᴇʀ

回答:



14

J、25バイト

echo'. + '{~4|>./~2#|i:12

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

説明

echo'. + '{~4|>./~2#|i:12
                     i:12  Range from -12 to 12.
                    |      Take absolute values,
                  2#       duplicate every element,
                /~         compute "multiplication table"
              >.           using maximum,
            4|             take mod 4 of every element,
    '. + '{~               index into this string,
echo                       print char matrix for everyone to see.

エコーを省くことができると思います。
コナーオブライエン

@ ConorO'Brien Oh、出力ルールが変更されました。...うーん、でも削除echoすると、関数ではなく、単なる値になります。とにかくJには引数なしの関数はありません。
ズガルブ

Jのreplの性質に従って許可されていると思います。いずれにせよ、定数関数はゼロ引数と見なすことができます。
コナーオブライエン

11

C、115バイト

#define M(x,y)x<(y)?x:y
f(i){for(i=2549;i;i--)putchar(i%51?". + "[(M(i%51-1,M(50-i%51,M(i/51,49-i/51))))/2%4]:10);}

文字列をSTDOUTに出力する関数f(として呼び出すf();)を定義します。


9

C、535 478 477バイト

今ではたくさんのゴルフがあります:-/

i;main(j){for(;++i<51;puts(""))for(j=0;++j<51;)putchar(i<3|i>48?46:j<3|j>48?46:i>4&i<47&j>4&j<47?i<7|(i>44&i<47)|(j>2&j<7)|(j>44&j<47)?43:j>8&j<43&((i>8&i<11)|(i>40&i<43))?46:i>9&i<41&((j>8&j<11)|(j>40&j<43))?46:i>13&i<37&((j>12&j<15)|(j>36&j<39))?43:((i>12&i<15)|(i>36&i<39))&j>12&j<39?43:i>17&i<33&((j>16&j<19)|(j>32&j<35))?46:((i>16&i<19)|(i>32&i<35))&j>16&j<35?46:i>21&i<29&((j>20&j<23)|(j>28&j<31))?43:((i>20&i<23)|(i>28&i<31))&j>20&j<31?43:i>24&i<27&j>24&j<27?46:32:32);}

出力は次のとおりです。

..................................................
..................................................
..                                              ..
..                                              ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..                                              ..
..                                              ..
..................................................
..................................................

2
クソ あなたの献身を称賛します。
Rɪᴋᴇʀ

制限を変更しました。文字列を返す関数は現在許可されています。
パベル

ループfor(;i++<51;
書き直す

@cleblanc++i
dkudriavtsev

MFW私はこれを理解しようとし始めました:i.imgur.com/TLV9gJ4.png +1
魔法のタコ

6

Haskell、72バイト

q=(\n->[n,n]).abs=<<[-12..12]
unlines[[". + "!!mod(max x y)4|y<-q]|x<-q]

Haskellの@Zgarbのソリューション。また、コアの周りにレイヤーを追加してボックスを作成しようとしまし["..",".."]たが、9バイト(81バイト)長くなります。

e!b=e:e:b++[e,e];s#c=(c!)<$>(c<$s!!0)!s
unlines$foldl(#)["..",".."]" + . + . + ."

5

スタック、非競合、35バイト

ここで試してみてください!

ε'.'3$' + .'2*tostr*+$surroundfold

ゴルフをしていない:

'' '.  ++  ..  ++  ..  ++  ..' $surround fold

とても簡単です。surroundエンティティを塗りつぶしエンティティで囲む関数です。たとえば、(0) 1 surroundです((1 1 1) (1 0 1) (1 1 1))$surroundsurround評価としてではなく関数としてです。foldは初期値を取り、次に折り返すものを取り、次に関数を取ります。この場合、surroundfold空で、最初は空の文字列を囲んでいます''(equiv。ε)を文字列の各文字でです。

'.'3$' + .'2*tostr*+

これは、最初に文字列を作成します。この文字列$' + .'は、数字を掛けると各文字を繰り返します。これにより、次のことができます。++ ..。次に、これは文字列にキャストされます。次に、この文字列を3回繰り返し、最後にaを追加し.て、目的の文字列を提供します。


39バイトの異なるアプローチ:

' .'3$' + .'2*tostr*+toarr$surround#\out

#\は挿入であり、開始値として文字列の最初の文字を取ります。また、配列でのみ機能します。


この非競合性はどうですか、ほんの数時間前に課題が上がりました。
パベル

@Pavel私は常にこれに取り組んでいます
コナー・オブライエン

4

JavaScript(ES6)、117バイト

f=(n=12,c=`. + `[n%4],t=c.repeat(n*4+2))=>n?t+`
${t}
${f(n-1).replace(/^|$/gm,c+c)}
${t}
`+t:`..
..`
console.log(f())

非再帰的なソリューションには128バイトかかりました:

console.log([...Array(100)].map((_,i,a)=>a.map((_,j)=>`. + `[j=j>50?j-50:51-j,(i>j?i:j)%8>>1],i=i>50?i-50:51-i).join``).join`\n`)

where \nは、リテラルの改行文字を表します。


4

C、97バイト

i,x,y;main(){for(;i<2550;putchar(++i%51?". + "[(x*x<y*y?y:x)&3]:10))x=i%51/2-12,y=i/102-12;}

3

ゼリー、18バイト

12ŒRAx2»þ`ị“ + .”Y

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

ZgarbのJの答えと同じアプローチ:12ŒRAis abs([-12 … 12])x2すべての要素を2回繰り返し»þ`、最大のテーブルをị“ + .”作成し、文字列に周期的にインデックスを付け、Y改行で結合します。


3

05AB1E39 35 33バイト

•â3fM~•3B…012… .+‡.pvyD¤sg25s-׫«})«»

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

•â3fM~•3B                               # Push 1100220011002200110022001
         …012… .+‡                      # Push ..  ++  ..  ++  ..  ++  .
                  .p                    # All prefixes of the above string.
                    vy            }     # For each prefix.
                      D¤sg25s-×         # Repeat the last letter until length is 25.
                               «Â«      # Concat, bifurcate, concat.
                                   )«» # Wrap to array, bifurcate, concat, print.

Emignaが私に2バイト節約してくれたとコメントしているので、33バイトバージョンは今ではもっとクールです。

". + "DøJ3×'.«.pvy¤25yg-׫«})«»

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


1
". + "DøJ3×'.«.pvy¤25yg-׫«})«»33バイト。
エミグナ

… .+•â3fM~•3BSè.pvy¤25yg-׫«})«»「クーラーバージョン」で34バイト。
エミグナ

クールという言葉は正しい選択ではありませんでした。「レスゲットー」、多分?
魔法のタコUr

prefixコマンドの使用が大好きです。鮮やかさ!
エミグナ

1
@Emignaはプレフィックスを三角形にします。三角形を転置して回転させると、元のプレフィックスと組み合わせてバイトを削ることができます。それは私が得ることができなかった主な計画でした。
魔法のタコUr

2

MATL、21バイト

'. + '[]25:"TTYaQ]2/)

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

'. + '    % Push this string
[]        % Push empty array. This will be used as "seed"
25:"      % Do the following 25 times
  TTYa    %   Extend the array with a frame of zeros
  Q       %   Add 1 to each entry
]         % End
2/        % Divide by 2
)         % Index modularly into the string. Non-integer indices are rounded
          % Implicitly display




1

Haskell、385バイト

    b 0 = ["..", ".."]
b n = f:f:s:s:m (b (n - 1)) ++s:s:f:f:[]
    where f = replicate (8*n+2) $ d
          s = l++replicate ((8*n)-6) ' ' ++r
          m (x:xs) = map (\x -> l ++ x ++ r ) $ t
          l = d:d:' ':' ':[]
          r = reverse l
          t = b (n - 1)
          d :: Char
          d | n `mod` 2 == 0 = '.'
            | n `mod` 2 == 1 = '+'
main = mapM_ putStrLn $ b 6

ここでコードゴルフの最初のラウンド...他の人がこの1つに取り組む方法を楽しみにしています。

出力:

..................................................
..................................................
..                                              ..
..                                              ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..                                              ..
..                                              ..
..................................................
..................................................

3
1)不要な空白がたくさんある。2)内のすべての関数定義をwhere1行に入れ、;分離に使用します。3)f:f:[]is f:[f] and d: '': '':[] `はd:" "です。4)mパラメータを受け取りますが、使用しません。インラインmおよびt。5)新しい関数を定義#置き換えるためにreplicatec#x=c<$[1..8*n+x]と同じようにそれを呼び出すd#2' '#(-6)。6)mod 2 == 0に置き換えることができますeven、またはテストと使用oddおよびゴルファーを反転しotherwiseます1<2。...
nimi

2
...全体として:b n=f:f:s:s:map(\x->l++x++r)(b$n-1)++s:s:f:[f]where f=d#2;s=l++' '#(-6)++r;l=d:d:" ";r=reverse l;d|odd n='+'|1<2='.';c#x=c<$[1..8*n+x]
nimi


1

Bash、191バイト

echo H4sIAGUcgFgAA73VOw7AIAyD4b2n6F6J+x+v6k5CnPy1F6ZPAvNaS80li4/cUvrkKWdGapOak3O5DDmVS5G8XI5k5ZIkLpclUbk02ZfLk125f5B4JIljLY59cZwxx31x3H3HO5aFIo7/pZIpqWZClHSJmg55AeBhTxb2CQAA|base64 -d|gunzip

おそらく小さくなりますが、私のアルゴリズムの試行よりも小さくなりました。


1

C#、203バイト

完全で読みやすいプログラム:

using System;
public class P
{
    public static void Main(string[] a)
    {
        Func<string> f = () =>
        {
            var z = 25;
            var t = "";
            Func<int, string> c = (q) => q % 4 == 0 ? ".." : (q % 4 != 2 ? "  " : "++");
            for (var y = 0; y < z; y++)
            {
                var l = "";
                for (var x = 0; x < z; x++)
                        l += ((y > z / 2) ? (x >= y | x < z - y) : (x < y | x >= z - y)) ? c(x):c(y);
                l += "\n";
                t += l + l;
            }
            return t;
        };

        Console.Write(f());
        Console.ReadKey();
    }
}

ゴルフ機能

()=>{var z=25;var t="";Func<int,string>c=(q)=>q%4==0?"..":(q%4!=2?"  ":"++");for(var y=0;y<z;y++){var l="";for(var x=0;x<z;x++)l+=((y>z/2)?(x>=y|x<z-y):(x<y|x>=z-y))?c(x):c(y);l+="\n";t+=l+l;}return t;};

1

05AB1E、33バイト

14G" . +"NL¤¸13N-.׫€D¨Â«èD})¨Â«»

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

説明

14G                               # for N in [1 ... 13]
   " . +"                         # push this string
         NL                       # push range [1 ... N]
           ¤¸13N-.×               # push a list of 13-N repetitions 
                                  # of the last element of the above range
                   «              # concatenate the two ranges
                    €D            # duplicate each element
                      ¨           # remove the last element
                       «         # concatenate a reversed copy to the list
                         è        # use the elements of the list to index into the string
                          D       # duplicate the resulting string
                           }      # end loop
                            )     # wrap the strings in a list
                             ¨    # remove the last element
                              «  # concatenate a reversed copy
                                » # join the list on newlines

来て説明?
パベル

@Pavel:もちろんです!:)
エミグナ

1

PowerShell171 151バイト

($x=(1..12|%{' . +'[$_%4]}|%{($a+=$_+$_)})+"$a."|%{$c=if(++$i%2){('+','.')[($b=!$b)]}else{' '};$_.PadRight(25,$c)}|%{,($_+-join$_[25..0])*2});$x[23..0]

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

ほんとうの答え。もっと短い方法があると確信しています(他の回答の長さを考えると、私は確信しています)が、これはいくつかの巧妙なトリックを示しています。

説明:

1..12|%{' . +'[$_%4]}必要な正しいパターンで(長さ1文字の)文字列の配列を生成します。オンラインでお試しください!

次に|%{($a+=$_+$_)})+"$a."、配列を取得し、前の行に基づいて横に展開します。オンラインでお試しください!

これらの文字列はループに送信され、 |%{$c=if(++$i%2){('+','.')[($b=!$b)]}else{' '};$_.PadRight(25,$c)}。反復ごとに、正しい文字(プラス、ドット、またはスペース)を選択し、.PadRight関数を使用して適切な数の文字にパディングします。オンラインでお試しください!

これで、右上隅の基礎ができました。|%{,($_+-join$_[($z=25..0)])*2}ブロックの先頭を取得できるように、各文字列を反転して追加する必要があります。これは、-joinコマンドと逆方向のインデックス付けで行われ25..0ます。さらに、文字列を配列にカプセル化します,(...) 'emを2倍*2にして、トップ全体を取得します。オンラインでお試しください!

それはすべて$x括弧に格納されカプセル化されるため、パイプラインに文字列が配置されます。最後に、私たちは逆にします$x(必ず複製と複製の中間行を切り取ります。..中間にします)、それらをパイプラインに残します。暗黙的にWrite-Output文字列の間に改行が挿入されるため、無料で取得できます。

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