스트링 트위스터 골프


24

줄이 꼬이는 방법

비틀림 알고리즘은 매우 간단합니다. 각 열은 색인에 의해 아래로 이동합니다 (col 0은 0 아래로 이동하고 col 1은 1, ...로 이동합니다). 열 이동이 맨 위로 줄 바꿈됩니다. 다음과 같이 작동합니다.

aaaa
bbbb
cccc

된다 :

a
ba
cba
----
 cba
  cb
   c

줄 아래에있는 모든 것이 맨 위에 배치됩니다. 실제 예 :

Original:
\\\\\\\\\\\\
............
............
............

Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\

입력

입력은 문자열 배열이거나 여러 줄 문자열입니다. 모든 줄의 길이는 같습니다.

산출

꼬인 끈, 멀티 라인 출력을 표준 출력으로 (또는 가장 가까운 대안)

예 :

( >입력을 나타내며 후행 공백이 중요합니다)

>Hello, world!
>I am another 
>string to be 
>twisted!     

Hwrmoe oo br!
Ieii ,dttr e 
s lsna !ohl  
ttaltgnw  ed 


>\\\\\\\\\\\\
>............
>............
>............

\...\...\...
.\...\...\..
..\...\...\.
...\...\...\


>abcdefg
>.......

a.c.e.g
.b.d.f.


>abcdefghij
>..........
>..........

a..d..g..j
.b..e..h..
..c..f..i.


>\\\\.....././
>...../.......
>........././.
>..../.^\\....

\.........../
.\....^..../.
..\../.\../..
...\/...\/...

>cdeab
>deabc
>eabcd
>abcde

cbbbb
ddccc
eeedd
aaaae


>aeimquy37
>bfjnrvz48
>cgkosw159
>dhlptx260

ahknqx147
beloru258
cfipsvy69
dgjmtwz30


>abcdefghi
>jklmnopqr
>stuvwxyz1
>234567890

a3ume7yqi
jb4vnf8zr
skc5wog91
2tld6xph0

12
이를 위해 Mathematica가 내장되어 있지 않은 것이 좋습니다.
Mama Fun Roll

1
입력에 ASCII 만 포함될 것이라고 가정 할 수 있습니까? 아니면 인쇄 가능한 ASCII + 줄 바꿈 또는 다른 것만?
Martin Ender 2016

예, ASCII와 개행 만 입력하십시오 (입력을 배열로 가져 가지 않는 한).
J Atkin

답변:


3

Brachylog , 5 바이트

iᵇ↻₎ᵐ

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

입력을 열의 배열로 가져옵니다 (질문의 사양 내에있는 것 같습니다).

iᵇ-배열의 각 요소에 대해 (0 기반) 인덱스와 쌍을 이룹니다
.-이 술어를 결과의 각 요소에 맵핑하십시오
↻₎.-마지막 요소 (지수)로 지정된 양만큼 순환 (열)

단일 여러 줄 문자열을 허용하는 버전으로 쉽게 확장 :

13 바이트

ṇẹ\iᵇ↻₎ᵐ\cᵐ~ṇ

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


이것은 놀라운 정보 압축입니다.
J Atkin

7

피스, 11

jC.>R~hZC.z

여기 사용해보십시오

jC.>R~hZC.z    ##  implicit: .z = list of input split by lines
        C.z    ##  transpose .z to get columns
  .>R~hZ       ##  shift each column by it's index
               ##  equivalent to .e.>bk
jC             ##  transpose back and join by newlines


6

망막 , 111 (101) 92 87 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

(?<=((.))*)(?=(?<1>.*¶)*.*(?<=(?=(?<-2>.)*(.))(?<-1>.+¶)*.*(.(?<=^(?<-1>¶?.+)*))*)).
$3

Woo는 단일 정규식 대체로 해결했습니다. :) (기회는 몇 가지를 사용하면 더 짧은 솔루션이 있지만 그 재미는 어디에 있습니까?)

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

설명

