차차 슬라이드 인덱싱


12

소개:

원래는 내 머리 속에 네덜란드 노래가 있었지만 가사는 다음과 같습니다. " Doe 'n stapje naar voren, en'n stapje terug "( " 조금 전진하고 조금 뒤로 물러서서 " 나는 완전한 가사를 찾았다.

대신, 저는 이제이 도전을 위해 Mr C The Slide Man aka DJ Casper-Cha-Cha Slide 의 가사를 사용합니다 .

우리가 다른 모든 것을 무시하고 언급 된 양을 포함하여 "왼쪽", "오른쪽", "뒤로"및 "홉"(앞으로 "홉"으로 간주)이라는 단어 만 보면 전체 노래의 목록은 다음과 같습니다 ( 약어 LRBH를 사용하고 있습니다.)

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

숨길 수있는 JavaScript 코드 스 니펫 (공간을 절약하기위한)의 전체 노래 가사는 이동과 양이 괄호로 묶여 있습니다.

도전:

이제 도전 자체에. 하나, 둘 또는 세 개의 입력 †을 취 합니다. 그중 하나는 인덱스-정수 목록입니다 (따라서 0- 인덱스에서는 음수가 아니거나 1- 인덱싱에서는 양수가 아닙니다). (다른 입력은 선택 사항이며 챌린지 규칙에 설명되어 있습니다.)

모든 테스트 케이스는 위치에서 시작됩니다 {x=0, y=0}.
이제 가사 목록을 사용하고 입력 목록의 주어진 색인에서 모든 움직임을 제거 하십시오. 그런 다음 이동을 통해 '걸어서'(입력 배열의 최대 색인까지) 최종 위치를 출력합니다.

동작은 다음과 같이 좌표를 변경합니다
.- R: x+1
- L: x-1
- H: y+1
- B:y-1

도전 규칙 :

  • 이동 목록은 원하는 방식으로 액세스 할 수 있습니다. † : 추가 입력이 가능합니다. 읽을 디스크의 별도 파일에있을 수 있습니다. 액세스하는 클래스 수준 변수에있을 수 있습니다. 그것은의 형태로해야 할 것이다 L, R, B그리고 H하지만 (문자열이나 문자 목록 / 배열 할 수있다)를 그래서 당신 할 수 없습니다로 이동-리스트에 저장 1s와 -1s 또는 정수.
  • 위에 제공된 이동 목록은 하드 코딩되어 있으며 항상 동일합니다. (왜냐하면 이것이 답변의 바이트 수에 도움이된다면 입력으로 사용하는 대신 클래스 수준 필드로 입력하는 것이 좋습니다.)
  • 입력 목록은 0 색인 또는 1 색인 (최대 사용자)
  • 우리는 목록의 가장 큰 색인을 제외하고 이동을 '보행'합니다.
    • † : 이 마지막 항목을 입력 배열의 마지막 항목 대신 분리 된 정수 입력으로 사용할 수도 있습니다.
  • 우리가 끝내는 x 및 y 좌표의 출력은 합리적인 형식 (두 개의 항목을 포함하는 정수 배열, 구분 된 문자열, 두 개의 분리 된 줄에 STDOUT로 인쇄 등)이 될 수 있습니다
  • 입력 목록이 가장 낮은 것에서 가장 높은 것 (또는 선호하는 경우 가장 높은 것에서 가장 낮은 것까지 정렬 된 것으로 가정 할 수 있습니다.이 경우 첫 번째 항목은 이동 목록의 초기 크기입니다 (분리 된 입력으로 간주되지 않는 경우)). 또한 중복 인덱스도 포함하지 않습니다.
  • 입력 목록의 가장 큰 색인이 위의 이동 목록보다 큰 경우 (55 개의 이동이 위의 이동 목록에 있음) 목록의 처음으로 다시 감습니다 (최대 색인에 따라 필요한만큼 여러 번) 입력).
  • y,x대신에 출력 할 수 있지만 가능하면 x,y답변에 지정하십시오.

예:

입력: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]

여기에서 서로의 움직임과 (0 인덱스) 지수 :

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
L, B, H, R, L, L, B, H, R, L, B, H, H, R, R, L, L, L, R, L, B, H, H, H, H, R, R, L, L, L, B, H, H, H, H, H, R, L, R, L, R, L, H, R, L, L, B, H, H, L, R, L, B, H, H, L, B, H, R, L, L, B, H, R, L

