Mari kita merancang mosaik digit

25

Tantangan

Mengingat positif integer N , ulangi masing-masing digit d1,d2,d3,,dn beberapa kali sesuai dengan posisinya di N . Dengan kata lain, setiap digit dk harus diulang k kali (untuk setiap , 1-diindeks), sehingga menciptakan nomor baru:1kn

d1d2d2d3d3d3dndndndnn times¯

Kemudian, tuliskan keduanya secara horizontal dan vertikal dan isi bagian yang kosong dengan salinan digit yang sesuai dengan indeks yang lebih besar antara indeks kolom dan indeks baris ruang kosong. Hasil akhir akan terlihat seperti ini:

[d1d2d2d3d3d3d2d2d2d3d3d3d2d2d2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3]

Spesifikasi

Anda dapat mengambil N sebagai bilangan bulat, string, daftar digit atau daftar karakter yang mewakili digit. Outputnya bisa berupa string yang dipisahkan baris baru, daftar string / integer atau daftar daftar karakter / digit, tetapi harap sertakan juga versi cetak yang cantik, jika memungkinkan. Jika output adalah string yang dipisahkan baris baru, itu juga dapat diterima untuk:

  • memiliki spasi putih terdepan / utama, selama tampilan visual output tidak berubah
  • pisahkan kolom menggunakan spasi jumlah konsisten atau baris dengan jumlah baris baru (tidak nol) yang konsisten

Anda dapat mengambil input dan memberikan output melalui metode standar apa pun , sambil memperhatikan bahwa celah ini dilarang secara default. Ini adalah , jadi cobalah untuk menyelesaikan tugas dalam byte terkecil yang dapat Anda kelola dalam bahasa pilihan Anda.

Uji kasus

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
Tuan Xcoder
sumber
Apakah kita memiliki pegangan dua digit yang sama di samping satu sama lain?
Dom Hastings
@HomHastings Ya, Anda harus menanganinya. Menambahkan test case yang menggambarkan hal ini.
Tn. Xcoder
Terkait
Magic Gurita Guci

Jawaban:

9

JavaScript (ES7), 70 byte

Mengambil input sebagai string. Mengembalikan string dengan linefeed baris tambahan.

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

Cobalah online!

Bagaimana?

metode

Kami membangun karakter keluaran dengan karakter dengan berjalan melalui matriks persegi dan mengubah setiap sel menjadi indeks menjadi string input.ix,y

Koordinasikan ke indeks string

Bagian atas terikat dari n t h daerah digit (0-diindeks) bersama setiap sumbu diberikan oleh A000096 :unnth

u0=0,u1=2,u2=5,u3=9,

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

Diberi bilangan bulat , kita bisa mencari tahu di area mana n = x+ 1 terletak dengan memecahkan:kn=x+1

x²+3x2k=0

Menuju ke:

n=

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

Untuk setiap sel , kami mendefinisikan:(x,y)

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

Nilai-nilai ini dikonversi menjadi indeks i x , y ke dalam string input dengan melakukan: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

Kondisi berhenti

Kami tahu bahwa kami telah mencapai:

  • batas kanan matriks ketika karakter di ix,y tidak ada dan kami memiliki x>y

  • batas bawah dari matriks ketika karakter tidak ada dan kita memiliki xy

Arnauld
sumber
7

J , 16 15 byte

-1 byte terima kasih kepada FrownyFrog!

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

Cobalah online!

Dibutuhkan N sebagai string.

Penjelasan solusi awal:

              #\   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

Sesi tes dengan 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
Galen Ivanov
sumber
1
Hah, terlepas dari penempatan ), jawaban APL Anda sama dengan milik saya.
Erik the Outgolfer
Saya benar-benar tidak mengenal J sama sekali, tetapi [:<:@tampaknya cukup mahal. Bisakah Anda sebaliknya menambahkan sesuatu ke daftar yang Anda indekskan ke akun untuk pengindeksan-1 (mis., Tambahkan dulu 0 untuk memindahkan setiap posisi elemen 1 yang diperlukan ke kanan)?
Tn. Xcoder
@ Mr.Xcoder saya sedang memikirkan hal itu. Saya akan mencoba untuk melihat apakah itu akan menghemat beberapa byte.
Galen Ivanov
@EriktheOutgolfer {⍵[∘.⌈⍨(/⍨)⍳⍴⍵]} ?
Galen Ivanov
@ GalenIvanov Ya, itu.
Erik the Outgolfer
6

Haskell , 60 59 58 byte

f x|s<-do(n,_)<-zip[0..]x;n<$[0..n]=[(x!!).max a<$>s|a<-s]

Cobalah online!


Versi bebas poin (68 byte)

(map=<<(.((snd.).max)).flip map).((\t@(n,c)->t<$[1..n])=<<).zip[1..]

Cobalah online!

Laikoni
sumber
6

Python 2 , 71 byte

i=j=0;r=''
for x in input():i+=1;r+=x*i
for c in r:print j*c+r[j:];j+=1

Cobalah online!

Pertama menghasilkan baris pertama r, lalu beralih runtuk mencetak setiap baris.

Tidak
sumber
6

R , 59 byte

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

Cobalah online!

  • Saya perhatikan bahwa mengambil vektor angka dapat diterima, dan ini memungkinkan saya untuk menyimpan 21 byte :)
  • -2 byte berkat saran @Giuseppe untuk hanya menerima vektor karakter
  • -2 byte yang ditetapkan dalam definisi argumen
