Trải thảm


40

Lấy cảm hứng từ câu hỏi SO này .

Thử thách:

Đầu vào:

  • Một chuỗis
  • Một nhân vậtc

Đầu ra:

Tạo một nghệ thuật ASCII hình vuông bằng kim cương của chuỗi theo cả bốn hướng, với ký tự đầu tiên của chuỗi ở giữa và đi ra ngoài. Đó là bên trong một tấm thảm nghệ thuật ASCII vuông, với nhân vật là phụ. Điều này nghe có vẻ khá mơ hồ, vì vậy đây là một ví dụ:

Đầu vào: = , = Đầu ra:sstringc.

..........g..........
........g.n.g........
......g.n.i.n.g......
....g.n.i.r.i.n.g....
..g.n.i.r.t.r.i.n.g..
g.n.i.r.t.s.t.r.i.n.g
..g.n.i.r.t.r.i.n.g..
....g.n.i.r.i.n.g....
......g.n.i.n.g......
........g.n.g........
..........g..........

Quy tắc thử thách:

  • Chuỗi đầu vào cũng có thể là một danh sách các ký tự
  • Đầu ra cũng có thể là một danh sách các chuỗi hoặc ma trận ký tự
  • Chuỗi đầu vào và ký tự được đảm bảo không trống
  • Chuỗi được đảm bảo không chứa ký tự
  • Cả chuỗi và ký tự sẽ chỉ có thể in ASCII (phạm vi unicode [32.126], khoảng trắng '' đến và bao gồm cả dấu ngã '~')

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Quy tắc chuẩn áp dụng cho câu trả lời của bạn với quy tắc I / O mặc định , vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn (ví dụ TIO ).
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.

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

Đầu vào: = , = Đầu ra:sc =11111c=0

00000000100000000
00000010101000000
00001010101010000
00101010101010100
10101010101010101
00101010101010100
00001010101010000
00000010101000000
00000000100000000

Đầu vào: = , = Đầu ra:sc12345ABCDEFc#

####################F####################
##################F#E#F##################
################F#E#D#E#F################
##############F#E#D#C#D#E#F##############
############F#E#D#C#B#C#D#E#F############
##########F#E#D#C#B#A#B#C#D#E#F##########
########F#E#D#C#B#A#5#A#B#C#D#E#F########
######F#E#D#C#B#A#5#4#5#A#B#C#D#E#F######
####F#E#D#C#B#A#5#4#3#4#5#A#B#C#D#E#F####
##F#E#D#C#B#A#5#4#3#2#3#4#5#A#B#C#D#E#F##
F#E#D#C#B#A#5#4#3#2#1#2#3#4#5#A#B#C#D#E#F
##F#E#D#C#B#A#5#4#3#2#3#4#5#A#B#C#D#E#F##
####F#E#D#C#B#A#5#4#3#4#5#A#B#C#D#E#F####
######F#E#D#C#B#A#5#4#5#A#B#C#D#E#F######
########F#E#D#C#B#A#5#A#B#C#D#E#F########
##########F#E#D#C#B#A#B#C#D#E#F##########
############F#E#D#C#B#C#D#E#F############
##############F#E#D#C#D#E#F##############
################F#E#D#E#F################
##################F#E#F##################
####################F####################

Đầu vào: = , = Đầu ra:sc@+-|-o-|-Oc:

