找到对应词


33

给定一个完全由q代表四分音符的s和e代表八分音符的s 组成的字符串的输入,输出已切分的四分音符的索引。

概要法很复杂,但是出于此挑战的目的,我们对“同步化”的定义将非常简单:四分音符从“节拍”开始,即节拍在n / 4中计为“和”时间。

可替代地,这可以被定义为在奇数个八分音符之后的任何四分音符。例如,*下面标记为的音符被视为已切分,并且还显示了它们的索引:

eqqeqqeqqe
 **    **
 12    78
Output: 1 2 7 8

输入将始终包含4/4次的所有小节(四分音符是小节的四分之一,八分音符是小节的八分之一)。(输入也永远不会为空。)输出可以是单个字符串,其元素由任何不包含数字的定界符分隔,也可以是数组/列表/等。如果需要,输出可以是基于1的(即第一个索引是1而不是0),并且它也可以使用任何数字基(一进制,十进制等)。

由于这是,因此以字节为单位的最短代码为准。

测试用例:

In                        Out
-----------------------------------------------
eqqqe                     1 2 3
qeqeq                     2
qqqeqqeeeeqeqeqeqqeqqeqq  4 5 10 14 19 20
eeeeeqeeqeeqqqqeqeqeeqe   5 8 11 12 13 14 18 21
qqqq                      <none>
eeeeeeee                  <none>

1
输出可以从1开始吗?
Luis Mendo

1
您能做一个可行的例子来显示索​​引如何工作吗?
彼得·泰勒

1
@LuisMendo当然可以,如果它会使您的代码更短。
Doorknob

@PeterTaylor好的,是您想的那样吗?
门把手

输入可以是包含引号在内的字符串吗?'eqqqe'而不是eqqqe
路易斯·门多

Answers:


12

果冻12 9 字节

=“e”µ<^\O

作为一个程序,以上代码需要在输入两边加上引号。由于不允许这样做,因此这是函数提交。输出基于1。在线尝试!

怎么运行的

=“e”µ<^\O    Monadic link. Argument: s (string)

=“e”         Check each character for equality with 'e'. Yields a Boolean array.
    µ        Start a new, monadic chain.
      ^\     Compute the array of partial reductions by XOR, i. e., the parities
             of all prefixes of the Boolean array.
     <       Check if the Booleans are strictly smaller than the parities.
             A truthy outcome indicates an off-beat quarter note.
        O    Yield all indices of 1's.

更新资料

上面的代码在最新版本的Jelly中不再起作用,因为我们需要一个字符 e,但是会“e”产生一个字符串。该修复程序节省一个字节,总共8个字节

=”eµ<^\O

这是一个完整程序。在线尝试!


7

Ruby,46岁

i=e=0
gets.bytes{|n|e^=n
e&4|n>114&&p(i)
i+=1}

输入到标准输入。输出到stdout,换行符分隔。

已评论

i=e=0               #i keeps index, e keeps track of 8ths.
gets.bytes{|n|      #iterate through bytes in the input
e^=n                #xor e with input. We're interested in the 4's bit, which is only affected by ascii e, not ascii q
e&4|n>114&&p(i)     #e&4 evaluates to 4 or 0. OR with n and if the value is greater than ascii code for q, print index
i+=1}               #increment index

6

的JavaScript ES7,50 48个字节

如果您问我,JS的缩写。[for...of]语法,基本上是将地图和过滤器结合在一起的,对于这一挑战非常有用。

s=>[for(c of(i=f=0,s))if(++i&&c>'e'?f%2:f++&0)i]

定义一个输出1索引数组的匿名函数。

测试片段

这将使用非公开,非ES7版本的代码。

a = function(s) {   // Create a function a that takes in a parameter s and does these things:
  var r = [],       // Set variable r to an empty array,
  i = 0, f = 0;     // i to 0, and f to 0.
  for(c of s) {     // For each character c in s:
    i++;            //  Increment i by 1.
    if(             //  If
      c == 'q' ?    //   if c == 'q',
      f%2 === 1 :   //    f is even; otherwise,
      f++ && false) //    increment f and don't execute this:
      r.push(i);    //   Add i to the end of r.
  } return r;       // Return r.
}
<input type="text" value="eqqqe" id=O />
<button onclick="P.innerHTML='['+a(O.value)+']'">Try it</button>
<p id=P />


3
很好的解释!而且如何使用ES7的新[...为的]👍一个很好的例子
Aᴄʜᴇʀᴏɴғᴀɪʟ

因此,我们是否需要一个新的问题:“ ECMAScript 7中的高尔夫技巧”?
尼尔