여기에는 그룹 밸런싱에 대한 기본 지식이 필요합니다 . 간단히 말해 .NET의 정규 표현식 기능을 사용하면 단일 그룹으로 여러 번 캡처하여 모든 캡처를 스택으로 푸시 할 수 있습니다. 이 스택은 팝될 수도 있는데,이를 통해 정규식 내부의 물건을 계산하는 데 사용할 수 있습니다.

(?<=((.))*)

이렇게하면 한 그룹의 캡처 12매치 앞의 각 캐릭터 (현재 줄에서)마다 한 장의 캡처가 적용 됩니다. 즉, 일치하는 가로 위치를 계산합니다.

나머지는 미리 본다 :

(?=(?<1>.*¶)*.* [...] )

우리는 각각의 라인과 일치하고 또한 그룹으로 푸시 1기가되도록, 1지금 (후자는 계산 된 수평 및 수직 위치의 합 아래에서 ). 이것은 기본적으로 왼쪽 하단에서 시작하여 증가하는 값으로 그리드의 대각선에 레이블을 지정합니다. 그런 .*다음 엔진 커서를 문자열 끝으로 이동합니다.

이제 .NET에서 오른쪽에서 왼쪽으로 일치하는 lookbehind로 전환합니다.

(?<= [...] (.(?<=^(?<-1>¶?.+)*))*)

이것은 H그룹에서 정확히 캡처를 반복해서 팝업합니다 1( H입력 높이). 그것의 목적은 모듈로 그룹을 취하는 것 H입니다. 이후에 group 1에는 현재 열에서 새 문자를 선택할 행 (아래에서 계산)이 포함됩니다.

(?=(?<-2>.)*(.))(?<-1>.+¶)*.*

오른쪽부터 다시 시작하는 또 다른 모습. (?<-1>.+¶)*.+이제 group 1을 사용 하여 새 문자를 선택할 행을 찾은 다음 lookahead는 group을 사용하여 올바른 열을 찾습니다 2.

원하는 문자가 그룹으로 캡처되어 3대체에 의해 다시 쓰여집니다.


아, 망막의 소스를 읽는 :) 좋은 분명 $+도움이 보입니다 ... 당신은 하나 개의 치환을 할 특히 : ^)
FryAmTheEggman

@FryAmTheEggman $+은 실제로는 쓸모가 없습니다 ... MSDN에 대한 설명은 (a)|(b)-> $+$+모든 as와 bs를 두 배로 늘리지 만 대신 모든 as를 제거 한다는 것을 의미하기 때문에 그보다 훨씬 더 유용하게 들립니다. . 그것은 당신이 너무 게으른 경우 (나처럼) 모든 그룹을 세는 것을 피할 수있는 방법이라는 것을 의미합니다. 골프의 경우 9 개 이상의 그룹이있을 때 바이트를 절약 할 수 있습니다.
Martin Ender

안타깝게도 ... retina에 비어 있지 않은 마지막 일치 그룹을 반환하는 새로운 대체 그룹 유형이있을 수 있습니까? 어쨌든 설명 주셔서 감사합니다! :)
FryAmTheEggman

@FryAmTheEggman 그것은 것입니다 ( Regex.ReplaceRetina를 위해 다시 쓸 때 염두에 두었던 것 중 하나 이지만 아직 구현하지는 않았습니다).
Martin Ender 2016

4

CJam, 13 바이트

qN/zee::m>zN*

여기에서 테스트하십시오.

설명

q    e# Read all input.
N/   e# Split into lines.
z    e# Transpose to get an array of columns.
ee   e# Enumerate, pairing each column with its index.
::m> e# Map: fold: rotate (cyclically shifting each column by its index).
z    e# Transpose again.
N*   e# Join with linefeeds.

2
그 소스 코드를 거의 발음 할 수 있습니다.
mınxomaτ

4

티 스크립트, 10 바이트