입력 목록의 색인을 제거하면 다음과 같은 이동 목록이 남습니다.

1, 2, 3, 5, 6, 7, 9,11,12,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,35,36,37,38,39,40,41,45,46,47,48,49,51,52,54,55,57,58,61,62,63
B, H, R, L, B, H, L, H, H, L, L, L, R, L, B, H, H, H, H, R, R, L, L, B, H, H, H, H, R, L, R, L, R, L, L, B, H, H, L, L, B, H, L, H, R, B, H, R

이제 {0, 0}남은 동작 위의 위치에서 걷게되면 매 움직임마다 다음과 같은 새로운 좌표가 생깁니다.

{0,0};B,{0,-1};H,{0,0};R,{1,0};L,{0,0};B,{0,-1};H,{0,0};L,{-1,0};H,{-1,1};H,{-1,2};L,{-2,2};L,{-3,2};L,{-4,2};R,{-3,2};L,{-4,2};B,{-4,1};H,{-4,2};H,{-4,3};H,{-4,3};H,{-4,5};R,{-3,5};R,{-2,5};L,{-3,5};L,{-4,5};B,{-4,4};H,{-4,5};H,{-4,6};H,{-4,7};H,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};L,{-5,8};B,{-5,7};H,{-5,8};H,{-5,9};L,{-6,9};L,{-7,9};B,{-7,8};H,{-7,9};L,{-8,9};H,{-8,10};R,{-7,10};B,{-7,9};H,{-7,10};R,{-6,10}

따라서 최종 출력은 다음과 같습니다. {-6, 10}

일반 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙이 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 링크를 추가하십시오.
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

테스트 사례 :

0-indexed input: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]
1-indexed input: [1,5,9,11,14,15,28,35,43,44,45,51,54,57,60,61,65]
Output: {-6, 10}

0-indexed input: [55]    (Note: There are 55 moves in the unmodified list)
1-indexed input: [56]    (Note: There are 55 moves in the unmodified list)
Output: {-6, 11}

0-indexed input: [0,1,4,5,6,9,10,15,16,17,19,20,27,29,30,37,38,39,41,44,45,46,49,51,52]
1-indexed input: [1,2,5,6,7,10,11,16,17,18,20,21,28,30,31,38,39,40,42,45,46,47,50,52,53]
Output: {10, 16}

0-indexed input: [2,3,7,8,11,12,13,14,18,21,22,23,24,25,26,31,32,33,34,35,36,38,40,42,43,47,48,50,53]
1-indexed input: [3,4,8,9,12,13,14,15,19,22,23,24,25,26,27,32,33,34,35,36,37,39,41,43,44,48,49,51,54]
Output: {-18, -7}

0-indexed input: [0]
1-indexed input: [1]
Output: {0, 0}

0-indexed input: [4,6,7,11,12,13,15,17,20,28,31,36,40,51,59,66,73,74,80,89,92,112,113,114,116,120,122,125,129,134,136,140,145,156,161,162,165,169,171,175,176,178,187,191,200]
1-indexed input: [5,7,8,12,13,14,16,18,21,29,32,37,41,52,60,67,74,75,81,90,93,113,114,115,117,121,123,126,130,135,137,141,146,157,162,163,166,170,172,176,177,179,188,192,201]
Output: {-17, 37}

0-indexed input: [25,50,75,100,125,150,175,200,225,250]
1-indexed input: [26,51,76,101,126,151,176,201,226,251]
Output: {-28, 49}

좌표를 역순으로 출력 할 수 있습니까?
얽히고 설킨

3
@Shaggy Umm, 왜 안 되겠 어? 답변에 명확하게 명시하는 한.
Kevin Cruijssen

@Arnauld 그렇습니다. 움직임은 표시된 것이며 결코 바뀌지 않습니다. 아직 명확하지 않은 경우 더 명확하게 설명하겠습니다. (따라서 바이트 수에 도움이된다면 하드 코딩 된 클래스 레벨 필드로 사용할 수있는 이유도 있습니다.)
Kevin Cruijssen 2016 년