::::::::::::::::::O::::::::::::::::::
::::::::::::::::O:-:O::::::::::::::::
::::::::::::::O:-:|:-:O::::::::::::::
::::::::::::O:-:|:-:|:-:O::::::::::::
::::::::::O:-:|:-:o:-:|:-:O::::::::::
::::::::O:-:|:-:o:-:o:-:|:-:O::::::::
::::::O:-:|:-:o:-:|:-:o:-:|:-:O::::::
::::O:-:|:-:o:-:|:-:|:-:o:-:|:-:O::::
::O:-:|:-:o:-:|:-:+:-:|:-:o:-:|:-:O::
O:-:|:-:o:-:|:-:+:@:+:-:|:-:o:-:|:-:O
::O:-:|:-:o:-:|:-:+:-:|:-:o:-:|:-:O::
::::O:-:|:-:o:-:|:-:|:-:o:-:|:-:O::::
::::::O:-:|:-:o:-:|:-:o:-:|:-:O::::::
::::::::O:-:|:-:o:-:o:-:|:-:O::::::::
::::::::::O:-:|:-:o:-:|:-:O::::::::::
::::::::::::O:-:|:-:|:-:O::::::::::::
::::::::::::::O:-:|:-:O::::::::::::::
::::::::::::::::O:-:O::::::::::::::::
::::::::::::::::::O::::::::::::::::::

Đầu vào: = , = Đầu ra:scABcc

ccBcc
BcAcB
ccBcc

Đầu vào: = , = Đầu ra:sc~cX

~

Đầu vào: = , = Đầu ra:sc/\^/\cX

XXXXXXXX\XXXXXXXX
XXXXXX\X/X\XXXXXX
XXXX\X/X^X/X\XXXX
XX\X/X^X\X^X/X\XX
\X/X^X\X/X\X^X/X\
XX\X/X^X\X^X/X\XX
XXXX\X/X^X/X\XXXX
XXXXXX\X/X\XXXXXX
XXXXXXXX\XXXXXXXX

Chuỗi có thể chứa không gian?
Emigna

1
@Emigna Có, tất cả ASCII có thể in (phạm vi unicode [32.126]) là các ký tự đầu vào hợp lệ.
Kevin Cruijssen

1
Điều này trở nên tuyệt vời để gỡ lỗi nếu bạn sử dụng các ký tự trông giống như một ký tự đơn, ví dụ ()()().
Filip Haglund

Điều gì sẽ xảy ra nếu $ s $ trống?
Solomon Ucko

@SolomonUcko Từ phần quy tắc: " Chuỗi đầu vào và ký tự được đảm bảo không trống " :)
Kevin Cruijssen

Câu trả lời:



6

R , 118 95 92 byte

function(a,d,n=length(a),I=c(n:1,1:n)[-n])for(i in I-1)write(c(a,d)[pmin(I+i,n+1)],1,n*2,,d)

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

Nhờ vào:

  • Giuseppe để sửa lỗi và chơi gôn
  • Aaron Hayman cho golf trị giá 22 byte

Tôi đoán tôi cần bỏ ác cảm với forcác vòng lặp trong R, ít nhất là để chơi gôn.
Aaron Hayman

@Giuseppe, cảm ơn, tôi không nên lười biếng trong việc đưa vào các trường hợp thử nghiệm thêm!
Kirill L.

1
Điều này cho 98 có vẻ gần với giải pháp của bạn hơn của tôi Hãy thử trực tuyến!
Aaron Hayman

1
có thể cất cánh khác với một chút sắp xếp lại: Hãy thử trực tuyến!
Aaron Hayman

1
@AaronHayman hoặc người khác 92 này, kết hợp pminlogic với sắp xếp lại :-)
Giuseppe


5

R , một phiên bản 118 byte xấu xí

Bằng cách để đầu vào là một vectơ của các ký tự đơn và xuất ra một ma trận thay vì in nghệ thuật ascii đẹp.

function(s,C,l=length(s),L=4*l-3,k=2*l-1,y=abs(rep(1:k,L)-l)+abs(rep(1:L,e=k)-k)/2+1)matrix(ifelse(y%%1|y>l,C,s[y]),k)

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

R , 161 157 byte

đã lưu 4 byte bằng cách sử dụng ifelse thay vì sửa đổi có điều kiện y

