布置地毯


40

受到这个SO问题的启发。

挑战:

输入:

  • 字符串s
  • 角色c

输出:

在所有四个方向上创建字符串的菱形正方形ASCII艺术作品,字符串的第一个字符在中心并向外。在方形ASCII艺术地毯中,该字符用作填充物。这听起来可能很模糊,所以这里有个例子:

输入:s = stringc = .
输出:

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

挑战规则:

  • 输入字符串也可以是字符列表
  • 输出也可以是字符串列表或字符矩阵
  • 输入字符串和字符保证为非空
  • 该字符串保证不包含字符
  • 字符串和字符都只能是可打印的ASCII(unicode范围[32,126],空格''到波浪号'〜'并包括波浪号'〜')

通用规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于具有默认I / O规则的答案,因此允许您使用STDIN / STDOUT,具有正确参数的函数/方法以及返回类型的完整程序。您的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接(即TIO)。
  • 另外,强烈建议为您的答案添加说明。

测试用例:

输入:s = 11111c= = 0
输出:

00000000100000000
00000010101000000
00001010101010000
00101010101010100
10101010101010101
00101010101010100
00001010101010000
00000010101000000
00000000100000000

输入:s = 12345ABCDEFc = #
输出:

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

输入:s = @+-|-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::::::::::::::::::

输入:s = ABc = c
输出:

ccBcc
BcAcB
ccBcc

输入:s = ~c = X
输出:

~

输入:s = /\^/\c = X
输出:

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

字符串可以包含空格吗?
Emigna

1
@Emigna是,所有可打印的ASCII(unicode范围[32,126])都是有效的输入字符。
凯文·克鲁伊森

1
如果您使用外观上看起来像单个字符的字符(例如),调试起来将变得非常棒()()()
Filip Haglund

如果$ s $为空应该怎么办?
所罗门·乌科

@SolomonUcko在规则部分:“ 输入字符串和字符确保为非空 ” :)
Kevin Cruijssen

Answers:



6

R118 95 92字节

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)

在线尝试!

谢谢:

  • 朱塞佩修正错误和打高尔夫球
  • 亚伦·海曼(Aaron Hayman)获得22字节高尔夫

我想for至少在高尔夫方面,我需要对R的循环不满意。
亚伦·海曼

@Giuseppe,谢谢,我不应该懒于包含额外的测试用例!
Kirill L.

1
98的解决方案比我的解决方案更接近您的解决方案在线尝试!
亚伦·海曼

1
可以重新整理一下,
亚伦·海曼

1
@AaronHayman,否则这92个方法pmin逻辑与重新排列结合在一起:-)
朱塞佩


5

R,一个丑陋的118字节版本

通过将输入作为单个字符的向量,并输出矩阵,而不是打印精美的ascii艺术。

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)

在线尝试!

[R 161个 157字节

通过使用ifelse而不是有条件地修改保存了4个字节 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='')

在线尝试!

取消评论

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
}

嗯,似乎是迄今为止最长的答案!


亲爱的,应该更好地研究这个问题
亚伦·海曼

1
@KevinCruijssen我已经修复它
Aaron Hayman

1
对于+15个字节,您可以做出难看的答案ascii-art:在线尝试!
朱塞佩


4

05AB1E15 11字节

.sûsζøsýí€û

在线尝试! 或作为测试套件

说明

.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:是的。幸运的是,它不需要花费任何字节来修复它。我仍然觉得应该有一个更好的方法,所以我会继续寻找。
Emigna

输出也可能是字符串行或字符矩阵的列表 ”,因此可以将其»移至页脚。:)
Kevin Cruijssen

@KevinCruijssen嗯,对。我瞥了一眼那部分。谢谢:)
艾米娜

4

J35 34 33字节

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

在线尝试!


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

负索引从-1开始,就像在python中一样。剩下的唯一事情就是插入零列。

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

非常感谢Galen Ivanov的算法。


您介意添加解释吗?我没那么熟悉J.
凯文Cruijssen

4

K(ngn / k),38字节

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

在线尝试!

{ }带有参数x(字符串s)和y(字符c)的函数

|x 相反 x

y,'预先考虑y到各

+ 转置

,/ 康卡特

1_ 删除第一个字符

在这一点上,我们有一个length(x)实例字符串,y后跟来自x

#x 的长度 x

(#x)' 这么多连续字符的滑动窗口

2{ }/ 做两次

+x,1_|xxx没有第一个元素的情况下与反向连接并转置

y,''前面加上y每个各

,/' 每一个

1_' 从每个投下一个


3

Japt,15个字节

返回行数组

Ôå+ ®¬qV êÃûV ê

试试吧

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

木炭,15字节

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

在线尝试!链接是详细版本的代码。最初作为对已删除的沙箱帖子评论提交。说明:

UBη

将背景设置为第二个输入c

Eθ✂θκ

映射第一个输入s以生成所有后缀,并在单独的行上隐式打印它们。

‖O↑←

水平和垂直反射。

UE¹

水平添加额外的空间。


3

红宝石95 84 75字节

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

在线尝试!

将输入字符串作为char数组。返回字符串数组。




2

PowerShell,120字节

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]

在线尝试!

有时候,使用索引范围而不是分片确实很痛苦。今天是那些日子之一。由于联合范围在处理单个元素时会弄乱(例如,返回0..0 + 1..0),因此使用特殊大小写完全避免了这种情况(以许多字节为代价)。




2

PowerShell82 83字节

+ 2个字节,感谢Veskah:修复了单字符大小写错误

-1字节:规则Input-string may also be a list of characters使用

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

在线尝试!

少打高尔夫球:

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

1
对于单个字符的情况,看起来像这样中断。TIO链接中只有一个空白行~
Veskah

确实。谢谢!
疯狂

2

24 20字节

QPRV:_JbMa@>RV,#aZDb

使用该-l标志获取人类可读的输出。在线尝试!

说明

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

例如,对于输入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

附件,57字节

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

在线尝试!输出是行列表。

说明

?? 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字节

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

在线尝试!

匿名代码块,使用咖喱输入(如f(char)(string))并返回行列表。我认为其他方法会更短。

说明:

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

Kotlin,250字节

注意:Kotlin tio当前无法返回新类,因此此代码获取空指针异常。我以前发布的当时适用的代码也会发生这种情况。我认为它将最终得到解决,但是找不到支持联系人来报告该问题。也可以在这里运行。

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

在线尝试!


您可以在第19个字节聊天室中@Dennis联系。他是TIO的主持人。另外,我允许返回字符串列表,而不是实际打印,因此,我认为(不确定)可以从字节数中删除(并在函数外部的页脚中执行此操作)。.joinToString("\n")
凯文·克鲁伊森



1

TSQL查询,191个字节

在MS-SQL Server Management Studio中,在运行此查询之前按Ctrl-T,这会将输出更改为文本。

该脚本在一个长的“字符串”中从左到右构建输出,计算要放在每个位置的值。输出限制为4096个字符。

打高尔夫球:

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

取消高尔夫:

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

我必须进行一些更改以将输出格式设置为在线版本。

在线尝试


1

爪哇(JDK) 213个 199 198字节

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

在线尝试!

-14 bytes感谢@KevinCruijssen
-1 byte感谢@ceilingcat

不打高尔夫球

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
不错的答案,但是您可以将其打成200以下的14个字节。:)
Kevin Cruijssen

@KevinCruijssen很好,谢谢!
Sara J

@ceilingcat很好的想法,谢谢!
Sara J

1

Wolfram语言(Mathematica),68字节

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

在线尝试!

接受字符列表(以及填充符)作为输入,并输出字符矩阵。

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

要获取字符列表的索引,我们使用list[[index]],它在内部扩展为Part[list, index]。如果索引有效,则该表达式的值将为该索引处的值。如果不是-如果索引不是整数或超出范围,则该表达式将保持未评估状态。
匹配Part[...]但不是单个字符的最简单(最短)模式是_@__,它匹配具有一个或多个参数的任何表达式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.