Cha-Cha Slaydı Dizine Ekleme


12

Giriş:

Başlangıçta kafamda Hollandaca bir şarkı olmasına rağmen, şarkı sözleri: " Doe 'n stapje naar voren, en' n stapje terug " (" Küçük bir adım ileri ve biraz geri adım at ") Tam şarkı sözlerini aradım, sadece ileri geri döndüklerini ve asla yanlara gitmediklerini fark ettim.

Bunun yerine, şimdi bu meydan okuma için Bay C The Slide Man aka DJ Casper - Cha-Cha Slide sözlerini kullanıyorum .

Diğer her şeyi göz ardı edersek ve yalnızca belirtilen miktarlar dahil olmak üzere "sol", "sağ", "geri" ve "hop" (ileri olarak "hop" olarak saydım) kelimelerine bakarsak, şarkının tamamı aşağıdaki listeye ( LRBH kısaltmalarını burada kullanıyorum):

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

Burada, hareketlerin ve miktarların engellenmiş köşeli parantezlerle çevrili olduğu gizlenebilir bir JavaScript kod snippet'indeki (yerden tasarruf etmek için) tam şarkı sözleri:

Meydan okuma:

Şimdi meydan okuma üzerine. Bir, iki veya üç giriş alırız † . Bunlardan biri dizin tamsayılarının bir listesidir (yani 0 dizinli için negatif olmayan veya 1 dizinli için pozitif). (Diğer girdiler isteğe bağlıdır ve meydan okuma kurallarında açıklanmıştır.)

Her test durumu bir konumda başlayacaktır {x=0, y=0}.
Şimdi hareketlerin şarkı sözleri listesini kullanın ve giriş listesinin verilen dizinlerindeki tüm hareketleri kaldırın . Ardından, hamleleri 'girdi' (giriş dizisinin en büyük dizinine kadar) ve sonuçta bulunacağınız konumu çıktılayın.

Hareketler koordinatları aşağıdaki gibi değiştirecektir:
- R: x+1
- L: x-1
- H: y+1
- B:y-1

Zorluk kuralları:

  • Taşıma listesine istediğiniz şekilde erişilebilir. †: Ek bir girdi olabilir; okuyacağınız diskteki ayrı bir dosyada olabilir; eriştiğiniz sınıf düzeyinde bir değişkende olabilir. Bu şeklinde olması gerekecektir L, R, Bve Holsa (bir dize veya karakter listesi / dizi olabilir) böylece olamaz benzeri hareketlerin listesine kaydetme 1s ve -1s veya tamsayılar.
  • Yukarıda verilen hamle listesi sabit olarak kodlanmıştır ve daima aynı olacaktır. (Bu yüzden cevabınızın bayt sayımına yardımcı oluyorsa, onu girdi olarak almak yerine sınıf düzeyinde bir alan olarak koymak iyi olur.)
  • Giriş listesi hem 0 dizinli hem de 1 dizinli olabilir (size kalmış)
  • Listenin en büyük dizinine giden ve hariç tutulan hareketleri yalnızca 'yürüyoruz'.
    • †: Bu son öğeyi, girdi dizisinin son öğesi yerine, ayrılmış tamsayı girişi olarak da almanıza izin verilir.
  • Sonunda x ve y koordinatlarının çıktısı herhangi bir makul biçimde olabilir (iki öğe içeren tamsayı dizisi, ayrılmış dize, iki ayrı satıra STDOUT'a yazdırılmış vb.)
  • Giriş listesinin en düşükten en yükseğe (veya tercih ettiğiniz buysa en yüksekten en düşüğe) sıralandığını varsayabilirsiniz; bu durumda ilk öğe, hareketler listesinin başlangıç ​​boyutudur - ayrı giriş olarak alınmazsa). Ayrıca yinelenen indeksler içermez.
  • Girdi listesinin en büyük dizini yukarıdaki hareket listesinden daha büyükse (55 hamle yukarıdaki hareket listesinde), listenin başına geri döneriz (en büyük dizine bağlı olarak gerektiği kadar) giriş).
  • Bunun y,xyerine çıktı x,yalmanıza izin verilir , ancak bunu yanıtınızda belirtin.

Misal:

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

Burada üst üste hamle ve (0 dizinli) endeksler:

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

Girdi listesinin endeksleri kaldırıldığında, aşağıdaki hamle listesi kalır:

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

Şimdi {0, 0}, kalan hamlelerin üzerindeki pozisyondan yürürsek, her hamleden sonra aşağıdaki yeni koordinatlara sahip oluruz:

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

Böylece nihai çıktı: {-6, 10}

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, cevabınız için bir açıklama eklemeniz şiddetle tavsiye edilir.

Test senaryoları:

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}

Koordinatları ters sırayla çıkarabilir miyiz?
Shaggy

3
@Shaggy Umm, elbette, neden olmasın. Cevabınızda açıkça belirttiğiniz sürece.
Kevin Cruijssen

@ Arnauld Evet, hamle görüntülenen hareketlerdir ve asla değişmez. Henüz net olmasaydı belki de bunu daha açık bir şekilde anlatacağım. (Bu nedenle bayt sayımına fayda sağlayacaksa kodlanmış sınıf düzeyinde bir alan olarak da sahip olabilirsiniz.)
Kevin Cruijssen

Çıktı bir çift şamandıra olabilir mi?
Jakob

