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

Hystérie de l'historien

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-08 10:38:13778parcourir

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

É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)

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)
]
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(...);

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));

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]),
];

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),
];

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

[ 1, 2, 3, 3, 3, 4 ]
[ 3, 3, 3, 4, 5, 9 ]

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]);
}

Ç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

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

Je veux donc un objet qui ressemble à :

{
  4: 1,
  3: 3,
  5: 1,
  9: 1
}

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
}, {})

À 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

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)

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!

Déclaration:
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