Inscriptio Labyrinthica

22

W miejscu pochówku króla Silo Asturii znajduje się napis: SILO PRINCEPS FECIT ( król Silo to zrobił ).

SILO PRINCEPS FECIT

Pierwsza litera znajduje się na samym środku, a stamtąd czyta się, kierując się w dowolnym kierunku po przekątnej promieniującym na zewnątrz. Ostatni list znajduje się na wszystkich czterech rogach. W tym wyzwaniu uogólnisz proces ich tworzenia.

Wkład

Ciąg ( lub odpowiednik ) i liczba całkowita. Możesz przyjąć następujące założenia dotyczące danych wejściowych:

  • Ciąg będzie miał nieparzystą długość.
  • Liczba całkowita będzie liczbą nieparzystą od 1 do jeden mniejszą niż dwukrotność długości łańcucha.

Wydajność

Labyrinthica Inscriptio dla napisu, wykorzystując całkowitą dla wysokości lub szerokości (patrz przykłady modeli wysokość). Wyjście powinno składać się z każdej litery bez spacji, domyślny podział linii na system / język.

Przypadki testowe

Zauważ, że wprowadzenie 1 lub (długość * 2 - 1) spowoduje palindrom poziomy lub pionowy.

 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^

Punktacja

To jest więc wygrywa najkrótsza odpowiedź w bajtach. Standardowe luki zabronione.

użytkownik 0721090601
źródło
Czy dane wejściowe mogą zawierać spacje? Jeśli tak, to jak powinny być traktowane?
Nitrodon
1
Czy możemy przyjmować dane wejściowe jako listę znaków?
Robin Ryder
1
@Charlie najwyraźniej brakuje Ci wszystkich moich odpowiedzi Perl6 :-) Oczekuję również od ciebie odpowiedzi, ponieważ jest inspirowana piątym królem Hiszpanii (cóż, z Asturies, ale Asturies ye España, y tolo demás ye tierra conquistao haha)
user0721090601
1
Czy możemy wziąć szerokość zamiast wysokości?
attinat

Odpowiedzi:

6

J , 27 bajtów

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

Wypróbuj online!

Przykład wyjaśni podejście na wysokim szczeblu.

Rozważać 'ABCDE' f 3

Zauważamy, że szukamy po prostu tabeli „dodawania krzyżowego” 1 0 1i 3 2 1 0 1 2 3, która wygląda następująco:

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

Następnie wyciągnąć te indeksy z oryginalnego napisu: [{~.

Cała reszta kodu to po prostu nudna arytmetyka i użycie i:do konstruowania argumentów 1 0 1i 3 2 1 0 1 2 3.

Jonasz
źródło
6

Galaretka , 12 bajtów

Uṡṛ‘HɗŒBŒḄZY

Wypróbuj online!

Diadadicowe ogniwo przyjmujące łańcuch za lewy, a wysokość za prawy argument. Zwraca ciąg z podziałami linii. Jeśli lista ciągów znaków była akceptowalna dla danych wyjściowych, mogę usunąć końcowy Yzapis bajtu. Co ciekawe, oryginalny „SILO PRINCEPS FECIT” wygląda jak sztuka ASCII diamentu 3D, gdy patrzę na to na TIO.

Wyjaśnienie

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
Nick Kennedy
źródło
2
Kliknąłem wypróbować, żeby zobaczyć i tak, w rzeczywistości robi 3D. Dziwne, ale fajne.
user0721090601
6

R , 93 91 87 bajtów

-2 bajty dzięki Giuseppe. -4 bajty przez podanie szerokości zamiast wysokości, jak dopuszcza OP.

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

Wypróbuj online!

Pobiera dane wejściowe jako wektor znaków. Kluczową częścią jest s[1+outer(abs(-w:w),abs(-h:h),'+')].

wh(2w+1)×(2h+1)

(i,j)1+|ih|+|jw|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

(musimy wtedy dodać 1, ponieważ R ma indeks 1). 0 w środku to miejsce, w którym powinna iść pierwsza litera wejścia.

Reszta to formatowanie.

Robin Ryder
źródło
5

Węgiel , 25 19 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Narysuj jedną czwartą napisu.

‖O←↑

Zastanów się, aby uzupełnić napis.

Neil
źródło
1
Imponujący! Jestem nowy na stronie, przepraszam z góry, jeśli poniższe pytania to kilka głupich pytań. 1. To z pewnością 19 znaków, ale czy to także 19 bajtów? oraz 2. W jakim kodowaniu ten tekst zająłby 19 bajtów?
damix911
Tak, zakodowane w UTF-8, zajmie to 19 znaków , ale w rzeczywistości 51 bajtów. W przypadku UTF-16 kodowanie wymaga 39 bajtów .
ruohola
1
@ damix911 Charcoal ma własne kodowanie, które można znaleźć na jego wiki. Myślę, że znaki poza stroną kodową kosztują 3 bajty. Deverbosifier próbuje obliczyć prawidłową długość, ale nie przeszkadza w transkrypcji do faktycznego kodowania, co jest denerwujące.
Neil
1
@Neil Okey, wydaje się legalny!
ruohola
3

Japt -R , 19 16 bajtów

z
ò@VÔtXUaVÊ)êÃê

Spróbuj

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
Kudłaty
źródło
2

Wolfram Language (Mathematica) , 57 54 bajtów

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

Wypróbuj online!

Przyjmuje szerokość jako dane wejściowe.

attinat
źródło
1
@lirtosiast to pierwszy gnie jest oceniany przy pierwszym wywołaniu funkcji. Wypróbuj online!
attinat
Ciekawe, jakiś pomysł, dlaczego wydaje się działać, gdy używasz @@ lub @@@?
lirtosiast
@lirtosiast To myśli Print/@f[...]-> Print/@Transpose[g[...]]-> Transpose[Print@g[...]], przez który czas gjest zdefiniowany.
attinat
2

Japt -R , 10 bajtów

Ôã°Vz)mê ê

