이것이 우리가 굴리는 방법입니다


18

Piet는 여러 가지 이유로 흥미로운 프로그래밍 언어입니다. 오늘 우리는 한 가지 이유, 즉 명령 에 중점을 둘 것 입니다. 롤 명령은 원래 PostScript에서 왔으며 스택을 조작하는 강력한 방법입니다.

롤 명령은 스택의 맨 위 두 요소를 팝업하여 매개 변수로 사용합니다. 첫 번째 값을 팝 turns하고 두 번째 값을 호출합니다 depth. 깊이 n으로 돌리면 스택의 최상위 요소를 가져 와서 스택의 n 번째 요소로 만들고 각 요소를 그 위의 하나 위로 이동합니다. 경우 turns 음이는 반대 방향으로 이루어집니다. 즉, n 번째 요소가 맨 위로 이동하고 다른 요소가 아래로 이동합니다. 이 abs(turns)시간 이 반복 됩니다.

도전

스택을 받아 롤을 실행 한 후 해당 스택을 반환하는 프로그램이나 함수를 작성하십시오.

규칙

  • 입력 및 출력은 목록, 배열, 구분 기호가있는 문자열, 한 번에 하나의 요소로 전달되거나 다른 적절한 형식 일 수 있습니다. 출력은 입력과 동일한 형식이어야합니다.
  • depth 절대 음수가 아니며 스택 길이보다 길지 않습니다.
  • 입력 스택에는 항상 두 가지 이상의 요소가 포함됩니다.
  • 이것은 이므로 각 언어에서 가장 짧은 대답이 이깁니다. 따라서 답변을받지 않습니다.
  • 표준 허점 은 금지되어 있습니다.

테스트 사례

in:  out:
2    
4    
1    3
2    4
3    1
4    2
5    5
6    6

in:  out:
-2   
3
1    2
2    3
3    1

in:  out:
-42
0
1    1
2    2
3    3
4    4
5    5

2
각 언어에서 가장 짧은 답변이 당첨됩니다 . 이것이 [code-golf]의 작동 방식이 아닙니다. 최단 답변이 이깁니다. 기간.
mbomb007


7
나는 이것이 결코 릭 롤링과 관련이 없다는 것에 매우 실망했다.
Christopher

2
@ mbomb007 태그 설명이나 메타에 대한 빠른 검색에서 볼 수 없으므로 그럴 것 같지 않습니다.
Mike Bufardeci

2
@ mbomb007 만약 당신이 그것을 바꾸고 싶다면, "당신이 틀렸고 맞습니다"라고 말하는 것 이외의 다른 주장을 제공해주십시오. 이것에 대한 선례가 있으며, 당신이 기각했으며, 도전에는 정확히 한 명의 승자가 필요하거나 대답을 받아 들여야한다고 말하는 곳은 없습니다.
Mike Bufardeci

답변:


8

하스켈 , 64 62 바이트

편집 : -2 바이트 : @xnor 내가 잘못 생각한 것을 보았습니다.

r의 목록을 가져 와서 반환합니다 Int.

r(t:d:l)|d<1=l|(x,y)<-d%l,(z,w)<-mod t d%x=w++z++y
(%)=splitAt

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

splitAt n llindex n에서 리스트 를 분할하고 , mod나눗셈의 나머지를 계산 하고리스트 를 ++연결합니다.


1
나는 당신이 (%)=splitAtinfix 를 정의하여 2 바이트를자를 수 있다고 생각합니다 .
xnor

@ xnor 오, 나는 어떻게 든 작동하지 않을 것이라고 스스로를 확신시켰다
Ørjan Johansen

8

자바 스크립트 (ES6), 49 47 바이트

(t,d,...a)=>a.splice(t=(t%d+d)%d,d-t).concat(a)