xHl@C(r╢tD

TeaScript 3 덕분에 매우 간결한 구문입니다,이는 정말 짧은 : D

시그마 루프가 버그가 없다면 1 바이트 더 짧을 것입니다.

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

설명

      // Implicit, x = input
xH    // Transpose input
l@    // Loop
 C(r╢   // Cycle column by index
        // `╢` exits loop
t    // Transpose
D    // Join on \n

3

파이썬 3, 164 바이트

긴 대답으로는 가장 좋은 대답은 아니지만 Python의 첫 번째 대답은 ...

s=list(zip(*open(0).readlines()))[:-1]
r=[[s[i][(j-i)%len(s[i])] for j in range(len(s[i]))] for i in range(len(s))]
print('\n'.join([''.join(l) for l in zip(*r)]))

1
당신은 다음과 공간 복용에 의해 바이트의 소수를 저장할 수 있습니다 )또는 ]대부분의 경우에, 예를 들어 ''.join(l)for l in....완벽하게 유효을
wnnmaw가

3

MATLAB, 92 36 바이트

s=bsxfun(@circshift,s,0:size(s,2)-1)

입력 문자열 s이 이미 2D 문자 배열 / 행렬의 형태 라고 가정합니다. 예 :

s = ['abcdefg';'.......'];
s = ['\\\\.....././';'...../.......';'........././.';'..../.^\\....'];

설명 : 행렬의 열을 반복합니다. 각 열에 대해 열 색인과 동일한 문자 수만큼 요소를 순환 이동합니다 (MATLAB 색인화로 인해 -1).


2

근접 , 96 바이트

$\:0{h_.|[M:I]hh:I{bh0,?h.|[C:I]h$)D,I-1=:Dr:2&.}C,I+1=J,Mb:J:1&:[C]rc.}$\{hA,[A]:"~s
"w,?b:3&;}

이것은 문자 코드 문자열의 목록을 입력으로하고 출력을 요구하지 않습니다. 예 : brachylog_main([`aaaa`,`bbbb`,`cccc`],_).

그것은 엄청나게 긴 대답이며 아마도 훨씬 짧은 방법이 있습니다.

설명

§ Main Predicate

$\:0{}$\{}                            § Create a list containing the transposed input and 0
                                      § Call sub-predicate 1 with this list as input
                                      § Transpose its output and pass it as input to
                                      § sub-predicate 3


§ Sub-predicate 1

h_.                                   § If the matrix is empty, output is empty list
   |                                  § Else
    [M:I]hh:I{}C,                     § Input is [M,I], call sub-predicate 2 with the first
                                      § line of M and I as input. Its output is C.
                 I+1=J,Mb:J:1&        § Call sub-predicate 1 with M minus the first line
                                      § and I+1 as input
                              :[C]rc. § Its output is appended after C, which is then
                                      § unified with the output of sub-predicate 1.


§ Sub-predicate 2

bh0,?h.                               § If the second element of the input list is 0,
                                      § output is the first element of the input
       |                              § Else
        [C:I]                         § Input is [C,I]
             h$)D,                    § Perform a circular permutation of C from left to
                                      § right (e.g. [a,b,c] => [c,a,b]) and unify it with D
                  I-1=:Dr:2&.         § Call sub-predicate 2 with D and I-1 as input, unify
                                      § its output with sub-predicate 2's output


§ Sub-predicate 3

hA,[A]:"~s\n"w,                       § Write the first line of the input as a char codes
                                      § string followed by a new line

               ?b:3&;                 § Call sub-predicate 3 with input minus the first
                                      § line. If it fails (empty input), terminate

2

자바 스크립트, 92 89 바이트

@Neil 덕분에 3 바이트가 떨어져 있습니다.

s=>(z=s.split`
`).map((m,i)=>m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])).join`
`


다음을 사용하여 3 바이트를 저장할 수 있습니다 replace: m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j]).
Neil

1
실제로 [...m].map(첫 번째를 포함하여 첫 번째를 포함합니다 .join.
Neil

2

파이썬 2, 115 바이트

lambda s:'\n'.join("".join(s)for s in zip(*[k[-i%len(k):]+k[:-i%len(k)]for i,k in enumerate(zip(*s.split('\n')))]))

zip이것을 한 줄로 줄인 것에 대한 경이로움 . 여기 에서 실제로 확인 하십시오 .


2

MATL , 18 21 바이트

Zy2):"G@Z)@qYS]N$h

입력은 형식입니다

['Hello, world!'; 'I am another '; 'string to be '; 'twisted!']

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

작동 방식 :

