Ich habe ein Kalenderproblem mit Ruby versucht

Ich bin ein Anfänger, der Rails studiert. Es ist ungefähr einen Monat her, seit ich zum ersten Mal Schienen gelernt habe. Während ich Ruby von Grund auf lernen wollte, kam ich zu dem folgenden Artikel von Mr. Ito, einem Ruby-Programmierer.

Wenn Sie Probleme mit dem Ausgabematerial haben, ist dies das Richtige! ?? Ich habe Programmierprobleme für Ruby-Anfänger gesammelt (insgesamt 10 Fragen)

Heute werde ich mich darauf beziehen und über den Code schreiben, den ich geschrieben habe und was ich darin gelernt habe. Ich würde gerne weiter alleine auffrischen, aber ich würde mich freuen, wenn andere Leute es sehen und darauf hinweisen könnten.

Kalenderproblem Meine Antwort Zunächst einmal ist mein Programm, das ich gemacht habe, wie folgt.

calender.rb



require  'Date'

#Methode zum Überprüfen des letzten Tages dieses Monats
def last_day(year,month)
  if month == 2 && Date.valid_date?(year,month,29)
    return 29
  elsif month == 2
    return 28
  elsif Date.valid_date?(year,month,31)
    return 31
  else
    return 30
  end
end

#Sehen Sie, wie viele Wochen dieser Monat ist
def how_many_weeks(day_array)
  days_count = day_array.length
  if days_count / 7 == 5 && days_count % 7 != 0
    return 6
  elsif days_count / 7 == 5
    return 5
  elsif days_count / 7 == 4 && days_count % 7 != 0
    return 5
  else
    return 4
  end
end

#Generieren Sie das heutige Datum
today = Date.today

#Ab dem heutigen Datum/Mond/Mondの英字名を出力する
year = today.year
month = today.month
name_of_month = today.strftime("%B")

#Finden Sie den Starttag des Monats heraus
day_of_the_week = Date.new(year,month,1).wday


#Erstellen Sie eine Reihe von Daten basierend auf dem letzten Tag
last_day = last_day(year,month)
day_array = [*1..last_day]

#Fügen Sie dem Array für jeden Starttag ein Leerzeichen hinzu
day_of_the_week.times do
  day_array.unshift(" ")
end

#Sehen Sie, wie viele Wochen dieser Monat ist
weeks_count = how_many_weeks(day_array)
#Kalendertitel erstellen
calender_title = name_of_month + " " + year.to_s


#Kalenderausgabe
puts calender_title.center(21," ")
printf("%3s%3s%3s%3s%3s%3s%3s\n","Su","Mo","Tu","We","Th","Fr","Sa","Su")
weeks_count.times do
  #Stellen Sie die Inhaltswoche einer Woche ein
  week = day_array.shift(7)

  #Lassen Sie als Gegenmaßnahme bei Null ein Leerzeichen
  if week.length < 7
    e  = week[6]
    week.map {|e| e ? e : " " }
  end

  #Ausgabe im Wert von einer Woche
 printf("%3s%3s%3s%3s%3s%3s%3s\n",
        week[0],week[1],week[2],week[3],week[4],week[5],week[6])
end


Das Ausgabeergebnis ist in diesem Monat wie folgt


     August 2020     
 Su Mo Tu We Th Fr Sa
                    1
  2  3  4  5  6  7  8
  9 10 11 12 13 14 15
 16 17 18 19 20 21 22
 23 24 25 26 27 28 29
 30 31   

Ruby-Funktionen, die während der Erstellung gelernt wurden

・ printf Eine Funktion, die nach Angabe des Anzeigeformats mit einem Formatbezeichner gedruckt wird, der von der Sprache C abgeleitet ist. Ich fand dies, als ich darüber nachdachte, wie ich es beim Erstellen eines Kalenders gestalten sollte. Dieses Mal wird es verwendet, um den Tag des Kopfteils und das Datum des Inhalts auszugeben.
printf("%3s%3s%3s%3s%3s%3s%3s\n","Su","Mo","Tu","We","Th","Fr","Sa","Su")

Zeigt die Ausgabe der Zeichenfolge mit% s an Geben Sie in der Zwischenzeit die Anzahl der Anzeigestellen mit "3" an Am letzten \ n gibt es einen Zeilenumbruch.

Durch die Angabe des gleichen Formats für den Kopfteil und das Datum konnte ich es ordentlich anordnen.

Referenz: Standardeingabefunktion

・ String # center Ich habe festgestellt, dass der Titel nicht mit dem obigen Ausdruck zentriert werden kann, und habe diese Methode gefunden, als ich untersucht habe, wie die Zeichenkette mit Ruby zentriert wird.
puts calender_title.center(21," ")

