数字モザイクをデザインしましょう


25

チャレンジ

正の整数与えられ、Nその各桁d1,d2,d3,,dn内の位置に対応する回数繰り返しNます。換言すれば、各桁dk繰り返されるべきk回(各1kn、1インデックス)こうして新たな数を作成し、:

d1d2d2d3d3d3dndndndnn times¯

次に、水平方向と垂直方向の両方に書き留めて、空白の列インデックスと行インデックスの間の大きいインデックスに対応する数字のコピーで空白を埋めます。最終的な出力は次のようになります。

[d1d2d2d3d3d3d2d2d2d3d3d3d2d2d2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3]

スペック

あなたはかかる場合があります 整数、文字列、数字のリストまたは数字を表す文字のリストとして。出力は、改行で区切られた文字列、文字列/整数のリスト、または文字/数字のリストのリストにすることができますが、可能であれば、きれいに印刷したバージョンも含めてください。出力が改行で区切られた文字列である場合、次のことも可能です。N

  • 出力の視覚的外観が変わらない限り、先頭/末尾に空白があります
  • 一定量のスペースを使用して列を分離するか、一定量(ゼロ以外)の改行を含む行を使用

これらの抜け穴はデフォルトでは禁止されていることに注意しながら、任意の標準的な方法で入力を取得し、出力を提供できます。これはなので、選択した言語で管理できる最小バイトでタスクを完了してください。

テストケース

65:

655
555
555

---------------

203:

200333
000333
000333
333333
333333
333333

--------------

233:

233333
333333
333333
333333
333333
333333

---------------

5202:

5220002222
2220002222
2220002222
0000002222
0000002222
0000002222
2222222222
2222222222
2222222222
2222222222

---------------

12345:

122333444455555
222333444455555
222333444455555
333333444455555
333333444455555
333333444455555
444444444455555
444444444455555
444444444455555
444444444455555
555555555555555
555555555555555
555555555555555
555555555555555
555555555555555

同じ数字の2つのハンドルを隣り合わせに持っていますか?
ドムヘイスティングス

@DomHastingsはい、それらを処理する必要があります。これを示すテストケースを追加しました。
ミスターXcoder

回答:


9

JavaScript(ES7)、70バイト

入力を文字列として受け取ります。末尾に改行がある文字列を返します。

s=>(g=x=>(c=s[(x>y?x:y)**.5-1>>1])?c+g(x+8):x>y?`
`+g(1,y+=8):'')(y=1)

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

どうやって?

方法

正方行列を歩いて各セルをインデックスi xに変換することにより、文字ごとに出力文字を作成しますix,y変換して入力文字列にます。

文字列インデックスへの座標

上限n個のT Hunnth各軸に沿っ桁領域(0インデックス) A000096で与えられます

u0=0u1=2u2=5u3=9u4=14u5=20

un=n(n+3)2
u0=0,u1=2,u2=5,u3=9,u4=14,u5=20,

整数所与、我々は、どの領域に見つけることができ、N = X+ 1kn=x+1には解くことによって配置されています。

x²+3x2k=0

につながる:

n=

x=1+8k32
n=1+8k32+1=1+8k12

各セル、以下を定義します。(x,y)

vx,y=max(1+8x,1+8y)

これらの値は、以下を実行することによりインデックスi x yに変換されて入力文字列に変換されます。vx,yix,y

ix,y=vx,y12
 v(x,y) |  0  1  2  3  4  5  6  7  8  9        i(x,y) |  0  1  2  3  4  5  6  7  8  9
--------+-------------------------------      --------+-------------------------------
    0   |  1  9 17 25 33 41 49 57 65 73           0   |  0  1  1  2  2  2  3  3  3  3
    1   |  9  9 17 25 33 41 49 57 65 73           1   |  1  1  1  2  2  2  3  3  3  3
    2   | 17 17 17 25 33 41 49 57 65 73           2   |  1  1  1  2  2  2  3  3  3  3
    3   | 25 25 25 25 33 41 49 57 65 73           3   |  2  2  2  2  2  2  3  3  3  3
    4   | 33 33 33 33 33 41 49 57 65 73   -->     4   |  2  2  2  2  2  2  3  3  3  3
    5   | 41 41 41 41 41 41 49 57 65 73           5   |  2  2  2  2  2  2  3  3  3  3
    6   | 49 49 49 49 49 49 49 57 65 73           6   |  3  3  3  3  3  3  3  3  3  3
    7   | 57 57 57 57 57 57 57 57 65 73           7   |  3  3  3  3  3  3  3  3  3  3
    8   | 65 65 65 65 65 65 65 65 65 73           8   |  3  3  3  3  3  3  3  3  3  3
    9   | 73 73 73 73 73 73 73 73 73 73           9   |  3  3  3  3  3  3  3  3  3  3

