সিনকোপেশনটি সন্ধান করুন


33

স্ট্রিংয়ের একটি ইনপুট দেওয়া হয়েছে যা সম্পূর্ণরূপে qকোয়ার্টারের নোটগুলিকে উপস্থাপন করে এবং eঅষ্টম নোটকে উপস্থাপন করে, সিঙ্কেপেটযুক্ত কোয়ার্টার নোটের সূচকগুলি আউটপুট দিন।

সিনকোপেশনটি জটিল, তবে এই চ্যালেঞ্জের উদ্দেশ্যে, আমাদের "সিনকোপেটেড" এর সংজ্ঞাটি খুব সহজ হবে: "অফ-বিট" -র সাথে শুরু হওয়া একটি চতুর্থাংশ নোট - এটি হ'ল বিট "এবং" এন / 4 তে গণনা করা হয় সময়।

এটি বিকল্পভাবে অষ্টম নোটগুলির একটি বিজোড় সংখ্যার আগে যে কোনও ত্রৈমাসিক নোট হিসাবে সংজ্ঞায়িত করা যেতে পারে। উদাহরণস্বরূপ, *নীচের সাথে চিহ্নিত নোটগুলি সিঙ্কপিটেড হিসাবে বিবেচিত হয় এবং তাদের সূচকগুলিও প্রদর্শিত হয়:

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

ইনপুটটি সর্বদা 4/4 সময়ে পুরো সংখ্যক পদক্ষেপ নিয়ে গঠিত হবে (একটি চতুর্থাংশ নোটটি একটি পরিমাপের চতুর্থাংশ এবং অষ্টম নোটটি একটি পরিমাপের অষ্টমী)। (ইনপুটটি কখনই খালি হবে না)) আউটপুট হয় কোনও ডিলিমিটার দ্বারা পৃথক পৃথক উপাদানগুলির সাথে একক স্ট্রিং হতে পারে যার মধ্যে সংখ্যা বা একটি অ্যারে / তালিকা / ইত্যাদি থাকে না। আপনি যদি চান তবে আউটপুটটি 1-ভিত্তিক হতে পারে (যেমন প্রথম সূচক 0 এর পরিবর্তে 1 হয়) এবং এটি কোনও সংখ্যাসূচক বেসেও থাকতে পারে (একরকম, দশমিক ইত্যাদি)।

যেহেতু এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।

পরীক্ষার কেস:

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-ভিত্তিক হতে পারে?
লুইস মেন্ডো

1
সূচকগুলি কীভাবে কাজ করে তা দেখাতে আপনি একটি কাজের উদাহরণ করতে পারেন?
পিটার টেলর

1
@ লুইস মেন্ডো অবশ্যই, যদি এটি আপনার কোডকে ছোট করে তোলে।
ডুরকনব

@ পিটারটেলর ঠিক আছে, আপনি যা ভেবেছিলেন সে রকম কিছু?
ডুরকনব

ইনপুটটি কি উদ্ধৃতি চিহ্ন সহ একটি স্ট্রিং হতে পারে? 'eqqqe'পরিবর্তেeqqqe
লুইস মেন্ডো

উত্তর:


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.

হালনাগাদ

উপরের কোডটি জেলির সর্বশেষতম সংস্করণে আর কাজ করে না, যেহেতু আমাদের একটি অক্ষর প্রয়োজন , তবে “e”একটি স্ট্রিং দেয়। স্থির করে মোট জন্য একটি বাইট সংরক্ষণ করে, 8 বাইট

=”eµ<^\O

এটি একটি সম্পূর্ণ প্রোগ্রাম হিসাবে কাজ করে। এটি অনলাইন চেষ্টা করুন!


7

রুবি, 46

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

স্টিডিন ইনপুট। স্টডআউট আউটপুট, নিউলাইন পৃথক।

মন্তব্য

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

জাভাস্ক্রিপ্ট ES7, 50 48 বাইট

আপনি আমাকে জিজ্ঞাসা করুন, জেএস জন্য খুব সংক্ষিপ্ত। [for...of]সিনট্যাক্স, মূলত সম্মিলিত মানচিত্র এবং ফিল্টার, এই চ্যালেঞ্জটির কাজে আসে।

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

