Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions

introduction

Participer à une programmation compétitive dans le cadre de l'apprentissage de Ruby et des algorithmes. Ici, nous sortons ce que nous avons appris pendant l'apprentissage.

Cette fois, comment créer un tableau à deux dimensions. Dans le 3e test d'algorithme 2e question Score dynamique Il y a une scène dans laquelle je veux utiliser un tableau à deux dimensions. J'ai eu un petit problème ici, donc je vais le résumer pour examen.

Chose que tu veux faire

Je voulais faire quelque chose comme ce qui suit, alors j'ai décidé de créer un tableau à deux dimensions.

Par exemple Trois participants (1, 2, 3) participent à un examen. L'examen comportera trois questions. Gérez si chaque participant a pu répondre à chaque question.

L'image ressemble à celle ci-dessous.

image


#① Créez un tableau à deux dimensions comme celui-ci
[[0, 0, 0],[0, 0, 0],[0, 0, 0]]

#② Si le participant 1 répond correctement à la première question, inscrivez 1 dans l'élément correspondant.
[[1, 0, 0],[0, 0, 0],[0, 0, 0]] #1 dans le premier élément du tableau des premiers éléments

#③ Ensuite, si le participant 3 répond correctement à la deuxième question, inscrivez 1 dans l'élément correspondant.
[[1, 0, 0],[0, 0, 0],[0, 1, 0]] #1 dans le deuxième élément du troisième tableau d'éléments

① Ce que vous avez fait en premier (mal)

ary = Array.new(3, Array.new(3, 0))
print ary
# => [[0, 0, 0],[0, 0, 0],[0, 0, 0]]

Quant à l'apparence, j'ai fait ce que je veux faire, Quand j'essaye d'enregistrer la réponse

ary[0][0] = 1
print ary
# => [[1, 0, 0],[1, 0, 0],[1, 0, 0]]

J'avais l'intention d'apporter des modifications uniquement au premier tableau d'éléments, mais cela affectait tous les tableaux.

② Utilisez la méthode de la carte (bonne réponse!)

ary = Array.new(3).map{Array.new(3,0)}
print ary
# => [[0, 0, 0],[0, 0, 0],[0, 0, 0]]

ary[0][0] = 1
print ary
# => [[1, 0, 0],[0, 0, 0],[0, 0, 0]]

En conséquence, en imbriquant la méthode cartographique, nous avons pu créer en toute sécurité un tableau comme imaginé.

Quelle est la différence

Les tableaux bidimensionnels de (1) et (2) ci-dessus se ressemblent exactement, mais ils semblent avoir des propriétés complètement différentes. Je vais réfléchir à ce qui est différent.

À propos de la nouvelle méthode ① de la classe Array

Dans la Référence, il est écrit comme suit.

new(size = 0, val = nil) -> Array

Génère un tableau de taille de longueur, initialise chaque élément avec val et retourne. Notez que val n'est pas dupliqué élément par élément. Tous les éléments font référence au même objet val.

Exemple


ary = Array.new(3, "foo")
p ary                     #=> ["foo", "foo", "foo"]
ary[0].capitalize!
p ary                     #=> ["Foo", "Foo", "Foo"]

Dans cet exemple, le "foo" dans chaque élément est montré comme étant le même objet. Comme le dit la description, tous les éléments sont le même objet val.

Alors, le tableau bidimensionnel est-il créé dans ① l'image suivante?

1.jpg

Même si les éléments semblent être divisés en trois parties dans le tableau, ils ne font référence qu'au même objet à la fin. Il semble que quel que soit l'élément que vous modifiez, le même objet changera.

Array.new(3, Array.new(3, 0)).jpg

Est-ce une telle image?

À propos de la méthode cartographique ②

Dans la Référence, il est écrit comme suit.

map -> Enumerator map {|item| ... } -> [object]

Renvoie un tableau contenant tous les résultats de l'évaluation des blocs pour chaque élément. Si vous omettez le bloc, effectuez l'itération décrite ci-dessus et Renvoie un objet Enumerator qui renvoie le tableau résultant.

