Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen

Problem

24. Offline-Echtzeit-Schreibproblem

Referenz (Clojure-Version)

Ich habe es früher mit Clojure gelöst. https://qiita.com/kts_h/items/64bb74fdcef642198bc5

Ruby-Version

Viele Antworten wurden bereits von Ruby herausgegeben, aber ich fand es interessant und habe versucht, es selbst zu lösen, also werde ich es veröffentlichen.

Ich wollte den each_char-Block ordentlich in lösen schreiben, also machte ich ihn zu einer Klasse und änderte den Inhalt der Instanzvariablen nacheinander.

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

Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Ich habe versucht, das Problem des Google Tech Dev Guide zu lösen
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 Tribonacci-Sequenz in Ruby zu lösen (Zeitlimit 10 Minuten).
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Ich habe versucht, das Paiza-Kampagnenproblem "Herausforderung von Phantomdieb 813" zu lösen.
[Competition Pro] Löse Rucksackprobleme mit Ruby
Ich habe die Anzahl der Taxis mit Ruby überprüft
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
Ich habe versucht, den Zugriff von Lambda → Athena mit AWS X-Ray zu visualisieren
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen
Ich habe DI mit Ruby versucht
[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 Infrastrukturtechnologie der Ingenieure heutzutage mit dem Kochen zu vergleichen.
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
[Bei Coder] Lösen Sie das ABC183 D-Problem mit Ruby
Ich habe das FizzBuzz-Problem ausprobiert
[Bei Coder] Lösen Sie das ABC182 D-Problem mit Ruby
Ich habe versucht, den Betrieb der http-Anfrage (Put) mit dem Talented API Tester zu überprüfen
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
[Ruby] Ich möchte die Reihenfolge der Hash-Tabelle umkehren
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, die Methode zu erklären
Sazae's Janken Ich habe versucht, den theoretischen Wert und den gemessenen Wert der Wahrscheinlichkeit derselben Hand 5 Mal hintereinander mit Ruby zu überprüfen
[Rubiy] Heute Abend habe ich versucht, die Schleifenverarbeitung zusammenzufassen [Zeiten, Pause ...]
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht, Ruby's Float (arg, Ausnahme: true) mit Builtin neu zu implementieren
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Ich habe ein Kalenderproblem mit Ruby versucht
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe versucht, mit Web Assembly zu beginnen
Ich habe versucht, die Ergebnisse vor und nach der Date-Klasse mit einer geraden Zahl auszudrücken
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
[Anfänger] Lösen wir das AtCoder-Problem mit Ruby, während wir uns den Artikel ansehen!
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
So lösen Sie die lokale Umgebungskonstruktion von Ruby on Rails (MAC)!