Maison > interface Web > js tutoriel > Hystérie de l'historien

Hystérie de l'historien

Mary-Kate Olsen
Libérer: 2024-12-08 10:38:13
original
712 Les gens l'ont consulté

Historian Hysteria

Avènement du Code 2024 Jour 1

Partie 1

Un softball pour commencer l'année avec le sourire

Résoudre cela semble simple :

Parse the input into two equal lists of numbers
Sort each list in ascending order
Compare both values at each index
Determine the absolute value after calculating the difference
Increment a tally by the absolute value
Copier après la connexion
Copier après la connexion

Étape 1 : faire deux listes de nombres

Tout d'abord, je vais faire une liste de listes de 2 éléments où chaque élément est un nombre :

input.split('\n').split(' ').map(Number)
Copier après la connexion
Copier après la connexion

Ensuite, j'extrairai les éléments dans des listes séparées en fonction de leur index :

let [list1, list2] = [
  input.map((_,i) => i == 0),
  input.map((_,i) => i == 1)
]
Copier après la connexion
L'exécuter et corriger mes erreurs

Première erreur : enchaîner les splits.
Je ne peux pas appeler split sur un tableau.
Je dois diviser à l'intérieur d'une méthode itérative, comme map :

input.split("\n").map(...);
Copier après la connexion

Deuxième erreur : pas assez d'espaces.
L'entrée contient plusieurs espaces entre chaque nombre, pas un :

input.split("\n").map((el) => el.split("   ").map(Number));
Copier après la connexion

Troisième erreur : trop réfléchir à l'accès aux listes.

Mon code agissait comme si chaque liste imbriquée était un élément et renvoyait des valeurs booléennes selon que l'élément était le premier ou le deuxième de la liste.

Quoi ???!!!

Ce code reconnaît chaque liste et conserve le premier ou le deuxième élément :

let [list1, list2] = [
  input.map(list => list[0]),
  input.map(list => list[1]),
];
Copier après la connexion

Hélas, mon algorithme génère désormais deux listes de nombres !

Ouf, je suis devenu un peu rouillé sans avoir fait ça depuis dix mois.

Trier chaque liste par ordre croissant

Cela devrait être court et doux.

En fait, je vais juste ajouter au code directement ci-dessus :

let [list1, list2] = [
  input.map(list => list[0]).sort((a,b) => a - b),
  input.map(list => list[1]).sort((a,b) => a - b),
];
Copier après la connexion

A fonctionné à merveille sur l'exemple d'entrée :

[ 1, 2, 3, 3, 3, 4 ]
[ 3, 3, 3, 4, 5, 9 ]
Copier après la connexion

Les trois autres étapes, d'un seul coup !

let answer = 0;
for (let i = 0; i < list1.length; i++) {
  answer += Math.abs(list1[i] - list2[i]);
}
Copier après la connexion

Ça fonctionne sur l'exemple : 11

Est-ce que cela fonctionnera avec ma saisie de puzzle, cependant ?

C'est le cas !

Woohoo ! Une étoile d'or !

Partie 2

Une variante amusante pour tester le temps d'exécution

Les instructions voudraient me faire croire :

For each number in list 1
  For each number in list 2
    If there's a match
      Increment a tally by 1
Copier après la connexion

Cela signifie que la liste 2 sera vérifiée, liste 2 longueurs fois, liste 1 longueur... fois.

1000 articles chacun : 1 million de chèques

Ce n'est pas mal. Mais cela semble inutile.

Tout ce qui m'importe, ce sont les décomptes de chaque numéro de la liste 2.

Ainsi, je peux vérifier les 1000 nombres une fois et créer une carte des nombres en fonction de leurs décomptes. Ensuite, vérifiez cette liste 1000 fois.

2000 < 1 million

Je préfère cette approche. Au code !

Construire la carte des nombres et des comptes

La liste d'exemples ressemble à :

4, 3, 5, 3, 9, 3
Copier après la connexion

Je veux donc un objet qui ressemble à :

{
  4: 1,
  3: 3,
  5: 1,
  9: 1
}
Copier après la connexion

Avec ma list2 de mon algorithme Partie 1, je dois effectuer une réduction pour construire cet objet :

let counts = list2.reduce((obj, num) => {
  if (!(num in obj)) {
    obj[num] = 1
  } else {
    obj[num] += 1
  }
  return obj
}, {})
Copier après la connexion

À ma grande surprise, cet extrait fonctionne exactement comme prévu !

Je pensais avoir oublié la syntaxe correcte pour num dans obj, mais c'est tout !

Une simple recherche pour chaque élément de la liste

Une autre réduction avec une condition vérifiant l'existence et la valeur associée à un nombre :

Parse the input into two equal lists of numbers
Sort each list in ascending order
Compare both values at each index
Determine the absolute value after calculating the difference
Increment a tally by the absolute value
Copier après la connexion
Copier après la connexion

Débogage pour toujours parce que, eh bien, je n'arrive pas à y croire

Je n'arrêtais pas de voir le mauvais score.

Je n'arrêtais pas de me demander pourquoi.

J'ai continué à ajouter des instructions console.log() avec de plus en plus de valeurs à imprimer.

Je n'arrêtais pas de voir des valeurs auxquelles je ne m'attendais pas.

Ensuite, je l'ai vu.

Je comparais à list2 et non à mon objet de comptage personnalisé !

Énorme coup de poing pour l'ego. Mais exactement ce dont j'avais besoin le premier jour.

Voici le code fonctionnel :

input.split('\n').split(' ').map(Number)
Copier après la connexion
Copier après la connexion

Cela génère la bonne réponse pour l'exemple d'entrée.

Espérons que cela fasse de même pour ma contribution au puzzle.

Et j'espère que ça fonctionnera à une vitesse fulgurante !

C'est le cas !

Ouaisehawwww!!!

Deux étoiles d'or pour lancer le tout.

Avec quelques erreurs de débutant qui me maintiennent sur pied.

C'est pourquoi j'aime ces puzzles.

En avant aussi le jour 2 !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal