카펫을 배치


40

이 SO 질문에서 영감을 얻었습니다 .

도전:

입력:

  • 문자열s
  • 문자c

산출:

문자열의 첫 번째 문자가 가운데에 바깥쪽으로 향하게하여 네 방향 모두에서 문자열의 다이아몬드 사각형 ASCII 아트를 만듭니다. 문자를 필러로 사용하는 사각형 ASCII 아트 카펫 안에 있습니다. 이것은 꽤 모호하게 들릴 수 있으므로 여기에 예제가 있습니다.

입력 : = , = 출력 :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..........

도전 규칙 :

  • 입력 문자열은 문자 목록 일 수도 있습니다.
  • 출력은 또한 문자열 행 또는 문자 행렬 목록 일 수 있습니다.
  • 입력 문자열과 문자는 비어 있지 않아야합니다.
  • 문자열은 문자를 포함하지 않아야합니다
  • 문자열과 문자는 모두 인쇄 가능한 ASCII (유니 코드 범위 [32,126], 공백 ''~ 물결표 '~'포함)입니다.

일반적인 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하지 마십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙기본 I / O 규칙으로 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트와 링크를 추가하십시오 (예 : TIO ).
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

테스트 사례 :

입력 : = , = 출력 :sc =11111c=0

00000000100000000
00000010101000000
00001010101010000
00101010101010100
10101010101010101
00101010101010100
00001010101010000
00000010101000000
00000000100000000

입력 : = , = 출력 :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####################

입력 : = , = 출력 :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::::::::::::::::::

입력 : = , = 출력 :scABcc

ccBcc
BcAcB
ccBcc

입력 : = , = 출력 :sc~cX

~

입력 : = , = 출력 :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

문자열에 공백이 포함될 수 있습니까?
Emigna

1
@Emigna 예, 인쇄 가능한 모든 ASCII (유니 코드 범위 [32,126])는 유효한 입력 문자입니다.
케빈 크루이 센

1
시각적으로 단일 문자처럼 보이는 문자를 사용하는 경우 디버깅하기에 좋습니다 (예 :) ()()().
Filip Haglund

$ s $가 비어 있으면 어떻게됩니까?
Solomon Ucko

@SolomonUcko 규칙 섹션에서 : " 입력 문자열과 문자는 비워 둘 수 없습니다 ":)
Kevin Cruijssen

답변:



6

R , 118 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)

온라인으로 사용해보십시오!

덕분에 :

  • 오류와 골프를 고치기위한 주세페
  • 22 바이트의 골프를위한 Aaron Hayman

for적어도 골프를 위해 R의 루프에 혐오감을 버려야한다고 생각합니다 .
Aaron Hayman

@Giuseppe, 감사합니다. 추가 테스트 사례를 포함시키는 것에 대해 너무 게으르지 않아야합니다!
Kirill L.

1
이것은 98보다 내 솔루션보다 더 가깝게 보입니다 . 온라인으로 사용해보십시오!
Aaron Hayman

1
약간의 재 배열로 다른 두 가지를 제거 할 수 있습니다. 온라인으로 사용해보십시오!
Aaron Hayman

1
@AaronHayman 또는이 92 번 으로 pmin논리를 재배치와 결합합니다 :-)
Giuseppe


5

못생긴 118 바이트 버전 인 R

입력을 단일 문자로 구성된 벡터로 만들고 멋진 아스키 아트를 인쇄하는 대신 행렬을 출력합니다.

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='')

온라인으로 사용해보십시오!

ungolfed 및 댓글

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
}

흠, 지금까지 가장 긴 대답처럼 보인다!


오, 얘야, 질문을 더 잘 보았어야했는데
Aaron Hayman

1
@KevinCruijssen 나는 지금 그것을 고쳤다
Aaron Hayman

1
+15 바이트 인 경우 추악한 답을 아스키 아트로 만들 수 있습니다. 온라인으로 사용해보십시오!
주세페


4

05AB1E , 15 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 아 맞아. 나는 그 부분을 보았다. 감사합니다 :)
Emigna

4

J , 35 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부터 시작합니다. 남은 것은 0의 열을 삽입하는 것입니다.

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

알고리즘에 대해 Galen Ivanov에게 감사드립니다.


설명을 추가 하시겠습니까? 나는 J.에 익숙하지 않다
Kevin Cruijssen

4

K (ngn / k) , 38 바이트

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

온라인으로 사용해보십시오!

{ }인수가 포함 된 함수 x(문자열 s ) 및 y(문자 c )

|xx

y,'y각각 앞에 붙이다

+ 바꾸어 놓다

,/ 연결하다

1_ 첫 번째 문자를 삭제

이 시점에서 우리는 길이의 문자열을 (이 x의) 인스턴스 y에서 문자 다음에x

#x 의 길이 x

(#x)' 많은 연속 문자의 슬라이딩 윈도우

2{ }/ 두 번하다

+x,1_|x가입 x반전과 x첫 요소없이 및 트랜스

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¹

수평으로 여분의 공간을 추가하십시오.




2

Japt , 16 바이트

참고 : 나는 그것을 골프 :)

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

온라인으로 사용해보십시오!


다른 Japt 답변과 상당히 비슷하지만 다른 순서로 그렇지 않습니까? 나는 Japt를 모르지만 두 대답 모두에서 비슷한 문자를 봅니다. ;)
Kevin Cruijssen

@KevinCruijssen 네, 둘 다 거의 동일합니다
Luis felipe De jesus Munoz

@KevinCruijssen, Luis는 내 솔루션과 독립적으로 이것을 개발했습니다.
얽히고 설킨

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

PowerShell , 82 83 바이트

Veskah 덕분에 +2 바이트 : 단일 문자 대소 문자 버그 수정

-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

과연. 감사!
mazzy

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

펄 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

코 틀린 , 250 바이트

참고 : Kotlin tio는 현재 새 클래스를 반환하지 못하므로이 코드는 null 포인터 예외가 발생합니다. 이전에 게시 한 코드에서 해당 시간에 작동했습니다. 결국 문제가 해결 될 것으로 생각하지만 문제를 신고 할 지원 담당자를 찾을 수 없습니다. 여기에서 실행할 수도 있습니다 .

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

온라인으로 사용해보십시오!


당신은 문의하실 수 있습니다 @Dennis을Ninteenth 바이트 채팅 . 그는 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@ceilingcat
-1 byte덕분에 @KevinCruijssen 에게 감사합니다

언 골프

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 잘, 감사합니다!
사라 J

@ceilingcat 감사합니다!
사라 J

1

Wolfram Language (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[...]하지 않지만 가장 간단한 (가장 짧은) 패턴 은입니다 _@__. 이는 하나 이상의 인수가있는 표현식과 일치합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.