Przybiera szerokość zamiast wysokości.

Spróbuj

Pseudokod (U to ciąg, V to liczba całkowita):

U.Reverse().AllSubstringsOfLength(++V / 2).Map(Palindromize).Palindromize
Wcielenie ignorancji
źródło
Miły! Nigdy nie przyszło mi do głowy, żeby spróbować zbudować go na boki.
Kudłaty
2

Perl 6 , 68 67 bajtów

{say |$^a.comb[{$_...0...$_}($a.comb-$^b+>1-1)X+.abs]for ^$b-$b+>1}

Wypróbuj online!

nwellnhof
źródło
2

Python 3, 104 bajty

Tak długo nie grałem w golfa ... Jestem pewien, że może być krótszy.

Detale

Ten kod definiuje funkcję, która pobiera dwa argumenty (ciąg i wysokość) i podaje wynik na standardowym wyjściu.

Indeks w łańcuchu to odległość Manhattanu od środka siatki. W przypadku siatki o szerokości wi wysokości hodległość dla komórki (x, y)wynosiabs(x - (w - 1) / 2) + abs(v - (h - 1) / 2) .

Szerokość siatki musi być taka, aby odległość rogów Manhattanu (powiedzmy (0, 0)) była o jeden mniejsza niż długość struny. Zastępując (0, 0)powyższe i upraszczając, stwierdzamy, że szerokość jest po prostu2 * len(s) - h .

Kod

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

Wypróbuj online!

Tim Pederick
źródło
1

Pyth , 19 bajtów

L+_btbjyyM.:Q-lQ/E2

Wypróbuj online!

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
Sok
źródło
1

Python 2 , 95 bajtów

def f(s,n):
 y=len(s);n//=2
 for i in range(n+1)+range(n)[::-1]:print s[y+~i:n-i:-1]+s[n-i:y-i]

Wypróbuj online!

wilkben
źródło
1

C # (.NET Core) , 146 bajtów

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

Wypróbuj online!

Najdłuższa odpowiedź tak długo. :-) Wykorzystuje odległość Manhattanu do środka kwadratu. Musi być jednak krótsza droga.

Charlie
źródło
1

Tcl , 188 170 162 bajtów

{{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

Wypróbuj online!

Wydaje się, że istnieje milion złych sposobów na rozwiązanie tego problemu w TCL. To nie jest najgorsze z nich.

Zapisano minimum 18 bajtów poprzez konwersję na lambda (można zaoszczędzić do 13 więcej, jeśli dopuszczalna jest wartość zwracana z listy linii)

Zapisano dodatkowe 8, ponieważ iterator lmap służył jako dodatkowa stała

SmileAndNod
źródło
1

Płótno , 18 bajtów

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

Wypróbuj tutaj!

Płótno nie tworzy podciągów, więc muszę traktować go jak obiekt artystyczny i uzyskać w ten sposób podrozdział. Wydaje mi się, że kosztuje mnie to 2 bajty, ale hej, co możesz zrobić?

Wygląda na to, że tak naprawdę nie działa tak, jak myślałem: funkcje palindromizacji Canvas odzwierciedlają określone znaki (np. V odbite pionowo zmienia się w ^) i nie mogę tego dokładnie wyłączyć ... no cóż, chyba

hakr14
źródło