@Neil我尝试将ES6帖子更新为ES6 / 7,但是OP撤消了编辑。同时,这里是:codegolf.stackexchange.com/a/61489/42545
ETHproductions 2016年

5

J,20 19 17字节

=&'e'(I.@:<~:/\@)

感谢randomra保存一个字节,并感谢Dennis保存两个字节。这是一个未命名的单子词动词,用法如下:

  f =: =&'e'(I.@:<~:/\@)
  f 'eqqqe'
1 2 3

在这里尝试。

说明

=&'e'(I.@:<~:/\@)
=&'e'               Replace every 'e' with 1, other chars with 0
     (         @)   Apply the verb in parentheses to the resulting 0-1 vector
           ~:/\     Cumulative reduce with XOR (parity of 'e'-chars to the left)
          <         Element-wise less-than with original vector
      I.@:          Positions of 1s in that vector

5

GNU grep,3 + 17 = 20 3 + 15 = 18个字节

该程序需要选项boP。该代码是

q(?!(q|eq*e)*$)

将其另存为synco,然后以grep -boPf synco

输出分隔符:q后跟换行符。例如,用于输出eqqqeIS

1:q
2:q
3:q

标志的含义是:

  • P:使用PCRE正则表达式。
  • o:这意味着仅打印与正则表达式匹配的行部分,但这并不是为什么它很重要。o之所以使用,是因为它具有允许每行进行多个匹配的效果。
  • b:从文件的开头打印每个匹配项开头的偏移量(以字节为单位)。

该模式检查四分音符之后八分音符的数量是否为偶数。


是否grep有资格成为一种语言?无论如何,+ 1是一个很好的答案
Digital Trauma

@DigitalTrauma我不明白为什么不...它可以使用PCRE正则表达式,因此它至少应该是图灵完整的,并且可以从文件中执行代码,如下所示。
feersum

给人的印象是PCRE尚未证明是图灵完整的。无论如何,您的表情都符合要求,所以我可以接受,但是在理论上可能会有其他人提出投诉。
Digital Trauma

@DigitalTrauma Huh,看来我因图灵完备性而受骗。
feersum

5

MATL,12 14 16字节

j101=tYs2\<f

感谢Dennis删除2个字节(并在他的在线平台上托管了MATL!)

这使用语言/编译器的当前版本(9.3.0)

输入和输出通过stdin和stdout进行。结果是从1开始的。

范例

>> matl j101=tYs2\<f
> eeeeeqeeqeeqqqqeqeqeeqe
6  9 12 13 14 15 19 22

在线尝试!

说明

j             % input string
101=          % vector that equals 1 at 'e' characters and 0 otherwise
t             % duplicate
Ys2\          % cumulative sum modulo 2
<             % detect where first vector is 0 and second is 1
f             % find (1-based) indices of nonzero values

3

蟒蛇2,94 85 79 75 66字节

编辑:谢谢Doorknob和AlexA。

编辑:谢谢亚历克斯·A。

编辑:现在使用input(),因此输入必须是带引号的字符串。

编辑:感谢Zgarb推荐我使用枚举。

只需计算e的数量,如果为q,则检查e计数是否为奇数,然后打印索引。

e=0
for j,k in enumerate(input()):
 if"q">k:e+=1
 elif e%2:print j

在这里尝试


您可以if ...仅用替换第二个else以节省8个字节。
门把手

您还可以删除print1个字节后的空格
Alex A.

我认为您可以将更else: if e%2:改为elif e%2:
Alex A.

您可以通过检查i[j]<"q"而不是来节省一个字节i[j]=="e"
Alex A.

2
@TanMath我问Doorknob,因为它将为我节省2个字节来输入带引号的输入。但这无法完成
Luis Mendo

3

Haskell,58 51字节

f x=[i|(i,'q')<-zip[0..]x,odd$sum[1|'e'<-take i x]]

用法示例:f "eeeeeqeeqeeqqqqeqeqeeqe"->[5,8,11,12,13,14,18,21]

查看列表并输出i每个字符的当前索引('q'如果'e'前面有奇数个s)。


2

Minkolang 0.15,28个字节

(o"q"=7&z1+$z8!z2%,2&iN$I$).

在这里尝试。

说明

(                        Open while loop
 o                       Read in character from input
  "q"                    Push the character "q"
     =                   1 if the top two items on stack are equal, 0 otherwise
      7&                 Pop and jump 7 spaces if truthy

        z                Push register value on stack
         1+              Add one
           $z            Pop top of stack and store in register
             8!          Jump eight spaces

        z                Push register value on stack
         2%              Modulo by 2
           ,             boolean not
            2&           Pop and jump two spaces if truthy
              i          Push loop counter
               N         Output as number

                $I       Push length of input
                  $).    Close while loop when top of stack is 0 and stop.

