Выложите ковер


40

Вдохновленный этим ТАКИМ вопросом .

Вызов:

Входные данные:

  • Строка s
  • Персонаж c

Выход:

Создайте ASCII-арт из струн алмазного квадрата во всех четырех направлениях, с первым символом струны в центре и направленным наружу. Который находится внутри квадратного ковра в стиле ASCII, с характером в качестве наполнителя. Это может звучать довольно расплывчато, поэтому вот пример:

Вход: s = string, c = .
Выход:

..........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], пробел '' до и включая тильду '~')

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вам разрешено использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.

Тестовые случаи:

Вход: s = 11111, c= = 0
Выход:

00000000100000000
00000010101000000
00001010101010000
00101010101010100
10101010101010101
00101010101010100
00001010101010000
00000010101000000
00000000100000000

Вход: s = 12345ABCDEF, c = #
Выход:

####################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-|-O, c = :
Выход:

::::::::::::::::::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 = AB, с = 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

Может ли строка содержать пробелы?
Эминья

1
@Emigna Да, все печатные ASCII (диапазон Unicode [32,126]) являются допустимыми символами ввода.
Кевин Круйссен

1
Отладка становится замечательной, если вы используете символы, которые визуально выглядят как один символ, например ()()().
Филипп Хаглунд

Что должно произойти, если $ s $ пусто?
Соломон Уко

@SolomonUcko Из раздела правил: « Строка ввода и символ гарантированно не являются пустыми » :)
Кевин Круйссен

Ответы:



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 байта

Я думаю, мне нужно отбросить отвращение к forпетлям в R, по крайней мере, для игры в гольф.
Аарон Хейман

@ Giuseppe, спасибо, я не должен быть настолько ленивым о включении дополнительных тестовых случаев!
Кирилл Л.

1
Это для 98 выглядит ближе к вашему решению, чем мое Попробуйте онлайн!
Аарон Хейман

1
можно снять еще два с небольшим перестановкой: попробуйте онлайн!
Аарон Хейман

1
@AaronHayman или еще 92 байта, сочетающих pminлогику с перестановкой :-)
Джузеппе


5

R , уродливая 118-байтовая версия

Позволяя вводу быть вектором из отдельных символов, и выводить матрицу вместо печати хорошего ascii art.

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 байт

сохранено 4 байта с использованием ifelse вместо условного изменения 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 Я исправил это сейчас
Аарон Хейман

1
за +15 байт вы можете сделать свой некрасивый ответ ascii-art: Попробуйте онлайн!
Джузеппе


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: Да. К счастью, это не стоило никаких байтов, чтобы это исправить. Я все еще чувствую, что должен быть лучший способ сделать это, поэтому я буду продолжать искать.
Эминья

« Вывод также может быть списком строк или матриц символов », так что вы можете переместить »его в нижний колонтитул. :)
Кевин Круйссен

@KevinCruijssen Ах, верно. Я посмотрел на эту часть. Спасибо :)
Emigna

4

J , 35 34 33 байта

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

Попробуйте онлайн!

Справа налево:
-&#длинас минус длина s
i:Диапазон от отрицательного n до n
1-|+/| Абсолютное значение, внешняя сумма с абсолютным значением, вычесть из 1
{: (<*-)Сравните матрицу с концом диапазона (the -&#), 0 для меньше или равно, 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, как в питоне. Осталось только вставить нулевые столбцы.

1j1( #"1для каждой строки повторите каждый элемент 1 раз и добавьте один 0,
  }:@затем отбросьте последний (ноль)
,{~конкатс а также s и индекс в это

Большое спасибо Галену Иванову за алгоритм.


Не могли бы вы добавить объяснение? Я не очень знаком с Дж.
Кевин Круйссен

4

K (нгн / к) , 38 байт

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

Попробуйте онлайн!

{ }функция с аргументами x(строка s ) и y(символ c )

|x обратный x

y,'готовиться yк каждому

+ транспонирования

,/ CONCAT

1_ бросить первый символ

в этот момент у нас есть строка xэкземпляров length ( ), за 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ê ê

Попробуйте онлайн!


Это довольно похоже на другой ответ Джапта, но в другом порядке, не так ли? Я не знаю Джапта, но я вижу похожие символы в обоих ответах. ;)
Кевин Круйссен

@KevinCruijssen Да, на данный момент они почти одинаковы
Луис Фелипе Де Иисус Муньос

@KevinCruijssen, Луис разработал это независимо от моего решения.
Мохнатый

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

Желе , 11 байт

jÐƤṚzṚŒḄZŒḄ

Попробуйте онлайн!

Левый аргумент: s,
Правильный аргумент:с(как один символ, а не как строка).
Вывод: список строк Jelly (отображается как список списков строк Python ŒṘс Y1 \nсимволом , замените на, чтобы увидеть вывод -joined).


2

PowerShell , 82 83 байта

+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

Верно. Благодарность!
Маззи

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

C # (интерактивный компилятор Visual C #) , 249 байт

s=>c=>{var r=s.Select((x,_)=>{int k=s.Length;var m=s.Substring(_,k-_).Aggregate("",(a,b)=>a+c+b);return new string(m.Skip(2).Reverse().Concat(m.Skip(1)).ToArray()).PadLeft(2*k-3+m.Length,c).PadRight(4*k-3,c);});return r.Skip(1).Reverse().Concat(r);}

Попробуйте онлайн!

Это должно быть улучшено ...




1

Котлин , 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")}

Попробуйте онлайн!


Вы можете связаться с @Dennis в чате Ninteenth Byte . Он модератор для TIO. Кроме того, я разрешаю возвращать список строк вместо фактической печати, поэтому я думаю (не уверен), что вы можете удалить .joinToString("\n")из подсчета байтов (и сделать это в нижнем колонтитуле за пределами функции).
Кевин Круйссен



1

TSQL-запрос, 191 байт

В MS-SQL Server Management Studio нажмите Ctrl-T перед выполнением этого запроса, это изменит вывод на текст.

Этот скрипт строит вывод слева направо в одну длинную «строку», вычисляя значение, которое нужно поместить в каждую позицию. Вывод ограничен 4096 символами.

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

Мне пришлось внести некоторые изменения, чтобы отформатировать вывод в онлайн-версии.

Попробуйте онлайн


1

Java (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

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
Хороший ответ, вы можете сыграть в гольф на 14 байт ниже 200, однако . :)
Кевин Круйссен

@KevinCruijssen Хорошо заметили, спасибо!
Сара J

@ceilingcat Хорошее мышление, спасибо!
Сара Джей

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[...]но не одному символу, является _@__соответствие любого выражения с одним или несколькими аргументами.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.