Inscriptio Labyrinthica


22

В месте захоронения Астурийского короля Силоса есть надпись, которая гласит: SILO PRINCEPS FECIT ( это сделал король Силос ).

SILO PRINCEPS FECIT

Первая буква находится в самой середине, и оттуда читается, идя в любом недиагональном направлении, исходящем наружу. Последнее письмо находится на всех четырех углах. В этом задании вы обобщите процесс их создания.

вход

Строка ( или эквивалент ) и целое число. Вы можете сделать следующие предположения относительно ввода:

  • Строка будет иметь нечетную длину.
  • Целое число будет нечетным числом от 1 до 1, которое в два раза меньше длины строки.

Выход

Inscriptio labyrinthica для строки, используя целое число для высоты или ширины (см моделей для примеров высоты). Вывод должен состоять из каждой буквы без пробелов, по умолчанию перевод строки в вашу систему / язык.

Контрольные примеры

Обратите внимание, что ввод 1 или (длина * 2 - 1) приведет к горизонтальному или вертикальному палиндрому.

 Input: FOO, 3    Input: BAR, 1    Input: BAR, 3    Input: BAR, 5

Output: OOO      Output: RABAR    Output: RAR       Output: R
        OFO                               ABA               A
        OOO                               RAR               B
                                                            A
                                                            R

 Input: ABCDE, 5   Input: ABCDE, 3   Input: *<>v^, 5

Output: EDCDE     Output: EDCBCDE           ^v>v^
        DCBCD             DCBABCD           v><>v
        CBABC             EDCBCDE           ><*<>
        DCBCD                               v><>v
        EDCDE                               ^v>v^

счет

Это поэтому выигрывает самый короткий ответ в байтах. Стандартные лазейки запрещены.



Может ли ввод содержать пробелы? Если так, как они должны быть обработаны?
Нитродон

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

1
@ Чарли, очевидно, ты упустил все мои ответы на Perl6 :-) Я тоже жду от тебя ответа, потому что он вдохновлен пятым королем Испании (ну, из Asturies, но Asturies ye España, y tolo demás ye tierra conquistao haha)
user0721090601

1
Можем ли мы взять ширину вместо высоты?
attinat

Ответы:


6

J , 27 байт

