Chỉ mục Cha-Cha Slide


12

Giới thiệu:

Mặc dù ban đầu tôi có một bài hát tiếng Hà Lan trong đầu, trong đó lời bài hát là: " Doe 'n chủ đề naar voren, en' n chủ đề terug " (dịch là " Tiến lên một bước, và lùi lại một chút "), khi Tôi tìm kiếm lời bài hát đầy đủ, tôi nhận ra họ chỉ qua lại và không bao giờ đi ngang.

Vì vậy, thay vào đó bây giờ tôi sử dụng lời bài hát Mr C The Slide Man hay còn gọi là DJ Casper - Cha-Cha Slide cho thử thách này.

Nếu chúng ta bỏ qua mọi thứ khác và chỉ nhìn vào các từ "trái", "phải", "trở lại" và "hop" (tôi đã tính "hop" là chuyển tiếp) bao gồm số tiền được đề cập, toàn bộ bài hát sẽ có danh sách sau ( Tôi đang sử dụng chữ viết tắt LRBH ở đây):

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

Ở đây, lời bài hát đầy đủ trong đoạn mã JavaScript có thể ẩn (để tiết kiệm dung lượng), trong đó các bước di chuyển và số lượng được bao quanh với dấu ngoặc bị chặn:

Thử thách:

Bây giờ vào thử thách chính nó. Chúng tôi có một, hai, hoặc ba đầu vào . Một trong số đó là danh sách các số nguyên chỉ mục (vì vậy không âm cho chỉ số 0; hoặc dương cho 1 chỉ mục). (Các đầu vào khác là tùy chọn và được giải thích trong các quy tắc thử thách.)

Mỗi trường hợp thử nghiệm sẽ bắt đầu tại một vị trí {x=0, y=0}.
Bây giờ sử dụng danh sách lời bài hát di chuyển và loại bỏ tất cả các di chuyển tại các chỉ số đã cho của danh sách đầu vào. Sau đó, 'đi bộ' qua các bước di chuyển (lên đến chỉ số lớn nhất của mảng đầu vào) và xuất ra vị trí bạn sẽ kết thúc tại.

Các bước di chuyển sẽ thay đổi tọa độ như sau:
- R: x+1
- L: x-1
- H: y+1
- B:y-1

Quy tắc thử thách:

  • Danh sách di chuyển có thể được truy cập theo bất kỳ cách nào bạn muốn. : Có thể là một đầu vào bổ sung; có thể trong một tệp riêng biệt trên đĩa bạn sẽ đọc từ; có thể trong một biến cấp độ lớp bạn truy cập. Nó sẽ phải theo hình thức L, R, BHmặc dù (có thể là một chuỗi hoặc nhân vật-list / mảng), vì vậy bạn có thể tiết kiệm không di chuyển danh sách như 1s và -1s hoặc số nguyên.
  • Danh sách di chuyển được đưa ra ở trên được mã hóa cứng và sẽ luôn giống nhau. (Đó cũng là lý do tại sao nên đặt nó làm trường cấp độ thay vì lấy nó làm đầu vào nếu điều này giúp đếm byte trong câu trả lời của bạn.)
  • Danh sách đầu vào có thể là cả hai chỉ mục 0 hoặc 1 chỉ mục (tùy thuộc vào bạn)
  • Chúng tôi chỉ "đi bộ" di chuyển lên và loại trừ chỉ số lớn nhất của danh sách.
    • : Bạn cũng được phép lấy mục cuối cùng này làm đầu vào số nguyên riêng biệt, thay vì mục cuối cùng của mảng đầu vào.
  • Đầu ra của tọa độ x và y mà chúng ta kết thúc có thể ở bất kỳ định dạng hợp lý nào (mảng số nguyên chứa hai mục, chuỗi phân tách, được in thành STDOUT trên hai dòng riêng biệt, v.v.)
  • Bạn có thể giả sử danh sách đầu vào được sắp xếp từ thấp nhất đến cao nhất (hoặc cao nhất đến thấp nhất nếu đó là những gì bạn thích, trong trường hợp đó, mục đầu tiên là kích thước ban đầu của danh sách di chuyển - nếu không được lấy làm đầu vào tách biệt). Và nó cũng sẽ không chứa bất kỳ chỉ số trùng lặp.
  • Nếu chỉ mục lớn nhất của danh sách đầu vào lớn hơn danh sách di chuyển ở trên (55 di chuyển nằm trong danh sách di chuyển ở trên), chúng tôi sẽ quay lại đầu danh sách (bao nhiêu lần tùy thuộc vào chỉ mục lớn nhất của đầu vào).
  • Bạn được phép xuất ra y,xthay vì x,y, nhưng vui lòng chỉ định điều này trong câu trả lời của bạn nếu bạn làm như vậy.