2

C(功能),65

感谢@Dennis的额外高尔夫活动!

i,n;f(char*m){for(i=n=0;*m;i++)*m++&4?++n:n%2?printf("%d ",i):0;}

1
我认为i,n;f(char*m){for(i=n=0;*m;m++,i++)*m&4?++n:n%2?printf("%d ",i):0;}应该可以。
丹尼斯,

2

Python 3、109 95 80 90 88 76 68 67 66 64字节

计算qs和es q的数目,如果前面es 的数目为奇数,则添加当前索引。

编辑:现在,它打印s的索引列表,这些索引在s之前q且具有奇数个es。八个字节保存感谢门把手和两个感谢feersum

lambda s:[x for x,m in enumerate(s)if("e"<m)*s[:x].count("e")%2]

取消高尔夫:

def f(s):
    c = []
    for index, item in enumerate(s):
        if item == "q":
            if s[:index].count("e")%2 == 1:
                c.append(index)
    return c

1
您能否将其作为lambda来使inputand print语句不必要?
Doorknob

它应该enumerate比使用短一些range(len(...
feersum

2

JavaScript的ES6,63个 60 58字节

x=>[...x].map((e,i)=>e>'e'?n%2&&a.push(i):n++,a=[],n=0)&&a

输出数组的匿名函数。感谢user81655节省了两个字节。这是使用更好支持的语法的非公开版本。

f=function(x) {
  a=[] // Indeces of syncopated notes
  n=0 // Number of e's encountered so far
  x.split('').map(function(e,i) { // For each letter...
    e>'e'? // If the letter is q...
      n%2&& // ...and the number of e's is odd...
        a.push(i): // ...add the current index to the array
      n++ // Otherwise, it is e so increment the counter
  })
  return a
}

run=function(){document.getElementById('output').textContent=f(document.getElementById('input').value)};document.getElementById('run').onclick=run;run()
<input type="text" id="input" value="qqqeqqeeeeqeqeqeqqeqqeqq" /><button id="run">Run</button><br />
<samp id="output"></samp>


0

Mathematica,76个字节

Flatten[Range[#+1,#2-1]&@@@StringPosition[#,"e"~~"q"..~~"e",Overlaps->1<0]]&

我注意到了一些有趣的事情。所有带锯齿的部分都是形式eqqq..qqe,所以我只检测它们并给出qs 的索引。


0

Japt,29 23 21字节

不再竞争了!

0+U ¬®¥'e} å^ ä© m© f

在线尝试!

怎么运行的

         // Implicit: U = input string, e.g.    "eqqeqeq"
0+U      // Add a 0 to the beginning.           "0eqqeqeq"
¬        // Split into chars.                   ['0,'e,'q,'q,'e,'q,'e,'q]
®¥'e}    // Map each item X to (X == 'e).       [F, T, F, F, T, F, T, F]
å^       // Cumulative reduce by XOR'ing.       [0, 1, 1, 1, 0, 0, 1, 1]
ä©       // Map each consecutive pair with &&.  [0, 1, 1, 0, 0, 0, 1]
m©       // Map each item with &&. This performs (item && index):
         //                                     [0, 1, 2, 0, 0, 0, 6]
f        // Filter out the falsy items.         [   1, 2,          6]
         // Implicit output                     [1,2,6]

非竞争版本,18字节

U¬m¥'e å^ ä©0 m© f

在线尝试!


0

Befunge,43个字节

:~:0\`#@_5%2/:99p1++\>2%#<9#\9#.g#:*#\_\1+\

在线尝试!

说明

我们从堆栈上的两个隐式零开始:音符编号和节拍计数。

:               Make a duplicate of the beat count.
~               Read a character from stdin.
:0\`#@_         Exit if it's less than zero (i.e. end-of-file).
5%2/            Take the ASCII value mod 5, div 2, translating q to 1 and e to 0.
:99p            Save a copy in memory for later use.
1+              Add 1, so q maps to 2 and e to 1.
+               Then add that number to our beat count.
\               Get the original beat count that we duplicated at the start.
2%              Mod 2 to check if it's an off-beat.
99g*            Multiply with the previously saved note number (1 for q, 0 for e).
_               Essentially testing if it's a quarter note on an off-beat.
       \.:\     If true, we go turn back left, get the beat count, and output it.
         >2     Then push 2 onto the stack, and turn right again.
2%              That 2 modulo 2 is just zero.
99g*            Then multiplied by the saved note number is still zero.
_               And thus we branch right on the second pass.
\1+\            Finally we increment the note number and wrap around to the start again.
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.