([{~]+/&(|@i:)#@[-1+])-:@<:

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

Пример прояснит подход высокого уровня.

Рассмотреть возможность 'ABCDE' f 3

Мы замечаем, что то, что мы ищем, это просто таблица "перекрестного сложения" 1 0 1и 3 2 1 0 1 2 3, которая выглядит следующим образом:

4 3 2 1 2 3 4
3 2 1 0 1 2 3
4 3 2 1 2 3 4

Затем вытащить эти индексы из исходной строки: [{~.

Весь остальной код является просто скучной арифметикой и использованием i:для конструирования аргументов 1 0 1и 3 2 1 0 1 2 3.


6

Желе , 12 байт

Uṡṛ‘HɗŒBŒḄZY

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

Диадическая ссылка, принимающая строку в качестве левого, а высота в качестве правого аргумента. Возвращает строку с разрывом строки. Если список строк был приемлем для вывода, я могу удалить окончательныйY сохранение байта. Интересно, что оригинальный «SILO PRINCEPS FECIT» выглядит как искусство 3D-бриллианта ASCII, когда я смотрю на него на TIO.

объяснение

U            | Reverse input
 ṡ   ɗ       | All overlapping substrings of the length given by:
  ṛ          | - The right argument
   ‘         | - Incremented by 1
    H        | - Halved
      ŒB     | Concatenate to the reverse, keeping a single copy of the last character (so creating a palindrome)
        ŒḄ   | Do the same, but this time using the lists of characters generated by the last atom
          Z  | Transpose
           Y | Join with newlines

2
Я нажал на пробную версию, чтобы увидеть, и да, действительно, он делает 3D. Странно, но круто.
user0721090601

6

R , 93 91 87 байт

-2 байта благодаря Джузеппе. -4 байта путем ввода ширины, а не высоты, как это разрешено OP.

function(s,W,w=W%/%2,h=length(s)-w-1)write(s[1+outer(abs(-w:w),abs(-h:h),`+`)],1,W,,"")

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

Принимает ввод как вектор символов. Ключевая часть есть s[1+outer(abs(-w:w),abs(-h:h),'+')].

весчас(2вес+1)×(2час+1)

(я,J)1+|я-час|+|J-вес|abs(-w:w)abs(-h:h)abs(-h:h)[час,час-1,час-2,...,2,1,0,1,2,...,час-1,час]outer(abs(-2:2), abs(-1:1), '+')

32123
21012
32123

(тогда мы должны добавить 1, потому что R индексируется как 1). 0 в центре - то, куда должна идти первая буква ввода.

Остальное форматирование.


5

Древесный уголь , 25 19 байт

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η‖O←↑

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

E⊘⊕η✂θι⁺ι⁻Lθ⊘⊖η

Нарисуйте четверть надписи.

‖O←↑

Подумайте, чтобы завершить надпись.


1
Впечатляет! Я новичок на сайте, заранее прошу прощения, если последует пара глупых вопросов. 1. Это определенно 19 символов, но они также 19 байтов? и 2. В какой кодировке этот текст будет занимать 19 байтов?
damix911

Да, в кодировке UTF-8 это займет 19 символов , но на самом деле это 51 байт. С UTF-16 это все еще требует 39 байтов для кодирования.
Руохола

1
@ damix911 Древесный уголь имеет свою собственную кодировку, которую можно найти в его вики. Я думаю, что символы вне кодовой страницы стоят 3 байта. Девербосификатор пытается вычислить правильную длину, но не переписывает фактическое кодирование, что раздражает.
Нил

1
@ Нил Окей, кажется законным!
Руохола

3

Japt -R , 19 16 байт

z
ò@VÔtXUaVÊ)êÃê

Попытайся

z\nò@VÔtXUaVÊ)êÃê     :Implicit input of integer U & string V
z                     :Floor divide U by 2
 \n                   :Reassign result to U
   ò                  :Range [0,U]
    @                 :Map each X
     VÔ               :  Reverse V
       tX             :  Substring from index X to index ...
         Ua           :    Absolute difference between U and ...
           VÊ         :    Length of V
             )        :  End substring
              ê       :  Palindromise
               Ã      :End map
                ê     :Palindromise
                      :Implicit output, joined by newlines

2

Wolfram Language (Mathematica) , 57 54 байта

(g=Reverse@Rest@#~Join~#&)@BlockMap[g,#,⌈#2/2⌉,1]&

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

Принимает ширину в качестве ввода.


1
@lirtosiast, то первый gне оценивается при первом вызове функции. Попробуйте онлайн!
attinat

Интересно, есть идеи, почему это работает, когда вы используете @@ или @@@?
lirtosiast

@lirtosiast Думаю Print/@f[...]-> Print/@Transpose[g[...]]-> Transpose[Print@g[...]], по которому gопределяется время.
attinat



2

Python 3, 104 байта

Я не играл в гольф так долго ... Я уверен, что это может быть короче.

Детали

Этот код определяет функцию, которая принимает два аргумента (строку и высоту) и выдает результат при стандартном выводе.

Индекс в строке - это манхэттенское расстояние от центра сетки. Для сетки ширины wи высоты h, расстояние для ячейки в (x, y)IS abs(x - (w - 1) / 2) + abs(v - (h - 1) / 2).

Ширина сетки должна быть такой, чтобы расстояние между углами в Манхэттене (скажем, (0, 0)) было на единицу меньше длины строки. Подставляя (0, 0)в вышесказанное и упрощая, мы находим, что ширина просто 2 * len(s) - h.

Код

def b(s,h):
 w=2*len(s)-h
 for y in range(h):print(''.join(s[abs(x-w//2)+abs(y-h//2)]for x in range(w)))

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



1

Pyth , 19 байт

L+_btbjyyM.:Q-lQ/E2

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

L+_btbjyyM.:Q-lQ/E2   Implicit: Q=string, E=height
L                     Define a function, y(b):
  _b                    Reverse b
 +  tb                  Append all be first element of b
                      y is now a palindromisation function
              lQ      Length of Q
             -  /E2   Subtract floored division of E by 2
          .:Q         All substrings of Q with the above length
        yM            Palindromise each substring
       y              Palindromise the set
      j               Join on newlines, implicit print



1

C # (.NET Core) , 146 байт

s=>n=>{int w=s.Length*2-n,i=0,j;var r=new char[n,w];for(;i<n;i++)for(j=0;j<w;)r[i,j]=s[System.Math.Abs(n/2-i)+System.Math.Abs(w/2-j++)];return r;}

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

Самый длинный ответ так долго. :-) Он использует расстояние Манхэттена до центра площади. Там должен быть более короткий путь, хотя.


1

Tcl , 188 170 162 байта

{{w s} {join [lmap C [lrepeat $w string] {join [$C reverse [set y [$C range $s [set x [expr abs($w/2+1-[incr i])]] end-[expr $w/2-$x]]]][$C range $y 1 end]}] \n}} bytes

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

Кажется, в TCL есть миллион неудачных способов решить эту проблему. Это не худший из них.

Сохранение минимум 18 байт путем преобразования в лямбду (может сохранить до 13 больше, если допустимо возвращаемое значение списка строк)

Сохранено еще 8, поскольку итератор lmap служит дополнительной константой


1

Холст , 18 байт

±X↕┌L╵┌-Y{x;1y1@]┼

Попробуй это здесь!

Canvas не выполняет подстрок, поэтому мне нужно обработать его как художественный объект и получить подраздел таким образом. Я чувствую, что это стоит мне 2 байта, но что поделаешь.

Похоже, что это на самом деле не работает так, как я думал: функции палиндромизации Canvas отражают определенные символы (например, V отражается вертикально в ^), и я не могу точно отключить это ... о, я думаю


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