function(S,C,l=nchar(S),L=4*l-3,k=2*l-1,y=abs(rep(1:L,k)-k)/2+abs(rep(1:k,e=L)-l)+1)cat(rbind(matrix(ifelse(y%%1|y>l,C,el(strsplit(S,''))[y]),L),'
'),sep='')

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

vô ý và bình luận

function(S,C){
    s=el(strsplit(S,''))
    l=nchar(S)
    L=4*l-3
    k=2*l-1
    y=abs(rep(1:L,k)-k)/2+abs(rep(1:k,e=L)-l)+1 # distance from centre
    y[!!y%%1]=l+1  # set non integers to one more than length of string
    y[y>l]=l+1     # set number beyond length of string to one more than length of string
    M = rbind(matrix(c(s,C)[y],L),'\n') # build matrix and add line returns
    cat(M,sep='') # print the matrix as a string
}

hmmm, có vẻ như câu trả lời dài nhất cho đến nay!


Ôi trời, đáng lẽ nên xem câu hỏi tốt hơn
Aaron Hayman

1
@KevinCruijssen Tôi đã sửa nó ngay bây giờ
Aaron Hayman

1
với +15 byte, bạn có thể đưa ra câu trả lời xấu xí của mình: Hãy thử trực tuyến!
Giuseppe


4

05AB1E , 15 11 byte

.sûsζøsýí€û

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

.s            # push suffixes of input
  û           # palendromize this list
   sζ         # transpose using the second input as filler
     ø        # transpose back
      sý      # merge each on the second input
        í     # reverse each row
         €û   # palendromize each row

1
@KevinCruijssen: Vâng. May mắn thay, nó đã không tốn bất kỳ byte nào để sửa nó. Tôi vẫn cảm thấy như thể có một cách tốt hơn để làm điều này mặc dù vậy, vì vậy tôi sẽ tiếp tục tìm kiếm.
Emigna

" Đầu ra cũng có thể là danh sách các dòng hoặc ma trận của các ký tự ", vì vậy bạn có thể di chuyển »đến chân trang. :)
Kevin Cruijssen

@KevinCruijssen À đúng rồi. Tôi liếc qua phần đó. Cảm ơn :)
Emigna

4

J , 35 34 33 byte

