Halı döşeme


40

Bu SO sorusundan esinlenerek .

Meydan okuma:

Giriş:

  • Bir dizes
  • Bir karakterc

Çıktı:

Dizenin ilk karakteri merkezde ve dışarı doğru olacak şekilde, dört yönün her birinde dizenin elmas kare bir ASCII resmi oluşturun. İçinde kare şeklinde olan ASCII sanat halısı, dolgu maddesi karakteri ile. Bu oldukça belirsiz görünebilir, bu yüzden burada bir örnek:

Giriş: = , = Çıkış: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..........

Meydan okuma kuralları:

  • Giriş dizesi ayrıca bir karakter listesi olabilir.
  • Çıktı ayrıca karakter dizisi veya karakter matrisi listesi de olabilir
  • Giriş dizesi ve karakterin boş olmadığı garantilidir
  • Dize, karakteri içermediği garantilidir.
  • Hem string hem de karakter yalnızca ASCII (unicode aralığı [32,126], '' ile tilde '~' dahil) aralığı yazdırılabilir

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Standart G / Ç kurallarına cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT işlevlerini, uygun parametreleri içeren fonksiyonlar / yöntemleri ve dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuzu test eden bir bağlantı ekleyin (ör. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemek şiddetle tavsiye edilir.

Test durumları:

Giriş: = , = Çıkış:sc =11111c=0

00000000100000000
00000010101000000
00001010101010000
00101010101010100
10101010101010101
00101010101010100
00001010101010000
00000010101000000
00000000100000000

Giriş: = , = Çıkış: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####################

Giriş: = , = Çıkış: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::::::::::::::::::

Giriş: = , = Çıkış:scABcc

ccBcc
BcAcB
ccBcc

Giriş: = , = Çıkış:sc~cX

~

Giriş: = , = Çıkış: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

Dize boşluk içerebilir mi?
Emigna

1
@Emigna Evet, yazdırılabilir tüm ASCII (unicode aralığı [32,126]) geçerli giriş karakterleridir.
Kevin Cruijssen

1
Görsel olarak tek bir karaktere benzeyen karakterler kullanırsanız, bu hata ayıklama işlemi harika olur, örn ()()().
Filip Haglund

$ S $ boşsa ne olur?
Solomon Ucko

@SolomonUcko Kurallar bölümünden: " Girdi dizgisi ve karakterin boş olmadığı garantili " :)
Kevin Cruijssen

Yanıtlar:



6

R , 118 95 92 bayt

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)

Çevrimiçi deneyin!

Sayesinde:

  • Bir hatayı ve golfü düzeltmek için Giuseppe
  • 22 baytlık golf sahası için Aaron Hayman

Sanırım foren azından golf oynamak için isteksizliğimi R'deki döngülere düşürmem gerekiyor .
Aaron Hayman

@Giuseppe, teşekkürler, fazladan test vakalarının dahil edilmesinden tembel olmamalı!
Kirill L.

1
Bu, 98 için çözümünüze benimkinden daha yakın görünüyor Çevrimiçi deneyin!
Aaron Hayman

1
biraz düzenleme ile başka iki çıkartabilirsiniz: Çevrimiçi deneyin!
Aaron Hayman

1
@AaronHayman veya bu 92 byter , pminmantığı yeniden düzenleme ile birleştiriyor :-)
Giuseppe


5

R , çirkin bir 118 bayt versiyonu

Girdiyi tek karakterli bir vektör haline getirerek ve güzel ascii sanatını basmak yerine bir matris çıkararak.

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)

Çevrimiçi deneyin!

R , 161 157 bayt

koşullu olarak değiştirmek yerine ifelse kullanarak 4 bayt kaydedildi 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='')

Çevrimiçi deneyin!

unungolfed ve yorum yaptı

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, şu ana kadarki en uzun cevap gibi görünüyor!


Ah canım, soruyu daha iyi incelemeliydim
Aaron Hayman

1
@KevinCruijssen Şimdi düzelttim
Aaron Hayman

1
+15 bayt için çirkin cevabınızı ascii-art: online deneyebilirsiniz!
Giuseppe


4

05AB1E , 15 11 bayt

.sûsζøsýí€û

Çevrimiçi deneyin! veya Test Paketi olarak

açıklama

.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: Evet. Neyse ki düzeltmek için herhangi bir byte'a mal olmadı. Yine de bunu yapmanın daha iyi bir yolu olması gerektiğini düşünüyorum, bu yüzden bakmaya devam edeceğim.
Emigna

" Çıktı aynı zamanda karakter dizisi veya karakter matrisi listesi de olabilir ", böylece »altbilgiye geçebilirsiniz . :)
Kevin Cruijssen

@KevinCruijssen Ah doğru. O kısma baktım. Thanks :)
Emigna

4

J , 35 34 33 bayt

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

Çevrimiçi deneyin!


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

Negatif endeksler, python'daki -1 ile başlar. Geriye kalan tek şey sıfır sütunlarını eklemektir.

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

Galen Ivanov'a algoritma için çok teşekkürler.


Bir açıklama ekler misiniz? J. ile tanıdık değilim
Kevin Cruijssen

4

K (ngn / k) , 38 bayt

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

Çevrimiçi deneyin!

{ }argümanlar ile işlev x( s ) ve y( c )

|x ters x

y,'başa eklemek yher

+ devrik

,/ concat

1_ ilk karakteri bırak

Bu noktada bir karakter uzunluğu ( x) örnekleri ve yardından gelen karakterlerinx

#x uzunluğu x

