J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby

problème

24e problème d'écriture en temps réel hors ligne

Référence (version Clojure)

Je l'ai résolu avec Clojure plus tôt. https://qiita.com/kts_h/items/64bb74fdcef642198bc5

Version rubis

De nombreuses réponses ont déjà été publiées par Ruby, mais j'ai trouvé cela intéressant et j'ai essayé de le résoudre moi-même, donc je vais le poster.

Je voulais écrire le bloc ʻeach_chardansrésoudre` proprement, donc j'ai essayé d'en faire une classe et de changer le contenu des variables d'instance l'une après l'autre.

class MultiStageSelection
  def self.solve(cmds)
    new.solve(cmds)
  end

  def initialize
    @enum = 1.step
  end

  def drop_nth(n)
    enum = @enum
    @enum = Enumerator.new do |y|
      n -= 1
      loop do
        n.times { y << enum.next }
        enum.next
      end
    end
    self
  end

  def drop_before(test)
    enum = @enum
    @enum = Enumerator.new do |y|
      a, b = enum.next, enum.next
      loop do
        y << a unless send(test, b)
        a, b = b, enum.next
      end
    end
    self
  end

  def drop_after(test)
    enum = @enum
    @enum = Enumerator.new do |y|
      a, b = enum.next, enum.next
      y << a
      loop do
        y << b unless send(test, a)
        a, b = b, enum.next
      end
    end
    self
  end

  def drop_100
    enum = @enum
    @enum = Enumerator.new do |y|
      100.times { enum.next }
      loop { y << enum.next }
    end
    self
  end

  def solve(cmds)
    cmds.each_char do |cmd|
      case cmd
      when "s" then drop_before(:square?)
      when "S" then drop_after(:square?)
      when "c" then drop_before(:cube?)
      when "C" then drop_after(:cube?)
      when "h" then drop_100
      else drop_nth(cmd.to_i)
      end
    end
    puts @enum.take(10).join(",")
  end

  private

  def square?(n)
    Math.sqrt(n).truncate**2 == n
  end

  def cube?(n)
    Math.cbrt(n).truncate**3 == n
  end
end


MultiStageSelection.solve("ss6cc24S")
MultiStageSelection.solve("4scC3hh982Cc5s")

Recommended Posts

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 la séquence Tribonacci en Ruby, avec récurrence.
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 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équence Tribonacci en Ruby (temps limite 10 minutes)
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
J'ai essayé de résoudre le problème de la campagne paiza "Challenge from Phantom Thief 813"
[Competition Pro] Résolvez les problèmes de sac à dos avec Ruby
J'ai vérifié le nombre de taxis avec Ruby
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
J'ai essayé de visualiser l'accès de Lambda → Athena avec AWS X-Ray
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
J'ai essayé DI 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 comparer la technologie d'infrastructure des ingénieurs ces jours-ci avec la cuisine.
J'ai essayé de réduire la capacité de Spring Boot
[At Coder] Résolvez le problème ABC183 D avec Ruby
J'ai essayé le problème FizzBuzz
[At Coder] Résolvez le problème ABC182 D avec Ruby
J'ai essayé de vérifier le fonctionnement de la requête http (Put) avec Talented API Tester
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
[Ruby] Je souhaite inverser l'ordre de la table de hachage
J'ai essayé d'interagir avec Java
J'ai essayé d'expliquer la méthode
Janken de Sazae J'ai essayé de vérifier la valeur théorique et la valeur mesurée de la probabilité de la même main 5 fois consécutives avec Ruby
[Rubiy] J'ai essayé de résumer le traitement de la boucle ce soir [fois, pause ...]
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai essayé de réimplémenter Ruby's Float (arg, exception: true) avec builtin
J'ai essayé de résumer les méthodes de Java String et StringBuilder
Je veux changer la valeur de l'attribut dans Selenium of Ruby
J'ai essayé un problème de calendrier avec Ruby
J'ai essayé de résumer les méthodes utilisées
J'ai essayé de démarrer avec Web Assembly
J'ai essayé d'exprimer les résultats avant et après de la classe Date avec une ligne droite numérique
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
[Débutant] Résolvons le problème d'AtCoder avec Ruby en regardant l'article!
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é
Comment résoudre la construction de l'environnement local de Ruby on Rails (MAC)!