Thí dụ:

Đầu vào: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]

Ở đây các di chuyển và chỉ số (0-index) trên nhau:

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

Xóa các chỉ mục của danh sách đầu vào, chúng tôi sẽ còn lại các danh sách di chuyển sau:

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

Bây giờ nếu chúng ta đi bộ từ vị trí {0, 0}trên các di chuyển còn lại, chúng ta sẽ có các tọa độ mới sau đây sau mỗi lần di chuyển:

{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}

Vì vậy, đầu ra cuối cùng sẽ là: {-6, 10}

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.

Các trường hợp thử nghiệm:

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}

Chúng ta có thể xuất tọa độ theo thứ tự ngược lại không?
Xù xì

3
@Shaggy Umm, chắc chắn, tại sao không. Miễn là bạn xác định rõ ràng trong câu trả lời của bạn.
Kevin Cruijssen

@Arnauld Có, các bước di chuyển được hiển thị và sẽ không bao giờ thay đổi. Tôi có lẽ sẽ làm rõ điều này rõ ràng hơn nếu nó chưa rõ ràng. (Đó cũng là lý do tại sao bạn có thể có nó dưới dạng trường cấp độ mã hóa cứng nếu nó có lợi cho số byte của bạn.)
Kevin Cruijssen

Đầu ra có thể là một cặp phao?
Jakob

1
Rất muộn với thử thách, nhưng hai trong số các trường hợp thử nghiệm của bạn dường như có đầu vào sai cho trường hợp 1 chỉ mục: thêm 82 trong trường hợp thứ sáu và 29 thay vì 39 trong thử nghiệm thứ ba (cách sắp xếp cho thấy bạn có thể đã dự định rằng thực sự là 28/29, nhưng sản lượng dự kiến ​​được hiển thị là từ việc sử dụng 38/39 ở đó).
- Phục hồi Monica

Câu trả lời:


4

05AB1E , 15 12 byte

Đã lưu 3 byte nhờ Erik the Outgolfer

ÝsKèIêRS¢2ôÆ

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

Ý                 # 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
Câu trả lời tốt đẹp! Thậm chí còn không biết về Æ. Cách thông minh để chỉ đếm tất cả các di chuyển và sử dụng Æđể tính toán sự khác biệt cho các cặp RLBH.
Kevin Cruijssen

Æđã tồn tại mãi mãi phải không? Tôi cho là như vậy, khi tôi không biết gì về nó. Có vẻ như các lệnh tôi nghĩ là "mới" đã tồn tại từ khi bắt đầu, nhưng tôi chưa bao giờ biết cách sử dụng chúng lol. Ồ, +1
Bạch tuộc ma thuật Urn

@MagicOctopusUrn: Nó thực sự đã tồn tại mãi mãi;)
Emigna

7

Ruby , 98 ... 58 55 byte

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

Hãy thử trực tuyến!

Giải trình:

Thủ thuật chính là sử dụng các số phức để biểu diễn các bước di chuyển: 'B' là -i, 'H' là + i, 'L' là -1 và 'R' là +1. Nếu chúng ta chuyển đổi tất cả các bước di chuyển thành số phức, thì với một khoản tiền duy nhất, chúng ta sẽ có kết quả đúng.

Tôi đã thử nhiều cách khác nhau, nhưng sau đó tôi đã tìm thấy phép thuật số 19: chúng ta không cần phải nghịch ngợm với kết hợp regex vì:

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