편집 : 스택 요소를 별도의 매개 변수로 사용하여 @Shaggy 덕분에 2 바이트를 절약했습니다. 설명:

  • 회전이 깊이의 배수이면 아무 일도 일어나지 않습니다. 따라서 첫 번째 단계는 회전 모듈로 깊이를 계산하는 것입니다. JavaScript는 나머지를 계산하는 방법 만 알고 있으므로 두 단계로 수행해야합니다.
  • 회전 1하면 맨 위 요소가 요소로 이동합니다 depth. 턴은 2맨 위 두 요소 등 을 이동합니다. 그러나 턴과 깊이 사이에서 요소를 앞쪽으로 이동하여이를 달성 할 수도 있습니다. splice해당 요소를 제거 concat하고 나머지 요소 앞에 추가합니다. (같은 길이이므로 배열 이해를 대신 사용할 수 있습니다.)
  • 와 달리 slice두 번째 매개 변수 splice는 제거 할 요소의 수입니다.

하지가 (t%d+d)%d같은 t%d?
Luke

@Luke No %는 나머지이므로 음수이면 부정적인 대답을줍니다 t.
Neil

(t,d,...a)=>규칙에 따라 입력을 한 번에 한 요소에 전달할 수 있으므로 2 바이트를 절약 할 수 있습니다.
Shaggy

@Shaggy 감사합니다, 나는 그것을 알아 차리지 못했습니다.
Neil

7

CJam, 31 바이트

)\):N@\,0a|={NW*1$1$>)\+@@<\+}*

입력 및 출력은 스택의 배열이며 마지막 요소는 스택의 상단을 나타냅니다.

스택 추적 :

                   e# Stack:                [6 5 4 3 2 1 4 2]
)                  e# Take out first value: [6 5 4 3 2 1 4] 2
\                  e# Swap:                 2 [6 5 4 3 2 1 4]
)                  e# Take out first value: 2 [6 5 4 3 2 1] 4
:N                 e# Store in N:           2 [6 5 4 3 2 1] 4; N=4
@                  e# Rotate:               [6 5 4 3 2 1] 4 2
\                  e# Swap:                 [6 5 4 3 2 1] 2 4
,                  e# Range:                [6 5 4 3 2 1] 2 [0 1 2 3]
0                  e# Push 0:               [6 5 4 3 2 1] 2 [0 1 2 3] 0
a                  e# Wrap in array:        [6 5 4 3 2 1] 2 [0 1 2 3] [0]
|                  e# Logical or:           [6 5 4 3 2 1] 2 [0 1 2 3]
                   e# (This will replace an empty array with [0] to handle a special case of n=0)
=                  e# Get array value:      [6 5 4 3 2 1] 2
{NW*1$1$>)\+@@<\+} e# Push block:           [6 5 4 3 2 1] 2 {NW*1$1$>)\+@@<\+}
*                  e# Preform n times:      [6 5 4 3 2 1]
  N                e# Push N:               [6 5 4 3 2 1] 4
  W*               e# Negate:               [6 5 4 3 2 1] -4
  1$               e# Copy element 1 back:  [6 5 4 3 2 1] -4 [6 5 4 3 2 1]
  1$               e# Copy element 1 back:  [6 5 4 3 2 1] -4 [6 5 4 3 2 1] -4
  >                e# Slice a[-4:]          [6 5 4 3 2 1] -4 [4 3 2 1]
  )                e# Take first value:     [6 5 4 3 2 1] -4 [4 3 2] 1
  \                e# Swap:                 [6 5 4 3 2 1] -4 1 [4 3 2]
  +                e# Append:               [6 5 4 3 2 1] -4 [1 4 3 2]
  @@               e# Rotate twice:         [1 4 3 2] [6 5 4 3 2 1] -4
  <                e# Slice a[:-4]:         [1 4 3 2] [6 5]
  \                e# Swap:                 [6 5] [1 4 3 2]
  +                e# Append:               [6 5 1 4 3 2]
e# Preform the block again:                 [6 5 2 1 4 3]

6

Mathematica, 58 50 바이트

편집 : 8 바이트를 절약 한 Martin Ender에게 감사드립니다.

Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&@@#&

설명:

