索引Cha-Cha幻灯片


12

介绍:

虽然我本来是脑中有一首荷兰歌,但歌词是:“ Doe'n stapje naar voren,en'n stapje terug ”(译为“ 向前走一点,向后走一点 ”),当我搜索了完整的歌词,我意识到它们只是来回晃来晃去,从不侧身。

因此,我现在改用C幻灯片先生(又名DJ Casper-Cha-Cha Slide)的歌词来应对这一挑战。

如果我们忽略所有其他内容,仅查看包括上述金额在内的单词“ left”,“ right”,“ back”和“ hop”(我将“ hop”算作正向),则整首歌曲将具有以下列表(我在这里使用缩写LRBH):

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

这是可隐藏的JavaScript代码段中的完整歌曲歌词(以节省空间),其中的移动和金额都用方括号括起来:

挑战:

现在进入挑战本身。我们接受一个,两个或三个输入。其中一个是索引整数列表(因此对于0索引非负;对于1索引非正)。(其他输入是可选的,并在质询规则中进行了说明。)

每个测试用例都将从某个位置开始{x=0, y=0}
现在使用动作的歌词列表,并删除输入列表给定索引处的所有动作。然后“遍历”这些移动(直到输入数组的最大索引)并输出您将要到达的位置。

移动将更改坐标,如下所示:
- Rx+1
- Lx-1
- Hy+1
- By-1

挑战规则:

  • 您可以通过任何方式访问移动列表。†:可以是附加输入;可以放在您要读取的磁盘上的单独文件中;可以在您访问的类级变量中。它必须在形式LRBH虽然(可以是一个字符串或字符列表/阵列),所以你不能保存移动列表为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,当然,为什么不呢。只要您在回答中明确指定即可。
凯文·克鲁伊森

@Arnauld是的,这些移动是显示的,永远不会改变。如果还不清楚,我可能会更清楚地阐明这一点。(这也是为什么如果有益于字节计数,就可以将其作为硬编码的类级字段的原因。)
Kevin Cruijssen

输出可以是一对浮点数吗?
Jakob

1
挑战已经来得很晚了,但是您的两个测试用例似乎为1索引的用例输入了错误的信息:在第六个用例中额外输入了82个,在第三个测试用例中添加了29个而不是39个(排序表明您可能打算实际为28/29,但显示的预期输出是从此处使用38/39获得的)。
sundar-恢复莫妮卡

Answers:


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
好答案!甚至都不知道Æ。聪明的方法是只计算所有动作并用于Æ计算RLBH对的差。
凯文·克鲁伊森

Æ一直存在,不是吗?我以为是这样,因为我对此一无所知。自创建以来似乎已经存在我认为是“新”的命令,但我不知道如何使用它们。哦,+ 1
魔术章

@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

因此,将所有内容加总,求和,反转符号,我们就完成了。

感谢Jakob -3个字节


巧妙使用复数!由于移动字符串是固定的,因此可以替换(m*c+m)[c]m[c%55]
Jakob

4

JavaScript(ES6),85个字节

根据质询规则,此代码希望全局范围字符串m包含移动列表。(节省3个字节,如@KevinCruijssen所建议。)

将输入作为基于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)

其中的符号国防部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;}

将最大值作为附加输入;moves-list是类级别的字符数组。

受到@Emigna的05AB1E答案的启发。
-7个字节,感谢@Jakob
-14个字节,感谢@Geobits

在线尝试。

说明:

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。并聪明地使用Set add代替!contains,谢谢!
凯文·克鲁伊森

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个字节。:)
Kevin Cruijssen

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

干净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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.