Hãy thiết kế một bức tranh khảm chữ số


25

Thử thách

Cho một dương tính số nguyên , lặp lại mỗi chữ số của nó một số lần tương ứng với vị trí của nó trong . Nói cách khác, mỗi chữ số phải được lặp lại lần (với mỗi , 1 chỉ mục), do đó tạo ra số mới:Nd1,d2,d3,,dnNdkk1kn

d1d2d2d3d3d3dndndndnn lần¯

Sau đó, viết nó xuống theo cả chiều ngang và chiều dọc và điền vào chỗ trống bằng các bản sao của chữ số tương ứng với chỉ số lớn hơn giữa chỉ mục cột và chỉ mục hàng của khoảng trắng. Đầu ra cuối cùng sẽ trông như thế này:

[d1d2d2d3d3d3d2d2d2d3d3d3d2d2d2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3]

Thông số kỹ thuật

Bạn có thể lấy làm số nguyên, chuỗi, danh sách các chữ số hoặc danh sách các ký tự đại diện cho các chữ số. Đầu ra có thể là một chuỗi được phân tách bằng dòng mới, một danh sách các chuỗi / số nguyên hoặc một danh sách các danh sách các ký tự / chữ số, nhưng vui lòng bao gồm cả một phiên bản in đẹp, nếu có thể. Nếu đầu ra là một chuỗi phân tách dòng mới, nó cũng được chấp nhận để:N

  • có khoảng trắng hàng đầu / dấu, miễn là giao diện trực quan của đầu ra không thay đổi
  • phân tách các cột bằng cách sử dụng một khoảng trắng số lượng nhất quán hoặc các hàng với số lượng dòng mới nhất quán (khác không)

Bạn có thể lấy đầu vào và cung cấp đầu ra thông qua bất kỳ phương thức tiêu chuẩn nào , trong khi lưu ý rằng các lỗ hổng này bị cấm theo mặc định. Đây là , vì vậy hãy cố gắng hoàn thành nhiệm vụ theo ít byte nhất bạn có thể quản lý bằng ngôn ngữ bạn chọn.

Các trường hợp thử nghiệm

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

Chúng ta có xử lý hai chữ số giống nhau cạnh nhau không?
Dom Hastings

@DomHastings Vâng, bạn phải xử lý chúng. Đã thêm một trường hợp thử nghiệm minh họa điều này.
Ông Xcoder

Câu trả lời:


9

JavaScript (ES7), 70 byte

Đưa đầu vào dưới dạng một chuỗi. Trả về một chuỗi với một linefeed trailing.

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

Hãy thử trực tuyến!

Làm sao?

phương pháp

Chúng tôi xây dựng ký tự đầu ra theo ký tự bằng cách đi qua một ma trận vuông và chuyển đổi từng ô thành một chỉ mục thành chuỗi đầu vào.tôix,y

Tọa độ để lập chỉ mục chuỗi

Giới hạn trên của khu vực chữ số n t h (được lập chỉ mục 0) dọc theo mỗi trục được cho bởi A000096 :bạnnnth

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

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

Đưa ra một số nguyên , chúng ta có thể tìm hiểu trong đó diện tích n = x+ 1 nó nằm bằng cách giải quyết:kn=x+1

x²+3x2k=0

Dẫn tới:

n=

x=1+8k32
n= =1+số 8k-32+1= =1+số 8k-12

Đối với mỗi ô , chúng tôi xác định:(x,y)

vx,y= =tối đa(1+số 8x,1+số 8y)

Các giá trị này được chuyển đổi thành các chỉ số i x , y thành chuỗi đầu vào bằng cách thực hiện:vx,ytôix,y

tôix,y= =vx,y-12
 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

Điều kiện tạm dừng

Chúng tôi biết rằng chúng tôi đã đạt được:

  • ranh giới bên phải của ma trận khi ký tự tại không tồn tại và chúng ta có x > ytôix,yx>y

  • ranh giới dưới cùng của ma trận khi ký tự không tồn tại và chúng ta có xy


7

J , 16 15 byte

-1 byte nhờ FrownyFrog!

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

Hãy thử trực tuyến!

Mất Nnhư một chuỗi.

Giải thích về giải pháp ban đầu:

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

Phiên kiểm tra với đầu vào 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
Hah, ngoài vị trí của )câu trả lời, APL của bạn giống như câu trả lời của tôi.
Erik the Outgolfer

