Gestern habe ich eine Mundharmonika gekauft:
Abbildung 1: Die Mundharmonika.
Meine Träume, seelenvolle Blues-Mundharmonika spielen zu können, die Menschen bewegt und einen erwachsenen Mann zum Weinen bringt, wurden jedoch schnell von zwei Problemen zunichte gemacht:
- Die Mundharmonika kann nur bestimmte Noten spielen;
- Ich bin deprimierend schlecht darin, Mundharmonika zu spielen.
Trotz meiner mangelnden Fähigkeiten in der Mundharmonika gibt es immer noch einige Songs, die ich darauf spielen kann. Es ist jedoch nicht sofort ersichtlich, ob ich ein Musikstück auf der Mundharmonika spielen kann oder nicht. Schreiben Sie anhand der Noten eines Musikstücks ein Programm, um festzustellen, ob ich es auf meiner Mundharmonika spielen kann oder nicht.
Wie das obige Bild zeigt, hat meine Mundharmonika zehn Löcher. Mit jedem Loch kann ich entweder einatmen oder einatmen - das Loch, das ich wähle, und ob ich einatme oder ausatme, ändert die Tonhöhe des resultierenden Klangs. Jedes Loch hat beim Ausatmen und Einatmen eine andere Tonhöhe, aber es gibt einige Kombinationen, die zur gleichen Note führen. Insgesamt kann meine Mundharmonika 19 verschiedene Tonhöhen spielen. Die Tonhöhen werden in musikalischer Notation dargestellt - der Buchstabe steht für die Note und die Zahl für die Oktave.
Hole Breathing Note
1 Exhale C4
1 Inhale D4
2 Exhale E4
2 Inhale G4
3 Exhale G4
3 Inhale B4
4 Exhale C5
4 Inhale D5
5 Exhale E5
5 Inhale F5
6 Exhale G5
6 Inhale A5
7 Exhale C6
7 Inhale B5
8 Exhale E6
8 Inhale D6
9 Exhale G6
9 Inhale F6
10 Exhale C7
10 Inhale A6
Wenn ich zum Beispiel bei Loch 3 ausatme, bekomme ich eine G4
Notiz. Wenn ich auf Loch 2 einatme, bekomme ich auch eine G4
Notiz. Wenn ich bei Loch 7 ausatme, bekomme ich eine C6
.
Wenn ich in die Mundharmonika einatme, kann ich neben dem Ausatmen oder Einatmen auch wählen, ob ich dünn oder weit atmen möchte . Durch dünnes Atmen ertönt nur ein Loch, während durch weites Atmen ein Loch und beide Löcher auf beiden Seiten dieses Lochs ertönen. Ich habe nicht die Fähigkeit, auf zwei Löcher zu blasen - es ist entweder eines oder drei.
Wenn ich zum Beispiel dünn auf Loch 4 ausatme, klingt nur Loch 4, sodass ich einen C5-Sound bekomme. Wenn ich weit auf Loch 4 ausatme, klingen die Löcher 3, 4 und 5 und ich bekomme einen G4-, C5-, E5-Akkord. Wenn ich weit in Loch 4 einatme, klingen die Löcher 3, 4 und 5, aber sie spielen stattdessen die Einatmungstöne, was zu einem B4-, D5-, F5-Akkord führt. Beachten Sie, dass für die Löcher an beiden Enden, wenn ich sie weit einatme, nur zwei Löcher ertönen würden (da es kein Loch 0 oder Loch 11 gibt).
Ich kann jedoch nicht gleichzeitig ein- und ausatmen. Zum Beispiel könnte ich in die Löcher 4, 5 und 6 ausatmen, damit die Noten C5, E5 und G5 gleichzeitig klingen und einen Akkord bilden. Ich kann jedoch nicht gleichzeitig ein- und ausatmen, so dass ich den Akkord C5, F5, A5 nicht spielen kann, da ich in Loch 4 irgendwie ausatmen und in Loch 5 und 6 einatmen müsste Dies ist noch unklar, dieser Kommentarthread könnte nützlich sein.
Die Eingabe sind die Noten der Musik. Die Noten werden auf die gleiche Weise notiert wie oben in der Tabelle und durch Kommas getrennt. Noten in geschweiften Klammern stehen für einen Akkord. Zum Beispiel:
C4,D4,G4,{D5,F5,A5},B5
Dies bedeutet: "C4, dann D4, dann G4, dann D5, F5 und A5 gleichzeitig, dann B5." Ihr Programm verwendet eine Zeichenfolge in diesem Format als Eingabe und Ausgabe, True
wenn ich die Musik auf meiner Mundharmonika oder auf False
andere Weise abspielen kann. Für Beispiel-Ein- und Ausgänge sollte das obige Beispiel ausgegeben werden True
. Der Eingang {C5,F5,A5}
hingegen wird ausgegeben False
.
Dies ist Code Golf, also gewinnt der kürzeste Eintrag.
Hier einige Testfälle:
Eingang (AC-Dur-Skala):
C4,D4,E4,F4,G4,A4,B4,C5
Ausgabe:
False
(weil die Mundharmonika F4 oder A4 nicht spielen kann)
Eingabe (die ersten 2 Takte von Let It Go ):
E6,F6,A5,E6,F6,F6,E6,A5,F6,E6
Ausgabe:
True
Eingang:
{E6,G6,F6}
Ausgabe:
False
Eingang:
{G4,C5,E5},{F5,A5,B5}
Ausgabe:
True
Sie können davon ausgehen, dass die Akkorde in einer niedrigeren bis höheren Tonhöhe vorliegen.
Antworten:
Python -
218209189 ZeichenMinimal:
Zum leichteren Lesen:
Geben Sie bei einer Zeichenfolge, die wie in der Problembeschreibung formatiert ist,
t
zurück,True
wenn die Sequenz auf der beschriebenen Mundharmonika spielbarFalse
ist und nicht.Die Reihenfolge der Noten in den Akkorden wird nicht überprüft. Sofern nicht anders angegeben, halte ich dies für ausreichend, da dies nicht in der Problemstellung enthalten ist und alle angegebenen Tests bestanden werden in:
quelle
] if "".join(x) not
->]if"".join(x)not
Schlüsselwörter können neben Zeichenfolgen stehen,"and"
ist also korrekt.Javascript -
245243 ZeichenMinimiert:
Und erweitert:
Die Funktion
p
akzeptiert eine Zeichenfolge als Eingabe und kehrt zurück,True
wenn die Noten- / AkkordfolgeFalse
ansonsten spielbar ist . Es gibt undefinierte Ergebnisse zurück, wenn die Eingabe syntaktisch nicht gültig ist.Es wird auch mutig davon ausgegangen, dass Akkordnoten in der Reihenfolge des aufsteigenden Lochs eingegeben werden (wie im Beispiel).
Die Anzahl der Zeichen kann um 14 verringert werden, wenn die Funktion logische
true
undfalse
nicht ihre Zeichenfolgenäquivalente zurückgeben darf .quelle
JavaScript (ES6), 230
Nur eine umgeschriebene Version der Antwort von @ COTO:
Würde mich über Tipps zum Golfen freuen, wenn ich anfange, ES6 zu lernen! :-)
quelle
Scala 178
Ungolfed:
Beachten Sie, dass fehlerhafte Eingaben schlecht behandelt werden - jede Zeichenfolge wird akzeptiert und viele fehlerhafte Zeichenfolgen geben true zurück, zum Beispiel:
druckt wahr.
quelle
Rebol - 188
Ungolfed:
Anwendungsbeispiel (in der Rebol-Konsole):
Während dieser Code Kauderwelsch wie folgt fängt:
Es wird jedoch solche Dinge ermöglichen durch:
Weil es es als "C4, D4" analysiert.
Hier ist eine strengere Version des Codes:
Dies spielt bis zu 228 Zeichen und kehrt jetzt
false
auf ...quelle
JavaScript ES6,
211209190 ZeichenIch weiß, dass dies weiter gespielt werden kann. Ich werde es in ein paar Stunden versuchen;
Führen Sie diesen Code in der Webkonsole von Latest Firefox aus. Sie erhalten eine Methode mit dem Namen,
C
die Sie wieC("{G4,C5,E5},{F5,A5,B5}")
folgt aufrufen können, und sie wird zurückgegebenTrue
oderFalse
entsprechend.Ich gehe von einer syntaktisch gültigen Eingabe aus.
BEARBEITEN : Vereinfachung des regulären Ausdrucks und der Längenprüfung.
quelle