Diberikan input dari string yang seluruhnya terdiri dari q
s yang mewakili not seperempat dan e
s yang mewakili not seperdelapan, menampilkan indeks not seperempat yang disinkronkan.
Sinkronisasi itu rumit, tetapi untuk tujuan tantangan ini, definisi kami tentang "disinkronkan" akan sangat sederhana: seperempat not yang dimulai pada "off-beat" —yaitu, ketukan dihitung sebagai "dan" dalam n / 4 waktu.
Sebagai alternatif, ini dapat didefinisikan sebagai setiap not seperempat yang didahului dengan jumlah ganjil nota kedelapan. Misalnya, catatan yang ditandai dengan di *
bawah ini dianggap sinkop, dan indeksnya juga ditampilkan:
eqqeqqeqqe
** **
12 78
Output: 1 2 7 8
Masukan akan selalu terdiri dari seluruh jumlah pengukuran dalam waktu 4/4 (not seperempat adalah seperempat ukuran, dan not kedelapan adalah kedelapan ukuran). (Input juga tidak akan pernah kosong.) Output dapat berupa string tunggal dengan elemen yang dipisahkan oleh pembatas yang tidak mengandung angka atau array / daftar / dll. Output mungkin berbasis 1 (yaitu indeks pertama adalah 1 bukan 0) jika Anda inginkan, dan mungkin juga dalam basis numerik apa pun (unary, desimal, dll.).
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang.
Kasus uji:
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>
'eqqqe'
alih-aliheqqqe
Jawaban:
Jelly ,
129 byteSebagai sebuah program, kode di atas membutuhkan tanda kutip di sekitar input. Karena itu tidak diizinkan, ini adalah pengiriman fungsi. Outputnya berbasis 1.
Cobalah online!Bagaimana itu bekerja
Memperbarui
Kode di atas tidak berfungsi lagi dalam versi terbaru Jelly, karena kita memerlukan karakter e , tetapi
“e”
menghasilkan string. Memperbaiki itu menghemat satu byte, dengan total 8 byte .Ini berfungsi sebagai program lengkap. Cobalah online!
sumber
Ruby, 46
Masukan ke stdin. Output ke stdout, baris baru dipisahkan.
Berkomentar
sumber
JavaScript ES7,
5048 byteCukup singkat untuk JS, jika Anda bertanya kepada saya.
[for...of]
sintaksis, pada dasarnya gabungan peta dan filter, berguna untuk tantangan ini.Menentukan fungsi anonim yang menghasilkan array 1-diindeks.
Cuplikan tes
Ini menggunakan versi kode yang ungolfed, un-ES7'd.
sumber
J,
20 1917 byteTerima kasih kepada randomra untuk menyimpan satu byte, dan untuk Dennis karena menyimpan dua byte. Ini adalah kata kerja monadik tanpa nama, digunakan sebagai berikut:
Coba di sini.
Penjelasan
sumber
GNU grep,
3 + 17 = 203 + 15 = 18 byteProgram ini membutuhkan opsi
boP
. Kodenya adalahSimpan sebagai
synco
, lalu jalankan sebagaigrep -boPf synco
.Pemisah output
:q
diikuti oleh baris baru. Misalnya output untukeqqqe
isArti dari bendera adalah:
P
: Gunakan regre PCRE.o
: Ini berarti untuk mencetak hanya bagian dari garis yang cocok dengan ekspresi reguler, tetapi bukan itu yang penting.o
digunakan karena memiliki efek memungkinkan beberapa pertandingan per baris.b
: Cetak offset dalam byte dari awal setiap pertandingan dari awal file.Pola memeriksa bahwa tidak ada jumlah genap dari not kedelapan setelah not seperempat.
sumber
grep
memenuhi syarat sebagai bahasa sendiri? Apapun, +1 untuk jawaban yang bagusMATL , 12
1416byteTerima kasih kepada Dennis karena telah menghapus 2 byte (dan untuk hosting MATL di platform daringnya yang mengagumkan!)
Ini menggunakan versi saat ini (9.3.0) dari bahasa / kompiler.
Input dan output melalui stdin dan stdout. Hasilnya berbasis 1.
Contoh :
Atau coba online!
Penjelasan
sumber
Python 2,
9485797566 byteEDIT: Terima kasih Doorknob dan Alex A.
EDIT: Terima kasih Alex A.
EDIT: Sekarang menggunakan input () sehingga input harus berupa string dengan tanda kutip.
EDIT: Terima kasih Zgarb karena merekomendasikan saya untuk menggunakan penghitungan.
Cukup hitung jumlah e dan jika q, periksa apakah e ganjil, lalu cetak indeks.
Coba di sini
sumber
if ...
hanyaelse
dengan menyimpan 8 byte.print
untuk 1 byteelse: if e%2:
menjadi adilelif e%2:
.i[j]<"q"
daripadai[j]=="e"
.Haskell,
5851 byteContoh penggunaan:
f "eeeeeqeeqeeqqqqeqeqeeqe"
->[5,8,11,12,13,14,18,21]
.Pergi melalui daftar dan output indeks saat ini
i
untuk setiap karakter'q'
jika ada jumlah ganjil dari'e'
sebelumnya.sumber
Minkolang 0,15 , 28 byte
Coba di sini.
Penjelasan
sumber
C (function), 65
Thanks to @Dennis for the extra golfing!
sumber
i,n;f(char*m){for(i=n=0;*m;m++,i++)*m&4?++n:n%2?printf("%d ",i):0;}
should work.Python 3,
109958090887668676664 bytesCounts the number of
q
s ande
s and adds the index of the currentq
if the number of precedinge
s is odd.Edit: Now it prints a list of the indices of s that are
q
and have an odd number ofe
s preceding them. Eight bytes saved thanks to Doorknob and two more thanks to feersum.Ungolfed:
sumber
input
andprint
statements unnecessary?enumerate
rather thanrange(len(...
.JavaScript ES6,
636058 bytesAnonymous function that outputs an array. Thanks to user81655 for saving two bytes. Here is an ungolfed version that uses better supported syntax.
sumber
Mathematica, 76 bytes
Something interesting I noticed. All of the syncopated parts are of form
eqqq..qqe
, so I just detect those and give the indices of theq
s.sumber
Japt,
292321 bytesNot non-competing anymore!
Try it online!
How it works
Non-competing version, 18 bytes
Try it online!
sumber
Befunge, 43 bytes
Try it online!
Explanation
We start with two implicit zeros on the stack: the note number, and a beat count.
sumber