Comment puis-je résoudre le Éloquent Javascript “échiquier”?
nouveau codeur ici à essayer d'apprendre le JS. Je n'ai codecademy déjà et je travaille à travers Éloquent Javascript maintenant. J'ai enfin eu quelque chose ensemble après de me gratter la tête pour un très long moment... mais ça ne fonctionne pas! Je ne suis pas sûr si j'aborde ce à partir de l'angle droit, mais je sais que je veux utiliser les boucles pour suivre les progrès par le biais de l'impression de la # base de la grille.
Écrire un programme qui crée une chaîne de caractères qui représente une grille 8×8,
à l'aide de caractères de saut de ligne pour séparer les lignes. À chaque position de l'
la grille il y a un espace ou un caractère“#”. Les caractères doivent
forme d'un échiquier.
Le passage de cette chaîne à la console.journal devrait donner quelque chose comme ceci:
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
Mon code est ci-dessous:
var chessBoard = "";
var size = 8;
for (var lineCounter = 1; lineCounter < size; lineCounter++) {
if (lineCounter%2 === 0) { /
/if lineCounter is an even number
for (var charCounter = 1; charCounter < size; charCounter++) {
var evenOdd = (charCounter%2 === 0);
switch (evenOdd) {
case true:
(chessBoard += "#");
break;
case false:
(chessBoard += " ");
break;
}
}
}
else { //if lineCounter is an odd number
for (var charCounter = 1; charCounter < size; charCounter++) {
var evenOdd = (charCounter%2 === 0);
switch (evenOdd) {
case true:
(chessBoard += " ");
break;
case false:
(chessBoard += "#");
break;
}
}
}
chessBoard += "\n";
}
console.log(chessBoard);
Le courant de sortie du programme est: est-ce
# # # #
# # #
# # # #
# # #
# # # #
# # #
# # # #
Par le biais de quelques itérations, j'ai déjà appris beaucoup de choses, mais pour l'instant je vois déjà une erreur - je suis clairement à la baisse à un 7x7 grille au lieu de la 8x8 je voulais obtenir. Je soupçonne qu'il a à faire avec moi à l'aide de "<" dans ma pour les boucles, mais vous ne savez pas si il y a une meilleure façon de lutter contre cela, au lieu de simplement l'ajout d'un chiffre supplémentaire.
- Et ce résultat ne votre code générer? Comment est-ce différent de ce que vous attendez? (Veuillez inclure votre sortie dans la question.)
- wow, qui a totalement échappé à - moi-je suis déjà sur la bonne voie...
- Est-il peut-être un moyen plus efficace de s'attaquer à cette question?
- Le retour à la ligne est
\n
, pas/n
. - de retour à la ligne doit être "\n"
Vous devez vous connecter pour publier un commentaire.
C'est en fait assez facile, vous devez faire deux boucles,
un pour chaque ligne et l'autre pour choisir l'élément que vous voulez de la console.journal (soit '' ou '#').
vérifier les commentaires par le biais de la solution
Voici une approche différente.
Chaque ligne dispose de quatre instances de
_#
ou#_
(où le trait de soulignement est un espace).Paires de lignes de commencer avec
_#
et impaires lignes de commencer avec#_
:JS:
size
mais j'ai maintenant ajouté. Cela fonctionne mieux?c
? Je suis vraiment nouveau dans tout cela, mais déjà remarqué que vous avez battu l'opérateur ternaire simplement le if/else. L'amour que! Edit: Aussi, je crois que l'utilisation de modulo ici:i%2
résultats en valeur vrai/faux qui puis sélectionne à partir de la gauche ou la droite de la virgule. J'étais sous l'impression que l'opérateur modulo renvoie le reste...c
pour une utilisation à l'intérieur de la boucle. Et bonne prise avec l'opérateur ternaire (aussi connu comme l'opérateur conditionnel).i%2
t de retour reste de la division par 2 (1 ou 0), qui JavaScript interprète commetrue
oufalse
. (Tous les non-zéro, les nombres sont traités commetrue
en JavaScript.)jsFiddle Démo
Je suis un fan du jeu d'échecs 🙂 Dans les échecs, il y a la règle "Blanc sur le droit", ce qui signifie que la première place de notre conseil d'échecs sera " ". Suivant qu'il y a une alternative à chaque fois il y a une étrange correspondance entre la ligne et la colonne.
De l'affichage de la carte, elle affiche désormais une grille 8x8
N'hésitez pas à remplacer
i
pour un numéro de ligne oua
pour un numéro de colonne. Ou un ensemble à la fois à une taille 🙂 Il faudra encore travailler. Par exemple,a < 20
donnera 20 colonnesVoici une version
#
caractère au lieu d'un espace et donc ne correspond pas à celle de l'OP demande de sortie.En utilisant seulement les connaissances fournies à ce point dans le livre Éloquent JavaScript, voici ma solution:
voici ma version.
N'est pas aussi propre et éloquente que le livre, mais elle fonctionne!
var taille = 8;
var carte = " ";
Que ma solution:
voulais juste ajouter le mien 🙂
Alors moi et certains de codage copains étaient en va-et-vient de l'optimisation de cette fonction pour le plaisir et l'éducation.
Je n'ai pas vu notre solution gagnante jusqu'ici, donc pourquoi ne pas le jeter vers le haut?
Si vous supprimez le
for(n=2;2*n<s;n*=2)
boucles, puis il va courir plus vite pour générer de petites commissions, mais en les gardant dans le rend beaucoup plus efficace pour les grandes planches. Idéalement, vous pouvez calculer et de spécifier unthreshold
et passez lafor
des boucles lorsquesize<threshold
.cela peut être en retard mais il y a des réponses sur le à partir de la page elle-même, voir: http://eloquentjavascript.net/code/
manipuler pour la boucle/formules pour comprendre comme
J'ai essayé le mien avec des boucles while et une compréhension de base des livres de la solution.
Ici, il va de une alternative la réponse à l'aide opérateur ternaire (ma première contribution :D):
board+=((j+i)%2==0 ? " ": "#")
.Je n'ai la suite... Ce n'est pas très éloquent, mais il a travaillé pour le scenerio.
J'ai utilisé deux indépendants POUR les boucles et cela a fonctionné. Espérons indépendant POUR des boucles fait qu'il soit lisible. La taille du conseil d'administration peuvent être modifiées et il reflète en conséquence.
Pas la solution la plus élégante, je suis sûr, mais il fonctionne.
J'ai créé une solution à l'aide de la Chaîne de caractères.répétez méthode qui je pense est beaucoup plus propre que de nombreuses solutions ici:
Dans le cas où quelqu'un se demande, il y a un moyen de le faire avec une seule boucle:
size
*size
fois, mais d'autres solutions itérer deux fois sursize
, si votre taille est de 8, si vous souhaitez toujours avoir 64 itérations.La solution officielle utilise le caractère de saut de ligne
/n
que je comprends. Par l'imbrication des deuxfor
des boucles à l'intérieur de chacun d'autres, il est possible de construire l'ensemble de l'échiquier dans une ligne. Sûr.Mais si je veux construire un
oddRow
(en commençant par#
et en répétant sur toute la largeur) et unevenRow
(en commençant par_
et en répétant sur toute la largeur) séparément, puis imprimez chaque ligne de manière séquentielle avec un nouveauconsole.log
fonction voici comment je l'ai fait.La raison pour laquelle je prends cette approche était à cause de l'impression de plusieurs
console.log
lignes a été seulement utilisé dans l'exercice 2.1 "lecture en boucle d'un triangle" de le même livre. Il semble plus logique pour moi, et cela fonctionne.Voici une autre version simplifiée de ce:
JS:
L' (hauteur+ligne) % 2 == 0 sur la ligne 5 est importante, car elle détermine si elle ajoute un "" ou # pour le rowString en fonction de la hauteur et de la ligne de la valeur. Si c'était juste basé sur la hauteur, vous obtiendrez une alternance de colonnes de #'s et" ", ou si c'était juste, fondée sur la largeur que vous obtenez en alternance lignes de "" et #. Si vous considérez le premier point; hauteur 0 largeur de 0, il évaluerait même, taille 1 largeur 1, bizarre, etc.. suivant la hauteur de la ligne 1 de la largeur de 0, bizarre, etc... Cela garantit que votre conseil d'administration est évolutive.
Voici mon propre code
Un autre
Voici mon approche. J'ai ajouté une description détaillée dans le JSDoc.
JS:
Sinon...
JS:
Hehe, je pense que j'ai fait le plus inutile mais la solution de travail pour cette