チャチャスライドのインデックス作成


12

前書き:

もともとオランダ語の歌が頭にありましたが、歌詞は次のとおりです:「Doe 'n stapje naar voren、en' n stapje terug」(これは「少し前へ、少し後ろへ」と訳されています)完全な歌詞を検索しましたが、歌詞が前後に移動するだけで、決して横にならないことに気付きました。

だから、代わりにこの挑戦のためにMr C The Slide Man別名DJ Casper-Cha-Cha Slideの歌詞を使うようになりました。

他のすべてを無視し、言及された量を含む「左」、「右」、「戻る」、および「ホップ」(「ホップ」を前方としてカウントしました)の単語だけを見ると、完全な歌には次のリストがあります(私はここで略語LRBHを使用しています):

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

ここでは、スペースを節約するために隠されたJavaScriptコードスニペットで完全な曲の歌詞が表示されます。ここでは、動きと量がブロックされた括弧で囲まれています。

チャレンジ:

さて、挑戦そのものに。1つ、2つ、または3つの入力を取ります。それらの1つは、インデックス整数のリストです(したがって、0インデックスの場合は非負、1インデックスの場合は正)。(他の入力はオプションであり、チャレンジルールで説明されています。)

すべてのテストケースは位置から始まり{x=0, y=0}ます。
次に、移動の歌詞リストを使用し、入力リストの指定されたインデックスにあるすべての移動を削除します。次に、移動(入力配列の最大のインデックスまで)を「ウォーク」し、最終的な位置を出力します。

動きは次のように座標を変更します:
- Rx+1
- Lx-1
- Hy+1
- By-1

チャレンジルール:

  • 移動リストには、好きな方法でアクセスできます。†:追加の入力にすることができます。読み込むディスク上の個別のファイルに入れることができます。アクセスするクラスレベルの変数に入れることができます。これは、の形でなければならないだろうLRB及びH(文字列または文字リスト/配列することができます)しかし、として移動リスト保存しないことができますので、1sおよび-1s以上の整数。
  • 上記のmoves-listはハードコーディングされており、常に同じです。(これが回答のバイト数に役立つ場合は、入力として受け取るのではなく、クラスレベルのフィールドとして置くのが良い理由でもあります。)
  • 入力リストには、0インデックスまたは1インデックスの両方を使用できます(任意)
  • リストの最大のインデックスまでの移動を除外します。
    • †:入力配列の最後のアイテムの代わりに、この最後のアイテムを整数で区切って入力することもできます。
  • 最終的なx座標とy座標の出力は、任意の妥当な形式(2つのアイテムを含む整数配列、区切り文字列、2行に分かれてSTDOUTに出力されるなど)になります。
  • input-listは最低から最高に並べ替えられていると想定できます(それが望ましい場合は最高から最低に並べ替えられます。この場合、最初の項目はmoves-listの初期サイズです-別の入力として受け取られない場合)。また、重複したインデックスも含まれません。
  • 入力リストの最大インデックスが上記の移動リストよりも大きい場合(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

入力リストのインデックスを削除すると、次のmoves-listが残ります。

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、確かに、そうではない。回答で明確に指定している限り。
ケビンクルーッセン

@Arnauldはい、動きは表示されたものであり、変更されることはありません。まだ明確になっていない場合は、おそらくこれをより明確にするでしょう。(バイトカウントに役立つ場合は、ハードコーディングされたクラスレベルのフィールドとして使用できる理由でもあります。)
ケビンCruijssen

出力はフロートのペアにできますか?
ヤコブ

1
課題に非常に遅れましたが、2つのテストケースが1インデックスのケースに対して間違った入力を持っているようです。実際には28/29になりますが、表示される予想される出力はそこでの38/39の使用からのものです)。
スンダ

回答:


4

05AB1E15 12バイト

Erik the Outgolferのおかげで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
いい答え!さえ知りませんでしたÆ。すべての動きを数えるだけのスマートな方法Æで、RLとのBHペアの差を計算します。
ケビンCruijssen

Æ永遠に存在していませんか?私はそのことを知らなかったので、そう思います。「新しい」と思われるコマンドは、当初から存在しているようですが、使用方法は知りませんでした(笑)。ああ、+ 1
魔法のタコ

@MagicOctopusUrn:それは確かに永遠に存在しています;)
エミグナ

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です。すべての動きを複素数に変換すると、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]
ヤコブ

4

JavaScript(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)mod 2)
  • dy =-((p-2)mod 2)

兆候はどこMOD 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

ジャワ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;}

追加の入力として最大値を取ります。moves-listは、クラスレベルの文字配列です。

@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条件として使用できます。
ヤコブ

int c[]することができますint[]c
ヤコブ

1
@Jakob Ah、int c[]以前のバージョンで、を使用するi代わりにインデックスを使用していましたm。そして、add代わりにSetを使用するのが賢明です!contains、ありがとう!
ケビンCruijssen

1
c[2]for軸(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

@Geobitsありがとう!さらにint[]、文字列の代わりにを返すだけで、-12バイト多くなります。:)
ケビンクルーッセン

2

Python 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

Clean148 ... 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.