Vì vậy, hãy tập hợp tất cả lại, tổng hợp, đảo ngược dấu hiệu và chúng ta đã hoàn thành.

Cảm ơn Jakob vì -3 byte


Khéo léo sử dụng số phức! Vì chuỗi di chuyển là cố định, bạn có thể thay thế (m*c+m)[c]bằng m[c%55].
Jakob

4

JavaScript (ES6), 85 byte

Theo các quy tắc thách thức, mã này hy vọng chuỗi phạm vi toàn cầu m sẽ giữ danh sách các bước di chuyển. (Lưu 3 byte, theo đề xuất của @KevinCruijssen.)

Đưa đầu vào dưới dạng danh sách các chỉ số dựa trên 0, được sắp xếp từ thấp nhất đến cao nhất.

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]

Hãy thử trực tuyến!

Làm sao?

Mỗi ký tự di chuyển được chuyển đổi sang vị trí của nó trong chuỗi di chuyển "LBHR...". Chúng tôi nhân kết quả với 3 và áp dụng modulo 5 , cho p . Chúng tôi sau đó có:

  • dx = ((p-1) mod 2)
  • dy = - ((p-2) mod 2)

Trong đó dấu hiệu của một mod b là của a .

 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

Thạch , 14 byte

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

Hãy thử trực tuyến!

Đối số 1 / Đối số bên trái: Chỉ mục dựa trên tối đa 1.
Đối số 2 / Đối số đúng: Chỉ số dựa trên 1.
Đối số 3: Di chuyển danh sách dưới dạng chuỗi. Hàm vẫn có thể sử dụng lại nếu đối số dòng lệnh thứ ba được sử dụng cho mục đích này.


3

Java 10, 129 119 112 107 100 86 byte

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;}

Lấy tối đa là đầu vào bổ sung; danh sách di chuyển là một mảng ký tự ở cấp độ lớp.

Lấy cảm hứng từ @Emigna 05AB1E câu trả lời 's .
-7 byte nhờ @Jakob .
-14 byte nhờ @Geobits .

Hãy thử trực tuyến.

Giải trình:

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ánh xạ tới tọa độ x hoặc y tùy thuộc vào nhân vật ( Thử trực tuyến ):

Letter    Unicode value    /73

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

s[m%55]*3%5-2ánh xạ tới chính xác +1hoặc -1tùy thuộc vào nhân vật ( Dùng thử trực tuyến ):

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
Nếu bạn lấy danh sách chỉ mục làm tập hợp có thể thay đổi, bạn có thể sử dụng a.add(m)làm ifđiều kiện.
Jakob

int c[]có thể int[]c.
Jakob

1
@Jakob Ah, int c[]là từ phiên bản trước, nơi tôi vẫn sử dụng một chỉ mục ithay vì sử dụng m. Và thông minh khi sử dụng Set addthay vì !contains, cảm ơn!
Kevin Cruijssen

1
Bạn có thể tránh phép trừ byte ở cuối bằng cách sử dụng c[2]cho trục (với s[m%55]/73) và đi bộ với một cái gì đó như 3*s[m%55]%5-2(tôi ước tôi có thể thấy một cách để rút ngắn điều đó, nhưng ...). Cùng với một 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];}
chú chim nhạn

@Geobits Cảm ơn! Và -12 byte nhiều hơn bằng cách chỉ trả về int[]thay vì Chuỗi. :)
Kevin Cruijssen

2

Python 3, 85 byte

blà danh sách chỉ mục (a set) và llà chỉ mục kết thúc. Danh sách di chuyển (danh sách chuỗi hoặc ký tự) xuất hiện miễn phí dưới dạng s. Đây là một cổng của câu trả lời Ruby của GB , và một lời giải thích về cách tiếp cận có thể được tìm thấy ở đó.

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

Dùng thử trực tuyến

Ung dung

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

Sạch , 148 ... 130 byte

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]

Hãy thử trực tuyến!

Xác định hàm $ :: [Int] -> (Int, Int), lấy một danh sách (được sắp xếp từ nhỏ nhất đến lớn nhất) để được loại bỏ khỏi các di chuyển trước khi thực hiện foldrcác thao tác áp dụng (0,0).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.