리스트의 시작이 스택의 상단을 나타내는리스트를 기대하는 순수 함수. 우리는리스트의 요소를 순수한 함수로 전달합니다 Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&. x는 세 번째 인수로 시작하는 요소 시퀀스로 설정됩니다. 그런 다음 첫 번째 #2(두 번째 인수) 요소를 x왼쪽 #(첫 번째 인수) 시간으로 회전 한 다음 Join의 나머지 요소를 회전시킵니다 x.

3스택 요소를 인수로 인수로 처음에 목록에 포함시키지 않고 함수에 직접 전달 하면 바이트 가 절약 되지만 입력 및 출력 형식이 일치하지 않습니다.

독창적 인 솔루션 :

#/.{t_,d_,x___}:>{x}~Take~d~RotateLeft~t~Join~Drop[{x},d]&

이 일련의 삽입 함수에 대해 실제로 만족스러운 점이 있습니다. 첫 번째 요소를 왼쪽 으로 회전하고 의 나머지 요소를 결합한 결과 로 목록을 첫 번째 요소 t, 두 번째 요소 d및 나머지 요소 x로 바꿉니다 .d{x}t{x}


1
좋은! ±대체 규칙 의 1 바이트 접두사 함수 insetad를 사용하여 3 바이트를 저장 TakeDrop하고 다음과 같이 활용하여 1 바이트를 절약 할 수 있습니다 . ±{t_,d_,x___}:=#~RotateLeft~t~Join~#2&@@{x}~TakeDrop~d
Greg Martin

