Pengindeksan Slide Cha-Cha

12

Pengantar:

Meskipun saya awalnya memiliki lagu Belanda di kepala saya, di mana liriknya adalah: " Doe 'n stapje naar voren, en' n stapje terug " (yang diterjemahkan menjadi " Ambil sedikit langkah maju, dan sedikit mundur "), ketika Saya mencari lirik lengkap, saya menyadari mereka hanya bolak-balik, dan tidak pernah menyamping.

Jadi, alih-alih sekarang saya menggunakan lirik dari Mr C The Slide Man alias DJ Casper - Cha-Cha Slide untuk tantangan ini.

Jika kita mengabaikan yang lainnya dan hanya melihat kata "kiri", "kanan", "kembali", dan "hop" (saya menghitung "hop" ke depan) termasuk jumlah yang disebutkan, lagu lengkap akan memiliki daftar berikut ( Saya menggunakan singkatan LRBH di sini):

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

Di sini lirik lagu lengkap dalam cuplikan kode JavaScript yang dapat disembunyikan (untuk menghemat ruang), tempat gerakan dan jumlahnya dikelilingi dengan tanda kurung yang diblokir:

Tantangan:

Sekarang ke tantangan itu sendiri. Kami mengambil satu, dua, atau tiga input . Salah satunya adalah daftar bilangan bulat indeks (jadi non-negatif untuk 0-diindeks; atau positif untuk 1-diindeks). (Input lain bersifat opsional dan dijelaskan dalam aturan tantangan.)

Setiap test case akan dimulai pada suatu posisi {x=0, y=0}.
Sekarang gunakan daftar lirik gerakan dan hapus semua gerakan pada indeks daftar masukan yang diberikan. Kemudian 'berjalan' di atas gerakan (hingga indeks terbesar dari array-input) dan output posisi Anda akan berakhir di.

Bergerak akan mengubah koordinat sebagai berikut:
- R: x+1
- L: x-1
- H: y+1
- B:y-1

Aturan tantangan:

  • Daftar bergerak dapat diakses dengan cara apa pun yang Anda inginkan. †: Dapat menjadi input tambahan; bisa dalam file terpisah di disk yang akan Anda baca; bisa dalam variabel tingkat kelas yang Anda akses. Ini akan harus dalam bentuk L, R, Bdan Hmeskipun (dapat berupa string atau karakter-list / array), sehingga Anda tidak bisa menyimpan bergerak-daftar sebagai 1s dan -1s atau bilangan bulat.
  • Daftar-pindah yang diberikan di atas adalah kode-keras dan akan selalu sama. (Itulah mengapa tidak apa-apa untuk menempatkannya sebagai bidang tingkat kelas alih-alih menganggapnya sebagai input jika ini membantu byte-count jawaban Anda.)
  • Input-list dapat berupa 0-diindeks atau 1-diindeks (terserah Anda)
  • Kami hanya 'menapaki' pergerakan ke atas dan mengecualikan indeks terbesar dari daftar.
    • †: Anda juga diperbolehkan mengambil item terakhir ini sebagai input integer yang terpisah, alih-alih item terakhir dari array-input.
  • Output dari koordinat x dan y yang kita dapatkan bisa dalam format yang wajar (integer-array yang berisi dua item, string yang dibatasi, dicetak ke STDOUT pada dua baris yang terpisah, dll.)
  • Anda dapat menganggap daftar input diurutkan dari terendah ke tertinggi (atau tertinggi ke terendah jika itu yang Anda inginkan, dalam hal ini item pertama adalah ukuran awal dari daftar bergerak - jika tidak diambil sebagai input yang terpisah). Dan itu juga tidak akan berisi indeks yang digandakan.
  • Jika indeks terbesar dari daftar input lebih besar dari daftar langkah di atas (55 langkah ada di daftar bergerak di atas), kami membungkus kembali ke awal daftar lagi (sebanyak yang diperlukan tergantung pada indeks terbesar dari input).
  • Anda diizinkan untuk menghasilkan y,xbukan x,y, tetapi harap tentukan ini dalam jawaban Anda jika Anda melakukannya.

Contoh:

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

Di sini gerakan dan (indeks-0) indeks di atas satu sama lain:

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

Menghapus indeks dari daftar input, kita akan memiliki sisa daftar berikut:

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

Sekarang jika kita berjalan dari posisi {0, 0}melewati gerakan yang tersisa, kita akan memiliki koordinat baru berikut setelah setiap gerakan:

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

Jadi hasil akhirnya adalah: {-6, 10}

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

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}
Kevin Cruijssen
sumber
Bisakah kita mengeluarkan koordinat dalam urutan terbalik?
Shaggy
3
@ Shaggy Umm, tentu, kenapa tidak. Selama Anda jelas menentukannya dalam jawaban Anda.
Kevin Cruijssen
@Arnauld Ya, gerakannya adalah yang ditampilkan dan tidak akan pernah berubah. Saya mungkin akan mengklarifikasi ini lebih jelas jika belum jelas. (Itulah sebabnya Anda dapat menjadikannya sebagai bidang tingkat kelas hardcoded jika itu akan menguntungkan byte-count Anda.)
Kevin Cruijssen
Bisakah output menjadi sepasang pelampung?
Jakob
1
Sangat terlambat untuk tantangan, tetapi dua dari kasus uji Anda tampaknya memiliki input yang salah untuk kasus 1-diindeks: 82 tambahan di yang keenam, dan 29 bukannya 39 di testcase ketiga (pengurutan menunjukkan Anda mungkin bermaksud bahwa sebenarnya 28/29, tetapi output yang diharapkan ditampilkan dari menggunakan 38/39 di sana).
sundar - Reinstate Monica