একটি বেনামি ফাংশন সংজ্ঞা দেয় যা 1-ইনডেক্সেড অ্যারে আউটপুট করে।

পরীক্ষার স্নিপেট

এটি কোডটির একটি অব্যক্ত, আন- ES7'd সংস্করণ ব্যবহার করে।

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 এর নতুন [এর জন্য ...] ব্যবহার করতে হবে তার একটি দুর্দান্ত উদাহরণ
5

সুতরাং, আমাদের কী নতুন প্রশ্ন দরকার, "ইসমাস্ক্রিপ্ট Golf-এ গল্ফিংয়ের টিপস"?
নিল

@ নীল আমি ইএস 6 পোস্টটি ইএস 6/7 তে আপডেট করার চেষ্টা করেছি, তবে ওপি সম্পাদনাটি ফিরিয়ে দিয়েছে। এরই মধ্যে, এটি রয়েছে: কোডগল্ফ.স্ট্যাকেক্সেঞ্জাওএআআআ
89১89৯৯

5

জে, 20 19 17 বাইট

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

বাইট সংরক্ষণের জন্য র্যান্ডম্রা এবং দুজনকে বাঁচানোর জন্য ডেনিসকে ধন্যবাদ। এটি একটি নামবিহীন monadic ক্রিয়া, নিম্নলিখিত হিসাবে ব্যবহৃত:

  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

জিএনইউ গ্রেপ, 3 + 17 = 20 3 + 15 = 18 বাইট

প্রোগ্রামটির বিকল্পগুলির প্রয়োজন boP। কোডটি হ'ল

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

এটি হিসাবে সংরক্ষণ করুন synco, তারপর হিসাবে চালানো grep -boPf synco

আউটপুট বিভাজক :qএকটি নতুন লাইন অনুসরণ করা হয়। যেমন আউটপুট eqqqeহয়

1:q
2:q
3:q

পতাকাগুলির অর্থ:

  • P: পিসিআরই রেজিক্সগুলি ব্যবহার করুন।
  • o: এর অর্থ নিয়মিত অভিব্যক্তির সাথে মিলিত লাইনের কেবলমাত্র সেই অংশটি মুদ্রণ করা, তবে কেন এটি গুরুত্বপূর্ণ তা নয়। oএটি ব্যবহৃত হয় কারণ এটি প্রতি লাইনে একাধিক ম্যাচ মঞ্জুরি দেওয়ার প্রভাব ফেলে।
  • b: ফাইলের শুরু থেকে প্রতিটি ম্যাচের শুরুতে অফসেটটি মুদ্রণ করুন।

প্যাটার্নটি চেক করে যে কোনও চতুর্থাংশ নোটের পরে অষ্টম নোটের সমান সংখ্যা নেই।


grepএকটি নিজস্ব ভাষা কি ভাষা হিসাবে যোগ্যতা অর্জন করতে পারে? নির্বিশেষে, দুর্দান্ত উত্তরের জন্য +1
ডিজিটাল ট্রমা

@ ডিজিটালট্রামা আমি দেখতে পাচ্ছি না কেন ... এটি পিসিআরই রেজিক্সগুলি ব্যবহার করতে পারে, তাই এটি কমপক্ষে টুরিং-সম্পূর্ণ হওয়া উচিত এবং এখানে প্রদর্শিত হিসাবে কোনও ফাইল থেকে কোড কার্যকর করতে পারে।
feersum

আমার ধারণা ছিল যে পিসিআরই টিউরিং সম্পূর্ণরূপে প্রমাণিত নয়। নির্বিশেষে, আপনার অভিব্যক্তিটি প্রয়োজনীয়তা পূরণ করে, তাই আমি এটির সাথে ঠিক আছি তবে তাত্ত্বিক কারণে অভিযোগ রয়েছে এমন আরও অনেকে থাকতে পারে।
ডিজিটাল ট্রমা

@ ডিজিটালট্রামা হু, মনে হচ্ছে আমি টুরিং-সম্পূর্ণতার বিষয়ে বিভ্রান্ত হয়েছি।
ফেয়ারসুম

5

এমএটিএল , 12 14 16 বাইট

j101=tYs2\<f