Tôi thực sự không biết J chút nào, nhưng [:<:@có vẻ khá tốn kém. Thay vào đó, bạn có thể thêm một cái gì đó vào danh sách mà bạn đang lập chỉ mục để tính đến việc lập chỉ mục 1 không (ví dụ: trả trước 0 để di chuyển từng vị trí 1 yếu tố cần thiết sang phải)?
Ông Xcoder

@ Mr.Xcoder Tôi đã suy nghĩ về điều đó. Tôi sẽ thử nó để xem nếu nó sẽ lưu một số byte.
Galen Ivanov

@EriktheOutgolfer {⍵[∘.⌈⍨(/⍨)⍳⍴⍵]} ?
Galen Ivanov

@GalenIvanov Vâng, đó.
Erik the Outgolfer



6

R , 59 byte

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

Hãy thử trực tuyến!

  • Tôi nhận thấy rằng việc lấy một vectơ các chữ số là chấp nhận được và điều này cho phép tôi lưu 21 byte :)
  • -2 byte nhờ đề xuất @Giuseppe chỉ chấp nhận vectơ ký tự
  • -2 byte gán trong định nghĩa đối số

1
Bạn có thể lấy amột vectơ ký tự, cho phép bạn đặt g=seq(a)trực tiếp.
Giuseppe

@Giuseppe: đúng vậy!
digEmAll


5

05AB1E , 14 11 10 byte

Đã lưu 1 byte nhờ Magic Octopus Urn / Adnan

ƶJDv¬N×?=¦

Hãy thử trực tuyến!

Giải trình

ƶ            # 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
Mặc dù không có tín dụng đối với tôi, tín dụng là Adnans: codegolf.stackexchange.com/a/87074/59376
Bạch tuộc ma thuật Urn

@MagicOctopusUrn: Ah, thật tuyệt vời! Cảm ơn cả hai bạn;)
Emigna



3

VBA Excel, 95 byte

Một chức năng cửa sổ ngay lập tức VBE ẩn danh nhận đầu vào [A1]và đầu ra cho bàn điều khiển

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

Ungolfed và bình luận

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

MATL , 15 12 byte

tftY"t!2$X>)

Hãy thử trực tuyến!

Tôi nghi ngờ điều này có thể rút ngắn, nhưng nó không quá tệ ...

          % 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

Thêm ++ , 35 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Chúng tôi lấy đầu vào là một danh sách các chữ số, trong khi ngăn chúng tôi khỏi việc phải chuyển sang các chữ số BDvà cũng không phải lưu các chữ số, sẽ mất hai byte.

Đầu tiên, chúng ta tạo ra một loạt từ [1 ... len (đầu vào)] với bLR, thì chúng ta lặp lại mỗi phần tửn trong phạm vi nlần Vì vector hóa tự động không tồn tại trong Add ++, chúng tôi tự nén nó dBcB]để tạo danh sách các cặp[[1,1],[2,2]...[n,n]]. Sau đó, chúng tôi áp dụng starmap , kết hợp với sự lặp lại qua các cặp: £Xtrước khi ghép chúng thành một mảng phẳng ( ¦Ω+).

Tiếp theo, chúng tôi nhân đôi mảng này và đặt nó theo mức tối đa , d‽b>. Tức là mỗi phần tử trong mảng được ghép với từng phần tử khác từ mảng thứ hai và lệnh tối đa dyadic được chạy trên cặp. Đối với đầu vào ví dụ của [6 5] , điều này tạo ra mảng [1 2 2 2 2 2 2 2 2] , đây là phiên bản dẹt của khảm, làm chỉ mục cho mảng. Thật không may, Add ++ sử dụng các mảng được lập chỉ mục 0, vì vậy chúng ta cần giảm từng phần tử : 1€Ω_.

Sau đó, chúng tôi lập chỉ mục vào danh sách đầu vào, bằng cách đẩy đầu vào lại ( A), một lần nữa lưu byte bằng cách lấy đầu vào làm danh sách. Lập chỉ mục vào danh sách với €Ω:trước khi cắt mảng thành các mảnh có độ dài phù hợp. Nếu số chữ số trong đầu vào được ký hiệu làx, sau đó kích thước mảnh là

x(x-1)2

