カーペットをレイアウトする


40

このSO質問に触発されました。

チャレンジ:

入力:

  • 文字列s
  • キャラクターc

出力:

文字列の最初の文字を中央に、外側に向かって、4方向すべてに文字列のひし形の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

文字列にスペースを含めることはできますか?
エミグナ

1
@Emignaはい、すべての印刷可能なASCII(ユニコード範囲[32,126])は有効な入力文字です。
ケビンクルーッセン

1
視覚的に単一の文字のように見える文字を使用する場合、これはデバッグするのに素晴らしいものになります()()()
フィリップハグランド

$ s $が空の場合はどうなりますか?
ソロモンウッコ

@SolomonUckoルールセクションから:「入力文字列と文字は空でないことが保証されています」:)
ケビンクルーッセン

回答:



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)

オンラインでお試しください!

おかげで:

  • エラーとゴルフを修正したジュゼッペ
  • アーロンヘイマン、22バイト分のゴルフ

for少なくともゴルフでは、Rのループに対する嫌悪感をなくす必要があると思います。
アーロンヘイマン

@ジュゼッペ、ありがとう、余分なテストケースを含めることについてそれほど怠けるべきではありません!
キリルL.

1
98の場合、これは私よりもソリューションに近いように見えます。オンラインで試してみてください。
アーロンヘイマン

1
少し並べ替えてさらに2つを離陸できます。オンラインで試してみてください。
アーロンヘイマン

1
@AaronHaymanまたはそうでなければ、ロジックと再配置を組み合わせたこの92バイトpmin :-)
ジュゼッペ


5

R、118い118バイトバージョン

入力を単一文字のベクトルにし、素敵なアスキーアートを印刷する代わりに行列を出力することにより。

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)

オンラインでお試しください!

R161 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今修正しました
アーロン・ヘイマン



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:ええ。幸いなことに、修正にバイトはかかりませんでした。それでも私はこれを行うより良い方法があるはずだと感じているので、私は探し続けます。
エミグナ

出力は文字列行のリストまたは文字のマトリックスである場合もある」ので»、フッターに移動できます。:)
ケビンクルーッセン

@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

負のインデックスは、Pythonのように-1から始まります。残っているのは、ゼロの列を挿入することだけです。

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)を持つ関数

|xx

y,'先頭に追加yそれぞれに

+ 転置

,/ 連結する

1_ 最初の文字をドロップ

この時点で、length(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η

背景を2番目の入力に設定しますc

Eθ✂θκ

最初の入力sにマップして、すべてのサフィックスを生成し、それらを個別の行に暗黙的に印刷します。

‖O↑←

水平および垂直に反射します。

UE¹

水平方向に余分なスペースを追加します。




2

Japt、16バイト

注:ゴルフします:)

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

オンラインでお試しください!


他のJaptの回答とかなり似ていますが、順序は異なりますか?私はJaptを知りませんが、どちらの答えにも似たキャラクターがいます。;)
Kevin Cruijssen

@KevinCruijssenええ、両方とも今のところほとんど同じです
ルイス・フェリペ・デ・イエス・ムニョス

@ 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

PowerShell82 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リンクには空の行があります~
ベスカ

確かに。ありがとう!
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

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は新しいクラスを返すことができないため、このコードは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")}

オンラインでお試しください!


The Ninteenth Byte chatで@Dennisに連絡できます。彼はTIOのモデレーターです。また、実際に印刷する代わりに文字列のリストを返すことができるため.joinToString("\n")、バイトカウントからを削除できる(とは言えません)(関数の外部のフッターで行うことができます)。
ケビンクルーッセン



1

TSQLクエリ、191バイト

MS-SQL Server Management Studioでは、このクエリを実行する前にCtrl-Tを押すと、出力がテキストに変更されます。

このスクリプトは、左から右へ1つの長い「文字列」で出力を構築し、各位置に配置する値を計算しています。出力は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バイトでゴルフできます。:)
ケビン・クルーッセン

@KevinCruijssenよくわかりました、ありがとう!
サラJ

@ceilingcatいい考え、ありがとう!
サラ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[...]_@__、1つ以上の引数を持つ式に一致します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.