Hier wird "" (leer) eingefügt, sodass die Zeichen in der Mitte innerhalb des Bereichs von 21 liegen, der der Größe des Kalenderteils entspricht. Es ist bequem!

Referenz: String # center Ruby Reference

・ Zuordnungsmethode, bei der Null leer bleibt Der Kalender sollte am Anfang und am Ende je nach Tag des ersten Tages Leerzeichen enthalten. In Bezug auf den Anfang habe ich mich damit befasst, indem ich dem Array ein Leerzeichen entsprechend dem Tag des Tages zu `day_array` mit einem Datum hinzugefügt habe, aber für das Leerzeichen am Ende weiß ich nicht, wie ich gut damit umgehen soll, und es kann eine brennende Klinge sein. Ich habe die folgende Methode verwendet.
  #Stellen Sie die Inhaltswoche einer Woche ein
  week = day_array.shift(7)

  #Lassen Sie als Gegenmaßnahme bei Null ein Leerzeichen
  if week.length < 7
    e  = week[6]
    week.map {|e| e ? e : " " }
  end

if week.length < 7 Wenn das Array "Woche" mit dem Datum der Woche weniger als 7 Elemente enthält e = week[6] Wenn Sie Woche [6] aufrufen, geben Sie in allen Teilen, die keinen Wert haben, Null ein. week.map {|e| e ? e : " " } Verwenden Sie von dort aus map, um eine ternäre Formel auszuführen (im Fall von nil durch "" (leer) ersetzen) und nil zu ersetzen.

Ich denke, es gibt einen besseren Weg, aber ... ich wollte es einmal schaffen, also habe ich mich dazu entschlossen.

Referenz: Verwalten von Null von Array und Wert, um keinen Fehler in Ruby zu verursachen

Endlich

Vorläufig konnte ich es durch verschiedene Versuche und Irrtümer sehr angenehm machen. Wie im Blog am Anfang geschrieben, denke ich, dass es wichtig ist, mehr nachzudenken und den Code sauberer zu machen, nicht nur, um ihn zu machen. Beginnen wir damit, den Code dieser Kalendererstellungs-App erneut zu überprüfen und einen Test zu schreiben.

Nochmals vielen Dank an alle Websites für Ihre Referenz!

Recommended Posts

Ich habe ein Kalenderproblem mit Ruby versucht
Ich habe versucht, eine Formel in Javadoc einzubetten
Ich habe versucht, Code wie eine Typdeklaration in Ruby zu schreiben
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Ich habe versucht, eine Datenbankverbindung in der Android-Entwicklung zu verwenden
Ich habe ein einfaches Berechnungsproblemspiel in Java gemacht
Ich habe DI mit Ruby versucht
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby zu lösen (Zeitlimit 10 Minuten).
Erstellen eines Kalenders mit Ruby
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Multiplikation innerhalb eines Ruby-Arrays
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe das FizzBuzz-Problem ausprobiert
Ich habe versucht, Metaprogrammierung mit Java
Ich habe mit Gem in Ruby nach einem Webframework gesucht
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich möchte eine Parkettdatei auch in Ruby erstellen
Ich habe versucht, eine Webanwendung voller Fehler mit Kotlin zu implementieren
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe einen C-Parser (wie) mit PEG in Ruby geschrieben
Problem bei der Kalendererstellung (lustiges Ruby-Übungsproblem)
Ich habe ein PDF mit Java erstellt.
Ich habe ein wenig digdags docker.run_options ausprobiert
Implementieren Sie den gRPC-Client in Ruby
Ich habe versucht, Domino11 in CentOS7 zu integrieren
Ich habe versucht, JWT in Java zu verwenden
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe versucht, eine einfache Karten-App in Android Studio zu erstellen
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
Rubinproblem ⑦
Ich habe versucht, einen Numeron zu erstellen, der mit Ruby nicht gut ist
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
[Ruby] Ich habe einen einfachen Ping-Client erstellt
Ich habe das neue Yuan-Problem in Java ausprobiert
Methoden, die ich in Ruby nützlich fand
Ich habe versucht, ein wenig mit BottomNavigationView zu spielen ①
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich habe die AutoValue-Bibliothek mit Intellij ausprobiert
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
[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, ein Beispielprogramm mit dem Problem des Datenbankspezialisten für domänengesteuertes Design zu erstellen
[LINE @] Ich habe versucht, einen westlichen Kalender für einen japanischen Kalender zu konvertieren. BOT [Messaging API]
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
Ruby-Suchproblem
Escape-Verarbeitung beim Erstellen einer URL in Ruby
Ich habe versucht, CentOS-7 einfach in einen PC zu integrieren, den ich nicht mehr benötige
[Für Anfänger] Ich habe versucht, DBUnit mit Eclipse zu verwenden
[Ruby] FizzBuzz-Problem