J'ai essayé un problème de calendrier avec Ruby

Je suis un débutant étudiant les rails. Cela fait environ un mois que j'ai appris les rails. Alors que je voulais commencer à apprendre Ruby à partir de zéro, je suis arrivé à l'article suivant écrit par M. Ito, un programmeur Ruby.

Si vous avez des problèmes avec le matériel de sortie, c'est tout! ?? J'ai collecté des problèmes de programmation pour les débutants Ruby (10 questions au total)

Aujourd'hui, je vais me référer à cela et écrire sur le code que j'ai écrit et ce que j'y ai appris. Je voudrais continuer à me rafraîchir moi-même, mais je serais heureux si d'autres personnes pouvaient le voir et le signaler.

Problème de calendrier Ma réponse Tout d'abord, mon programme que j'ai fait est le suivant.

calender.rb



require  'Date'

#Méthode pour vérifier le dernier jour de ce mois
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

#Voir combien de semaines ce mois est
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

#Générer la date du jour
today = Date.today

#À partir de la date d'aujourd'hui/Mois/Moisの英字名を出力する
year = today.year
month = today.month
name_of_month = today.strftime("%B")

#Découvrez le jour de début du mois
day_of_the_week = Date.new(year,month,1).wday


#Créez un tableau de dates basé sur le dernier jour
last_day = last_day(year,month)
day_array = [*1..last_day]

#Ajouter un blanc au tableau pour chaque jour de début
day_of_the_week.times do
  day_array.unshift(" ")
end

#Voir combien de semaines ce mois est
weeks_count = how_many_weeks(day_array)
#Créer un titre de calendrier
calender_title = name_of_month + " " + year.to_s


#Sortie de calendrier
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
  #Défini sur une semaine de contenu d'une semaine
  week = day_array.shift(7)

  #En cas de contre-mesure en cas de zéro, laissez un blanc
  if week.length < 7
    e  = week[6]
    week.map {|e| e ? e : " " }
  end

  #Sortie d'une semaine
 printf("%3s%3s%3s%3s%3s%3s%3s\n",
        week[0],week[1],week[2],week[3],week[4],week[5],week[6])
end


Le résultat de sortie est le suivant ce mois-ci


     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   

Fonctions Ruby apprises lors de la création

・ printf Une fonction qui s'imprime après avoir spécifié le format d'affichage avec un spécificateur de format, qui est dérivé du langage C. J'ai trouvé cela en réfléchissant à la façon de le façonner lors de la création d'un calendrier. Cette fois, il est utilisé pour sortir le jour de la partie d'en-tête et la date du contenu.
printf("%3s%3s%3s%3s%3s%3s%3s\n","Su","Mo","Tu","We","Th","Fr","Sa","Su")

Indique la sortie de la chaîne de caractères avec % s Spécifiez le nombre de chiffres d'affichage avec «3» entre-temps Il y a un saut de ligne au dernier \ n.

En spécifiant le même format pour la partie en-tête et la date, j'ai pu l'organiser proprement.

Référence: Fonction d'entrée standard

・ Chaîne # center J'ai remarqué que le titre ne peut pas être centré avec le printf ci-dessus, et j'ai trouvé cette méthode en étudiant comment centrer la chaîne de caractères avec ruby.
puts calender_title.center(21," ")

Ici, nous traitons pour avoir "" (vide) inséré de sorte que les caractères soient au centre dans la plage de 21 qui est la taille de la partie du calendrier. C'est pratique!

Référence: String # center Ruby Reference

・ Méthode de carte qui ne laisse aucun blanc Le calendrier doit comporter des espaces vides au début et à la fin en fonction du jour du premier jour. Concernant le début, je l'ai traité en ajoutant un blanc au tableau en fonction du jour du jour à `day_array` avec une date, mais pour le blanc à la fin, je ne sais pas comment bien le gérer et c'est peut-être une lame brûlante. J'ai utilisé la méthode suivante.
  #Défini sur une semaine de contenu d'une semaine
  week = day_array.shift(7)

  #En cas de contre-mesure en cas de zéro, laissez un blanc
  if week.length < 7
    e  = week[6]
    week.map {|e| e ? e : " " }
  end

if week.length < 7 Si le tableau semaine avec la date de la semaine contient moins de 7 éléments e = week[6] En appelant la semaine [6], mettez nil dans toutes les parties qui n'ont aucune valeur. week.map {|e| e ? e : " " } À partir de là, utilisez map pour effectuer une formule ternaire (remplacez par "" (vide) dans le cas de nil) et remplacez nil.

Je pense qu'il y a un meilleur moyen, mais ... je voulais y arriver une fois, alors j'ai décidé de le faire.

Référence: Comment gérer nil de tableau et de valeur pour ne pas provoquer d'erreur dans ruby

Enfin

Pour le moment, j'ai pu le faire très agréablement grâce à divers essais et erreurs. Comme mentionné dans le blog au début, je pense qu'il est important de réfléchir davantage et de rendre le code plus propre que de simplement le faire. Commençons par revoir le code de cette application de création de calendrier et écrire un test.

Encore une fois, merci à tous les sites pour votre référence!

Recommended Posts

J'ai essayé un problème de calendrier avec Ruby
J'ai essayé d'incorporer une formule dans Javadoc
J'ai essayé d'écrire du code comme une déclaration de type en Ruby
J'ai créé une bibliothèque d'extension Ruby en C
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
J'ai essayé d'utiliser une connexion à une base de données dans le développement Android
J'ai fait un jeu de problèmes de calcul simple en Java
J'ai essayé DI avec Ruby
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby (temps limite 10 minutes)
Créer un calendrier avec Ruby
J'ai essayé de créer une compétence Clova en Java
Multiplication dans un tableau Ruby
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé le problème FizzBuzz
J'ai essayé la métaprogrammation avec Java
J'ai recherché un framework web avec Gem en Ruby
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
Je veux créer un fichier Parquet même en Ruby
J'ai essayé d'implémenter une application web pleine de bugs avec Kotlin
J'ai créé un client RESAS-API en Java
J'ai écrit un analyseur C (comme) en utilisant PEG dans Ruby
Problème de création de calendrier (problème de pratique amusant avec Ruby)
J'ai créé un PDF avec Java.
J'ai essayé un petit docker de digdag.
Implémenter le client gRPC dans Ruby
J'ai essayé de mettre Domino11 dans CentOS7
J'ai essayé d'utiliser JWT en Java
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé de créer une application cartographique simple dans Android Studio
J'ai essayé d'illuminer le sapin de Noël dans un jeu de la vie
Problème de rubis ⑦
J'ai essayé de faire un Numeron qui n'est pas bon avec Ruby
J'ai essayé d'utiliser l'API Elasticsearch en Java
[Ruby] J'ai créé un simple client Ping
J'ai essayé le nouveau yuan à Java
Méthodes que j'ai trouvées utiles dans Ruby
J'ai essayé de jouer un peu avec BottomNavigationView ①
J'ai fait une mort risquée avec Ruby
J'ai essayé la bibliothèque AutoValue avec Intellij
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
[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 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
[LINE @] J'ai essayé de créer un BOT de conversion de calendrier occidental de calendrier japonais [API de messagerie]
J'ai créé un programme de jugement des nombres premiers en Java
problème de recherche de rubis
Traitement d'échappement lors de la création d'une URL dans Ruby
J'ai essayé de mettre facilement CentOS-7 dans un PC dont je n'ai plus besoin
[Pour les débutants] J'ai essayé d'utiliser DBUnit avec Eclipse
[Ruby] Problème de FizzBuzz