"Introduction à Ruby pour ceux qui veulent devenir un professionnel" Je suis un débutant en programmation après avoir appris le livre dit de la cerise. Quand j'ai voulu bouger mes mains et mettre en pratique ce que j'apportais, j'ai trouvé un article de l'auteur. "Si vous rencontrez des problèmes avec le matériel de sortie!? J'ai collecté des problèmes de programmation pour les débutants Ruby (10 questions au total)"
J'ai essayé de résoudre ce deuxième problème.
Première question: Problème de création de calendrier (problème de pratique Ruby amusant) Deuxième question: Problème de création de machine à karaoké Troisième question: Problème de création de carte de bingo Quatrième question: Problème de boisson bonus Cinquième question: Problème de création du répertoire
Pour plus de détails, voir Énoncé du problème réel. Si vous connaissez le problème, [Aller à l'exemple de réponse](# exemple de réponse).
Le karaoké a une fonction pour changer la clé. +1 augmentera la clé de un. -1 abaissera la clé de un. Par exemple, si vous élevez deux touches de la mélodie "Dremifaso", elle devient "Remifa #Sora". Le katakana comme "Dremi Faso" est difficile à manipuler dans le programme, alors remplaçons-le par la lecture anglaise, c'est-à-dire l'alphabet. Doremi Faso → C D E F G Remifa #Sora → D E F # G A
La mélodie de Kaeru no Uta est exprimée par les chaînes de caractères suivantes. Modifiez la clé pour la taille spécifiée, comme (+6) ou (-11).
"C D E F |E D C |E F G A |G F E |C C |C C |CCDDEEFF|E D C "
L'exemple d'exécution ressemble à ceci.
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 octave(12 sons)Vous pouvez modifier ce qui précède karaoke.transpose(14)
# Exemple de réponse
Il s'est avéré être quelque chose comme ça.
```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
Au début, je pensais que c'était complété avec le code ci-dessous,
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
Dans ce cas, j'ai remarqué que «l'alphabet» et «#» étaient séparés lorsque la mélodie suivante est arrivée, et je l'ai corrigée en utilisant une expression régulière.
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# "
Je vais l'écrire comme mon mémorandum.
L'échelle des tons dans ce problème est une répétition de «Dodo #Rele #Mifafa #Soso #Lara #Shi», y compris la netteté.
scales = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]`
Je l'ai transformé en un tableau comme celui-ci.
La chaîne de caractères reçue par «melody =» est séparée en «tone» et «other» et transformée en tableau.
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", " "]
Chaque élément du tableau se trouve dans le bloc de la méthode map
pour trouver la valeur de vérité de la condition, et chaque valeur est ajoutée au nouveau tableau.
tone
, changez la touche des minutes spécifiée.@melody.split(/(\w#?)/).map{
|m| /(\w#?)/.match?(m) ?
scales[(scales.find_index(m) + amount) % scales.length] : m
}.join
En divisant la somme de l '«index» de la «gamme» et de l'incrémentation / décrémentation de la clé spécifiée par la «longueur» des «échelles», on obtient l' «index» du «ton» correspondant auquel la clé a été modifiée. ..
Par conséquent, si vous remplacez la valeur de scale []
et spécifiez ʻindex, vous pouvez trouver la
scale` avec le changement de clé.
Enfin, rejoignez à nouveau `` join this
tone ʻet other
et convertissez-le en une chaîne de caractères, et vous avez terminé.
Je pense qu'il y a des endroits qui sont devenus un peu forcés. Veuillez me faire savoir si vous avez des erreurs ou des opinions.