1
Meydan okumaya çok geç, ancak test durumlarınızdan ikisinin 1 endeksli vaka için yanlış girdisi var gibi görünüyor: altıncı olanda ekstra 82 ve üçüncü test çantasında 39 yerine 29 (sıralama, aslında 28/29, ancak gösterilen beklenen çıktı 38/39 orada kullanmaktır).
sundar - Monica'yı geri

Yanıtlar:


4

05AB1E , 15 12 bayt

Outgolfer Erik sayesinde 3 bayt kurtardı

ÝsKèIêRS¢2ôÆ

Çevrimiçi deneyin! veya Test takımı olarak

açıklama

Ý                 # 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
Güzel cevap! Bilmiyordum bile Æ. Akıllıca tüm hareketleri saymak Æve RLve BHçiftleri için farkı hesaplamak için kullanın .
Kevin Cruijssen

Æsonsuza dek var olmuştur, değil mi? Bunu bilmiyormuşum gibi görüyorum. Sanırım "yeni" olduğunu düşündüğüm komutlar başlangıçtan beri var, ama lol nasıl kullanılacağını hiç bilmiyordum. Oh, +1
Sihirli Ahtapot Urn

@MagicOctopusUrn: Gerçekten sonsuza dek var olmuştur;)
Emigna

7

Ruby , 98 ... 58 55 bayt

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

Çevrimiçi deneyin!

Açıklama:

Ana hile hareketleri temsil etmek için karmaşık sayılar kullanmaktır: 'B' -i, 'H' + i, 'L' -1 ve 'R' +1'dir. Tüm hareketleri karmaşık sayılara dönüştürürsek, tek bir toplamla doğru sonucu alırız.

Farklı yollar denedim, ama sonra sihirli sayı 19'u buldum: regex eşleşmesi ile uğraşmamıza gerek yok çünkü:

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

Yani, hepsini bir araya getirin, toplayın, işareti ters çevirin ve işimiz bitti.

-3 byte için teşekkürler Jakob


Karmaşık sayıların akıllı kullanımı! Taşıma dizesi sabit olduğundan, (m*c+m)[c]ile değiştirebilirsiniz m[c%55].
Jakob

4

JavaScript (ES6), 85 bayt

Sınama kurallarına göre, bu kod genel kapsam dizesi m'nin hareket listesini tutmasını bekler . (@KevinCruijssen tarafından önerildiği gibi 3 bayt kaydediliyor.)

Girdiyi en düşükten en yükseğe doğru sıralanan 0 tabanlı endekslerin bir listesi olarak alır.

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]

Çevrimiçi deneyin!

Nasıl?

Her taşıma karakteri taşıma dizesindeki konumuna dönüştürülür "LBHR...". Sonucu 3 ile çarparız ve p veren bir modulo 5 uygularız . Sonra:

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

İşareti nerede bir mod b ait olduğunu bir .

 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

Jöle , 14 bayt

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

Çevrimiçi deneyin!

Bağımsız değişken 1 / Sol bağımsız değişken: Maksimum 1 tabanlı dizin.
Argüman 2 / Sağ argüman: 1 tabanlı endeksler.
Argüman 3: Listeyi bir dize olarak taşır. Üçüncü komut satırı argümanı bu amaçla kullanılırsa işlev yine de kullanılabilir.


3

Java 10, 129 119 112 107 100 86 bayt

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

Ek girdi olarak maksimum değeri alır; move-list, sınıf düzeyinde bir karakter dizisidir.

Esinlenerek @Emigna 'ın 05AB1E cevap . @ Jakob
sayesinde -7 bayt . @Geobits sayesinde -14 bayt .

Çevrimiçi deneyin.

Açıklama:

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]/73karaktere bağlı olarak x veya y koordinatıyla eşleşir ( Çevrimiçi deneyin ):

Letter    Unicode value    /73

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

s[m%55]*3%5-2doğru +1veya -1karaktere bağlı olarak eşler ( Çevrimiçi deneyin ):

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
Dizin listesini değiştirilebilir bir set olarak alırsanız a.add(m), ifkoşul olarak kullanabilirsiniz .
Jakob

Ve int c[]olabilir int[]c.
Jakob

1
@ Jakob Ah, int c[]önceki bir sürümdendi ive kullanmak yerine hala bir dizin kullandım m. Ve addyerine bir Set kullanarak akıllı !contains, teşekkürler!
Kevin Cruijssen

1
c[2]Eksen (ile s[m%55]/73) kullanarak ve böyle bir şeyle yürüterek sonunda bayt-hogging çıkarmasını önleyebilirsiniz 3*s[m%55]%5-2(Keşke bunu kısaltmanın bir yolunu görebilseydim, ama ...). Bir üçlü ile birlikte, 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 için.
Geobits

@Geobits Teşekkürler! Ve -12 bayt daha fazla int[]bir String yerine dönerek . :)
Kevin Cruijssen

2

Python 3, 85 bayt

bdizin listesi (a set) ve lbitiş dizinidir. Taşıma listesi (dize veya karakter listesi) olarak ücretsiz görünür s. Bu, GB'nin Ruby cevabı limanıdır ve yaklaşımın açıklaması burada bulunabilir.

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

Çevrimiçi Deneyin

Ungolfed

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

Temiz , 148 ... 130 bayt

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]

Çevrimiçi deneyin!

Uygulamayı $ :: [Int] -> (Int, Int), foldrişlemlerin yapılmasından önce hareketlerden kaldırılacak (en küçükten büyüğe doğru sıralanan) indekslerin bir listesini alarak işlevi tanımlar (0,0).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.