,{~1j1(}:@#"1{:(<*-)1-|+/|)i:@-&#

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


-&#cs
i:
1-|+/|
{: (<*-)-&#

 0  0 _1  0  0
 0 _1 _2 _1  0
_1 _2 _3 _2 _1
 0 _1 _2 _1  0
 0  0 _1  0  0

Các chỉ số tiêu cực bắt đầu từ -1 như trong python. Điều duy nhất còn lại là chèn các cột số không.

1j1( #"1
  }:@
,{~cs

Rất cám ơn Galen Ivanov cho thuật toán.


Bạn có phiền thêm một lời giải thích? Tôi không quen thuộc với J.
Kevin Cruijssen

4

K (ngn / k) , 38 byte

{1_',/'y,''2{+x,1_|x}/(#x)'1_,/+y,'|x}

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

{ }hàm với các đối số x(chuỗi s ) và y(ký tự c )

|x đảo ngược x

y,'trả trước ycho mỗi

+ hoán vị

,/ concat

1_ thả char đầu tiên

tại thời điểm này, chúng ta có một chuỗi các xtrường hợp độ dài ( ) được ytheo sau bởi các ký tự từx

#x độ dài của x

(#x)' cửa sổ trượt của nhiều ký tự liên tiếp

2{ }/ làm hai lần

+x,1_|xtham gia xvới đảo ngược xmà không có phần tử đầu tiên của nó và hoán vị

y,''trả trước ycho mỗi

,/' concat từng

1_' thả từng cái một


3

Japt , 15 byte

Trả về một mảng các dòng

Ôå+ ®¬qV êÃûV ê

Thử nó

Ôå+ ®¬qV êÃûV ê     :Implicit input of strings U=s & V=c
Ô                   :Reverse U
 å+                 :Prefixes
    ®               :Map
     ¬              :  Split
      qV            :  Join with V
         ê          :  Palindromise
          Ã         :End map
           ûV       :Centre pad each string with V, to the length of the longest
              ê     :Palindromise

3

Than , 15 byte

UBηEθ✂θκ‖O↑←UE¹

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Ban đầu được gửi như là một nhận xét về bài viết hộp cát bây giờ đã bị xóa . Giải trình:

UBη

Đặt nền cho đầu vào thứ hai c.

Eθ✂θκ

Ánh xạ qua đầu vào đầu tiên sđể tạo ra tất cả các hậu tố và in chúng trên các dòng riêng biệt.

‖O↑←

Phản ánh theo chiều ngang và chiều dọc.

UE¹

Thêm không gian theo chiều ngang.


3

Ruby , 95 84 75 byte

->a,c{(1...2*z=a.size).map{|i|s=a[j=(z-i).abs,z]*c+c*2*j;s.reverse.chop+s}}

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

Lấy chuỗi đầu vào như một mảng ký tự. Trả về một chuỗi các chuỗi.



2

Japt , 16 byte

Lưu ý: Tôi sẽ đánh gôn :)

Ôå+ ®¬qVÃùV mê ê

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


Nó khá giống với câu trả lời của Japt khác, nhưng theo một thứ tự khác, phải không? Tôi không biết Japt, nhưng tôi thấy các nhân vật tương tự trong cả hai câu trả lời. ;)
Kevin Cruijssen

@KevinCruijssen Vâng, cả hai gần như giống nhau, bây giờ
Luis felipe De jesus Munoz

@KevinCruijssen, Luis đã phát triển điều này một cách độc lập từ giải pháp của tôi.
Shaggy

2

PowerShell , 120 byte

param($s,$c)($s,(($l=$s.length-1)..0+1..$l|%{($x=$c*(2*$_))+($s[($_,($l..$_+($_+1)..$l))[$_-ne$l]]-join$c)+$x}))[$l-gt0]

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

Một số ngày, có phạm vi chỉ số thay vì lát thực sự đau. Hôm nay là một trong những ngày đó. Do các phạm vi liên kết gây rối khi xử lý các phần tử đơn lẻ (ví dụ trả về 0..0 + 1..0), vỏ đặc biệt được sử dụng để tránh hoàn toàn (với chi phí là nhiều byte).




2

PowerShell , 82 83 byte

+2 byte cảm ơn Veskah: đã sửa lỗi trường hợp ký tự đơn

-1 byte: Quy tắc Input-string may also be a list of charactersđược sử dụng

$c,$s=$args
($s|%{(-join$s|% s*g $i)+$c*$i++})[($r=$i..0+1..$i)]|%{"$_"[$r]-join$c}

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

Ít chơi gôn hơn:

$c,$s=$args
$southEast = $s|%{
    (-join$s|% substring $i) + $c*$i++
}
$range=$i..0+1..$i
$southEast[$range]|%{
    "$_"[$range]-join$c
}

1
Có vẻ như điều này phá vỡ cho trường hợp nhân vật duy nhất. Chỉ có một dòng trống trong liên kết TIO cho~
Veskah

Thật. Cảm ơn!
mazzy

2

Pip , 24 20 byte

QPRV:_JbMa@>RV,#aZDb

Sử dụng -lcờ để có được đầu ra con người có thể đọc được. Hãy thử trực tuyến!

Giải trình

QPRV:_JbMa@>RV,#aZDb
                      a,b are cmdline args (implicit)
                a     1st cmdline arg (the string)
               #      Length
              ,       Range
            RV        Reverse
         a@>          Take slices of a starting at those indices
                 ZDb  Zip the list of slices together, filling out missing values in
                      the matrix with b (the character)
        M             To each row, map this function:
     _Jb               Join on b
  RV:                 Reverse (making top row the bottom and vice versa)
QP                    Quad-palindromize: reflect downward and rightward, with overlap

Ví dụ: với đầu vào của abcd.:

RV,#a
 [3 2 1 0]
a@>
 ["d" "cd" "bcd" "abcd"]
ZDb
 [['d 'c 'b 'a] ['. 'd 'c 'b] ['. '. 'd 'c] ['. '. '. 'd]]
_JbM
 ["d.c.b.a" "..d.c.b" "....d.c" "......d"]
RV:
 ["......d" "....d.c" "..d.c.b" "d.c.b.a"]
QP
 ["......d......" "....d.c.d...." "..d.c.b.c.d.." "d.c.b.a.b.c.d" "..d.c.b.c.d.." "....d.c.d...." "......d......"]

2

Tùy viên , 57 byte

${q:=#x-1Bounce!Bounce@Join&y@PadLeft&y&#x=>x[q::(q::0)]}

Hãy thử trực tuyến! Đầu ra là một danh sách các dòng.

Giải trình

?? parameters: x, y
${
    ?? q is length of x - 1
    q:=#x-1
    ?? Reflect, collapsing middle:
    Bounce!
        ?? Function:
            ?? Reflect,
            Bounce@
            ?? Joined by y,
            Join&y@
            ?? padded to the length of x with y
            PadLeft&y&#x
        ?? Mapped over
        =>
            ?? The elements of x at
            x[
                ?? decreasing range from q to
                q::(
                    ?? each element in the range from q to 0
                    q::0
                )
            ]
}

2

Perl 6 , 79 byte

->\c{{map {join c,g $_ X||c},g .[^*X+(^$_,)]}o*.comb}
my&g={.[$_-1...0...$_-1]}

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

Codeblock ẩn danh nhận đầu vào được cuộn (như f(char)(string)) và trả về một danh sách các dòng. Tôi nghĩ rằng một cách tiếp cận khác sẽ ngắn hơn.

Giải trình:

my&g={.[$_-1...0...$_-1]}  # Helper function to palindromise a list
->\c{                                                }  # Code block that takes a char
     {                                       }o*.comb   # And returns a function
                                .[^*X+(^$_,)]  # Get all prefixes with end padding
                                               # e.g. "str" => [["r",Nil,Nil]
                                                                ["t","r",Nil]
                                                                ["s","t","r"]]
                              g   # Palindromise the lsit
       map {                },    # Map each element to
                     $_ X||c      # Replace all Nils with the character
                   g              # Palindromise it
            join c,               # And join by the character




1

JavaScript (Node.js) , 143 byte

(s,c)=>{q=Math.abs;m=(l=s.length*4-3)-1;for(i=j=0;j<l/2;(i=(++i)%l)?0:++j){p=s[q(i-m/2)/2+q(j-m/4)];process.stdout.write((i?"":"\n")+(p?
p:c))}}

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

Suy nghĩ kỹ hơn một chút sẽ dẫn đến việc tính toán theo mảng một chiều và ít byte hơn.


1

Kotlin , 250 byte

Lưu ý: Hiện tại Kotlin tio không trả về một lớp mới để mã này có ngoại lệ con trỏ null. Điều này cũng xảy ra đối với các mã tôi đã đăng trước đó hoạt động vào thời điểm đó. Tôi cho rằng cuối cùng nó sẽ được sửa chữa, nhưng không thể tìm thấy một liên hệ hỗ trợ để báo cáo vấn đề. Nó cũng có thể được chạy ở đây .

{s:String,c:Char->val h=s.length*2-1
val w=h*2-1
val m=Array(h){Array(w){c}}
for(i in s.indices)for(r in 0..h-1){val o=(i-Math.abs(h/2-r))*2
if(o>=0){m[r][w/2+o]=s[i].toChar()
m[r][w/2-o]=s[i].toChar()}}
m.map{it.joinToString("")}.joinToString("\n")}

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


Bạn có thể liên hệ với @Dennis trong Các Ninteenth Byte trò chuyện . Anh ấy là người điều hành cho TIO. Ngoài ra, tôi cho phép trả về một danh sách các chuỗi thay vì thực sự in, vì vậy tôi nghĩ (không chắc chắn) bạn có thể loại bỏ .joinToString("\n")khỏi số đếm byte (và thực hiện điều đó trong phần chân trang bên ngoài hàm).
Kevin Cruijssen



1

Truy vấn TSQL, 191 byte

Trong MS-SQL Server Management Studio nhấn Ctrl-T trước khi chạy truy vấn này, điều này sẽ thay đổi đầu ra thành văn bản.

Kịch bản lệnh này đang xây dựng đầu ra từ trái sang phải trong một "chuỗi" dài, tính toán giá trị để đặt ở mỗi vị trí. Đầu ra được giới hạn ở 4096 ký tự.

Chơi gôn

SELECT
string_agg(iif(h>k/2,@y,substring(@,h+1,1))+iif(-~n%k=0,'
',@y),'')FROM(SELECT
abs(k/2-n%k)+abs(k/2-n/k)h,*FROM(SELECT
number n,len(@)*2-1k,*FROM spt_values)c)d
WHERE n<k*k and'P'=type

Ung dung:

USE master
DECLARE 
@y char='.',
@ varchar(20) = 'abcd'

SELECT
  string_agg(iif(h>k/2,@y,substring(@,h+1,1))+iif(-~n%k=0,'
',@y),'')
FROM
(
  SELECT
    abs(k/2-n%k)+abs(k/2-n/k)h,*
  FROM
  (
    SELECT
      number n,
      len(@)*2-1k,*
    FROM spt_values
  )c
)d
WHERE n<k*k and'P'=type

Tôi đã phải thực hiện một số thay đổi để định dạng đầu ra trong phiên bản trực tuyến.

Dùng thử trực tuyến


1

Java (JDK) , 213 199 198 byte

a->b->{int i=0,l=a.length()-1;String s=a,r[]=new String[l-~l],p;for(;i<=l;s=s.substring(1))r[l+i]=r[l-i]=new StringBuffer(p=b.join(b,s.split(""))+b.repeat(2*i++)).reverse()+p.substring(1);return r;}

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

-14 bytescảm ơn @KevinCruijssen
-1 bytecảm ơn @ceilingcat

Bị đánh cắp

a->
    b-> {
        int i = 0, l = a.length() - 1;
        String s = a, r[]=new String[a.length()*2-1],p;
        for (; i<=l; s=s.substring(1))
            r[l+i]
              = r[l-i++]
              =   new StringBuffer(
                                   p =   String.join(b,s.split(""))
                                       + b.repeat(2*i)
                                  ).reverse()
                + p.substring(1);
        return r;
    }

1
Câu trả lời hay, bạn có thể đánh gôn bằng 14 byte dưới 200 . :)
Kevin Cruijssen

@KevinCruijssen Phát hiện tốt, cảm ơn!
Sara J

@ceilingcat Suy nghĩ tốt, cảm ơn!
Sara J

1

Ngôn ngữ Wolfram (Mathicala) , 68 byte

Table[#[[1+Abs@y+Abs@x/2]]/._@__:>#2,{y,l=1-Tr[1^#],-l},{x,2l,-2l}]&

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

Lấy danh sách các ký tự (cùng với ký tự phụ) làm đầu vào và xuất ra một ma trận các ký tự.

Table[                              ,{y,l=1-Tr[1^#],-l},{x,2l,-2l}]&    (* make a (2*len-1 x 4*len-3) table centered at (0,0) *)
      #[[               ]]                                              (*  where the value at each point is the string indexed at *)
         1+Abs@y+Abs@x/2                                                (*   (1 + |y-coordinate| + |x-coordinate|/2) *)
                          /._@__:>#2                                    (*  if that indexing fails, use the filler character instead *)

Để lấy chỉ mục của danh sách các ký tự, chúng tôi sử dụng list[[index]], được mở rộng bên trong Part[list, index]. Nếu chỉ mục hợp lệ, biểu thức đó ước tính giá trị tại chỉ mục đó. Nếu không - nếu chỉ mục không phải là số nguyên hoặc nằm ngoài phạm vi - biểu thức vẫn không được đánh giá.
Mẫu đơn giản nhất (ngắn nhất) phù hợp Part[...]nhưng không phải là một ký tự đơn _@__, phù hợp với bất kỳ biểu thức nào có một hoặc nhiều đối số.

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.