Exemple


#Tout triple
p [1, 2, 3].map {|n| n * 3 }  # => [3, 6, 9]

La méthode map, comme la méthode each, extrait les éléments de l'objet tableau un par un. Renvoie le résultat du traitement dans le bloc {} sous forme de tableau.

Alors, le tableau bidimensionnel créé dans (2) a-t-il l'image suivante?

2.jpg

Puisqu'un tableau est généré séparément pour chaque élément, chaque élément existe en tant qu'objet indépendant. Il semble donc que vous puissiez apporter des modifications séparément.

finalement

Jusqu'à présent, j'ai résumé les points sur lesquels je suis tombé sur la façon de créer un tableau à deux dimensions. J'ai l'intention de le résumer en lisant la référence etc. Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.

Recommended Posts

Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions
Comment créer un tableau Java
Apprendre Ruby avec AtCoder 11 Comment recevoir une entrée standard souvent utilisée
[Java] Comment transformer un tableau à deux dimensions avec une instruction for étendue
[Ruby] Extraction d'un tableau à deux dimensions
Apprendre Ruby avec AtCoder 12 Comment utiliser correctement la sortie standard (p / met / print)
Apprendre Ruby avec AtCoder 6 [Concours 168 Donc]
Comment changer une chaîne dans un tableau en un nombre dans Ruby
Comment créer un pilote JDBC
Comment créer un écran de démarrage
Comment créer un plug-in Jenkins
Comment faire un projet Maven
Faites un jeu de frappe avec ruby
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
Comment créer un fichier jar sans dépendances dans Maven
Comment créer un résumé de calendrier Java
Apprendre Ruby avec AtCoder 7 [Contest 168 Triple Dots]
Comment ajouter un nouveau hachage / tableau
Comment créer un robot Discord (Java)
Tableau bidimensionnel Ruby
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 6.x)
Si vous voulez créer un fichier zip avec Ruby, c'est rubyzip.
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 5.x)
Comment créer une application avec un mécanisme de plug-in [C # et Java]
AtCoder Beginner Contest 169 A, B, C avec rubis
Convertissez une chaîne en un tableau caractère par caractère avec Swift
Comment créer des pages pour le tableau "kaminari"
Comment créer un JRE léger pour la distribution
AtCoder ABC127 D hash à résoudre avec Ruby 2.7.1
[Ruby] Comment générer une chaîne de caractères d'alphabet aléatoire
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part3 ~ Practice ~
Comment faire une méthode de jugement pour rechercher n'importe quel caractère dans le tableau
Rails6 Je veux créer un tableau de valeurs avec une case à cocher
Apprendre Ruby avec AtCoder 9 [1er test pratique d'algorithme 3ème] Tri des éléments du tableau
Comment faire un pot ombré
[Rubiy] Je veux créer un tableau à partir d'une chaîne de caractères avec la méthode split. Et vice versa.
Comment utiliser un tableau pour la clé TreeMap
Tableau 2D AtCoder ABC129 D résolu en Ruby et Java
Comment supprimer un objet new_record construit avec Rails
Comment organiser les informations pour rationaliser l'apprentissage de la programmation
Faisons un Bot LINE avec Ruby + Sinatra - Partie 2
Comment faire fonctionner JavaScript sur une page spécifique
Comment générer manuellement un JWT avec Knock in Rails
AtCoder Beginner Contest 170 A, B, C jusqu'au rubis
Comment lancer une autre commande dans un programme Ruby
Comment sortir le standard d'un tableau avec for Each
[Comment insérer une vidéo dans un hameau avec Rails]
Comment convertir un fichier en tableau d'octets en Java
Comment interroger Array dans jsonb avec Rails + postgres
Faisons un Bot LINE avec Ruby + Sinatra - Partie 1
Comment faire un cache sans trop réfléchir
Comment faire un MOD pour Slay the Spire
[Java] Comment rompre une ligne avec StringBuilder
Comment trouver la valeur totale, la valeur moyenne, etc. d'un tableau à deux dimensions (tableau multidimensionnel) -java