Zy       % implicitly take input: 2D char array. Get its size
2)       % second element from size vector: number of columns, say n
:        % create vector [1,2,...,n]
"        % for each element k in that vector
  G      %   push input
  @      %   push k
  Z)     %   k-th column from input
  @qYS   %   circularly shift k-1 positions
]        % end for loop
N$h      % concatenate all stack contents horizontally
         % implicitly display

1

F #, 105 바이트

나의 첫 찌르기 ( \n캐릭터 만 필요) :

let m x y=(x%y+y)%y
let f(a:string[])=Array.mapi(fun i x->String.mapi(fun j _->a.[m(i-j)a.Length].[j])x)a

용법:

f [| @"\\\\\\\\\\\\"
     "............"
     "............"
     "............" |]

PPCG에서 F #을 본 적이 없다고 생각합니다.
J Atkin

1

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

t=>t.replace(/./g,(_,i)=>t[(i+s*l-i%l*l)%s],l=t.search`
`+1,s=t.length+1)

설명

t=>
  t.replace(/./g,(_,i)=> // replace each character at index i
    t[                   // get the character at index:
      (i                 // start at i
        +s*l             // add s*l to ensure the result is always positive for %s
        -i%l*l           // move the index upwards the num of chars from start of the line
      )%s                // shift the index into the the range of s
    ],
    l=t.search`
`+1,                     // l = line length
    s=t.length+1         // s = input grid length (+1 for the missing newline at the end)
  )

테스트


1

apt, 29 바이트

Uy £XsV=(Y*Xl -Y %Xl)+X¯V}R y

온라인으로 테스트하십시오!

작동 원리

Uy        // Transpose rows and columns in the input string.
£     }R  // Map each item X and index Y in the result, split at newlines, to:
Y*Xl -Y   //  Take Y times X.length and subtract Y.
%Xl)      //  Modulate the result by X.length.
XsV=      //  Set V to the result of this, and slice off the first V chars of X.
+X¯V      //  Concatenate this with the first V chars of X.
y         // Transpose the result again.
          // Implicit: output last expression

1

하스켈, 81 바이트

let t=transpose in t.snd.mapAccumR(\c l -> 1+c,take(length l)(drop c$cycle l))0.t

리버스, 맵 및 열거가 mapAccumR의 일부이지만 CJam 예제의 재 구현은 더 이상 필요하지 않기 때문에 snd가 누산기를 제거합니다. 반전은 오른쪽 접기의 부작용 일뿐입니다.


1

하스켈, 65 바이트

g l@("":_)=l;g l|t<-tail<$>l=zipWith(:)(head<$>l)$g$last t:init t

사용 예 : g ["1111","2222","3333"]-> ["1321","2132","3213"].


1

MATL , 9 바이트

"@X@qYS&h

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

예쁜 루이스 Mendo의 핵심 유사한 기존 MATL 대답 하지만, 그 시점에서 언어 아마되지 않은 기능을 사용하여 짧은 : 1. "그들로 열 인덱스와 인덱스를 구성, 자동으로 현재 행렬의 열을 통해 반복을 그래서 아무 비용이 많이 드는 사업 ( 2. &h이것은 속기입니다)N$h , 그리고 3. ]명시되지 않은 경우 암시 적 루프 종료 .

또는 동일한 바이트 수의 경우 :

tsn:ql&YS

MATL Online에서 사용해보십시오

      &YS   % circularly shift the matrix
     l      % across rows (i.e. shift each column) by the amounts
            %  given by this array:
tsn         % duplicate input, get the sum of each column, get the 
            %  number of elements in that (which is the number of columns)
   :q       % construct range 1 to ncols, then decrement to start at 0
            % (implicit output)

0

C (클랑) , 114 바이트

MinGW의 GCC에서 작동합니다. TIO의 GCC는 strlen첫 번째 for 루프의 init 표현식을 사용하여 혼동됩니다 .

f(L,n)char**L;{for(int l=strlen(*L),i=0,j,c;i<n;i++)for(j=c=0;j<=l;j++,c=c?c-1:n-1)putchar(l^j?L[(c+i)%n][j]:10);}

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

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