2 বাইট অপসারণ করার জন্য ডেনিসকে ধন্যবাদ জানায় (এবং তার দুর্দান্ত অনলাইন প্ল্যাটফর্মে এমএটিএল হোস্ট করার জন্য!)

এটি ভাষা / সংকলকের বর্তমান সংস্করণ (9.3.0) ব্যবহার করে।

ইনপুট এবং আউটপুট স্টিডিন এবং স্টডআউট মাধ্যমে হয়। ফলাফল 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 বাইট

সম্পাদনা: ধন্যবাদ ডুরকনব এবং অ্যালেক্স এ।

সম্পাদনা: ধন্যবাদ অ্যালেক্স এ।

সম্পাদনা: এখন ইনপুট () ব্যবহার করে তাই ইনপুটটি অবশ্যই কোটগুলির সাথে একটি স্ট্রিং হওয়া উচিত।

সম্পাদনা: জনাব আমাকে গণনা ব্যবহার করার পরামর্শ দেওয়ার জন্য ধন্যবাদ gar

কেবলমাত্র ই এর সংখ্যা গণনা করে এবং যদি q হয় তবে e গণনাটি বিজোড় কিনা তা পরীক্ষা করুন, তারপরে মুদ্রণ সূচক।

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

এখানে চেষ্টা করুন


দ্বিতীয় প্রতিস্থাপন করতে পারেন if ...শুধু একটি সঙ্গে else8 বাইট সংরক্ষণ করুন।
ডুরকনব

আপনি print1 বাইটের পরে
অ্যালেক্স এ।

আমার মনে হয় আপনি পরিবর্তন করতে পারেন else: if e%2:শুধু elif e%2:
অ্যালেক্স এ।

i[j]<"q"পরিবর্তে চেক করে আপনি আরও একটি বাইট সংরক্ষণ করতে পারেন i[j]=="e"
অ্যালেক্স এ।

2
@ ট্যানম্যাথ আমি ডুরকনবকে জিজ্ঞাসা করেছি কারণ কোটস সহ একটি ইনপুট নিতে আমার 2 বাইট সংরক্ষণ করবে। তবে এটি করা যায় না
লুইস মেন্ডো

3

হাস্কেল, 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'এর আগে একটি বিচিত্র সংখ্যা থাকে।


2

মিনকোলাং 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

সি (ফাংশন), 65

অতিরিক্ত গলফিংয়ের জন্য @ ডেনিসকে ধন্যবাদ!

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

পাইথন 3, 109 95 80 90 88 76 68 67 66 64 বাইট

qS এবং es এর সংখ্যা গণনা করে এবং qপূর্ববর্তী সংখ্যার সংখ্যাটি eবিজোড় হলে বর্তমানের সূচক যুক্ত করে ।

সম্পাদনা করুন: এখন এটি সূচকগুলির সূচকগুলির একটি তালিকা মুদ্রণ করে যাগুলির পূর্বে qএকটি বিচিত্র সংখ্যা রয়েছে e। আট বাইট ধন্যবাদ সংরক্ষিত Doorknob এবং আরো দুটি ধন্যবাদ feersum

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

Ungolfed:

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
আপনি করতে এই একটি ল্যামডা করা যায়নি inputএবং printবিবৃতি অপ্রয়োজনীয়?
ডুরকনব

এটি ব্যবহার enumerateকরার চেয়ে কম ব্যবহার করা উচিত range(len(...
feersum

2

জাভাস্ক্রিপ্ট ES6, 63 60 58 বাইট

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

বেনামে ফাংশন যা একটি অ্যারের আউটপুট করে। দুইটি বাইট সংরক্ষণের জন্য ব্যবহারকারীর পক্ষে ধন্যবাদ 1 এখানে একটি অসমাপ্ত সংস্করণ যা আরও ভাল সমর্থিত সিনট্যাক্স ব্যবহার করে।

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

গণিত, 76 বাইট

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

আমি আকর্ষণীয় কিছু লক্ষ্য। সিনকোপেটেড সমস্ত অংশই ফর্মের eqqq..qqe, তাই আমি কেবল সেগুলি সনাক্ত করি এবং এর সূচকগুলি দিয়ে থাকি q


0

জাপট, 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

বেফুঞ্জ, 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.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.