Inscriptio Labyrinthica


22

아스투리아스의 사일로 왕의 매장지에는 SILO PRINCEPS FECIT ( 사일로 왕이 만들었다 ) 라는 비문 있습니다.

실로 프린세스

첫 번째 글자는 가장 가운데에 있으며 바깥에서 비 대각선 방향으로 나가서 읽습니다. 마지막 편지는 네 구석에 있습니다. 이 과제에서는 프로세스를 일반화하여 작성합니다.

입력

문자열 ( 또는 동등한 ) 및 정수 입력에 대해 다음과 같은 가정을 할 수 있습니다.

  • 문자열의 길이는 홀수입니다.
  • 정수는 1과 문자열 길이의 두 배보다 작은 홀수입니다.

산출

높이 또는 너비에 정수를 사용하여 문자열에 대한 음순 미로 (높이 예는 모델 참조). 출력은 공백이없는 각 문자, 시스템 / 언어의 기본값으로 줄 바꿈이어야합니다.

테스트 사례

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 답변을 누락했습니다 :-) 나도 당신에게서 대답을 기대가 스페인의 다섯 번째 왕에 의해 영감을하기 때문에 (잘 Asturies의,하지만 Asturies 너희 에스파냐, Y 톨로 데마 너희 티에라 conquistao 하하)
user0721090601

1
높이 대신 너비를 사용할 수 있습니까?
attinat

답변:


6

J , 27 바이트

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

온라인으로 사용해보십시오!

예를 들어 높은 수준의 접근 방식을 설명합니다.

치다 'ABCDE' f 3

우리는 우리가 찾는 것이 단순히 1 0 1and 의 "교차 추가"테이블이라는 것을 알았습니다 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

온라인으로 사용해보십시오!

문자열을 왼쪽으로, 높이를 오른쪽 인수로 사용하는 2 진 링크. 줄 바꿈이있는 문자열을 반환합니다. 문자열 목록이 출력에 허용되는 경우 최종 Y저장 바이트를 제거 할 수 있습니다 . 흥미롭게도 오리지널“SILO PRINCEPS FECIT”는 TIO에서 볼 때 3D 다이아몬드의 ASCII 예술처럼 보입니다.

설명

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 바이트. OP에서 허용하는 높이 대신 너비를 입력하여 -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),'+')]입니다.

h(2+1)×(2h+1)

(나는,j)1+|나는h|+|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

(R은 1- 인덱싱되므로 1을 추가해야합니다.) 가운데의 0은 입력의 첫 글자가 나오는 곳입니다.

나머지는 포맷 중입니다.


5

, 25 19 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

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

비문의 1/4을 그립니다.

‖O←↑

비문을 완성하십시오.


1
인상적! 나는 사이트에 처음 왔는데, 다음에 나오는 몇 가지 멍청한 질문이 있다면 미리 사과드립니다. 1. 이것들은 분명히 19 자이지만 19 바이트입니까? 그리고 2.이 텍스트는 어떤 인코딩에서 19 바이트가 필요합니까?
damix911

예, UTF-8로 인코딩하면 19 문자 가 걸리지 만 실제로는 51 바이트가 필요합니다. UTF-16을 사용하면 여전히 인코딩하는 데 39 바이트 가 걸립니다 .
ruohola

1
@ damix911 숯에는 자체 인코딩이 있으며 위키에서 찾을 수 있습니다. 코드 페이지 외부의 문자는 3 바이트라고 생각합니다. 디버 보시 파이어는 정확한 길이를 계산하려고 시도하지만 실제 인코딩으로의 전송을 방해하지 않습니다.

1
@ 닐 오키, 합법적 인 것 같습니다!
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

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

Japt -R , 10 바이트

Ôã°Vz)mê ê

높이 대신 너비를 사용합니다.

시도 해봐

의사 코드 (U는 문자열, V는 정수) :

U.Reverse().AllSubstringsOfLength(++V / 2).Map(Palindromize).Palindromize

좋은! 그것을 옆으로 세우려고 시도한 적이 없습니다.
얽히고 설킨


2

파이썬 3, 104 바이트

오랫동안 골프를 치지 않았는데 ... 이것이 더 짧을 것이라고 확신합니다.

세부

이 코드는 두 개의 인수 (문자열과 높이)를 사용하고 표준 출력에 결과를 제공하는 함수를 정의합니다.

스트링의 인덱스는 그리드의 중심에서 맨해튼 거리입니다. 너비 w와 높이 의 격자 h에서 셀의 거리는 (x, y)입니다 abs(x - (w - 1) / 2) + abs(v - (h - 1) / 2).

격자의 너비는 모서리의 맨해튼 거리 (예 :) (0, 0)가 줄 길이보다 1이 작아야합니다. (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 코어) 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 개 저장 가능)

lmap iterator가 추가 상수로 사용되어 추가 8을 저장했습니다.


1

캔버스 , 18 바이트

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

여기 사용해보십시오!

Canvas는 하위 문자열을 수행하지 않으므로 아트 객체처럼 취급하고 하위 섹션을 가져와야합니다. 나는 이것이 2 바이트의 비용이라고 생각하지만 어떻게 할 수 있습니까?

내가 생각처럼 다음과 같습니다 실제로 작동하지 않습니다 캔버스의 palindromize 기능은 특정 문자 (예 : V 미러링 수직 ^된다) 거울, 나는 정확히 비활성화 할 수 없습니다 ... 것을 잘 아, 그런 것 같아요


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.