Rozłóż dywan


40

Zainspirowany tym pytaniem SO .

Wyzwanie:

Wejście:

  • Ciągs
  • Znakc

Wynik:

Utwórz diamentową kwadratową grafikę ASCII sznurka we wszystkich czterech kierunkach, z pierwszym znakiem sznurka pośrodku i skierowanym na zewnątrz. Który znajduje się w kwadratowym dywanie ASCII-art, z postacią wypełniającą. Może to zabrzmieć dość niejasno, więc oto przykład:

Dane wejściowe: = , = Dane wyjściowe: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..........

Zasady konkursu:

  • Ciąg wejściowy może być również listą znaków
  • Wyjściem może być również lista linii ciągów lub macierz znaków
  • Ciąg wejściowy i znak są gwarantowane jako niepuste
  • Ciąg nie może zawierać znaku
  • Zarówno ciąg, jak i znak będą drukowane tylko w formacie ASCII (zakres Unicode [32, 126], spacja „” włącznie z tyldą „~”)

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

Dane wejściowe: = , = Dane wyjściowe:sc =11111c=0

00000000100000000
00000010101000000
00001010101010000
00101010101010100
10101010101010101
00101010101010100
00001010101010000
00000010101000000
00000000100000000

Dane wejściowe: = , = Dane wyjściowe: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####################

Dane wejściowe: = , = Dane wyjściowe: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::::::::::::::::::

Dane wejściowe: = , = Dane wyjściowe:scABcc

ccBcc
BcAcB
ccBcc

Dane wejściowe: = , = Dane wyjściowe:sc~cX

~

Dane wejściowe: = , = Dane wyjściowe: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

Czy ciąg może zawierać spacje?
— Emigna

1
@Emigna Tak, wszystkie drukowalne ASCII (zakres Unicode [32, 126]) są prawidłowymi znakami wejściowymi.
— Kevin Cruijssen

1
Debugowanie staje się cudowne, jeśli używasz znaków, które wizualnie wyglądają jak pojedynczy znak, np ()()().
— Filip Haglund

Co powinno się stać, jeśli $ s $ jest puste?
— Solomon Ucko

@ SolomonUcko Z sekcji zasad: „ Ciąg wejściowy i znak są gwarantowane, że są niepuste ” :)
— Kevin Cruijssen

Odpowiedzi:



6

R , 118 95 92 bajtów

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)

Wypróbuj online!

Dzięki:

  • Giuseppe za naprawienie błędu i golfa
  • Aaron Hayman za 22 bajty golfa

Chyba muszę rzucić niechęć do forpętli w R, przynajmniej do gry w golfa.
— Aaron Hayman

@Giuseppe, dzięki, nie powinienem być tak leniwy, jeśli chodzi o włączenie dodatkowych przypadków testowych!
— Kirill L.

1
To dla 98 wygląda bliżej twojego rozwiązania niż mojego. Wypróbuj online!
— Aaron Hayman

1
może zdjąć kolejne dwa z odrobiną rearanżacji: Wypróbuj online!
— Aaron Hayman

1
@AaronHayman lub ten 92 bajter łączący pminlogikę z rearanżacją :-)
— Giuseppe


5

R , brzydka wersja 118 bajtów

Pozwalając na wejście jako wektor pojedynczych znaków i generowanie matrycy zamiast drukowania ładnej sztuki 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)

Wypróbuj online!

R , 161 157 bajtów

zapisano 4 bajty, używając ifelse zamiast warunkowo modyfikować 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='')

Wypróbuj online!

nie golfił i komentował

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, wydaje się najdłuższą jak dotąd odpowiedzią!


Och, skarbie, powinienem był lepiej przyjrzeć się temu pytaniu
— Aaron Hayman

1
@KevinCruijssen Naprawiłem to teraz
— Aaron Hayman

1
za +15 bajtów możesz zrobić brzydką odpowiedź ascii-art: Wypróbuj online!
— Giuseppe


4

05AB1E , 15 11 bajtów

.sûsζøsýí€û

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

.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: Tak. Na szczęście naprawienie go nie kosztowało żadnych bajtów. Nadal uważam, że powinien istnieć lepszy sposób, więc będę szukał dalej.
— Emigna

„ Wyjściem może być również lista linii ciągów lub macierz znaków ”, więc możesz przenieść »stopkę. :)
— Kevin Cruijssen

@KevinCruijssen Ah racja. Spojrzałem na tę część. Dzięki :)
— Emigna

4

J , 35 34 33 bajtów

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

Wypróbuj online!

Od prawej do lewej:
-&#długość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

Wskaźniki ujemne zaczynają się od -1 jak w Pythonie. Pozostało tylko wstawić kolumny zer.

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

Ogromne podziękowania dla Galena Iwanowa za algorytm.


Czy mógłbyś dodać wyjaśnienie? Nie znam się tak dobrze na J.
— Kevinie Cruijssenie,

4

K (ngn / k) , 38 bajtów

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

Wypróbuj online!

{ }funkcja z argumentami x(napisu s ) i y(znak c )

|x rewers x

y,'dodawać ydo każdego

+ transponować

,/ konkat

1_ upuść pierwszy znak

w tym momencie mamy ciąg xinstancji length ( ), ypo których następuje znak zx

#x długość x

