열 회전


28

정수 k 와 텍스트 블록 또는 내부 배열의 길이가 같지 않은 (텍스트 블록과 유사한) 2d 배열이 주어지면 k 번째 열의 모든 문자 또는 요소를 다음 위치로 위 또는 아래로 회전 존재합니다.

다음 텍스트의 20 번째 열을 회전합니다 (1 기반).

A line with more than k characters.
A longer line with more than k character.
A short line.
Rotate here: ------v--
This is long enough.

This is not enough.
Wrapping around to the first line.

산출:

A line with more thtn k characters.
A longer line with aore than k character.
A short line.
Rotate here: ------m--
This is long enoughv

This is not enough.
Wrapping around to .he first line.

35 < k <42 인 동일한 입력 의 k 번째 열을 회전하면 입력 텍스트가 변경되지 않습니다.

규칙

  • 원시 텍스트, 행 배열, 2d 문자 배열 또는 적절한 형식을 사용하여 데이터를 나타낼 수 있습니다. 문자 이외의 데이터 형식을 사용할 수도 있습니다.
  • 코드 길이에 따라 요소의 데이터 유형에 가능한 값의 수는 20 이상, 그렇지 않으면 2 이상이어야합니다. 기본 유형에서 지원되는 문자 또는 기타 값의 서브 세트 일 수 있습니다.
  • 공백과 모든 종류의 null 값은 입력에 허용되는 경우 정상적인 값입니다. 요소 유형에서 단순히 제외 할 수도 있습니다.
  • 규칙 변경 : 동일한 길이의 배열을 사용하여 데이터를 저장하려는 경우 공백과 같은 일반적인 기본값으로 더 짧은 배열을 채울 수 있습니다.
  • k 는 0 기반 또는 1 기반 일 수 있습니다. 입력에서 가장 긴 줄 안에 있어야합니다 (입력에 비어 있지 않은 줄이 하나 이상 있음).
  • 회전 여부를 선택할 수 있습니다.
  • 한 위치 만 회전하거나 n 이 입력에 제공된 양의 정수인 n 위치를 회전 하십시오.
  • 가장 짧은 코드가 승리합니다.

답변:


8

APL (Dyalog Extended) , 9 바이트 SBCS

전체 프로그램. 2D 텍스트 블록을 표시 한 다음 k (APL의 현재 설정에 따라 0 또는 1 기반), n을 입력하라는 프롬프트가 표시 됩니다. 양수 n 회전, 음수 n 회전.

도메인은 다음 중 하나로 구성됩니다.

  1. 공백을 제외한 모든 유니 코드 문자는 1114111의 허용 값을 남겨두고 필요한 20보다 큽니다.

  2. 0을 제외한 모든 숫자는 약 2129 개의 허용 값을 남겨두고 필요한 20보다 큽니다.

APL은 2D 블록이 직사각형이어야하므로 입력은 공백 / 0으로 채워 져야합니다. 문자열 / 숫자 목록의 왼쪽 에 입력 하면 자동으로 수행 할 수 있습니다 .

⎕⌽@≠@⎕⍢⍉⎕

온라인으로 사용해보십시오! (겉보기 공간은 실제로 비파괴 공간입니다)

 텍스트 블록에 대한 프롬프트

⍢⍉ 전치되는 동안 :

@⎕ 입력 행에 다음을 적용하십시오.

  @≠ 프로토 타입과 다른 요소에서 (문자 공간, 숫자 0)

   ⎕⌽ "입력"단계를 왼쪽으로 회전

APL (Dyalog Unicode) , 22 바이트 이상 SBCS

이 버전은 0을 식별 가능한 채우기 요소로 사용하여 전체 문자 세트를 허용합니다.

0~¨⍨↓⍉⎕⌽@(0≠⊢)@⎕⍉↑0,¨⎕

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