停止条件

私たちは到達したことを知っています:

  • にある文字が存在せず x > yである場合の行列の右境界ix,yx>y

  • 文字が存在せず、我々が持っている行列の下部境界xy


7

J16 15バイト

FrownyFrogのおかげで-1バイト!

{~#\<:@>./~@##\

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

テイク N文字列としてます。

最初の解決策の説明:

              #\   finds the length of the successive prefixes of the input (1 2 3...)
            #~     copies each digit as many times (1 2 2 3 3 3...)  
       >./~@       and creates a table of the max of the row/col numbers
  [:<:@            then subtract 1 from each element (for indexing)
{~                 select the corresponding digit from the input

入力を使用したテストセッション203

   #\ '203'
1 2 3

   #~#\ '203'
1 2 2 3 3 3

   >./~@#~#\ '203'
1 2 2 3 3 3
2 2 2 3 3 3
2 2 2 3 3 3
3 3 3 3 3 3
3 3 3 3 3 3
3 3 3 3 3 3

   <:@>./~@#~#\ '203'
0 1 1 2 2 2
1 1 1 2 2 2
1 1 1 2 2 2
2 2 2 2 2 2
2 2 2 2 2 2
2 2 2 2 2 2

   ({~[:<:@>./~@#~#\) '203'
200333
000333
000333
333333
333333
333333

1
ああ、の配置は別)として、あなたのAPLの答えは、自分の持っているものと同じです。
エリックアウトゴルファー

私は本当にJをまったく知りませんが、[:<:@かなり費用がかかりそうです。代わりに、インデックスを作成するリストに何かを追加して、1インデックスを説明できます(たとえば、必要な各要素1の位置を右に移動するために0を追加します)。
Mr Xcoder

@ Mr.Xcoder私はそれについて考えていました。いくつかのバイトを節約できるかどうかを確認します。
ガレンイワノフ

@EriktheOutgolfer {⍵[∘.⌈⍨(/⍨)⍳⍴⍵]}
ガレンイワノフ

@GalenIvanovはい、それ。
エリックアウトゴルファー



6

R、59バイト

function(a){m=outer(x<-rep(g<-seq(a),g),x,pmax);m[]=a[m];m}

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

  • 私は数字のベクトルをとることが受け入れられることに気付き、これにより21バイトを節約することができました:)
  • 文字ベクトルのみを受け入れるという@Giuseppeの提案のおかげで-2バイト
  • -2バイトの引数定義での割り当て

1
a文字のベクトルとして取得でき、g=seq(a)直接設定できます。
ジュゼッペ

@ジュゼッペ:そうです!
digEmAll


5

05AB1E14 11 10バイト

Magic Octopus Urn / Adnanのおかげで1バイト節約

ƶJDv¬N×?=¦

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

説明

ƶ            # repeat each element its index (1-based) times 
 J           # join to string
  Dv         # for N in [0 ... len(string)-1] do
    ¬N×      # push the head repeated N times
       ?     # print without newline
        =    # print the rest of the string without popping
         ¦   # remove the head


1
私にはクレジットはありませんが、クレジットはアドナンです:codegolf.stackexchange.com/a/87074/59376
マジックタコ

@MagicOctopusUrn:ああ、それは素晴らしい!両方のおかげで;)
エミグナ



3

Excel VBA、95バイト

[A1]コンソールからの入力とコンソールへの出力を行う匿名VBEイミディエイトウィンドウ機能

n=[len(A1)]:For y=1To n:For l=1To y:?:For x=1To n:?String(x,Mid([A1],IIf(x>y,x,y)));:Next x,l,y

非ゴルフとコメント

n=[len(A1)]                         ''  Get Length
For y=1To n                         ''  Iterate down input
For l=1To y                         ''  Iterate down repeat lines
?                                   ''  Print Newline
For x=1To n                         ''  Iterate accross input
?String(x,Mid([A1],IIf(x>y,x,y)));  ''  Print x of the `max(x,y)`th digit in input
Next x,r,y                          ''  Loop, Loop, Loop

2

MATL15 12バイト

tftY"t!2$X>)

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

これは短縮できると思いますが、それほど悪くはありません...

          % implicit input, '230'
t         % duplicate input. Stack: ['230','230']
f         % indices of nonzero values. Stack: ['230',[1,2,3]]
t         % duplicate. Stack: ['230',[1,2,3],[1,2,3]]
Y"        % run-length decoding. Stack: ['230',[1,2,2,3,3,3]]
t         % duplicate. Stack: ['230',[1,2,2,3,3,3],[1,2,2,3,3,3]]
!         % transpose. Stack: ['230',[1,2,2,3,3,3],[1;2;2;3;3;3]]
2$X>      % elementwise maximum of 2 inputs, with broadcast.
          % Stack:
          % ['230',
          % [1, 2, 2, 3, 3, 3;
          %  2, 2, 2, 3, 3, 3;
          %  2, 2, 2, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3]]
 )        % index into G
          % implicit end, display stack contents

2

Add ++、35バイト

L,bLRdBcB]£X¦Ω+d‽b>1€Ω_A€Ω:AbLR¦+$T

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

使い方

入力を数字のリストとして受け取りますが、a)で数字にキャストする必要はありません BD必要がなく、2バイトかかる数字を保存する必要もありません。

まず、我々は、範囲を生成する[1 ... lenの(入力)]bLR、我々は、各要素を繰り返しますn 範囲内 n回。自動ベクトル化はAdd ++には存在しないため、それ自体をzipで圧縮してdBcB]、ペアのリストを作成します[[11][22][nn]]。次に、ペアの繰り返しと結合したstarmapを適用します:ペア£Xを1つのフラット配列に連結する前に(¦Ω+)。