출력이 플로트 쌍이 될 수 있습니까?
Jakob

1
매우 어려운 과제이지만 두 가지 테스트 사례가 1- 인덱싱 된 사례에 대해 잘못된 입력을 한 것 같습니다. 여섯 번째 사례에서 82 개, 세 번째 테스트 사례에서 39 개 대신 29 개 (정렬은 실제로 28/29이지만 예상 출력은 38/39를 사용하는 것입니다).
sundar-복원 모니카

답변:


4

05AB1E , 15 12 바이트

Outgolfer Erik 덕분에 3 바이트 절약

ÝsKèIêRS¢2ôÆ

온라인으로 사용해보십시오! 또는 테스트 스위트

설명

Ý                 # push range [0 ... input_int]
 sK               # remove all elements in input_list from this range
   è              # cyclically index into the moves-list with the remaining elements
    Iê            # push the unique chars of the move-list, sorted
      R           # reverse
       S¢         # count the occurrences of each char in "RLHB"
         2ô       # split into 2 parts
           Æ      # reduce each part by subtraction

1
좋은 대답입니다! 에 대해 몰랐습니다 Æ. 모든 움직임 Æ을 계산하고 RLBH쌍 의 차이를 계산하는 데 사용 하는 현명한 방법 .
케빈 크루이 센

Æ영원히 존재하지 않았습니까? 내가 알지 못하는 것처럼 보았을 것입니다. 처음에 "새"라고 생각되는 명령이 처음부터 존재 한 것처럼 보이지만 LOL을 사용하는 방법을 몰랐습니다. Oh, +1
Magic Octopus Urn

@MagicOctopusUrn : 그것은 실제로 영원히 존재했다;)
Emigna

7

루비 , 98 ... 58 55 바이트

->a{([*0..a[-1]]-a).sum{|c|-1i**(m[c%55].ord%19)}.rect}

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

설명:

주요 트릭은 복잡한 숫자를 사용하여 이동을 나타냅니다. 'B'는 -i, 'H'는 + i, 'L'은 -1, 'R'은 +1입니다. 모든 동작을 복소수로 변환하면 단일 합계로 올바른 결과를 얻습니다.

다른 방법으로 시도했지만 마법 번호 19를 찾았습니다. 다음과 같은 이유로 정규식 일치를 피할 필요가 없습니다.

B  is ASCII 66; 66%19=9  and i^9  = i
H  is ASCII 72; 72%19=15 and i^15 =-i
L  is ASCII 76; 72%19=0  and i^0  = 1
R  is ASCII 82; 82%19=6  and i^6  =-1

자, 모두 합쳐서 부호를 뒤집 으면 끝났습니다.

-3 바이트를위한 감사 Jakob


복소수의 영리한 사용! 이동 문자열이 고정되어 있기 때문에, 당신은 대체 할 수 (m*c+m)[c]와 함께 m[c%55].
Jakob

4

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

챌린지 규칙에 따라이 코드는 전역 범위 문자열 m 이 이동 목록을 보유 할 것으로 예상합니다 . (@KevinCruijssen에서 제안한대로 3 바이트 저장)

입력을 0부터 시작하여 가장 낮은 순서에서 높은 순서로 나열합니다.

a=>a.map(g=i=>j++<i&&g(i,p=m.search(m[~-j%55])*3%5,x+=--p%2,y-=--p%2),j=x=y=0)&&[x,y]

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

어떻게?

각 이동 문자는 이동 문자열에서 해당 위치로 변환됩니다 "LBHR...". 결과에 3을 곱하고 모듈로 5를 적용 하면 p가 됩니다. 우리는 다음을 가지고 있습니다.

  • dx = ((p-1) 모드 2)
  • dy =-((p-2) 모드 2)

의 부호 어디 모드 B는 의이다 .

 character | position | * 3 | mod 5 | dx | dy
-----------+----------+-----+-------+----+----
    'L'    |     0    |  0  |   0   | -1 |  0
    'B'    |     1    |  3  |   3   |  0 | -1
    'H'    |     2    |  6  |   1   |  0 | +1
    'R'    |     3    |  9  |   4   | +1 |  0

3

젤리 , 14 바이트

Rḟị⁵ċⱮ⁵QṢṚ¤_2/

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