이것은 물론 숫자 인수에 0을 사용할 수 없음을 의미합니다. 모든 숫자에 해당하는 프로그램은 다음 과 같이 세 가지 항목을 0대체하여 ' '공간을 채우기로 사용합니다.

' '~¨⍨↓⍉⎕⌽@(' '≠⊢)@⎕⍉↑' ',¨⎕

문자와 숫자 모두의 전체 범위 (혼합)를 원한다면 채우기로 null을 사용할 수 있습니다.

n~¨⍨↓⍉⎕⌽@(n≠⊢)@⎕⍉↑⎕,¨⍨n←⎕NULL

마지막으로 입력 도메인에 널과 객체를 포함하려면 채우기 클래스를 정의하고이 인스턴스를 채우기로 사용할 수 있습니다.

~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEWFIX':Class C' ':EndClass'

이제 공식적 으로이 (및 이와 같은 새로운 답변)를 유효한 답변으로 선언하십시오. 이것이 너무 귀찮게해서 죄송합니다.
jimmy23013

null 버전보다 짧습니다 : n~¨⍨↓⍉⎕⌽@(≢¨)@⎕⍉↑⎕,¨⍨n←⊂⊂⍬. 어쩌면 확장에 modded 를 추가 하여 추가 골프를 도울 수 있습니다 (그러나 나는 그것이 얼마나 유용한 지 잘 모르겠습니다).
jimmy23013

@ jimmy23013 그래, 나는 그것을 생각했지만 임의로 중첩 된 물건의 목록을 취할 수는 없습니다. 마지막 하나는, 특히, 최고의 솔루션입니다 CI: 그들은 오염되지 않도록 지역화{~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEW⎕FIX I←C←':Class C' ':EndClass'}
아담

11

파이썬 (2) , 111 (110) 109 99 98 96 94 바이트

lambda a,n:[l[:n]+(l[n:]and[L[n]for L in a[i:]+a if L[n:]][1]+l[n+1:])for i,l in enumerate(a)]

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

입력을 행 목록과 0 색인 열로 가져 와서 문자열 목록을 리턴합니다.

열이 위로 회전합니다.

Jo King 덕분에 -11 바이트


7

자바 (8) 107 106 135 107 바이트

k->m->{int s=m.length,i=-1;for(char p=0,t;i<s;t=m[i%s][k],m[i%s][k]=p<1?t:p,p=t)for(;m[++i%s].length<=k;);}

버그 수정을위한 +29 바이트

0- 인덱싱; 예제와 같이 아래로 회전합니다.
문자 매트릭스로 입력하십시오. 바이트를 절약하기 위해 새로운 것을 반환하는 대신 char-matrix를 수정합니다.

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

설명:

k->m->{                 // Method with integer and char-matrix parameters and no return-type
  int s=m.length,       //  Amount of lines in the matrix `s`
      i=-1;             //  Index-integer `i`, starting at -1
  for(char p=0,         //  Previous-character, starting at 0
           t;           //  Temp-char, uninitialized
      i<s               //  Loop as long as `i` is smaller than `s`:
      ;                 //    After every iteration:
       t=m[i%s][k],     //     Set the temp to the `k`th character of the `i`'th line
       m[i%s][k]=       //     Replace the `k`'th character of the `i`'th line with:
         p<1?           //      If `p` is still 0:
          t             //       Set it to the temp we just set
         :              //      Else:
          p,            //       Set it to the previous-character instead
       p=t)             //     And then replace `p` with the temp for the next iteration
    for(;m[++i          //   Increase `i` by 1 before every iteration with `++i`,
             %s].length //   And continue this loop until the length of the `i`'th line
           <=k;);}      //   is smaller than or equal to the input `k`

1
내가 알았던 한 가지는 첫 줄에 충분한 문자가 있다고 가정한다는 것입니다 char p=m[0][k].-그렇지 않은 경우 예외가 발생하지 않습니까? 잘 했어. 당신은 내 C # 시도를 크게 꺾고 있습니다 :)
dana