(#x)' ardışık birçok karakterin kayan penceresi

2{ }/ iki kere yap

+x,1_|xkatılmak xtersine ile xilk unsuru olmadan ve devrik

y,''Başa eklenen yher biri, her için

,/' her biri

1_' her birinden bir tane bırak


3

Japt , 15 bayt

Satır dizisini döndürür

Ôå+ ®¬qV êÃûV ê

Dene

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

Kömür , 15 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Başlangıçta silinmiş sanal alan yayınına yorum olarak gönderildi . Açıklama:

UBη

Arka planı ikinci girişe ayarlayın c.

Eθ✂θκ

sTüm sonekleri oluşturmak ve bunları ayrı satırlara dolaylı olarak yazdırmak için ilk girdi üzerinden eşleyin.

‖O↑←

Yatay ve dikey olarak yansıtın.

UE¹

Yatay olarak fazladan boşluk ekleyin.


3

Ruby , 95 84 75 bayt

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

Çevrimiçi deneyin!

Giriş dizesini bir karakter dizisi olarak alır. Bir dizi dizeyi döndürür.




2

PowerShell , 120 bayt

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]

Çevrimiçi deneyin!

Bazı günler, dilim yerine indeks aralıklarının olması gerçekten acı veriyor. Bugün o günlerden biri. Tekli elemanlarla uğraşırken birbirine karışan aralıklar dağıldığından (örn. 0..0 + 1..0 döndürerek), tamamen kaçınılması için (birçok bayt pahasına) özel kılıf kullanılır.




2

PowerShell , 82 83 bayt

+2 bayt Veskah: tek karakterli durum hatası düzeltildi

-1 bayt: kural Input-string may also be a list of characterskullanılan

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

Çevrimiçi deneyin!

Daha az golf oynadı:

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

1
Tek karakter durumu için bu sonları gibi görünüyor. TIO bağlantısında sadece boş bir satır var~
Veskah

Aslında. Teşekkürler!
mazzy

2

Pip , 24 20 bayt

QPRV:_JbMa@>RV,#aZDb

-lİnsan tarafından okunabilir bir çıktı almak için bayrağı kullanın . Çevrimiçi deneyin!

açıklama

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

Örneğin, girdilerle abcdve .:

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

Ataşesi , 57 bayt

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

Çevrimiçi deneyin! Çıktı, satırların bir listesidir.

açıklama

?? 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 bayt

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

Çevrimiçi deneyin!

Girdiyi alan anonim kod bloğu (benzeri f(char)(string)) ve satır listesi döndürür. Farklı bir yaklaşımın daha kısa olacağını düşünüyorum.

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

Biraz daha fazla düşünmek, tek boyutlu bir dizi ve daha az bayt cinsinden hesaplamalara yol açacaktır.


1

Kotlin , 250 bayt

Not: Kotlin tio şu anda yeni bir sınıfa geri dönemediğinden bu kod boş bir işaretçi istisnası alıyor. Bu aynı zamanda daha önce o anda çalıştığım mesajlar için de geçerlidir. Sonunda çözüleceğini, ancak sorunu bildirmek için bir destek kişisi bulamadığını tahmin ediyorum. Ayrıca çalıştırılabilir burada .

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

Çevrimiçi deneyin!


Sen irtibata geçebilirsiniz @Dennis içinde Ninteenth Byte sohbet . O TIO'nun moderatörü. Ayrıca, gerçekte yazdırmak yerine bir dize listesi döndürmeye izin veriyorum, bu nedenle .joinToString("\n")bayt sayısından kaldırabileceğinizi (emin değilim) (ve işlevin dışındaki altbilgide bunu yapabilirim).
Kevin Cruijssen



1

TSQL sorgusu, 191 bayt

MS-SQL Server Management Studio'da bu sorguyu çalıştırmadan önce Ctrl-T tuşlarına basın, bu çıktıyı metne dönüştürür.

Bu komut dosyası, çıktısını soldan sağa doğru uzun bir "dizge" de oluşturarak her bir konuma koymak için değeri hesaplıyor. Çıktı 4096 karakterle sınırlıdır.

golfed:

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

Ungolfed:

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

Çıktıyı çevrimiçi sürümde biçimlendirmek için bazı değişiklikler yapmak zorunda kaldım.

Çevrimiçi deneyin


1

Java (JDK) , 213 199 198 bayt

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

Çevrimiçi deneyin!

-14 bytes@cefccatse
-1 byteTeşekkürler @ceilingcat

Ungolfed

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
Güzel cevap, ancak 200 altında 14 bayt golf yapabilirsiniz . :)
Kevin Cruijssen

@KevinCruijssen İyi benekli, teşekkürler!
Sara J,

@ceilingcat Güzel düşünce, teşekkürler!
Sara J,

1

Wolfram Dili (Mathematica) , 68 bayt

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

Çevrimiçi deneyin!

Girdi olarak bir karakter listesini (dolgu karakteriyle birlikte) alır ve bir karakter matrisi çıkarır.

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

Karakter listesinin indeksini almak için list[[index]], içinde dahili olarak bulunan bir dizini kullanırız Part[list, index]. Dizin geçerliyse, bu ifade o dizindeki değere göre değerlendirilir. Değilse - eğer dizin bir tamsayı değilse veya aralık dışındaysa - ifade değerlenmeden kalır. Tek bir karakterle
eşleşen, Part[...]ancak tek bir karakterle eşleşmeyen en basit (en kısa) desen _@__, herhangi bir ifadeyi bir veya daha fazla argümanla eşleştiren biçimdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.