menggali semua
sumber
1
Anda dapat mengambil asebagai vektor karakter, memungkinkan Anda untuk mengatur g=seq(a)secara langsung.
Giuseppe
@ Giuseppe: benar!
digEmAll
5

05AB1E , 14 11 10 byte

Disimpan 1 byte berkat Magic Octopus Urn / Adnan

ƶJDv¬N×?=¦

Cobalah online!

Penjelasan

ƶ            # 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
Emigna
sumber
1
Cobalah online! = 10
Guci Gurita Sihir
1
Tidak ada kredit untuk saya, kredit adalah Adnans: codegolf.stackexchange.com/a/87074/59376
Magic Octopus Mm
@MagicOctopusUrn: Ah, itu brilian! Terima kasih untuk kalian berdua;)
Emigna
4

APL (Dyalog Classic) , 16 byte

{⍵[∘.⌈⍨(/⍨⍳⍴⍵)]}

Saya memisahkan solusi ini dari posting dengan jawaban J saya, seperti yang disarankan oleh Jo King

Cobalah online!

Galen Ivanov
sumber
3

Excel VBA, 95 byte

VBE jendela anonim langsung yang mengambil input dari [A1]dan output ke konsol

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

Tidak diikat dan dikomentari

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
Taylor Scott
sumber
2

MATL , 15 12 byte

tftY"t!2$X>)

Cobalah online!

Saya menduga ini bisa dipersingkat, tapi tidak terlalu buruk ...

          % 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
Giuseppe
sumber
2

Tambahkan ++ , 35 byte

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

Cobalah online!

Bagaimana itu bekerja

Kami mengambil input sebagai daftar digit, sementara mencegah kami dari a) harus dilemparkan ke digit BD, dan juga dari harus menyimpan digit, yang akan memakan waktu dua byte.

bLRnndBcB][[1,1],[2,2]...[n,n]]£X¦Ω+

Selanjutnya, kami menduplikasi array ini dan tabelnya secara maksimum d‽b>,. Yaitu setiap elemen dalam array dipasangkan dengan satu sama lain elemen dari array kedua dan perintah maksimum diad dijalankan oleh pasangan. Untuk input contoh [6 5] , ini menciptakan array [1 2 2 2 2 2 2 2 2] , yang merupakan versi rata dari mosaik, sebagai indeks untuk array. Sayangnya, Tambah ++ menggunakan 0-diindeks array, jadi kita perlu pengurangan setiap elemen: 1€Ω_.

A€Ω:x

x(x-1)2

xth AbLR¦+Tn$T


sumber
1

Arang , 17 byte

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

Cobalah online! Penjelasan:

F⮌…Lθ

Ulangi indeks karakter dalam urutan terbalik.

⊕⊘×ι⁺³ι

Hitung ukuran kotak.

UO...§θι

Gambarlah persegi menggunakan karakter saat ini.

Neil
sumber
1

Arang , 14 byte

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

Cobalah online!

Bagaimana?

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

... dapatkah metode ini di-golf?

Jonathan Allan
sumber
"... bisakah metode ini di mainkan?" Bahkan solusi Neil lebih lama, jadi saya tidak melihat harapan di sini. : P
Erik the Outgolfer
×⊕κιdua kali.
Jonathan Allan
Masalahnya adalah, tidak mudah untuk menetapkan itu ke variabel, karena nilai-nilai ιdan κberubah pada setiap iterasi dari loop Each.
Erik the Outgolfer
Itu perlu fungsi tetapi saya tidak tahu apakah itu mungkin.
Jonathan Allan
Pertanyaan untuk ditanyakan adalah apakah mungkin dalam 3 (atau 5, tergantung pada bagaimana fungsi didefinisikan) byte atau kurang. ;) (Jawaban yang jelas, tentu saja, tidak.)
Erik the Outgolfer
1

