"Einführung in Ruby für diejenigen, die professionell werden wollen" Ich bin ein Anfänger in der Programmierung, nachdem ich das sogenannte Kirschbuch gelernt habe. Als ich meine Hände bewegen und meine Eingaben in die Praxis umsetzen wollte, fand ich einen Artikel des Autors. "Wenn Sie Probleme mit dem Ausgabematerial haben !? Ich habe Programmierprobleme für Ruby-Anfänger gesammelt (insgesamt 10 Fragen)"
Ich habe versucht, dieses zweite Problem zu lösen.
Erste Frage: Problem bei der Kalendererstellung (lustiges Ruby-Übungsproblem) Zweite Frage: Problem bei der Erstellung von Karaoke-Maschinen Dritte Frage: Problem bei der Erstellung der Bingokarte Vierte Frage: Problem mit Bonusgetränken Fünfte Frage: Problem bei der Erstellung des Telefonbuchs
Weitere Informationen finden Sie unter Aktuelle Problemstellung. Wenn Sie das Problem kennen, [Zum Antwortbeispiel springen](# Antwortbeispiel).
Karaoke hat eine Funktion zum Ändern der Taste.
+1 erhöht den Schlüssel um eins.
-1 senkt die Taste um eins.
Wenn Sie beispielsweise zwei Tasten der Melodie "Dremifaso" anheben, wird sie zu "Remifa #Sora".
Katakana wie "Dremi Faso" ist im Programm schwer zu handhaben. Ersetzen wir es also durch die englische Lesart, dh das Alphabet.
Doremi Faso → C D E F G.
Remifa #Sora → D E F # G A.
Die Melodie von Kaeru no Uta wird durch die folgenden Zeichenketten ausgedrückt. Ändern Sie den Schlüssel für die angegebene Größe, z. B. (+6) oder (-11).
"C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
Das Ausführungsbeispiel sieht folgendermaßen aus.
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C " karaoke = KaraokeMachine.new(melody) karaoke.transpose(2)
karaoke.transpose(-1)
#1 Oktave(12 Töne)Sie können das oben Gesagte ändern karaoke.transpose(14)
# Antwortbeispiel
Es stellte sich heraus, dass es so etwas war.
```ruby
class KaraokeMachine
def initialize(melody)
@melody = melody
end
def transpose(amount)
scales = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
@melody.split(/(\w#?)/).map{
|m| /(\w#?)/.match?(m) ?
scales[(scales.find_index(m) + amount) % scales.length] : m
}.join
end
end
Zuerst dachte ich, dass es mit dem Code unten vervollständigt wurde,
class KaraokeMachine
def initialize(melody)
@melody = melody
end
def transpose(amount)
scales = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
@melody.split("").map{
|m| m == " " || m == "|" ?
m : scales[(scales.find_index(m) + amount) % scales.length]
}.join
end
end
In diesem Fall bemerkte ich, dass das "Alphabet" und "#" getrennt wurden, als die folgende Melodie kam, und korrigierte sie mit einem regulären Ausdruck.
melody = "F# G# A# B |A# G# F# |A# B C# D# |C# B A# |F# F# |F# F# |F#F#G#G#A#A#BB|A# G# F# "
Ich werde es als mein Memorandum schreiben.
Die Tonskala in diesem Problem ist eine Wiederholung von "Dodo #Rele #Mifafa #Soso #Lara #Shi" einschließlich Schärfe.
scales = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]`
Ich habe es so zu einem Array gemacht.
Die von melody =
empfangene Zeichenkette wird in Ton
und Sonstige
getrennt und zu einem Array verarbeitet.
melody = "C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
melody.split(/(\w#?)/)
=> ["", "C", " ", "D", " ", "E", " ", "F", " |", "E", " ", "D", " ", "C", " |", "E", " ", "F", " ", "G", " ", "A", " |", "G", " ", "F", " ", "E", " |", "C", " ", "C", " |", "C", " ", "C", " |", "C", "", "C", "", "D", "", "D", "", "E", "", "E", "", "F", "", "F", "|", "E", " ", "D", " ", "C", " "]
Jedes Element des Arrays befindet sich im Block der "Map-Methode", um den Wahrheitswert der Bedingung zu ermitteln, und jeder Wert wird dem neuen Array hinzugefügt.
Ton
, ändern Sie die angegebene Minutentaste.@melody.split(/(\w#?)/).map{
|m| /(\w#?)/.match?(m) ?
scales[(scales.find_index(m) + amount) % scales.length] : m
}.join
Das Teilen der Zahl, die durch Addieren des "Index" der "Skala" und der Erhöhen / Verringern-Zahl des angegebenen Schlüssels durch die "Länge" der "Skalen" erhalten wird, ergibt den "Index" der entsprechenden "Skala", in die der Schlüssel geändert wurde. .. Wenn Sie also den Wert von "scale []" ersetzen und "index" angeben, können Sie die "scale" mit der Schlüsseländerung finden.
Schließlich "verbinden" Sie diesen "Ton" und "andere" erneut und konvertieren Sie ihn in eine Zeichenkette, und Sie sind fertig.
Ich denke, es gibt einige Orte, die etwas gewaltsam geworden sind. Bitte lassen Sie mich wissen, wenn Sie Fehler oder Meinungen haben.
Recommended Posts