앨리스 서수 형식 /나 \)는 다른 곳으로 하나 개의 모드로

소개

AliceMartin Ender 의 2 차원 언어로 , 추기경순서의 두 가지 실행 모드가 있습니다 . 명령 포인터가 전달되면 통해 (하나 미러 /\)는 다른 곳으로 하나 개의 모드로 전환한다.

이 과제 에서는 명령이 문자열에서 작동하고 명령 포인터가 대각선으로 움직이면서 코드의 가장자리에 튀는 서수 모드에 중점을 둘 것 입니다.

서수 모드에서만 작동하는 간단한 프로그램은 다음 예제와 같이 매우 간단한 스타일로 작성할 수 있습니다.

/fbd/
@aec\

여기서 IP는 첫 번째 셀은 동쪽가는 기수 모드에서 시작하고, 제 1 미러를 통과 대각선 이동 튀는 명령 실행 시작 a, bc. 그런 다음이 다른 거울을 향해 남쪽으로 이동 한 다음, 서쪽을 향해 다시 수신 거부 명령을 발생 시작하게 북동쪽 거울을 발견 d, e, f, 그리고 마지막으로 @, 프로그램을 종료한다.

이러한 종류의 구조는 매우 작지만 작성 및 유지 관리가 쉽지 않습니다 (하나의 명령을 추가하면 대부분의 코드를 다시 정렬해야 할 수도 있습니다!). 따라서 형식 지정에 도움을 주길 바랍니다.

작업

각 명령이 인쇄 가능한 단일 ASCII 문자 인 일련의 명령이있는 경우, 순서의 첫 번째 절반을 두 번째 행의 첫 번째 문자부터 시작하여 항상 대각선으로 오른쪽으로 이동할 수 있도록 두 행으로 재정렬하십시오. 후반은 나머지 문자를 오른쪽에서 왼쪽으로 읽어 읽을 수 있습니다. 거울과 종료 기호에 대해 걱정하지 마십시오. 직접 추가하겠습니다.

예를 들어 입력 abcdef이 주어지면 출력해야합니다.

fbd
aec

입력 길이가 홀수 인 경우, 발생하는 명령 순서가 동일하게 유지되는 한 Alice (1 개의 Alice)에 단일 공백을 추가해야합니다. 한 문자 씩 길이가 다른 두 줄을 출력하도록 선택할 수도 있습니다.이 경우 짧은 줄은 끝에 공백이있는 것으로 간주됩니다.

규칙

이것은 가장 짧은 답변은 바이트 단위로 이깁니다!

  • 기본 입 / 출력 방법 중 하나를 통해 입 / 출력 할 수 있습니다
  • 입력 가능한 한 줄의 인쇄 가능한 ASCII 문자로 구성
  • 출력에서 단일 후행 줄 바꿈이 허용됩니다.
  • Alice 프로그램으로 실행될 때 (예 : 패딩 공간이 문자열 리터럴 안에 삽입 된 경우) 프로그램의 일부 출력이 완전히 올바르게 동작하지 않을 수 있습니다. 이러한 상황에 대해 걱정할 필요가 없습니다.
  • 표준 허점 은 금지되어 있습니다

테스트 사례

--Input
abcdef
--Output
fbd
aec

--Input
123
--Output
 2
13
OR
31
 2
OR
3
12
OR
32
1

--Input
O
--Output
O

OR

O

--Input
"Hello, World!"o
--Output
oH!lloo
""edlr,W

--Input
i.szR.szno
--Output
o.zz.
inssR

