Letakkan Karpet


40

Terinspirasi oleh pertanyaan SO ini .

Tantangan:

Memasukkan:

  • Sebuah strings
  • Karakter Ac

Keluaran:

Buat seni ASCII berlian-persegi dari string di keempat arah, dengan karakter pertama dari string di tengah dan keluar. Yang ada di dalam karpet ASCII-art persegi, dengan karakter sebagai pengisi. Ini mungkin terdengar agak kabur, jadi di sini sebuah contoh:

Input: = , = Output: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..........

Aturan tantangan:

  • Input-string juga dapat berupa daftar karakter
  • Output juga dapat berupa daftar garis-garis atau matriks karakter
  • Input-string dan karakter dijamin tidak kosong
  • String dijamin tidak mengandung karakter
  • Baik string dan karakter hanya akan dapat dicetak ASCII (rentang unicode [32.126], spasi '' ke dan termasuk tilde '~')

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda dengan aturan I / O default , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

Input: s = 11111, c= = 0
Output:

00000000100000000
00000010101000000
00001010101010000
00101010101010100
10101010101010101
00101010101010100
00001010101010000
00000010101000000
00000000100000000

Input: s = 12345ABCDEF, c = #
Output:

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

Input: s = @+-|-o-|-O, c = :
Output:

::::::::::::::::::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::::::::::::::::::

Input: s = AB, c = c
Output:

ccBcc
BcAcB
ccBcc

Input: s = ~, c = X
Output:

~

Input: s = /\^/\, c = X
Output:

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

Bisakah string berisi spasi?
Emigna

1
@Emigna Ya, semua ASCII yang dapat dicetak (kisaran unicode [32.126]) adalah karakter input yang valid.
Kevin Cruijssen

1
Ini menjadi luar biasa untuk di-debug jika Anda menggunakan karakter yang secara visual terlihat seperti satu karakter, misalnya ()()().
Filip Haglund

Apa yang harus terjadi jika $ s $ kosong?
Solomon Ucko

@SolomonUcko Dari bagian aturan: " Input-string dan karakter dijamin tidak kosong " :)
Kevin Cruijssen

Jawaban:



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)

Cobalah online!

Terimakasih untuk:

  • Giuseppe karena memperbaiki kesalahan dan golf
  • Aaron Hayman untuk golf senilai 22 byte

Saya kira saya perlu menghilangkan keengganan saya untuk forloop di R, setidaknya untuk bermain golf.
Aaron Hayman

@ Giuseppe, terima kasih, saya seharusnya tidak terlalu malas tentang dimasukkannya kasus uji tambahan!
Kirill L.

1
Ini untuk 98 terlihat lebih dekat dengan solusi Anda daripada milik saya Cobalah online!
Aaron Hayman

1
dapat melepas dua lagi dengan sedikit penataan ulang: Cobalah secara online!
Aaron Hayman

1
@AaronHayman atau byter 92 ini menggabungkan pminlogika dengan penataan ulang :-)
Giuseppe


5

R , versi 118 byte yang jelek

Dengan membiarkan input menjadi vektor karakter tunggal, dan mengeluarkan matriks alih-alih mencetak ascii art yang bagus.

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)

Cobalah online!

R , 161 157 byte

disimpan 4 byte dengan menggunakan ifelse alih-alih memodifikasi kondisi 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='')

Cobalah online!

ungolfed dan berkomentar

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, sepertinya jawaban terpanjang sejauh ini!


Oh sayang, seharusnya melihat pertanyaan yang lebih baik
Aaron Hayman

1
@KevinCruijssen Saya telah memperbaikinya sekarang
Aaron Hayman

1
untuk +15 byte, Anda dapat membuat jawaban jelek ascii-art: Coba online!
Giuseppe


4

05AB1E , 15 11 byte

.sûsζøsýí€û

Cobalah online! atau sebagai Test Suite

Penjelasan

.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: Ya. Untungnya itu tidak memerlukan biaya byte untuk memperbaikinya. Saya masih merasa seolah-olah harus ada cara yang lebih baik untuk melakukan ini, jadi saya akan terus mencari.
Emigna

" Output juga dapat berupa daftar garis-garis atau matriks karakter ", sehingga Anda dapat memindahkan »ke footer. :)
Kevin Cruijssen

@KevinCruijssen Ah benar. Aku melirik bagian itu. Terima kasih :)
Emigna

4

J , 35 34 33 byte

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

Cobalah online!


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

Indeks negatif mulai dari -1 seperti di python. Satu-satunya yang tersisa adalah menyisipkan kolom nol.

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

Terima kasih banyak kepada Galen Ivanov untuk algoritme.


Maukah Anda menambahkan penjelasan? Saya tidak terbiasa dengan J.
Kevin Cruijssen

4

K (ngn / k) , 38 byte

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

Cobalah online!

{ }berfungsi dengan argumen x(string s ) dan y(karakter c )

|x membalikkan x

y,'saling tergantung ysatu sama lain

+ mengubah urutan

,/ concat

1_ drop dulu char

pada titik ini kami memiliki serangkaian panjang ( x) contoh ydiikuti oleh karakter darix

#x panjang dari x