Stax , 12 byte

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

Jalankan dan debug itu

Menggunakan algoritma ini .

Penjelasan:

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

Stax , 20 19 18 16 byte

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

Jalankan dan debug itu

Penjelasan:

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
wastl
sumber
1

Attache , 34 byte

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

Cobalah online!

Penjelasan

Bekerja mirip dengan jawaban J Galen Ivanov .

{_[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
Conor O'Brien
sumber
1

C (gcc) , 130 byte

Siapa yang butuh matematika mewah saat Anda bisa bruteforce?

n,l;R(n,c){for(;n--;)putchar(c);}f(s){for(char*p=s,*q;*p++;)for(n=l=p-s;l--;R(1,10))for(R(n*n+n>>1,p[-1]),q=p;*q;q++)R(q-s+1,*q);}

Cobalah online!

gastropner
sumber
1

QBasic 1.1 , 127 byte

INPUT S$
FOR X=1TO LEN(S$)
K=K+X
R$=R$+STRING$(X,MID$(S$,X,1))
NEXT
FOR C=1TO K
?STRING$(C-1,MID$(R$,C,1))RIGHT$(R$,K-C+1)
NEXT

-4 Terima kasih untuk DLosc .

Menggunakan versi modifikasi dari algoritma Python 2 xnor .

Input adalah string yang tidak dikutip. Output \ndipisahkan-tanpa ruang tambahan atau \ns.

Erik the Outgolfer
sumber
1

QBasic , 111 byte

Fungsi anonim yang meminta input dan output ke konsol.

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
Taylor Scott
sumber
Terlihat bagus - tetapi bukankah maksud Anda "program penuh"? Saya tidak berpikir QBasic memiliki "fungsi anonim."
DLosc
0

Php 7.1 , 163 bytes

Via CLI memberikan nomor sebagai argumen:

<?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";

Tidak begitu bermain golf:

$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";

Keluaran:

122333
222333
222333
333333
333333
333333

Metode:

Pada dasarnya membangun kotak array multi-dimensi yang terdiri dari digit, dan kemudian menempatkan semuanya (array_replace_recursive).

(Ya, saya tahu ini sangat memalukan.)

Progrock
sumber
Jika input adalah array digit yang ditentukan sebelumnya, dan gema implode / join dihapus / diganti dengan tugas ke daftar daftar digit, ini dapat dikurangi menjadi sekitar 119 byte, ya masih panjang.
Progrock
0

Japt, 12 byte

Mengambil input sebagai string, menghasilkan array string.

Ë+pE
¬£h°YçX

Cobalah


Penjelasan

            :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
Shaggy
sumber
0

uBASIC , 120 byte

Fungsi anonim yang mengambil input foprm STDIN dan output ke STDOUT

0Input"",S$:N=Len(S$):ForY=1ToN:ForL=1ToY:ForX=1ToN:ForC=1ToX:Z=X:IfY>XThenZ=Y
1?Mid$(s$,z,1);:NextC:NextX:?:NextL:NextY

Cobalah online!

Taylor Scott
sumber
0

Visual Basic .NET (VBC) , 198 byte

Sebuah Subrutinitas yang mengambil masukan dari STDIN dan output ke stdout.

Tampaknya tidak bisa membuat StrDup berfungsi: /

Module M
Sub Main
Dim c,s,n,l,x,y
s=Console.readLine()
n=Len(s)
For y=1To n
For l=1To y
For x=1To n
For c=1To x
Console.Write(Mid(s,IIf(x>y,x,y),1)&IIf(c=n,vbLf,""))
Next c,x,l,y 
End Sub
End Module

Cobalah online!

Taylor Scott
sumber
0

Lua, 149 140 byte

Fungsi yang menerima daftar string digit dan mencetak hasilnya ke stdout. Ini adalah upaya pertama saya di golf kode (dan pilihan bahasa tidak membantu baik) jadi bersabarlah :)

Cobalah online!

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

Tidak Disatukan:

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())())
PhilipRoman
sumber
0

Perl 5 + -nalF -M5.010, 67 byte

s/./$&x++$-/ge;eval'eval"say;"x++$i;$x+=$i;s/.{$x}/$F[$i]x$x/e;'x@F

Cobalah online!

Dom Hastings
sumber
0

Yabasic , 108 byte

Fungsi anonim yang mengambil input dari STDIN dan output ke STDOUT

Input""s$
n=len(s$)
For y=1To n
For r=1To y
For x=1To n
For c=1To x?Mid$(s$,max(x,y),1);Next
Next
?Next
Next

Cobalah online!

Taylor Scott
sumber