--Input
"  ^^} .~[}.~~[}{~~{}[^^^^.""!}"r.h~;a*y'~i.*So
--Output
o *^i}'.*[;.h~r}}~"{.[^
"S .^~ y~a}~~.["{!~"}^^^
(Odd length, your solution may be different)


답변

젤리 , 15 바이트

œs2U2¦ṚZUJḤ$¦ZY

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

인용 된 입력을받습니다.

설명:

œs2U2¦ṚZUJḤ$¦ZY Main link, monadic
œs2             Split into 2 chunks of similar lengths, last might be shorter
   U2¦          Reverse the 2nd chunk
      Ṛ         Swap the chunks
       Z        Transpose into chunks of length 2
        UJḤ$¦   Reverse the chunks at even indices (1-indexed)
             Z  Transpose into 2 chunks again
              Y Join by a newline

답변

Alice , 28 바이트

/mY. zm~wZ.k;
\I;'!*?RR.OY@/

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

입력 길이가 홀수이면 선형화 된 프로그램의 끝에 패딩 공간이 생겨 출력의 첫 문자가됩니다.

Leo는 며칠 전에 Alice에서 Ordinal formatter를 작성했습니다 . 홀수 길이의 입력에 대한 지원을 추가 한 다음이 과제에 필요하지 않은 일부 항목을 제거한 후 28 바이트가되었습니다 . 나는 약간 다른 접근법을 시도하고 싶었습니다.이 답변입니다. 불행히도 방금 28 바이트를 묶었 지 만 적어도이 방법으로 내 솔루션을 게시하고 Leo가 원래 알고리즘을 게시하도록 할 수 있습니다.

이것은 Leo의 정말 영리한 아이디어를 사용하여 문자열을 반으로 나눕니다 ..Y;m;.!z?~.

설명

입력의 길이가 짝수라고 가정합시다 (그렇지 않으면 공백으로 채울 것이므로). 패턴을 0123456789코드로 사용하는지보다 쉽게 ​​알 수 있습니다. 필요한 출력은 다음과 같습니다.

91735
08264

따라서 첫 번째 줄에는 입력의 모든 홀수 위치가 포함되고 두 번째 줄에는 모든 짝수 입력이 포함됩니다. 또한 홀수 위치를 반대로하면 선 자체가 전반부 (아마도 더 길어질 수 있음)와 후반부 반전으로 인터리브됩니다.

기본 아이디어는 다음과 같습니다.

  • 홀수 및 짝수 위치로 입력을 분리하십시오.
  • 필요한 경우 홀수 위치를 공백으로 채 웁니다.
  • 홀수 위치를 뒤집습니다.
  • 그런 다음 두 번 : 현재 문자열을 반으로 줄이고 후반부를 뒤집고 두 절반을 인터리브하고 후행 줄 바꿈으로 인쇄합니다.

코드에 관해서는, 이것은 우리가이 챌린지에서 생성하는 일종의 레이아웃과 비슷해 보이지만 미묘하게 다릅니다. IP가 /코드의 끝에 도달하면 남쪽이 아닌 동쪽 에 반영됩니다 . 그런 다음 카디널 모드에서 IP는 첫 번째 열로 줄 바꿈됩니다. 는 \거기에 다시 진입 서수 모드, 그래서 코드의 두 번째 절반은 오른쪽에서 이동하지 않는 것을 여기 남아 있지만에서 오른쪽뿐만 아니라 왼쪽. 이것은 리턴 주소 스택으로 작업 할 때 유용합니다. IP 방향에 대한 정보를 저장하지 않기 때문입니다. 는 IP가 모두 동일 (수평) 방향으로 이동하기 때문에이 작업은 몇 바이트 저장 우리를 할 수 있습니다 wk.

선형화 된 코드는 다음과 같습니다.

IY' *mRw..Y;m;.!z?~RZOk@

살펴 보겠습니다 :

I       Read one line of input.
Y       Unzip. Separates the string into even and odd positions.
' *     Append a space to the odd half.
m       Truncate: discards characters from the longer of the two
        strings until they're the same length. So if the input
        length was even, appending a space will make the odd half
        longer and this discards the space again. Otherwise, the
        space just padded the odd half to the same length as the
        even half and this does nothing.
R       Reverse the odd half.
w       Push the current IP address to the return address stack.
        The purpose of this is to run the following section
        exactly twice.

          This first part splits the current line in half, based
          on an idea of Leo's:
  ..        Make two copies of the current half.
  Y         Unzip one of the copies. The actual strings are irrelevant
            but the important part is that the first string's length
            will be exactly half the original string's length (rounded up).
  ;         Discard the potentially shorter half.
  m         Truncate on the original string and its even half. This shortens
            the original string to the first half of its characters.
  ;         Discard the even half, because we only needed its length.
  .!        Store a copy of the first half on the tape.
  z         Drop. Use the first half to discard it from the original string.
            This gives us the the second (potentially shorter half).
  ?         Retrieve the first half from the tape.
  ~         Swap it so that the second half is on top.
          The string has now been split in half.
  R       Reverse the second half.
  Z       Zip. Interleave the two halves.
  O       Print the result with a trailing linefeed.

k       Pop an address from the return address stack and jump back there.
        The second time we reach this, the return address stack is empty,
        and this does nothing.
@       Terminate the program.

답변

젤리 , 23 22 바이트

Leo 덕분에 -1 바이트 (왼쪽 아래가 패딩 일 수 있음)

LḂ⁶ẋ;µṚ,µm2œs2U0¦ż/µ€Y

결과를 인쇄하는 전체 프로그램 (모나 딕 링크는 문자 목록 목록을 반환합니다).

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

어떻게?

LḂ⁶ẋ;µṚ,µm2œs2U0¦ż/µ€Y - Main link: list of characters
L                      - length
 Ḃ                     - modulo 2
  ⁶                    - literal space character
   ẋ                   - repeat
    ;@                 - concatenate (swap @rguments) (appends a space if the input's length is odd)
      µ                - monadic chain separation, call that s
       Ṛ               - reverse s
        ,              - pair with s
         µ         µ€  - for €ach:
          m2           -   modulo 2 slice (take every other character)
            œs2        -   split into two "equal" chunks (first half longer if odd)
               U0¦     -   upend index 0 (reverse the second chunk)
                   /   -   reduce by:
                  ż    -     zip
                     Y - join with newlines (well just the one in this case)
                       - implicit print (mushes the sublists together)

답변

자바 스크립트 (ES6), 104 바이트

f=
s=>s.replace(/./g,(c,i)=>a[1&~i][i+i>l?l-i:i]=c,a=[[` `],[]],l=s.length-1|1)&&a.map(a=>a.join``).join`
`
<input oninput=o.textContent=f(this.value)><pre id=o>

실행 경로를 에뮬레이트하고 명령을 그대로 채 웁니다.