Bei einer Eingabe einer Zeichenfolge, die ausschließlich aus q
s für Viertelnoten und e
s für Achtelnoten besteht, werden die Indizes der synchronisierten Viertelnoten ausgegeben.
Die Synchronisation ist komplex, aber für die Zwecke dieser Herausforderung wird unsere Definition von "synchronisiert" sehr einfach sein: Eine Viertelnote, die mit dem "Off-Beat" beginnt - das heißt, die Beats werden in n / 4 als "und" gezählt Zeit.
Dies kann alternativ als jede Viertelnote definiert werden, der eine ungerade Anzahl von Achtelnoten vorausgeht. Beispielsweise werden die mit gekennzeichneten Noten *
als synchronisiert betrachtet und ihre Indizes werden ebenfalls angezeigt:
eqqeqqeqqe
** **
12 78
Output: 1 2 7 8
Die Eingabe besteht immer aus einer ganzen Anzahl von Takten im 4/4-Takt (eine Viertelnote ist ein Viertel eines Takts und eine Achtelnote ist ein Achtel eines Takts). (Die Eingabe ist auch niemals leer.) Die Ausgabe kann entweder eine einzelne Zeichenfolge mit durch Trennzeichen getrennten Elementen sein, die keine Zahlen enthalten, oder ein Array / eine Liste / usw. Die Ausgabe kann auf 1 basieren (dh der erste Index ist 1 anstelle von 0), und sie kann auch auf einer beliebigen numerischen Basis (unär, dezimal usw.) erfolgen.
Da es sich um Code-Golf , der kürzeste Code in Bytes gewinnt.
Testfälle:
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'
statteqqqe
Antworten:
Gelee ,
129 BytesAls Programm erfordert der obige Code Anführungszeichen um die Eingabe. Da dies nicht zulässig ist, handelt es sich um eine Funktionsübermittlung. Die Ausgabe ist 1-basiert.
Probieren Sie es online!Wie es funktioniert
Aktualisieren
Der obige Code funktioniert in der neuesten Version von Jelly nicht mehr, da wir ein Zeichen e benötigen , aber
“e”
einen String liefern. Behebung, die ein Byte für insgesamt 8 Bytes spart .Dies funktioniert als vollständiges Programm. Probieren Sie es online!
quelle
Rubin, 46
Eingabe in stdin. Ausgabe auf Standardausgabe, Zeilenvorschub getrennt.
Kommentiert
quelle
JavaScript ES7,
5048 BytesZiemlich kurz für JS, wenn Sie mich fragen.
[for...of]
Die Syntax, im Grunde genommen eine Kombination aus Karte und Filter, ist für diese Herausforderung praktisch.Definiert eine anonyme Funktion, die ein Array mit einem Index ausgibt.
Testschnipsel
Dies verwendet eine ungolfed, un-ES7-Version des Codes.
quelle
J,
20 - 19 -17 BytesDank an randomra für das Speichern eines Bytes und an Dennis für das Speichern von zwei Bytes. Dies ist ein unbenanntes monadisches Verb, das wie folgt verwendet wird:
Probieren Sie es hier aus.
Erläuterung
quelle
GNU grep,
3 + 17 = 203 + 15 = 18 BytesDas Programm benötigt die Optionen
boP
. Der Code istSpeichern Sie es als
synco
, und führen Sie es als ausgrep -boPf synco
.Auf das Ausgabetrennzeichen
:q
folgt eine neue Zeile. ZB die Ausgabe füreqqqe
ISDie Bedeutungen der Flags sind:
P
: Verwenden Sie PCRE-reguläre Ausdrücke.o
: Dies bedeutet, dass nur der Teil der Zeile gedruckt wird, der mit dem regulären Ausdruck übereinstimmt, dies ist jedoch nicht wichtig.o
wird verwendet, weil dadurch mehrere Übereinstimmungen pro Zeile zugelassen werden.b
: Gibt den Versatz des Anfangs jeder Übereinstimmung vom Anfang der Datei an in Bytes aus.Das Muster prüft, ob nach einer Viertelnote keine gerade Zahl von Achtelnoten vorhanden ist.
quelle
grep
eine eigenständige Sprache? Unabhängig davon, +1 für eine gute AntwortMATL , 12
1416BytesVielen Dank an Dennis für das Entfernen von 2 Bytes (und für das Hosten von MATL auf seiner großartigen Online-Plattform!)
Dies verwendet die aktuelle Version (9.3.0) der Sprache / des Compilers.
Ein- und Ausgabe erfolgen über stdin und stdout. Das Ergebnis ist 1-basiert.
Beispiel :
Oder versuchen Sie es online!
Erläuterung
quelle
Python 2,
9485797566 BytesEDIT: Danke Doorknob und Alex A.
EDIT: Danke Alex A.
BEARBEITEN: Verwenden Sie jetzt input (), sodass die Eingabe eine Zeichenfolge mit Anführungszeichen sein muss.
BEARBEITEN : Danke Zgarb für die Empfehlung, Aufzählung zu verwenden.
Zählt einfach die Anzahl der e, und wenn q, prüft, ob die Anzahl der e ungerade ist, und druckt den Index.
Probieren Sie es hier aus
quelle
if ...
durch eine ersetzenelse
, um 8 Bytes zu sparen.print
für 1 Byte entfernenelse: if e%2:
einfach ändernelif e%2:
.i[j]<"q"
aktiviereni[j]=="e"
.Haskell,
5851 BytesAnwendungsbeispiel:
f "eeeeeqeeqeeqqqqeqeqeeqe"
->[5,8,11,12,13,14,18,21]
.Gehen Sie die Liste durch und geben Sie den aktuellen Index
i
für jedes Zeichen aus,'q'
wenn eine ungerade Anzahl von'e'
s davor steht.quelle
Minkolang 0,15 , 28 Bytes
Probieren Sie es hier aus.
Erläuterung
quelle
C (Funktion), 65
Vielen Dank an @Dennis für das zusätzliche Golfen!
quelle
i,n;f(char*m){for(i=n=0;*m;m++,i++)*m&4?++n:n%2?printf("%d ",i):0;}
sollte funktionieren.Python 3,
109958090887668676664 BytesZählt die Anzahl von
q
s unde
s und addiert den Index des aktuellen Werts,q
wenn die Anzahl der vorangegangenene
s ungerade ist.Bearbeiten: Jetzt wird eine Liste der Indizes von s gedruckt,
q
denen eine ungerade Anzahl vone
s vorangestellt ist. Acht Bytes gespart dank Doorknob und zwei weitere dank feersum .Ungolfed:
quelle
input
undprint
unnötig zu machen ?enumerate
stattrange(len(...
.JavaScript ES6,
636058 BytesAnonyme Funktion, die ein Array ausgibt. Vielen Dank an user81655 für das Speichern von zwei Bytes. Hier ist eine ungolfed Version, die eine besser unterstützte Syntax verwendet.
quelle
Mathematica, 76 Bytes
Etwas interessantes ist mir aufgefallen. Alle synkopierten Teile sind von Form
eqqq..qqe
, also erkenne ich sie einfach und gebe die Indizes derq
s an.quelle
Japt,
292321 BytesNicht mehr konkurrierend!
Probieren Sie es online!
Wie es funktioniert
Nicht konkurrierende Version, 18 Bytes
Probieren Sie es online!
quelle
Befunge, 43 Bytes
Probieren Sie es online!
Erläuterung
Wir beginnen mit zwei impliziten Nullen auf dem Stapel: der Notennummer und einer Schlagzahl.
quelle