Inscriptio Labyrinthica


22

У місці поховання царя Силосу Астурійського є напис, на якому написано SILO PRINCEPS FECIT ( це зробив Цар Силос ).

SILO PRINCEPS FECIT

Перша буква знаходиться в самій середині, а звідти читається, рухаючись у будь-якому недіагональному напрямку, що випромінюється назовні. Підсумковий лист знаходиться на всіх чотирьох кутах. У цьому виклику ви узагальнюєте процес їх виготовлення.

Вхідні дані

Рядок ( або еквівалент ) і ціле число. Ви можете зробити наступні припущення щодо введення даних:

  • Рядок матиме непарну довжину.
  • Ціле число буде непарним числом від 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^

Оцінка балів

Це тому найкоротша відповідь у байтах виграє. Стандартні лазівки заборонені.



Чи може вхід містити пробіли? Якщо так, то як з ними поводитися?
Nitrodon

1
Чи можемо ми взяти дані як список символів?
Робін Райдер

1
@Charlie явно ви пропустили всі мої відповіді Perl6 :-) Я очікую відповіді і від вас, оскільки вона натхненна п'ятим королем Іспанії (ну, Астурія, але Астурія, ви Іспанія, y tolo demás ye tierra conquistao haha)
користувач0721090601

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" мені схожий на ASCII мистецтво 3D-діаманта, коли я дивлюся на нього на 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. Дивно, але круто.
користувач0721090601

6

R , 93 91 87 байт

-2 байти завдяки Джузеппе. -4 байти, вводячи ширину, а не висоту, дозволену ОП.

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)

(i,j)1+|i-год|+|j-ш|abs(-w:w)abs(-h:h)abs(-h:h)[h,h1,h2,,2,1,0,1,2,,h1,h]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 байт .
ruohola

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

1
@Neil Okey, здається, законним!
ruohola

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

Мова Вольфрама (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

Пітон 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@]┼

Спробуйте тут!

Полотно не робить підрядків, тому мені потрібно ставитися до нього як до предмету мистецтва та отримати підрозділ таким чином. Я відчуваю, що це коштує мені 2 байти, але ей, що ти можеш зробити.

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.