인수 1 / 왼쪽 인수 : 최대 1 기반 인덱스.
인수 2 / 오른쪽 인수 : 1 기반 인덱스.
인수 3 :리스트를 문자열로 이동합니다. 이 목적으로 세 번째 명령 줄 인수를 사용하면 함수를 계속 재사용 할 수 있습니다.


3

자바 10 129 119 112 107 100 86 바이트

a->m->{var r=new int[2];for(;m-->0;)r[s[m%55]/73]-=a.add(m)?s[m%55]*3%5-2:0;return r;}

추가 입력으로 최대 값을 가져옵니다. 이동 목록은 클래스 수준의 문자 배열입니다.

@Emigna 의 05AB1E 답변에서 영감을 얻었습니다 . @Jakob
덕분에 -7 바이트 . @Geobits 덕분에 -14 바이트 .

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

설명:

a->m->{              // Method with Integer-Set & int parameters and int-array return
  var c=new int[2];  //  [x,y] result-array, starting at {0,0}
  for(;m-->0;)       //  Use the `m` input as index, and loop in the range (`m`, 0]
    r[s[m%55]/73]-=  //   Subtract from either x or y based on the character:
     a.add(m)?       //    If the input-set doesn't contain the current index `m`:
      s[m%55]*3%5-2  //     Modify the x or y coordinate based on the character
     :               //    Else:
      0;             //     Leave the x or y coordinate unchanged
  return r;}         //  Return count(R)-count(L) and count(H)-count(B) as result

s[m%55]/73캐릭터에 따라 x 또는 y 좌표에 매핑됩니다 ( 온라인으로 시도 ).

Letter    Unicode value    /73

B         66               0
H         72               0
L         76               1
R         82               1

s[m%55]*3%5-2올바른 +1또는 -1캐릭터에 따라 매핑됩니다 ( 온라인으로 시도 ).

Letter    Unicode value    *3     %5    -2

B         66               198    3     1
H         72               216    1     -1
L         76               228    3     1
R         82               246    1     -1

1
인덱스 목록을 변경 가능한 세트로 사용 a.add(m)하면 if조건으로 사용할 수 있습니다 .
Jakob

그리고 int c[]될 수 있습니다 int[]c.
Jakob

1
@Jakob Ah int c[]는 이전 버전에서 사용했지만 여전히을 사용하는 i대신 색인 을 사용했습니다 m. 그리고 add대신 Set을 사용하는 것이 현명합니다 !contains. 감사합니다!
Kevin Cruijssen

1
c[2]축 (with s[m%55]/73)을 사용하고 다음과 같이 걸어서 바이트 호깅 뺄셈을 피할 수 있습니다 3*s[m%55]%5-2. 삼항과 함께 a->m->{var c=new int[2];for(;m-->0;)c[s[m%55]/73]-=a.add(m)?3*s[m%55]%5-2:0;return c[1]+","+c[0];}98입니다.
Geobits

트윗 담아 가기 그리고 int[]String 대신에 -12 바이트 만 더 반환하면 됩니다. :)
Kevin Cruijssen 2016 년

2

파이썬 3, 85 바이트

b색인 목록 (a set)이며 l최종 색인입니다. 이동 목록 (문자열 또는 문자 목록)은로 표시됩니다 s. 이것은 GB 의 Ruby 답변 포트이며 접근 방식에 대한 설명을 찾을 수 있습니다.

def f(b,l):r=sum(-1j**(ord(s[i%55])%19)for i in set(range(l))-b);print(r.real,r.imag)

온라인 시도

언 골프

def f(b, l):
    r = sum(
        -1j ** (ord(s[i % 55]) % 19)
        for i in set(range(l)) - b
    );
    print(r.real, r.imag)


1

클린 , 148 ... 130 바이트

import StdEnv
$i=foldr(\a(x,y)|any((==)a)i=(x,y)=case m.[a rem 55]of'H'=(x,y+1);'B'=(x,y-1);'L'=(x-1,y);_=(x+1,y))(0,0)[0..last i]

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

적용 가능한 작업을 완료 $ :: [Int] -> (Int, Int)하기 전에 이동에서 제거 할 (최소에서 최대로 정렬 된) 인덱스 목록을 사용 하여 함수를 정의합니다 .foldr(0,0)

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