צפייה בגרסה מלאה : אלגוריתם סוגריים בג'אווהסקירפט.
נבחנתי בבית והנבלות עדיין לא החזירו תשובה,
אני לא הכי מנוסה ב JS
לקח לי חצי שעה ללמוד מה צריך ולכתוב את האלגוריתם, עם טעויות סינטקס קטנות וטעות בהגדרת גבולות הלולאה, שתיקנתי יותר מאוחר,
בסה"כ חרגתי פי 2 מהזמן.
אבל יותר מענין אותי האם יש דרך אחרת יותר יעילה וקריאה יותר.
צריך לכתוב פונקציה המקבלת string ומחזירה 1 אם הסוגריים בקלט מקוננים נכון ו- 0 אחרת.
דוגמאות :
You need to consider three kinds: (), [], <> and only these kinds.
Examples:
verify("---(++++)----") -> 1
verify("") -> 1
verify("before ( middle []) after ") -> 1
verify(") (") -> 0
verify("} {") -> 1 //no, this is not a mistake.
verify("<( >)") -> 0
verify("( [ <> () ] <> )") -> 1
verify(" ( [)") -> 0
function verify(text)
{
var stack = new Array();
var myMap = new Map();
myMap.set('[' ,']');
myMap.set('(',')');
myMap.set( '<','>');
myMap.set('”', '”');
var regOpen = /[([<"]/ ;
var regClose = /[\)\]\>"]/ ;
var length= text.length-1;
var textArr= text.split("");
var pop;
console.log(length);
for (i=0;i<=length; i++ )
{
if( textArr[i].match(regOpen) )
stack.push(textArr[i]);
else if( textArr[i].match(regClose) )
{
pop = myMap.get(stack.pop());
if( pop!= textArr[i] )
return 0;
}
}
return (stack.length==0 ? 1:0);
}
דיסקליימר :
אין לי מושג ירוק בתכנות ומה שאני עומד לכתוב כאן הם שטויות במקרה הטוב.
אז.
קודם כל בשביל העוואנטה הייתי משתמש בסינטקס של ES6.
יענו
use strict ;
// use "let" and "const" , don't use var
2) השימוש ברגקס מיותר.
אתה הרי מפרק את המחרוזת למערך ועובר תו תו. אז תשתמש בפונקציה indexOf
יענו
const regOpen = '[([<' ;
if (regOpen.indexOf(textArr[i]) { textArr[i] => { stack.push(textArr[i])} }
// או שטות דומה
3) אתה צריך להחזיק מונה של כל סוג סוגרים. כשהסוגרים פותחות הוא עולה באחד וההפך.
ברגע שאחד המונים יורד מתחת לאפס בום! Game Over ואתה צריך לעשות ברייק מהלולאה. אין טעם להמשיך בה.
אני לא מצליח לעקוב אחרי הפלואו של הקוד כדי לדעת אם זה קורה. הרצת טסטים כדי לבדוק שזה עובד?
4) האופרטור הטרנרי שלך (בסוף) אחלה. תשתמש בזה יותר.
עריכה:
3.א )
וכמובן כמובן כמובן שברגקס אתה חייב לעשות אסקייפינג לתווים מיוחדים כמו סוגריים. (איך שכחתי את זה אני לא יודע)
1) כן אני יודע, צריך לעבור ל- let.
מצאתי דרך לבצע את השמת הערכים לאובייקט ה Map בשורה אחת :
let myMap = new Map([ ['[', ']'], ['(',')'] , ['<','>'],['”', '”'] ]);
אבל הסינטקס הזה עדיין לא עובד לי ב WEBSTORM של JETBRAIN אולי צריך למצוא גירסה מעודכנת יותר של V8.
2) איך השימוש ברגקס מיותר אם אתה משתמש בו בדוגמא שלך ?
השימוש ברגקס מאפשר לי להמנע מ- SWITCH CASE ארוך ומסורבל.
יכולתי להשתמש במונה לכל סוג סוגריים, אבל אז הקוד יהיה מסורבל הרבה פחות קריא וקשה לתחזוקה.
במקום זה אני משתמש ב HASH TABLE שבעגה של ES6 נקרא Map, כלומר משהו שמחזיק זוגות של KEY ו- VALUE
3) הקוד עובד לי פרפקט.
הפלוו של התוכנית הוא :
א) אני יוצר אובייקט של מאפ, ה KEY הוא הסוגר ימני וה VALUE הוא הסוגר השמאלי,
ב) אני עובר בלולאה על המחרוזת, תו תו,
1)בודק ע"י שימוש ברגקס REGOPEN האם התו הנוכחי הוא מסוג סוגר-שמאלי אם כן דוחף אותו למחסנית ועובר לתו הבא,
אם לא,
2) בודק האם התו הוא מסוג סוגר- ימני, אם כן, אני שולף מהמחסנית את הסוגר השמאלי האחרון שנדחף אליה
וע"י קריאה למתודת GET של MAP המקבלת כארגמונט KEY ומחזירה VALUE אני מקבל את הסוגר הימני (של הסגירה)
המתאים לסוגר השמאלי (הפותח) שנשלף מהמחסנית,
כעת אני יכול לבדוק בעצם אם הסוגר השמאלי האחרון במחרוזת מתאים לסוגר הימני , אם לא אני יוצא מהפונקציה עם אפס,
אם כן, אני ממשיך הלאה בלולאה כי ה POP שהשתמשתי לבדיקה כבר העיף לי את הסוגר השמאלי האחרון במחסנית,
ג) אחרי שיצאתי מהלולאה אני בודק האם המחסנית ריקה, אם כן הסוגריים מקוננות נכון ומחזיר 1 אחרת מחזיר 0.
לגבי הקוד: כתבתי גירסה ללא שימוש ב SPLIT והתוכנית מצליחה עם כל הטסטים שהבאתי קודם וגם אחרים.
function verify(text){
var stack = new Array();
var myMap = new Map();
myMap.set('[' ,']');
myMap.set('(',')');
myMap.set( '<','>');
myMap.set('”', '”');
var regOpen = /[([<"]/ ;
var regClose = /[\)\]\>"]/ ;
var length= text.length-1;
var pop;
for (i=0;i<=length; i++ )
{ if( text.charAt(i).match(regOpen) )
stack.push( text.charAt(i));
else if( text.charAt(i).match(regClose) )
{ pop = myMap.get(stack.pop());
if( pop!= text.charAt(i) )
return 0;
} } return (stack.length==0 ? 1:0);}
2) איך השימוש ברגקס מיותר אם אתה משתמש בו בדוגמא שלך ?
או שאתה הדיוט גמור בתחום, או שאתה טרול שמטריל להפגת שיעמום, או גם וגם.
היות וטמנת בקוד כמה ביצות פסחא (למשל מה קשור התו " לסוגריים? מה זה " סוגר ומה זה " פותח? ובמיוחד שהשאלה כתבה במפורש באילו סוגריים להתחשב.
ולמה ב regClose אתה משתמש באסקייפינג כמו שצריך וב regOpen לא?) -
שזה דבר המעיד על איזושהיא אינטליגנציה אשר גבוהה במעט משל אי אילו נמוכי מצח - אני מהמר על אופציה שתים.
ובכל זאת אענה לך:
indexOf זה ממש לא רגקס. match זה ממש כן.
ואמנם זה לא תכנות רילטיים אבל אני מעדיף להשתמש בכמה פחות משאבים.
indexOf vs match (http://stackoverflow.com/questions/4757438/javascript-indexof-vs-match-when-searching-strings#4757501)
ובנוסף. לא התייחסת למקרה שהעליתי בו מופיע סוגר סוגר לפני סוגר פותח. גם לא בפלואו שלך שתיארת.
אין לי ענין לענות לך.
אתה חוצפן יודע הכל שלא מסוגל להבין פלוו של 20 וכמה שורות,
והקוד שכתבת לא עובד.
סיימת לערוך? כי אם לא אני גם היבריסי קטטוני. תוסיף תוסיף.
מקריאה חוזרת אני רואה שטיפלת בנושא הסוגר סוגר לפני פותח.
עדיין ה regOpen וה regClose מאד בעייתיים ואני לא מבין איך הקוד שלך עובד לטענתך.
() ברגקס נועדו לתפוס משהו (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references).
[] ברגקס זה הסוויץ' קייס שאתה מדבר עליו - אפשרות של כמה תווים (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp#character-sets).
אבל נמתין לשאר התכנתים שפה. אני סיימתי :)
התכוונת לייצר בודק תקינות של קוד?
כי אם כן, שכחת להתייחס לרימארקים ולמחרוזות.
בכל אופן, הכי יעיל לרוץ תו תו ולשמור על סטייט, מה שנקרא מכונת מצבים.
אבל מה אני מבין, לא סיימתי תיכון.
התכוונת לייצר בודק תקינות של קוד?
כי אם כן, שכחת להתייחס לרימארקים ולמחרוזות.
בכל אופן, הכי יעיל לרוץ תו תו ולשמור על סטייט, מה שנקרא מכונת מצבים.
אבל מה אני מבין, לא סיימתי תיכון.
לא, אין כוונות נוספות, הפונקציה מוגדרת היטב בפוסט הראשון,
המטרה היא בדיקת תקינות הקינון של 3 הסוגריים הנתונים במחרוזת הקלט, לא הערות.
לא מבין למה התכוונת ב"להתייחס למחרוזת".
הקוד רץ תו-תו עד למציאת אי-קינון או עד סוף המחרוזת המוקדם מבינהם.
אם זה לא בודק תקינות של קוד, אז התוכנית בסדר, חוץ מזה ששכחת var i
ואם זה רק לסוגריים, אז מה טוב בקוד הזה חוץ מתרגילים של מכללת תחת? ומה הטעם בשיפור היעילות מעבר לנל?
לויל וקסד, מחפשים אצלנו בנרות, ואני חלק מוועדת הקבלה. אתם מוזמנים לראיון.
לויל וקסד, מחפשים אצלנו בנרות, ואני חלק מוועדת הקבלה. אתם מוזמנים לראיון.
אני יותר בכיוון של DevOps (שמעתם? סתם שתדעו) אבל קבל ה"פ לחוצה.
אני יותר בכיוון של DevOps (שמעתם? סתם שתדעו) אבל קבל ה"פ לחוצה.
גם הולך
איפה אתם נמצאים ?
זו הגירסה הנקיה של המתודה.
function verify(text)
{
'use strict';
let stack = new Array();
let myMap = new Map([ ['[', ']'], ['(',')'], ['<','>'] ]);
let regOpen = /[([<"]/ ;
let regClose = /[\)\]\>"]/ ;
let length = text.length-1;
var pop;
var currentChar;
for (var i=0;i<=length; i++ )
{
currentChar = text.charAt(i);
if( currentChar.match(regOpen) )
stack.push( currentChar);
else if( currentChar.match(regClose) )
{
pop = myMap.get(stack.pop());
if( pop!= currentChar ) return 0;
}
}
return (stack.length==0 ? 1:0);
}
shaul_13
13-09-2016, 21:07
רק אני תוהה עם קסד ולויל הם אדם אחד עם שני טרולים?
Sent from my LG-D620 using Tapatalk
אתה יודע, אף אחד לא מכוון לך אקדח לגולגולת ומכריח אותך להכנס לשרשור, לקרוא או יותר גרוע להגיב.
רק אני תוהה עם קסד ולויל הם אדם אחד עם שני טרולים?
לכבוד הוא לא
לויל וקסד, מחפשים אצלנו בנרות, ואני חלק מוועדת הקבלה. אתם מוזמנים לראיון.
https://s18.postimg.org/3tak7ljc9/Screenshot_2016_09_14_15_28_13.png
~/Desktop/es6/levil % node ex.js
[ '-', '-', '-', '(', '+', '+', '+', '+', ')', '-', '-', '-', '-' ]
- - [
- ( [
+ + [
+ + [
) - [
- - [
- - ]
- ( ]
+ + ]
+ + ]
) - ]
- - ]
- - (
- ( (
+ + (
+ + (
) - (
- - (
- - )
- ( )
+ + )
+ + )
) - )
- - )
- - <
- ( <
+ + <
+ + <
) - <
- - <
- - >
- ( >
+ + >
+ + >
) - >
- - >
0
שאיג פליז הייר מי
הנבזיות טבועה בך.
אתה פשוט טיפוס נאלח.
מחכים לך יא קסד
,P`.`.`.`.`.`.,$$$$$i.`$$h
,P".`.`.`.`.`.,$$$$$$$$$hJ$$$.
c"`.`.`.`.`.,$$$$$$$$$$$$$$$$$$$
J"`.`.`.`.`.;J$$$$$$$$$$$$$$$$$$$$h
J"`.`.`.`.`.,;$$$$$$$$$?????iiJJJJJJ$$$$$cc,
J"`.`.`.`.`.`;???????iiJJJJ$$$$$$$$$$$$$$$$$$$$h
,?`.`.`.`.`.`;;J$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $c
,P`.`.`.`.`.`.;;P"$F?$$$$$$$$$?$$"?$I"?C?$$$$$$$$$$$$$h
J".`.`.`.`.`.,;;$ j"J$?"""?$C`.??";;J?$'?L$$$$$$$$$$$$$$>
,P.`.`.`.`.`.`,;;$'J3F'J$??$3c$`.`?h$9hP"`.$<?$$$$$$$$$$$$'
J"`.`.`.`.`.`.,;9'$ P3`.`.""`.`3`.`.`.`.`.`.3?$ $?$$$$$$$$P
J'.`.`.`.`.`.`;;J$,/j'$`.`.`.`.`$`.`.`.`.`.`.3F<? "',_?$$$$ _,,="
P.`.`.`.`.`.`.;;J'$$ $ ?`.`.`.`.$"`.`.`.`.`.`.3h ? `"?$C,c$P"
P`.`.`.`.`.`.,;;9' $$ F h.`.`.`."?".".`.`.`.`.$$ h=-,_ `?c
,$.`.`.`.`.`.`;;;J' ,'$j' <$.`.`.`.`.`.`.`.`.`.`.$j ?c ". `$"??hcc?
;C;.`.`.`.`.`;;;;J'$$h;$J `Ph`.`.`,JllllCCc`.`.`.PjL "=c,`=c, "h.
$;;.`.`.`.`,;;;;P Jh?$J L$`.`.`?hiiii?".`.`.`.Fj'' ?? ?. ?c
C;;,`.`.`.;;;;9" $" $J $'h.`.`.`.`.`.`.`.`.`JFJ $C $ ,>h, `?c,_
C;;;;;;;;;;;;$ <Lc,jP$ $ ?h`.`.`.`.`.`.`.`J$$ $ $ ?cc, ?.,P""=c,c=""
C;;;;;;;;;;;?$ <C,'j'$ $ $?h,.`.`.`.`,J??;$F $ $ $ ""$ . ,=-cc"""
$;;;;;;;;;;;;?h. <$F $ $ $ $;;;;?TTTT??;;;;;P F $ > $ .`h "c`h.
$;;;;;;;;;;;;;9h?$C$ J',P F $h;;;;;;;;;;;;;;9> j'c $ > ? `h`h `"c`h.
$;;;;;;;;;;;;;;h;;;$ $ $ \ F $$;;;;;;;;;;;;;;9' 3 $ $ h `h $ ?c"h.3?=,_
`h;;;;;;;;;;;;;$;;;$j'<$ `h.F F<C;;;;;;;;;;;;;J> $ $ $ $ `h $ $Pc,`"?$h.
$;;;;;;;;;;;;;??;;P$ $F h,F F,c;;;;;;;;;;;;;$> $ $ $ $ C ?c?c "???"
`h;;;;;;;;;;;;;;;9FF<$ h,F j'J;;;;;;;;;;;;;$ h $ $ ?. $ $ `h`?`h
?;;;;;;;;;;;;;;;$<F$$ F,F $,c;;;;;;;;;`;;J'J3 $ $ `h ? $h `h`h.`.
$;;;;;;;;;;;;;;FJj'$ .F Jl$;;;;;;;;;;;;$.P.`,? ? h `h <$? ?h `$C3hc
$;;;;;;;;;;;;J $$ $ J' $ $;;;;;;;;;'J"3" $,'? ?. $ $ $'L $"',"","
"i;;;;;;;;;;$j'$ $ $ J',C;;`;;;ii?3$'J $ $ `L`h `h ?. `h'L .?,_
`i;;;;;;;;;$$$L ?',F .P $.`.`.j??$cc,' J' F $ $ $ ? $ ?c`-,,h.
?;;;;;;;;;;;$$?c$F P J'.`.`.`.`.`P" ,F `F ? `h `h h $ ???
`C;;;;;;;;;;;$> / J'`.`.`.`.`.??3FJF $ L $ `h `h c$$.
$;;;;;;;;;;;$,?,-<c$`.`.`.`.`.`.`.`$F$c `h `h_$ `L $???"`$
$;;;;;;;;;;;'"$ $?$.`.`.`.`.`.`.`.`?`.`?$$. `?c,$$,`L`.`.`h
$;;;;;;;;;;`.?LP'`?.`.`.`.`.`.`.`.`.`.`.`.`?c, $$F.`.`.`.`3
<h;;;;;;;;`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.?$?cJ ;,.`.`.`.`3>
<C;;;;;;;.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.; ;;.`.`.`.`3'
<C;C;;;;`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.; ;;,`.`.`.`J
<C9C;;;;`.c???i.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`;; ;;;`.`.`.`$
<C9;;;;.`$;ii;?h`.`.`.`,;;;.`.`.`.`.`.`.`.`.`.`.`J; ;;;`.`.`.`F
<;9;;;;.<C?b9h;P`.`.`.,;3;;.`.`.`.`.`.`.`.`.`.`.`?;;;;`.`.` .j'
<29h;;;;`$;;;;$.`.`.`;;;$;;.`.`.`.`.`.`.`.`.`.`.`.L ;;;`.`.`.$
`C;h;;;;`.?ii?`.`.,;;;;J?;`.`.`.`.`.`.`.`j???hc.`. h;;.`.`.`;P
$;9h;;;;;`.`.`.;;;;;;I?;;`.;;;,`.`.`.`.jF;$?h?h`.$ ;;.`.`.`F
$;;?i;;;;;;;;;;;;;;;J?;;.`;;;;;;;`.`.`.?C?bi$;$`.$ ;;.`.`.$
3;;;;$i;;;;;;;;;;;J?;;;`.`.;;h;;;;;`.`.`?i;;;J'`.$ ;;.`.`J'
`C;;;;??hiiiiiiJ??;;;;.`.`.;;?h;;;;;;`.`.`"""`.`;P;;.`.`F
h;;;;;;;;;;;;;;;;;`.`.`.`.`.;;$i;;;;;;;;`.`;;;;J;; ;.`.j'
$;;;;.`.`.`.`.`.`.`.`.`.`.`.`;;;$i;;;;;;;;;;;;$;;; `.`.3
<;;;;.`.`.`.`.`.`.`.`.`.`.`.`.;;;;?$iijjjjii$?;;;;` .`.3
`C;;`.`.`.`.`.`.`.`.`.`.`.`.`.`.`;;;;;;;;;;$;;;;;; `.`.J
$;;`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`;;;;;;;;C;;;;;.` .`.$
?;.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`;;;;;9;;;;;;.` .`.3
`h.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`;;;$;;;;;`.` .`.3
h.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.;;$;;;;;`.`. `.3
?.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`;?C;;;;`.`. `.3
`h`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`$;;;;`.`. `.?,
$`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.h;;.`.`.` .`$
?,.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.?h;.`.`.` .`.h
$.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`?h;`.`.`. `.`h
`h`.`.`.`.`.`.`.`.`.`;;.`.`.`.`.`.`.`.`.`.`h;,`.`. `.`.h
$`.`.`.`.`.`.`.`.`.`;;.`.`.`.`.`.`.`.`.`.`.$;;.`.` .`.`L
?`.`.`.`.`.`.`.`.`.`;;.`.`.`.`.`.`.`.`.`.`.`?i;`.` .`.`?,
`h.`.`.`.`.`.`.`.`.`;;.`.`.`.`.`.`.`.`.`.`.`.`h;,` .`.`.?.
h.`.`.`.`.`.`.`.`.`t$h`.`.`.`.`.`.`.`.`.`.`.``h;;. `.`.`?
$.`.`.`.`.`.`.`.`.`3$$`.`.`.`.`.`.`.`.`.`.`.`.`h;; ;.`.`.h
$.`.`.`.`.`.`.`.`.`."'`.`.`.`.`.`.`.`.`.`.`.`.`.$;;;;.`.`h
$.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`? ;;;;`.`.h
?,`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. $;;;;.`.`$.
`h`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. `?;;;;`.`.?.
$`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`,c=""'"""`.`.`.`?
$`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`/".`.`.`.`.`.`.`.`3
המערכת פועלת באמצעות vBulletin® ; גרסה 4.2.2 Copyright © 2026 vBulletin Solutions, Inc. כל הזכויות שמורות. תורגם על ידי WizCraft