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
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) ]
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.
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 ]
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 !
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 !
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 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
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!