(#x)' przesuwne okno wielu kolejnych znaków

2{ }/ zrobić dwa razy

+x,1_|xpołącz xz odwróconym xbez pierwszego elementu i transponuj

y,''dodawać ydo każdego z nich

,/' konkat każdy

1_' upuść po jednym z każdego


3

Japt , 15 bajtów

Zwraca tablicę wierszy

Ôå+ ®¬qV êÃûV ê

Spróbuj

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

Węgiel drzewny , 15 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Pierwotnie przedstawiony jako komentarz do piaskownicy teraz usuniętego postu . Wyjaśnienie:

UBη

Ustaw tło na drugie wejście c.

Eθ✂θκ

Odwzoruj na pierwszym wejściu, saby wygenerować wszystkie przyrostki i niejawnie wydrukować je w osobnych wierszach.

‖O↑←

Odbijaj w poziomie i w pionie.

UE¹

Dodaj dodatkową przestrzeń w poziomie.


3

Rubin , 95 84 75 bajtów

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

Wypróbuj online!

Pobiera ciąg wejściowy jako tablicę znaków. Zwraca tablicę ciągów.




2

PowerShell , 120 bajtów

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]

Wypróbuj online!

W niektóre dni posiadanie zakresów indeksów zamiast plasterków naprawdę boli. Dzisiaj jest jeden z tych dni. Ze względu na bałagan połączonych zakresów w przypadku pojedynczych elementów (np. Zwracanie wartości 0..0 + 1..0) zastosowano specjalną obudowę, aby całkowicie tego uniknąć (kosztem wielu bajtów).




2

PowerShell , 82 83 bajty

+2 bajty dzięki Veskah: naprawiono błąd dotyczący pojedynczego znaku

-1 bajt: Input-string may also be a list of characterszastosowana reguła

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

Wypróbuj online!

Mniej golfa:

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

1
Wygląda na to, że zrywa się w przypadku pojedynczego znaku. W linku TIO jest tylko pusta linia~
— Veskah

W rzeczy samej. Dzięki!
— mazzy

2

Pip , 24 20 bajtów

QPRV:_JbMa@>RV,#aZDb

Użyj -lflagi, aby uzyskać wynik czytelny dla człowieka. Wypróbuj online!

Wyjaśnienie

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

Na przykład z danymi wejściowymi abcdi .:

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 bajtów

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

Wypróbuj online! Dane wyjściowe to lista wierszy.

Wyjaśnienie

?? 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 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera wejście curry (jak f(char)(string)) i zwraca listę wierszy. Myślę, że inne podejście byłoby krótsze.

Wyjaśnienie:

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 bajty

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

Wypróbuj online!

Nieco bardziej przemyślane podejście prowadziłoby do obliczeń w postaci jednowymiarowej tablicy i mniejszej liczby bajtów.


1

Kotlin , 250 bajtów

Uwaga: Kotlin tio obecnie nie zwraca nowej klasy, więc ten kod otrzymuje wyjątek wskaźnika zerowego. Dzieje się tak również w przypadku wcześniej opublikowanych kodów, które działały. Zakładam, że w końcu zostanie to naprawione, ale nie mogłem znaleźć kontaktu z pomocą techniczną do zgłoszenia problemu. Można go również uruchomić tutaj .

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

Wypróbuj online!


Możesz skontaktować się z @Dennis na czacie The Ninteenth Byte . Jest moderatorem TIO. Ponadto zezwalam na zwracanie listy ciągów zamiast faktycznego drukowania, więc myślę (nie jestem pewien), że możesz usunąć .joinToString("\n")licznik bajtów (i zrobić to w stopce poza funkcją).
— Kevin Cruijssen



1

Zapytanie TSQL, 191 bajtów

W MS-SQL Server Management Studio naciśnij Ctrl-T przed uruchomieniem tego zapytania, zmieni to wynik na tekst.

Ten skrypt buduje dane wyjściowe od lewej do prawej w jednym długim „łańcuchu”, obliczając wartość, którą należy umieścić w każdej pozycji. Dane wyjściowe są ograniczone do 4096 znaków.

Gra w golfa:

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

Nie golfowany:

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

Musiałem wprowadzić pewne zmiany, aby sformatować dane wyjściowe w wersji online.

Wypróbuj online


1

Java (JDK) , 213 199 198 bajtów

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

Wypróbuj online!

-14 bytesdzięki @KevinCruijssen
-1 bytedzięki @ceilingcat

Bez golfa

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
Dobra odpowiedź, możesz zagrać w golfa o 14 bajtów poniżej 200 . :)
— Kevin Cruijssen

@KevinCruijssen Dobrze zauważony, dzięki!
— Sara J

@ceilingcat Ładne myślenie, dzięki!
— Sara J

1

Wolfram Language (Mathematica) , 68 bajtów

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

Wypróbuj online!

Pobiera na wejściu listę znaków (wraz ze znakiem wypełniającym) i wysyła macierz znaków.

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

Aby wziąć indeks listy znaków, używamy list[[index]], który jest wewnętrznie rozszerzony do Part[list, index]. Jeśli indeks jest prawidłowy, to wyrażenie wyraża wartość tego indeksu. Jeśli nie - jeśli indeks nie jest liczbą całkowitą lub jest poza zakresem - wyrażenie pozostaje nieocenione.
Najprostszym (najkrótszym) wzorcem, który pasuje, Part[...]ale nie jest jednym znakiem _@__, który pasuje do dowolnego wyrażenia z jednym lub więcej argumentami.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.