hoặc là xth số tam giác . Chúng tôi tạo ra điều đó bằng cách đẩy độ dài của đầu vào, tính toán phạm vi từ 1 đến giá trị đó, sau đó lấy tổng bằng AbLR¦+. Bây giờ, ngăn xếp, cho đầu vào của [6 5] , trông giống như [[6 5 5 5 5 5 5 5 5] 3] . Tcắt mảng thành các mảnh kích thướcn, nhưng các đối số hiện đang theo thứ tự sai, vì vậy chúng tôi trao đổi chúng với $trước khi cắt và quay lại với T.


1

Than , 17 byte

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

Hãy thử trực tuyến! Giải trình:

F⮌…Lθ

Lặp lại các chỉ số của các ký tự theo thứ tự ngược lại.

⊕⊘×ι⁺³ι

Tính kích thước hình vuông.

UO...§θι

Vẽ hình vuông bằng ký tự hiện tại.




1

Than , 14 byte

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

Hãy thử trực tuyến!

Làm sao?

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

... phương pháp này có thể được đánh golf?


"... phương pháp này có thể được đánh gôn không?" Ngay cả giải pháp của Neil cũng dài hơn, vì vậy tôi không thấy bất kỳ hy vọng nào ở đây. : P
Erik the Outgolfer

×⊕κιhai lần mặc dù.
Jonathan Allan

Vấn đề là, không dễ để gán nó cho một biến, vì các giá trị ικthay đổi ở mỗi lần lặp của vòng lặp Each.
Erik the Outgolfer

Nó cần phải là một chức năng nhưng tôi không biết liệu nó có khả thi hay không.
Jonathan Allan

Câu hỏi cần đặt ra là liệu có thể có 3 (hoặc 5 hay không, tùy thuộc vào cách xác định hàm) byte hoặc ít hơn. ;) (Câu trả lời rõ ràng là, tất nhiên, không phải.)
Erik the Outgolfer

1

Stax , 12 byte

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

Chạy và gỡ lỗi nó

Sử dụng thuật toán này .

Giải trình:

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╝

Chạy và gỡ lỗi nó

Giải trình:

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

Tùy viên , 34 byte

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

Hãy thử trực tuyến!

Giải trình

Hoạt động tương tự như câu trả lời J của 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


1

C (gcc) , 130 byte

Ai cần toán học ưa thích khi bạn có thể 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);}

Hãy thử trực tuyến!


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 cảm ơn DLosc .

Sử dụng một phiên bản sửa đổi của thuật toán Python 2 của xnor .

Đầu vào là một chuỗi không trích dẫn. Đầu ra được phân \ntách mà không có thêm khoảng trắng hoặc \ns.


1

QBasic , 111 byte

Một chức năng ẩn danh nhắc nhở đầu vào và đầu ra cho bàn điều khiển.

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

Có vẻ tốt - nhưng bạn không có nghĩa là "chương trình đầy đủ"? Tôi không nghĩ QBasic có "chức năng ẩn danh."
DLosc

0

Php 7.1 , 163 byte

Thông qua CLI cung cấp số làm đối số:

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

Không chơi gô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";

Đầu ra:

122333
222333
222333
333333
333333
333333

Phương pháp:

Về cơ bản xây dựng các ô vuông đa chiều bao gồm chữ số, và sau đó xếp chồng tất cả chúng (mảng numplace_recursive).

(Vâng, tôi biết điều này là dài đáng xấu hổ.)


Nếu đầu vào là một mảng các chữ số được xác định trước và âm / nối âm được loại bỏ / thay thế bằng một phép gán cho danh sách các chữ số, điều này có thể giảm xuống còn khoảng 119 byte, vẫn còn dài.
Progrock


0

Japt, 12 byte

Lấy đầu vào dưới dạng một chuỗi, xuất ra một chuỗi các chuỗi.

Ë+pE
¬£h°YçX

Thử nó


Giải trình

            :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

Visual Basic .NET (VBC) , 198 byte

Một Subthói quen lấy đầu vào từ STDIN và đầu ra thành STDOUT.

Dường như không thể khiến StrDup hoạt động: /

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

Hãy thử trực tuyến!


0

Lua, 149 140 byte

Hàm chấp nhận danh sách các chuỗi chữ số và in kết quả ra thiết bị xuất chuẩn. Đây là nỗ lực đầu tiên của tôi tại môn đánh gôn (và lựa chọn ngôn ngữ cũng không giúp được gì) vì vậy hãy đồng ý với tôi :)

Hãy thử trực tuyến!

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

Ung dung:

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())())


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.