J'ai essayé de résoudre le problème de la machine à karaoké Ruby (il y a un exemple de réponse)

introduction

"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

problème

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

=> "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 octave(12 sons)Vous pouvez modifier ce qui précède 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 "


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

Commentaire

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.

  1. Si tone, changez la touche des minutes spécifiée.
  2. Si «autrement», ajoutez l'élément tel quel. Sera exécuté par le code suivant.
@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é.

à la fin

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.

Recommended Posts

J'ai essayé de résoudre le problème de la machine à karaoké Ruby (il y a un exemple de réponse)
J'ai essayé de résoudre le problème de la boisson bonus Ruby (il y a un exemple de réponse)
J'ai essayé de résoudre le problème de création de carte de bingo Ruby (il y a un exemple de réponse)
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé de résoudre le problème de Google Tech Dev Guide
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby (temps limite 10 minutes)
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de résoudre le problème de la campagne paiza "Challenge from Phantom Thief 813"
Je veux rendre le cadre de la zone de texte rouge lorsqu'il y a une erreur de saisie
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
[Java] J'ai essayé de résoudre le problème de rang B de Paiza
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
Je veux connaître la réponse de l'application Janken
Comment écrire un exemple d'implémentation du problème dans E05 (ruby, C11) en temps réel hors ligne
L'argument de link_to est nul (nul) et un lien inattendu a été généré, j'ai donc essayé de le vérifier
J'ai essayé de résumer les bases de kotlin et java
Puisque la lecture de JdbcCodeList de TERASOLUNA est lente, j'ai essayé d'enregistrer plusieurs à la fois.
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai essayé le problème FizzBuzz
[Ruby] Je souhaite inverser l'ordre de la table de hachage
Je veux résoudre le problème N + 1 où les données sont plus rassemblées et l'opération devient lente.
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
[Rubiy] J'ai essayé de résumer le traitement de la boucle ce soir [fois, pause ...]
Vous voulez savoir ce que Ruby n est la puissance de 2? (Jugement de puissance de 2)
Comment afficher la valeur lorsqu'il y a un tableau dans le tableau
J'ai essayé de comprendre comment la méthode des rails "redirect_to" est définie
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
J'ai essayé de comprendre comment la méthode des rails "link_to" est définie
J'ai essayé de résumer les méthodes de Java String et StringBuilder
J'ai essayé de faire un Numeron qui n'est pas bon avec Ruby
Je veux changer la valeur de l'attribut dans Selenium of Ruby
J'ai essayé d'expliquer la méthode
J'ai essayé de créer un exemple de programme en utilisant le problème du spécialiste des bases de données dans la conception pilotée par domaine
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
[Ruby] Je souhaite extraire uniquement la valeur du hachage et uniquement la clé
[Introduction à Java] J'ai essayé de résumer les connaissances que j'estime essentielles
Obtenez le type d'un élément d'un tableau pour déterminer s'il s'agit d'un tableau
Comment résoudre la construction de l'environnement local de Ruby on Rails (MAC)!
J'ai essayé de visualiser l'accès de Lambda → Athena avec AWS X-Ray
[Ruby] J'ai essayé de résumer les méthodes fréquentes dans paiza
[Ruby] J'ai essayé de résumer les méthodes fréquentes avec paiza ②
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
J'ai un LSP et j'ai essayé de créer un environnement pour écrire Java avec Vim (NeoVim), mais je n'ai pas pu battre l'IDE ...
J'ai essayé un problème de calendrier avec Ruby
J'ai essayé de résumer les méthodes utilisées
Comme la commande du utilisée lorsque la capacité est pleine est difficile à utiliser, j'ai essayé de l'envelopper avec du rubis
J'ai essayé de résoudre la recherche binaire d'AOJ
J'ai essayé d'implémenter le modèle Iterator
J'ai essayé de résumer l'API Stream
Qu'est-ce que Docker? J'ai essayé de résumer
Ruby: J'ai essayé de savoir où Nokogiri va voir l'encodage lui-même
Ce que j'ai essayé quand je voulais obtenir tous les champs d'un haricot