Ich habe versucht, das Problem mit dem Ruby-Bonusgetränk 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 vierte Problem zu lösen.

Klicken Sie hier für weitere Probleme 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 beim Erstellen des Telefonbuchs

Problem

Für Details von hier

Wenn Sie ein Getränk in einem Süßwarenladen kaufen, erhalten Sie ein neues Getränk mit 3 leeren Flaschen. Erstellen Sie ein Programm, das die Gesamtzahl der Getränke berechnet, die Sie aus der Anzahl der zuerst gekauften Getränke trinken können. Wenn Sie zum ersten Mal 100 Flaschen kaufen, wie viele Flaschen können Sie insgesamt trinken?

** Bemerkungen ** Dieses Problem basiert auf dem mathematischen Problem der dritten Klasse der Grundschule.

** Beispiel **

|Anzahl der Einkäufe|Anzahl der Getränke| |--:|--:| | 0 | 0 | | 1 | 1 | | 3 | 4 | | 11 | 16 | | 100 | (Nach Programm berechnen) |

Antwortbeispiel

Es stellte sich heraus, dass es so etwas war

class BonusDrink
  def self.total_count_for(amount)
    if amount.zero?
      0
    elsif amount.odd?
      3 * amount / 2
    elsif amount.even?
      3 * (amount - 1) / 2 + 1
    end
  end
end

Hier ist der Testcode.

require_relative '../Bonus_drink/drink'

RSpec.describe BonusDrink do
  it "total_count_for" do
    expect(BonusDrink.total_count_for(0)).to eq 0
    expect(BonusDrink.total_count_for(1)).to eq 1
    expect(BonusDrink.total_count_for(3)).to eq 4
    expect(BonusDrink.total_count_for(11)).to eq 16
  end
end

Kommentar

Ich denke, dass es als Programm etabliert ist, aber es gibt ein leichtes Gefühl, dass diese Lösung als Zweck des Programmierproblems gut war. (Meistens habe ich das Papier und den Stift bewegt, um es mathematisch zu lösen.)

Zuerst

Wie Sie im Problem sehen können, können Sie "3 leere Flaschen und 1 neue austauschen". Der Punkt dieses Problems ist, dass sogar eine neue Flasche, die Sie umgetauscht und erhalten haben, ausgetauscht werden muss.

Damit

Anzahl der gekauften: 3 Anzahl der neu ausgetauschten:1 Gesamtzahl der Getränke: 4

Wenn Sie jedoch die erhaltenen Flaschen hinzufügen und drei erreichen, können Sie eine andere umtauschen. Zum Beispiel

Anzahl der gekauften: 5 Anzahl der neu ausgetauschten:1 Zusätzliche ausgetauschte Bücher: 1 Gesamtzahl der Getränke: 7

Es bedeutet das. Daher werden mit zunehmender Anzahl von Einkäufen zusätzliche Umtauschvorgänge viele Male wiederholt.

Ich dachte, es sei ein Problem, dies durch Programmieren auszudrücken und wiederholt die Gesamtzahl der Flaschen und die Anzahl der ersetzten Flaschen zu ersetzen, um näher an die maximale Gesamtzahl heranzukommen, aber ich konnte nicht daran denken und gab auf. Ich würde mich freuen, wenn Sie mir in den Kommentaren mitteilen könnten, ob Sie Beispiele für Antworten haben.

Erklärung von hier

Wie habe ich das gelöst? Ich habe die Anzahl der gekauften Flaschen und die Anzahl der Flaschen, die ich trinken konnte, aufgeschrieben.

Anzahl der Einkäufe Anzahl der Getränke
0 0
1 1
2 2
3 4
4 5
5 7
6 8
7 10
8 11
9 13
10 14
11 16

Dann *** *** Wenn die Anzahl der gekauften Flaschen n eine ungerade Zahl ist, stimmt der Wert von (n * 3) mit der Gesamtzahl der trinkbaren Flaschen bei n und der Anzahl der trinkbaren Flaschen bei (n + 1) überein *** Ich fand heraus. Übrigens, wenn es 0 ist, hält es nicht. (Es gibt verschiedene andere Regeln, aber dieses Mal werde ich diese Gleichung verwenden.) Speziell,

Anzahl der Einkäufe Anzahl der Getränke
5 7
6 8
5 * 3 = 15
7 + 8 = 15

Es wird sein! Mit anderen Worten, *** "Wenn Sie n durch 3 teilen und durch 2 teilen, können Sie die Anzahl der Getränke finden, die Sie trinken können" ***. Wenn Sie dies in Programmierung übersetzen,

#Wenn es seltsam ist
3 * amount / 2
#Wenn es gerade ist, wird es aus der vorherigen ungeraden Zahl berechnet.
3 * (amount - 1) / 2 + 1

[Beispiel der obigen Antwort](#Beispiel der Antwort) ist eine Zusammenfassung des obigen Inhalts.

schließlich

Ich verstehe, dass diese Art von Regel nicht gilt, aber ich bin mir nicht sicher ** "Warum das passiert" **. Wenn Sie auf leicht verständliche Weise erklären können, möchte ich Sie bitten, mit Verlegenheit zu unterrichten.

Vielen Dank!

Recommended Posts

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 mit der Ruby-Karaoke-Maschine 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
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, 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
Ich habe versucht, die Infrastrukturtechnologie der Ingenieure heutzutage mit dem Kochen zu vergleichen.