(#x)' jendela geser dari banyak karakter yang berurutan

2{ }/ lakukan dua kali

+x,1_|xbergabung xdengan yang terbalik xtanpa elemen pertama, dan transpos

y,''saling tergantung ymasing-masing

,/' concat masing-masing

1_' jatuhkan satu dari masing-masing


3

Japt , 15 byte

Mengembalikan array garis

Ôå+ ®¬qV êÃûV ê

Cobalah

Ôå+ ®¬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

Arang , 15 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Awalnya dikirim sebagai komentar pada posting sandbox yang sekarang dihapus . Penjelasan:

UBη

Atur latar belakang ke input kedua c.

Eθ✂θκ

Peta atas input pertama suntuk menghasilkan semua sufiks dan secara implisit mencetaknya pada baris yang berbeda.

‖O↑←

Merefleksikan secara horizontal dan vertikal.

UE¹

Tambahkan ruang ekstra secara horizontal.


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}}

Cobalah online!

Mengambil string input sebagai array karakter. Mengembalikan array string.




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]

Cobalah online!

Beberapa hari, memiliki rentang indeks bukannya irisan benar-benar menyakitkan. Hari ini adalah salah satu dari hari-hari itu. Karena rentang siam yang berantakan ketika berhadapan dengan elemen tunggal (misalnya mengembalikan 0..0 + 1..0), casing khusus digunakan untuk menghindarinya sama sekali (dengan biaya banyak byte).




2

PowerShell , 82 83 byte

+2 byte terima kasih Veskah: bug huruf tunggal diperbaiki

-1 byte: Aturan yang Input-string may also be a list of charactersdigunakan

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

Cobalah online!

Kurang bermain golf:

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

1
Sepertinya ini istirahat untuk kasus karakter tunggal. Hanya ada garis kosong di tautan TIO untuk~
Veskah

Memang. Terima kasih!
mazzy

2

Pip , 24 20 byte

QPRV:_JbMa@>RV,#aZDb

Gunakan -lbendera untuk mendapatkan hasil yang bisa dibaca manusia. Cobalah online!

Penjelasan

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

Misalnya, dengan input abcddan .:

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

Attache , 57 byte

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

Cobalah online! Output adalah daftar baris.

Penjelasan

?? 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]}

Cobalah online!

Codeblock anonim yang mengambil input curried (seperti f(char)(string)) dan mengembalikan daftar baris. Saya pikir pendekatan yang berbeda akan lebih pendek.

Penjelasan:

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

Cobalah online!

Pemikiran yang lebih banyak akan mengarah pada penghitungan dalam hal array satu dimensi, dan lebih sedikit byte.


1

Kotlin , 250 byte

Catatan: Kotlin tio saat ini gagal mengembalikan kelas baru sehingga kode ini mendapat pengecualian null pointer. Ini juga terjadi untuk kode yang saya posting sebelumnya yang berfungsi pada saat itu. Saya menganggap itu pada akhirnya akan diperbaiki, tetapi tidak dapat menemukan kontak dukungan untuk melaporkan masalah ini. Itu juga bisa dijalankan di sini .

{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")}

Cobalah online!


Anda dapat menghubungi @Dennis di The Ninteenth Byte chatting . Dia adalah moderator untuk TIO. Juga, saya izinkan mengembalikan daftar string daripada benar-benar mencetak, jadi saya pikir (tidak yakin) Anda dapat menghapus.joinToString("\n") dari byte-count (dan melakukannya di footer di luar fungsi).
Kevin Cruijssen



1

Permintaan TSQL, 191 byte

Di Studio Manajemen MS-SQL Server tekan Ctrl-T sebelum menjalankan kueri ini, ini akan mengubah output ke teks.

Script ini membangun output dari kiri ke kanan dalam satu "string" yang panjang, menghitung nilai untuk diletakkan di setiap posisi. Output dibatasi hingga 4096 karakter.

Golf:

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

Tidak Disatukan:

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

Saya harus membuat beberapa perubahan untuk memformat output dalam versi online.

Cobalah online


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;}

Cobalah online!

-14 bytes terima kasih kepada @KevinCruijssen
-1 byte berkat @ceilingcat

Tidak disatukan

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
Jawaban yang bagus, Anda dapat golf dengan 14 byte di bawah 200 . :)
Kevin Cruijssen

@KevinCruijssen Terlihat dengan baik, terima kasih!
Sara J

@ceilingcat Pemikiran yang bagus, terima kasih!
Sara J

1

Bahasa Wolfram (Mathematica) , 68 byte

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

Cobalah online!

Mengambil daftar karakter (bersama dengan karakter pengisi) sebagai input, dan mengeluarkan matriks karakter.

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

Untuk mengambil indeks daftar karakter, kami menggunakan list[[index]], yang diperluas secara internal ke Part[list, index]. Jika indeks itu valid, ekspresi itu mengevaluasi nilai pada indeks itu. Jika tidak - jika indeks bukan bilangan bulat atau di luar rentang - ekspresi tetap tidak dievaluasi.
Pola paling sederhana (terpendek) yang cocok Part[...]tetapi bukan karakter tunggal _@__, yang cocok dengan ekspresi apa pun dengan satu atau lebih argumen.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.