次に、この配列を複製し、最大でテーブル化しd‽b>ます。つまり、配列内の各要素は、2番目の配列の他の要素とペアになり、dyadic maximumコマンドがそのペアに対して実行されます。[6 5]の入力例では、配列のインデックスとして、モザイクの平坦化されたバージョンである配列[1 2 2 2 2 2 2 2 2 2]を作成します。残念ながら、Add ++は0インデックスの配列を使用するため、各要素をデクリメントする必要があります1€Ω_

次に、入力を再度プッシュすることにより、入力リストにインデックスを付けます(A)。これは、入力をリストとして取得することでバイトを再び節約します。€Ω:配列を適切な長さに分割する前に、リストにインデックスを付けます。入力の桁数がバツ、ピースサイズは

バツバツ12

または バツth 三角形の数。入力の長さをプッシュし、1からその値までの範囲を計算し、で合計を取得することで生成しAbLR¦+ます。今、スタックの入力のために[6 5] 、のように見える[[6 5 5 5 5 5 5 5 5] 3] T配列をサイズの断片に切り刻みますn、しかし、引数は現在間違った順番になっているので、$切り刻んで返す前にそれらを交換しますT


1

、17バイト

F⮌…LθUO⊕⊘×ι⁺³ι§θι

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

F⮌…Lθ

文字のインデックスを逆順にループします。

⊕⊘×ι⁺³ι

正方形のサイズを計算します。

UO...§θι

現在のキャラクターを使用して正方形を描きます。




1

、14 バイト

E⭆θ×⊕κι×⊕κι‖O↗

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

どうやって?

E⭆θ×⊕κι×⊕κι‖O↗ - implicitly print the result of...
E                - map:
  ⭆              -   over: string map:       
    θ             -     over: first input
     ×            -     using: repeat
        ι         -       what: ι (loop value)
      ⊕κ          -       by: incremented κ (loop counter)
         ×        -   using: repeat
            ι     -     what: ι (loop value)
          ⊕κ      -     by: incremented κ (loop counter)
             ‖O  - Reflect with overlap:
                ↗ -   direction: up-right

...can this method be golfed?


"...can this method be golfed?" Even Neil's solution is longer, so I don't see any hope here. :P
Erik the Outgolfer

×⊕κιでも二回。
ジョナサンアラン

事は、それは変数に割り当てるのは簡単ではない、というのはEAachループの繰り返しごとにの値ιとがκ変わるからです。
エリックアウトゴルファー

関数である必要がありますが、それが可能かどうかはわかりません。
ジョナサンアラン

質問は、3(または関数の定義方法に応じて5)バイト以下で可能かどうかです。;)(もちろん、明らかな答えはそうではありません。)
エリック・ザ・アウトゴルファー

1

スタックス、12 バイト

ü°√¿«│⌠º₧@\τ

実行してデバッグする

このアルゴリズムを使用します

説明:

c%R:BXm]i*xit+ Full program, implicit input
c%             Length of input
  R            1-based range
   :B          Repeat each element according to the range ("123" -> "122333")
     X         Save to X register
      m        Map:
       ]         Character -> string
        i*       Repeat by iteration index
          xit    Trim first <iteration index> elements from X
             +   Concatenate
                 Implicit output with newline

スタックス20 19 18 16 バイト

ù↔‼i,ÑΓæ☺=╘‼æ↕4╝

実行してデバッグする

説明:

c%R:BX%mYx%{y|Mvx@m Full program, implicit input
c%                  Length of input
  R                 1-based range
   :B               Repeat each element according to the range ("123" -> "122333")
     X              Save to X register
      %             Length
       m            Map over 1-based range:
        Y             Save index to Y register
         x%           Push length of X register
           {      m   Map over 1-based range:
            y|M         Maximum of both indices
               v        1-based -> 0-based (decrement)
                x@      Index into X register
                      Implicit output with newline

1

アタッシュ、34バイト

{_[Table[Max,Flat!{_&_}=>1:#_]-1]}

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

説明

Galen IvanovのJ answerと同様に機能します

{_[Table[Max,Flat!{_&_}=>1:#_]-1]}
{                                }   anonymous function: _ is input, array of digits
                                     example: _ := [2, 0, 3]
                         1:#_        the range 1 to Size[_]
                                     > e.g.: [1, 2, 3]
                  {   }=>            over each number N:
                   _&_                   map to N repeated N times
                                     > e.g.: [[1], [2, 2], [3, 3, 3]]
             Flat!                   flatten it
                                     > e.g.: [1, 2, 2, 3, 3, 3]
   Table[Max,                ]       create a "max" table with it
                                     > e.g.:
                                       1 2 2 3 3 3
                                       2 2 2 3 3 3
                                       2 2 2 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                              -1     subtract 1 from each
                                     > e.g.:
                                       0 1 1 2 2 2
                                       1 1 1 2 2 2
                                       1 1 1 2 2 2
                                       2 2 2 2 2 2
                                       2 2 2 2 2 2
                                       2 2 2 2 2 2
 _[                             ]    index the original array with this matrix
                                     > e.g.:
                                       2 0 0 3 3 3
                                       0 0 0 3 3 3
                                       0 0 0 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3




1

QBasic、111バイト

コンソールへの入力および出力を求める匿名関数。

INPUT s$
n=LEN(s$)
FOR y=1TO n
FOR l=1TO y
?
FOR x=1TO n
z=x
IF y>x THEN z=y
?STRING$(x,MID$(s$,z));
NEXT x,l,y

良さそうに見えますが、「フルプログラム」という意味ではありませんか。QBasicに「匿名関数」があるとは思わない。
DLosc

0

Php 7.1、163バイト

引数として番号を提供するCLIを介して:

<?foreach(str_split($argv[1])as$k=>$d)$a[]=array_fill(0,$s+=$k+1,array_fill(0,$s,$d));foreach(array_replace_recursive(...array_reverse($a))as$v)echo join($v)."\n";

それほどゴルフではない:

$n = 123;

foreach(str_split($n) as $k => $d) {
    $s += $k + 1;
    $a[] = array_fill(0, $s, array_fill(0, $s, $d));
}

foreach(array_replace_recursive(...array_reverse($a)) as $v)
    echo implode('', $v) . "\n";

出力:

122333
222333
222333
333333
333333
333333

方法:

基本的に、数字で構成される多次元配列の正方形を構築し、それらをすべて重ね合わせます(array_replace_recursive)。

(はい、これは非常に長いことを知っています。)


入力が事前に定義された数字の配列であり、エコーの内破/結合が削除され/数字のリストのリストへの割り当てに置き換えられた場合、これは約119バイトに短縮できます。
Progrock


0

Japt、12バイト

入力を文字列として受け取り、文字列の配列を出力します。

Ë+pE
¬£h°YçX

それを試してみてください


説明

            :Implicit input of string U
Ë           :Map each character D at 0-based index E
  pE        :  Repeat D E times
 +          :  Append to D
\n          :Reassign to U
¬           :Split to character array
 £          :Map each element X at 0-based index Y
   °Y       :  Increment Y
     çX     :  Repeat X Y times
  h         :  Replace the first Y characters in U with that



0

Lua、149140バイト

数字列のリストを受け入れ、結果を標準出力に出力する関数。これはコードゴルフでの私の最初の試みです(言語の選択も助けにはなりません)。

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

function(a)F,s=0,""for b=1,#a do s=s..a[b]:rep(b)end;for b=1,#a do io.write((s.."\n"):rep(b))F,z=F+b,a[b+1]or""s=z:rep(F)..s:sub(F+1)end end

ゴルフをしていない:

G = function(p)
    F,s = 0,""
    for i=1,#p do
        s=s..p[i]:rep(i)
    end
    for i=1, #p do
        io.write((s.."\n"):rep(i))
        F,z = F+i, p[i+1]or""
        s = z:rep(F)..s:sub(F+1)
    end
end
-- allows to pass the argument list from stdin
-- example: {"1", "2", "3", "4", "5"}
G(load("return " .. io.read())())


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