Ich habe versucht, das Problem mit der Ruby-Karaoke-Maschine zu lösen (es gibt ein Beispiel für die Antwort).

Einführung

"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

Problem

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". image.png 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)

=> "D E F# G |F# E D |F# G A B |A G F# |D D |D D |DDEEF#F#GG|F# E D "

karaoke.transpose(-1)

=> "B C# D# E |D# C# B |D# E F# G# |F# E D# |B B |B B |BBC#C#D#D#EE|D# C# B "

#1 Oktave(12 Töne)Sie können das oben Gesagte ändern karaoke.transpose(14)

=> "D E F# G |F# E D |F# G A B |A G F# |D D |D D |DDEEF#F#GG|F# E D "


# 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#   "

Kommentar

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.

  1. Wenn Ton, ändern Sie die angegebene Minutentaste.
  2. Wenn nicht, fügen Sie das Element so hinzu, wie es ist. Wird mit dem folgenden Code ausgeführt.
@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.

schließlich

Ich denke, es gibt einige Orte, die etwas gewaltsam geworden sind. Bitte lassen Sie mich wissen, wenn Sie Fehler oder Meinungen haben.

Recommended Posts

Ich habe versucht, das Problem mit der Ruby-Karaoke-Maschine zu lösen (es gibt ein Beispiel für die Antwort).
Ich habe versucht, das Problem mit dem Ruby-Bonusgetränk zu lösen (es gibt ein Beispiel für die Antwort).
Ich habe versucht, das Problem bei der Erstellung von Ruby-Bingokarten zu lösen (es gibt ein Beispiel für die Antwort).
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe versucht, das Problem des Google Tech Dev Guide zu lösen
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby zu lösen (Zeitlimit 10 Minuten).
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, das Paiza-Kampagnenproblem "Herausforderung von Phantomdieb 813" zu lösen.
Ich möchte den Rahmen des Textfelds rot machen, wenn ein Eingabefehler auftritt
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
[Java] Ich habe versucht, Paizas B-Rang-Problem zu lösen
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich möchte die Antwort der Janken-App wissen
Offline-Echtzeit-Schreibweise Implementierungsbeispiel für das Problem in E05 (Ruby, C11)
Das Argument von link_to ist nil (null) und ein unerwarteter Link wurde generiert, daher habe ich versucht, ihn zu überprüfen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Da das Lesen von JdbcCodeList von TERASOLUNA langsam ist, habe ich versucht, mehrere gleichzeitig zu registrieren.
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe das FizzBuzz-Problem ausprobiert
[Ruby] Ich möchte die Reihenfolge der Hash-Tabelle umkehren
Ich möchte das N + 1-Problem lösen, bei dem die Daten mehr gesammelt werden und der Vorgang langsam wird.
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
[Rubiy] Heute Abend habe ich versucht, die Schleifenverarbeitung zusammenzufassen [Zeiten, Pause ...]
Möchten Sie wissen, was Ruby n die Potenz von 2 ist? (Machturteil von 2)
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Ich habe versucht, einen Numeron zu erstellen, der mit Ruby nicht gut ist
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Ich habe versucht, die Methode zu erklären
Ich habe versucht, ein Beispielprogramm mit dem Problem des Datenbankspezialisten für domänengesteuertes Design zu erstellen
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Ich habe versucht, die wichtigsten Punkte des gRPC-Designs und der Entwicklung zusammenzufassen
[Ruby] Ich möchte nur den Wert des Hash und nur den Schlüssel extrahieren
[Einführung in Java] Ich habe versucht, das Wissen zusammenzufassen, das ich für wesentlich halte
Rufen Sie den Typ eines Elements eines Arrays ab, um festzustellen, ob es sich um ein Array handelt
So lösen Sie die lokale Umgebungskonstruktion von Ruby on Rails (MAC)!
Ich habe versucht, den Zugriff von Lambda → Athena mit AWS X-Ray zu visualisieren
[Ruby] Ich habe versucht, die häufigen Methoden in Paiza zusammenzufassen
[Ruby] Ich habe versucht, die häufigen Methoden mit paiza ② zusammenzufassen
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen
Ich habe einen LSP und habe versucht, eine Umgebung zum Schreiben von Java mit Vim (NeoVim) zu erstellen, aber ich konnte die IDE nicht übertreffen ...
Ich habe ein Kalenderproblem mit Ruby versucht
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Da der Befehl du, der bei voller Kapazität verwendet wird, schwierig zu verwenden ist, habe ich versucht, ihn mit Rubin zu umwickeln
Ich habe versucht, AOJs binäre Suche zu lösen
Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe versucht, die Stream-API zusammenzufassen
Was ist Docker? Ich habe versucht zusammenzufassen
Ruby: Ich habe versucht herauszufinden, wohin Nokogiri geht, um die Kodierung selbst zu sehen
Was ich versucht habe, als ich alle Felder einer Bohne bekommen wollte