@dana 아, 젠장, 네 말이 맞아
케빈 크루이 센

1
@dana 고정 해 주셔서 감사합니다.
케빈 크루이 센

2
@dana 그리고 다시 107로 돌아갑니다. ;)
Kevin Cruijssen

1
nkn케이int p=0,t;pm[i%s][k]=(char)(p<1?t:p)

7

Zsh , 94 87 78 74 69 바이트

산술 삼항으로 변경하여 -7 바이트 , 문자 내부 위치 (TIL)를 변경하여 -9 바이트 , stdin 및 색인으로 문자열을 인수로 입력하여 -4 바이트 , 배열 대신 문자열을 사용하여 -5 바이트 회전하는 문자를 저장합니다.

read i
for s;c+=$s[i]
c=$c[-1]$c
for s;s[i]=$c[$[$#s<i?0:++j]]&&<<<$s

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

이 답변을 작동시키는 열쇠는 다음과 같습니다.

  • $array[0]또는 $string[0]항상 비어 있습니다
  • $array[n]또는 $string[n]n이 배열 / 문자열의 길이보다 큰 경우 비어 있습니다.
  • array[i]=c또는 string[i]=c요소 / 캐릭터를 대체합니다.
  • 에서가 $[$#s<i?0:++j], j되어 있지 경우 증가 $#s<i.

원래 94 바이트 답변에서 <<<인쇄 를 사용하여 흥미로운 문제가 발생했습니다 . 나는 echo그것을 해결하기 위해 사용해야 했다.

for s;echo $s[0,i-1]$c[$[$#s<i?0:++j]]${s:$i}

이에 대한 이유는 여기에서 볼 수 있습니다.

echo $ZSH_SUBSHELL   # prints 0
<<< $ZSH_SUBSHELL    # prints 1

here-string은 다른 프로그램에 stdin으로 제공되므로 서브 쉘에서 실행됩니다. 제공된 프로그램이 없으면 암시 적으로에 제공됩니다 cat. 로 볼 수 있습니다 <<< $_. <<< $ZSH_SUBSHELL와 비슷합니다 echo $ZSH_SUBSHELL | cat. 을 증가시켜야하므로 j서브 쉘에있을 수 없습니다.


6

R , 62 바이트

function(L,n){L[A,n]<-rep(L[A<-L[,n]!=' ',n],2)[1+1:sum(A)];L}

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

공백으로 채워진 문자 행렬로 입력을받습니다. 위쪽으로 회전합니다. Kirill L. 에게 감사합니다 . !

R , 74 바이트

function(L,n){substr(L[A],n,n)=rep(substr(L[A<-nchar(L)>=n],n,n),2)[-1]
L}

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

이 제출물은 패딩 된 선이 허용되기 전에 시작됩니다.

앨리어싱 substr우리가 호출하고 있기 때문에 여기에 일을하지 않습니다 substrsubstr<-첫 번째 줄에.

패딩되지 않은 행 목록으로서의 I / O; 위쪽으로 회전합니다.


합의를 통해 입력을 수정할 수 있기 때문에이 미친 짓
Kirill L.

또한, 영업 이익은 공간 패딩 행렬, 같은과 함께 작업 할 수있게되었습니다 그래서, 규칙을 완화
키릴 L.

@KirillL. R이 참조로 전달한다고 생각하지 않으므로 아마도 그렇게 할 수 없습니다. 인수가 L부모 환경에서 이름이 지정된 경우에만 작동한다는 사실에 충격을 받았습니다 . 그래도 공간 패딩으로 행복하게 업데이트 할 것입니다!
주세페

아, 그렇습니다. 나는 내 루비 답변 (이 방법으로 전체 1 바이트를 절약하는)을 보고이 아이디어를 생각해 냈지만 언어는 실제로이 상황에서 다르게 행동합니다.
Kirill L.

5

C # (Visual C # 대화식 컴파일러) , 82 바이트

k=>a=>{var c='0';a.Where(b=>b.Count>k&&((b[k],c)=(c,b[k])).c>0).ToList()[0][k]=c;}

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

@ASCIIOlyly foreach는 12 바이트 절약 을 제안 했습니다!

@someone 덕분에 -8 바이트!
@EmbodimentofIgnorance 덕분에 -1 바이트!



문자 대신 정수를 사용하는 경우 183
데이터 만료

char 대신 @ExpiredData ew int
ASCII 전용

foreach반대 순서이므로 a를 사용할 수 없습니다 :(
ASCII-only

1
dynamic선언을 병합하고 2 바이트를 저장하는 데 사용 합니다 (이전에 본 적이 없습니다!) 온라인으로 사용해보십시오!
내 대명사는


3

05AB1E , 21 바이트

ʒg‹}U¹εXyk©diX®<èIèIǝ

확실히 더 골프를하실 수 있습니다 ..

0- 인덱싱; 문자열 목록으로 입력 및 출력.
예와 같이 아래로 회전하지만 대신 회전하도록 <바꿀 수 있습니다 >.

온라인으로 시도하십시오 (바닥 글은 줄 바꿈으로 목록을 조인합니다. 실제 목록 출력을 보려면 제거하십시오).

설명:

ʒ  }             # Filter the (implicit) input-list by:
 g               #  Where length of the current string
                #  is larger than the (implicit) input-integer
    U            # Pop and store this filtered list in variable `X`
¹ε               # Map over the first input-list again:
  Xyk            #  Get the index of the current string in variable `X`
     ©           #  Store it in the register (without popping)
      di         #  If the index is not -1, so the current string is present in variable `X`
        X®<è     #   Get the (index-1)'th string in variable `X`
            Iè   #   Get the character at the index of the input-integer
              Iǝ #   And insert it at the index of the input-integer in the current string

3

K4 , 41 바이트

해결책:

{.[x;i;:;.q.rotate[1;x . i:(&y<#:'x;y)]]}

설명:

뭔가 ... 0 인덱스를 누락하지 않도록 경우합니다 (변경 최대 회전 1-1회전 아래의 경우)

{.[x;i;:;.q.rotate[1;x . i:(&y<#:'x;y)]]} / the solution
{                                       } / lambda taking implicit x and y
 .[x; ;:;                              ]  / index apply assignment back into x
         .q.rotate[1;                 ]   / left rotate 1 character
                           (       ; )    / two item list
                                    y     / index to rotate
                               #:'x       / count (#:) each (') input
                             y<           / index less than ?
                            &             / indexes where true
                         i:               / assign to variable w
                     x .                  / index into x
     i                                    / indexes we saved as i earlier

3

Japt v2.0a0, 18 바이트

입력 및 출력이 여러 줄로 된 0 기반. 1만큼 회전합니다.

더 짧은 방법이 있습니다!

yÈr\S_Y¦V?Z:°TgXrS

시도 해봐

yÈr\S_Y¦V?Z:°TgXrS     :Implicit input of string U & integer V
y                      :Transpose
 È                     :Pass each line X at 0-based index Y through the following function & transpose back
  r                    :  Replace
   \S                  :  RegEx /\S/g
     _                 :  Pass each match Z through the following function
      Y¦V              :    Test Y for inequality with V
         ?Z:           :    If true, return Z, else
            °T         :    Increment T (initially 0)
              g        :    Index into
               XrS     :    X with spaces removed

나는 의견과 새로운 규칙을 자세히 보지 않았으므로 (아마도 이전에는 없었지만 지금은 허용되는 것으로 언급되었지만) 초기 입력의 공백을 건너 뛸 수 있습니까? input-index를로 변경한다고 가정하면 6대답은 line with첫 번째 줄과 Rotate here네 번째 줄 의 공백을 건너 뛰지 만 다른 답변은 해당 공간을 회전시킵니다.
케빈 크루이 센

@ KevinCruijssen, 나는 모든 추가 규칙 및 허용량에 약간 혼란 스럽지만 문제 있는 경우 입력에 공백을 허용하지 않으면 해결할 수있는 것처럼 보입니다. 내 생각에
얽히고 설킨

1
" 나는 생각한다 "이 부분은 실제로 내가 어떻게 반응 할 것인가에 대한 것이다. 난 더 이상 필수 및 옵션이 무엇인지 모르겠지만, 내 생각 엔 당신이 실제로 인 -과 출력을 생략 공간으로 선택할 수 있습니다; 나는 당신이 공백을 세도록 선택할 수 있다고 생각 합니다. 그리고 내가 생각하는 당신이 출력 여부에 공백을 시운전 사용할 수 있습니다; 등 혼란스러운 모든 것. 아 잘 ..
Kevin Cruijssen

3

젤리 , 16 바이트

z⁷⁹ịỴFṙ-ṁƲY⁸ṛ⁹¦"

왼쪽에 줄 목록 (줄 바꾸기 문자를 포함하지 않는 문자 목록)과 오른쪽에있는 정수를 허용하는 2 진 링크는 줄 목록을 리턴합니다.

온라인으로 사용해보십시오! 바닥 글은 줄 바꿈으로 분할되고 링크를 호출하고 다시 줄 바꿈으로 연결됩니다.

방법?

z⁷⁹ịỴFṙ-ṁƲY⁸ṛ⁹¦" - Link: lines L; index I        e.g. example in question; 20
z⁷               - transpose L with filler '\n'       ['AAART\nTW', '   oh\nhr', ...]
  ⁹ị             - Ith item                           'am\nv.\n\nt'
    Ỵ            - split at newlines                  ['am', 'v.', '', 't']
         Ʋ       - last four links as a monad - i.e. f(X):
     F           -   flatten                          'amv.t'
       -         -   -1
      ṙ          -   rotate left by                   'tamv.'
        ṁ        -   mould like X                     ['ta', 'mv', '', '.']
          Y      - join with newlines                 'ta\nmv\n\n.'
                 -   -- call this C
           ⁸     - chain's left argument, L
               " - zip with - i.e. [f(L1,C1), f(L2,C2), ...]:
              ¦  -   sparse application...
             ⁹   -   ...to indices: chain's right argument, I
            ṛ    -   ...of: right argument, Cn

2

펄 5 ( -p), 75 바이트

k는 인덱스가 0이며 아래로 회전

s/.*//;$r="^.{$&}";s/
//;/$r(.)/;$c=$1;s/$r\K.(?=(?s:.)*?$r(.)|)/$1||$c/gme

TIO


2

펄 6 , 38 33 바이트

배열을 적절하게 수정합니다 (규칙에서 허용하지 않음)

{@^a.grep(*>$^b+1)[*;$b].=rotate}

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


@ joking 처음에는 그것을 출력하는 것이 아니라 약간 저장하는 것이 아니라고 생각했지만 규칙을 다시 읽으면 실제로 출력 할 수있는 규정이 없습니다 ... hooray. (...) (…)를하면 31처럼 얻을 수 있습니다. 블록에서 전화를 효과적으로 끌어 올리기 때문에 부정 행위를하는 것처럼 보이지만 한 번의 호출로 동시에 전화를 전달하여 33을 계속 수행 할 수 있습니다. 나는 그것으로 갈 것입니다.
user0721090601

아 죄송합니다, 잘못된 링크를 붙여 넣었습니다. 그래도 내가 말하려는 의미가 있습니다. (이것은이 경우에는 작업을하지 않습니다하지만) 입력이 미세하지만 완벽하다 무두질, 참조로 전달 된 인수를 수정하는 것은 허용 입력의 표준 forn이다
조 왕

2

자바 스크립트 (Node.js) , 52 바이트

k=>a=>a.filter(b=>b[k]&&([b[k],a]=[a,b[k]]))[0][k]=a

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

Shaggy 덕분에 -7 바이트!

아직 JavaScript 답변을 보지 못했습니다! 내 C # 답변의 포트입니다.


63 바이트 . 아마 더 골프를 칠 수 있습니다.
얽히고 설킨

@Shaggy-nice :) 대부분의 경우 JS 답변이 모든 종류의 미친 일을하는 것을 봅니다. 이번에는 전략이 있었기 때문에 나는 그것을 쐈다.
dana

1
오, 멋지게 골프를 쳤다! :)
얽히고 설킨

2

, 34 28 21 바이트

θJη⁰≔ΦKDLθ↓℅ιζUMζ§ζ⊖κ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 문자열 배열을 입력으로 사용합니다. 인덱스가 0입니다. 편집 : 이제 수정 PeekDirection되었으므로 직접 조작 할 수 있습니다. 설명:

θ

입력 문자열을 인쇄하십시오.

Jη⁰

회전 할 열의 맨 위로 이동하십시오.

≔ΦKDLθ↓℅ιζ

인쇄 된 셀을 추출하십시오.

UMζ§ζ⊖κ

인쇄 된 각 셀을 이전 셀 값 (순환)으로 바꿉니다. 편리하게 PeekDirection호출 할 때 셀 값을 읽으 므로 MapCommand호출이 새 값을 셀에 기록 한다는 사실은 중요하지 않습니다.


1

-rn , 32 바이트

POgY#(g@_)>aFI,#gFiyAE@ySsg@i@ag

인덱스가 0이면 아래로 회전합니다. 온라인으로 사용해보십시오!

회전에 참여하기에 충분히 긴 모든 행의 인덱스를 찾기위한 필터입니다. 그런 다음 해당 행을 반복하여 각 행의 해당 문자를 temp 변수로 바꿉니다 s. 끝에서 첫 번째 행을 다시 방문하면 더미 값이 다시 바뀝니다.


1

젤리 , 19 바이트

ZnÄ×$ịḟ¹ṙ-;ɗɗʋ€⁹¦⁶Z

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

1- 색인. 아래로 회전합니다. 오른쪽에 채워진 젤리 문자열 목록 (문자 목록)을 첫 번째 인수로 사용하고 k를 두 번째 인수로 사용하는 모나드 링크입니다. 오른쪽 여백을 제외하고는 입력에서 공백이 금지되지만 다른 모든 문자는 허용됩니다.

TIO에서 구현 된대로 바닥 글은 단일 문자열 입력을 문자열 목록으로 분할하고 오른쪽 패드로 만들지 만 편의상 사용됩니다. 내가 알기로, 그 단계의 결과는 규칙에 따라 메인 링크에 대한 입력이 허용됩니다.


1

GFortran , 199 바이트

공백을 제거 하여 -4내재 된 정수를 사용하여 파일
-14 대신 stdin에서 읽음으로써 -20 정도i, k, n
::

사용자가 첫 번째 줄에 입력해야 k하며 n, k회전 할 열은 어디에 있고 n텍스트 행 수입니다. 후속 입력은 회전 할 텍스트 줄입니다. 이것은 쓰는 고통이었다! 포트란은 너무 비천합니다!

character(99),allocatable::A(:);character(1)r,s
read(*,*)k,n;allocate(A(n))
do i=1,n;read(*,'(A)')A(i);r=A(i)(k:k)
if(r.ne.''.or.r.ne.' ')then;A(i)(k:k)=s;s=r;endif;enddo
A(1)(k:k)=s;print'(A)',A;end

0

T-SQL, 195 바이트

WITH C as(SELECT rank()over(order by i)r,sum(1)over()c,*FROM @t
WHERE len(x)>=@)SELECT
isnull(stuff(c.x,@,1,substring(e.x,@,1)),t.x)FROM @t t
LEFT JOIN c ON t.i=c.i
LEFT JOIN c e ON e.r%c.c+1=c.r

온라인 ungolfed 버전 사용해보기

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