방금 Greg와 같은 내용을 언급하려고했지만 실제로는 더 짧아 질 수 있습니다. 어느 (이 입력이 걸리기 때문에 그 비트 사기 비록 이름없는 가변 기능을 ...&[1, 1, 3, 4]하고 반환 {3, 4}또는 수동으로 그렇게 Apply처음에 : Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&@@#&(단지 명확하게하기 위해, 내 첫 번째 제안은 생략 @@#&).
마틴 청산

5

루비, 40 바이트

x=->s{n,d,*s=s;s[0,d]=s[0,d].rotate n;s}

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

입력을 목록으로 가져 와서 목록을 리턴합니다. rotate포지티브 회전과 네거티브 회전을 모두 처리 할 수 있는 내장 기능이 있다는 사실 이 사소한 일입니다.


5

파이썬, 141 98 87 74 바이트

@Cole 덕분에 11 바이트 절약

def f(s):*s,d,t=s;n=len(s)-d;return s*0**d or s[:n]+s[-t%d-d:]+s[n:-t%d-d]

마지막 요소가 스택의 최상위 인 목록으로 입력을받습니다.

0ⁿ 트릭을 사용하여 0 심도 및 파이썬의 부호 조정 모듈로 연산자를 필터링하여 잘라낼 목록의 일부를 결정합니다.


왜 그냥 가져 가지 f(s,t,d)?
cole

@Cole 포장 풀기 주셔서 감사합니다! 그러나, 나는 당신이 무엇을 의미했는지 알 수 없습니다 f(s,t,d)(입력은 전체 스택입니다).
Uriel

포장 풀기를위한 멋진 아이디어, 나는 당신이 그것에 대해 신용해야한다고 생각하지 않습니다 (변수를 따로 따로 제안하는 것이 좋습니다). 입력 스펙은 깊이를 가져와 스택에서 별도의 변수로 바꾼 것처럼 보입니다. "입력 및 출력은 목록, 배열, 구분 기호가있는 문자열, 한 번에 하나의 요소로 전달되거나 다른 적절한 형식 일 수 있습니다. 출력은 입력과 같은 형식이어야합니다. "
cole

로 1 바이트를 저장할 수 있습니다 r=-t%d-d. 또한, 교체 s*0**d로하는 s*(d<1)바이트 수를 유지하지만 어쩌면 가독성을 (즉, 목표입니다하지 않는 것이)이 향상됩니다. 나는 0**0==1파이썬에서 그것을 알지 못했다 . 흥미 롭다.
벤 프랭클

@BenFrankel 내가 할 수없는 저장 -t%d-d(내가 전에 그랬던 것처럼) 값으로, 때 때문에 d됩니다 0이것은 0으로 나누기 예외가 발생하게됩니다.
Uriel

3

자바 스크립트 ES6, 109 92 바이트

x=>{for(i=x.shift(),i=i>0?i:-i,j=x.shift();i-->0&&j>0;)x=x.splice(j,1).concat(x);return x}

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

정수 배열의 형태로 입력을받습니다.
또한 화살표에 카운트가 있습니다 : P

설명:

이 코드는 shift 함수를 사용하여 목록의 처음 두 요소를 추출합니다.

그런 다음 첫 번째 요소의 절대 값인 회전 수를 가져옵니다.

Javascript는 인덱스가 0이므로 깊이 인덱스는 1 씩 감소해야합니다.

깊이 인덱스가 0 또는 1 인 경우 아무 것도 변경하지 않아야하지만 감소로 인해 인덱스 0은 변경을 유발합니다. 따라서 깊이 인덱스가 <= 0이 아닌 경우 루프를 종료하십시오.

splice (a, b) 함수는 배열에서 시작 색인 a를 사용하여 길이 b의 하위 배열을 반환하고 해당 요소없이 원래 배열을 남깁니다.

원래 배열의 나머지 부분과 연결되면 깊이 인덱스에서 배열의 단일 회전입니다.

이 작업을 n 번 수행하면 (여기서 n은 회전 수임) 결과 배열은 롤 연산자의 결과입니다.



2

TI-베이직 141 150 바이트 (noncompeting)

Prompt L1
L1(1→T
L1(2→D
seq(L1(C),C,3,dim(L1→L1
If TD>0
Then
For(A,1,T
L1(1→B
For(C,2,D
L1(C→L1(C–1
End
B→L1(D
End
End
If TD<0
Then
For(A,1,-T
L1(D→B
For(C,D,2,-1
L1(C–1→L1(C
End
B→L1(1
End
End
L1

편집 : 깊이가 0 인 고정 된 경우 (+ 9 바이트)

TI-Basic은 길이가 0 인 목록을 지원하지 않으므로이 방법은 길이가 2 개인 입력에서는 작동하지 않습니다.

설명:

Prompt L1                # 4 bytes, input list
L1(1→T                   # 7 bytes, turns
L1(2→D                   # 7 bytes, depth
seq(L1(C),C,3,dim(L1→L1   # 18 bytes, remove turns and depth from list
If TD>0                  # 6 bytes, if turns is positive and depth is nonzero (can't be negative)
Then                     # 2 bytes
For(A,1,T                # 7 bytes, do this 'turns' times
L1(1→B                    # 7 bytes, backup the first item
For(C,2,D                # 7 bytes, shuffle the rest along
L1(C→L1(C–1               # 12 bytes
End                      # 2 bytes
B→L1(D                   # 7 bytes, restore the backup to where it should be
End                      # 2 bytes
End                      # 2 bytes
If TD<0                  # 6 bytes, if T is negative and D is nonzero
Then                     # 2 bytes
For(A,1,-T               # 8 bytes, do this -'turns' times
L1(D→B                   # 7 bytes, backup the Dth item
For(C,D,2,-1             # 10 bytes, shuffle the items the other way
L1(C–1→L1(C              # 12 bytes
End                      # 2 bytes
B→L1(1                   # 7 bytes, restore backup to where it belongs
End                      # 2 bytes
End                      # 2 bytes
L1                       # 2 bytes, implicitly return

2 요소 목록 사례를 처리하는 코드도 필요하다고 생각합니다. 현재에서 오류가 발생합니다 seq(.
lirtosiast

1

배치, 163 바이트

@set s=
@set r=
@set/ad=%2,t=(%1%%d+d)%%d
:l
@shift
@set/af=t-=1,f^^=d-=1
@if %f% lss 0 (set r=%r% %2)else set s=%s% %2
@if not "%3"=="" goto l
@echo%r%%s%

입력을 명령 줄 매개 변수로 사용하고 공백으로 구분 된 목록을 출력합니다. 변수 사이의 t및 변수 d로 추출되어 r변수 앞에 추가 될 수 있으므로 s다른 모든 매개 변수를받습니다.

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