Jawaban:

4

05AB1E , 15 12 byte

Disimpan 3 byte berkat Erik the Outgolfer

ÝsKèIêRS¢2ôÆ

Cobalah online! atau sebagai Test suite

Penjelasan

Ý                 # 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
Emigna
sumber
1
Jawaban bagus! Bahkan tidak tahu Æ. Cara cerdas untuk hanya menghitung semua gerakan dan gunakan Æuntuk menghitung perbedaan untuk RLdan BHpasangan.
Kevin Cruijssen
Æsudah ada selamanya, bukan? Saya berasumsi begitu, mengingat saya tidak tahu tentang itu. Sepertinya perintah yang saya pikir "baru" sudah ada sejak awal, tapi saya tidak pernah tahu bagaimana menggunakannya lol. Oh, +1
Guci Gurita Ajaib
@MagicOctopusUrn: Itu memang ada selamanya;)
Emigna
7

Ruby , 98 ... 58 55 byte

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

Cobalah online!

Penjelasan:

Trik utamanya adalah menggunakan bilangan kompleks untuk mewakili gerakan: 'B' adalah -i, 'H' adalah + i, 'L' adalah -1 dan 'R' adalah +1. Jika kita mengonversi semua gerakan menjadi bilangan kompleks, maka dengan jumlah tunggal kita mendapatkan hasil yang tepat.

Saya mencoba berbagai cara, tetapi kemudian saya menemukan keajaiban nomor 19: kita tidak perlu bermain-main dengan pencocokan regex karena:

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

Jadi, kumpulkan semuanya, jumlahkan, balikkan tanda itu, dan kita sudah selesai.

Terima kasih Jakob untuk -3 byte

GB
sumber
Penggunaan bilangan kompleks secara cerdik! Karena string pemindahan sudah diperbaiki, Anda dapat menggantinya (m*c+m)[c]dengan m[c%55].
Jakob
4

JavaScript (ES6), 85 byte

Sesuai aturan tantangan, kode ini mengharapkan string global-scope m untuk menyimpan daftar gerakan. (Menyimpan 3 byte, seperti yang disarankan oleh @KevinCruijssen.)

Mengambil input sebagai daftar indeks berbasis 0, dipesan dari terendah ke tertinggi.

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]

Cobalah online!

Bagaimana?

Setiap karakter move dikonversi ke posisinya dalam string move "LBHR...". Kami mengalikan hasilnya dengan 3 dan menerapkan modulo 5 , yang memberikan p . Kami kemudian memiliki:

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

Di mana tanda mod b adalah tanda 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
Arnauld
sumber
3

Jelly , 14 byte

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

Cobalah online!

Argumen 1 / Argumen Kiri: Indeks berbasis 1 maksimum.
Argumen 2 / Argumen Kanan: indeks berbasis 1.
Argumen 3: Daftar-bergerak sebagai string. Fungsi masih dapat digunakan kembali jika argumen baris perintah ketiga digunakan untuk tujuan ini.

Erik the Outgolfer
sumber
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;}

Mengambil maksimum sebagai input tambahan; move-list adalah array karakter pada level kelas.

Terinspirasi oleh @Emigna 's jawaban 05AB1E .
-7 byte berkat @Jakob .
-14 byte terima kasih kepada @Geobits .

Cobalah online.

Penjelasan:

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]/73peta ke koordinat x atau y tergantung pada karakter ( Coba online ):

Letter    Unicode value    /73

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

s[m%55]*3%5-2peta ke karakter yang benar +1atau -1tergantung ( Coba online ):

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
Kevin Cruijssen
sumber
1
Jika Anda mengambil daftar indeks sebagai satu set bisa berubah Anda dapat menggunakan a.add(m)sebagai ifkondisi.
Jakob
Dan int c[]bisa jadi int[]c.
Jakob
1
@ Jakob Ah, int c[]berasal dari versi sebelumnya di mana saya masih menggunakan indeks idaripada menggunakan m. Dan pintar menggunakan Set addbukan !contains, terima kasih!
Kevin Cruijssen
1
Anda dapat menghindari pengurangan byte-hogging pada akhirnya dengan menggunakan c[2]untuk sumbu (dengan s[m%55]/73) dan berjalan dengan sesuatu seperti 3*s[m%55]%5-2(saya berharap saya bisa melihat cara untuk mempersingkat itu, tapi ...). Bersama dengan terner, ini 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];}untuk 98.
Geobits
@Geobits, terima kasih! Dan -12 byte lebih banyak dengan hanya mengembalikan int[]bukan sebuah String. :)
Kevin Cruijssen
2

Python 3, 85 byte

badalah daftar indeks (a set) dan lmerupakan indeks akhir. Daftar pindah (daftar string atau karakter) muncul sebagai s. Ini adalah port dari jawaban Ruby GB , dan penjelasan pendekatannya dapat ditemukan di sana.

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

Cobalah secara Online

Tidak disatukan

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

MATL , 16 byte

:wX-)Jw19\^s_&Zj

Cobalah online!

Membawa 3 input seperti jawaban Jelly, indeks terbesar, daftar indeks untuk dilewati, dan array 55 karakter.

sundar - Pasang kembali Monica
sumber
1

Bersih , 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]

Cobalah online!

Menentukan fungsi $ :: [Int] -> (Int, Int), mengambil daftar indeks (diurutkan dari yang terkecil hingga terbesar) untuk dihapus dari gerakan sebelum foldrmengakhiri operasi yang berlaku (0,0).

Suram
sumber