ãã®æçš¿ã§ã¯ã2018幎ã«Yandex.Blitzã³ã³ãã¹ãã«é¢ããäžé£ã®åºçç©ãå®æãããŠããŸãã åå ããŠããã ãããå°ãªããšãå¶äœã®è¿ãã§ã©ã®ãããªã¿ã¹ã¯ãææ¡ããããã芧ãã ããã æåŸã®ã³ã³ãã¹ãã¯ãããã³ããšã³ãã§ã®ã¢ã«ãŽãªãºã ã®äœ¿çšã«æ§ããããŸããã æ¬æ¥ã12ã®åé¡ã®è©³çŽ°ãªåæãå
¬éããŸããæåã®6ã€ã¯äºéžã§ææ¡ãããåé¡7ã12ã¯æ±ºåã§ææ¡ãããŸããã æ¡ä»¶ãã©ã®ããã«åœ¢æãããã©ã®ã¹ãã«ã«æ³šæãæã£ããã説æããããšããŸããã ãã¹ãŠã®åå è
ã®é¢å¿ã«æè¬ããŸãïŒ
ã¿ã¹ã¯1
æåã®ã¿ã¹ã¯ã¯20åéã®ãŠã©ãŒã ã¢ããã§ããããæ£èŠè¡šçŸã䜿çšããŠç°¡åã«è§£æ±ºã§ããããã«ããã®ç¶æ
ãäœãããšã«ããŸããã
å²ãåœãŠã®ãã¹ãŠã®ãªãã·ã§ã³ã¯åæ§ã®æ¹æ³ã§æ§ç¯ãããŸã-ãã€ã³ãã«åé¡ãããåãã€ã³ãã¯æçµçãªæ£èŠè¡šçŸã®ã°ã«ãŒãã§è¡šãããšãã§ããŸãã
ãªãã·ã§ã³ã®1ã€ãéµäŸ¿å±ãæ€èšããŠãã ããã
ç¶æ
ææãžã§ãã³-14-53ã§ã¯ãå°å
ã®äººã
ã¯ãäºãã«æçŽãéããããšæã£ãŠããŸãããããããå±ãã鳩ããããã¯äœæãæ··åããŠããŸãã ããªãã¯åœŒãã«æçŽã解æããæå¹æ§ããã§ãã¯ããããã«æããªããã°ãªããŸããã
äœæã®åºæ¬éšåã®æ§é ã¯ãåå人ã®å°åãåžåºçºæãååãå§ã§æ§æãããŸãã èªæ²»äœã¯é¡ãšéµäŸ¿å±ã«åããããšãã§ããŸãã ãã¹ãŠã®éšåã¯ã³ã³ãã§åºåãããŸãã
å°åãåžçºæãå°åºã®ååã¯åèªã§ãååèªã®æåã®æåã¯å€§ãããæ®ãã¯å°ããã§ãã ã¹ããŒã¹ãŸãã¯ãã€ãã¹èšå·ã§åºåããã2èªã®ååãå¯èœã§ãã 3ã8æåã®ååèªAãZã
äœæ°ã¯6æ¬ã®æãæã«æã£ãŠããŸããæ¥åžžç掻ã§ã¯åäºæè
žç³»ã§ãã çªå·0ã9ã¯ãã®ãŸãŸäœ¿çšããã10ãš11ã¯èšå·
~
ãš
â
瀺ãããŸãã
æ§å³å
ã®éµäŸ¿å±çªå·ã«ã¯ã3æ¡ã®è¡ãŸãã¯4æ¡ã®ãã€ãã¹èšå·ä»ã2æ¡ã®2ã€ã®ã°ã«ãŒãã«åãããŠããŸãã äŸïŒ
44-99
ã
æã
ãäœæ°ã¯èŠæ±ã«å¿ããŠèªæ²»äœã«æçŽãéãã ãã®å Žåãäœæã¯ãããŸãããèªæ²»äœãšå®å
ã®ååã®ã¿ã§ãã
ããã¯é¢çœãã§ãããå°çäžã®äººã
ã¯6åãš9åã®å§ã®ã¿ãšåŒã°ããŠããŸãã ååïŒShobãRyobãMobãXiangãRyanãMansã å§ïŒç¿ã,ã,ãå€ãiaã銬ãMaãéŸã,ã ãã®ææã®äœæ°ã¯å€¢æ³å®¶ã§ã¯ãããŸããã
解æ
äœæã®åºæ¬éšåã®æ§é ã¯ãåå人ã®å°åãåžåºçºæãååãå§ã§æ§æãããŸãã èªæ²»äœã¯é¡ãšéµäŸ¿å±ã«åããããšãã§ããŸãã ãã¹ãŠã®éšåã¯ã³ã³ãã§åºåãããŸãã
æåã®æ®µèœãããå°åãåžçºæãå°åºãéµäŸ¿å±ãååãšå§ã瀺ãæ¹æ³ãããã³ãã¹ããããè¡ã§åŸãã¹ãé åºãåŠã³ãŸãã
å°åãåžçºæãå°åºã®ååã¯åèªã§ãååèªã®æåã®æåã¯å€§ãããæ®ãã¯å°ããã§ãã ã¹ããŒã¹ãŸãã¯ãã€ãã¹èšå·ã§åºåããã2èªã®ååãå¯èœã§ãã 3ã8æåã®ååèªAãZã
ãã®æ®µèœãããã°ã«ãŒããåèª
([-][-]{2,7})
察å¿ããŠããããšãæããã§ãã ãããŠãããããã®åå
([-][-]{2,7}(?:[- ][-][-]{2,7}))
ã
äœæ°ã¯6æ¬ã®æãæã«æã£ãŠããŸããæ¥åžžç掻ã§ã¯åäºæè
žç³»ã§ãã çªå·0ã9ã¯ãã®ãŸãŸäœ¿çšããã10ãš11ã¯èšå·~
ãšâ
瀺ãããŸãã
ããã§ãæ°åã«
\d
ã䜿çšããã ãã§ã¯äžååã§ããããšãããããŸã-
[0-9~â]
ã䜿çšããå¿
èŠããããŸãã
æ§å³å
ã®éµäŸ¿å±çªå·ã«ã¯ã3æ¡ã®è¡ãŸãã¯4æ¡ã®ãã€ãã¹èšå·ä»ã2æ¡ã®2ã€ã®ã°ã«ãŒãã«åãããŠããŸãã äŸïŒ 44-99
ã
ãããã£ãŠãã°ã«ãŒãã¯éµäŸ¿å±çªå·
([0-9~â]{3}|[0-9~â]{2}-[0-9~â]{2})
ãŸãã
æã
ãäœæ°ã¯èŠæ±ã«å¿ããŠèªæ²»äœã«æçŽãéãã ãã®å Žåãäœæã¯ãããŸãããèªæ²»äœãšå®å
ã®ååã®ã¿ã§ãã
ç§ãã¡ã¯ãå°åºãšéµäŸ¿å±ãåæã«æ¬ åžããå¯èœæ§ãããããšãæçµæ©èœã®éäŒã§ç解ããèŠããŠãããèæ
®ããŸãã
ããã¯é¢çœãã§ãããå°çäžã®äººã
ã¯6åãš9åã®å§ã®ã¿ãšåŒã°ããŠããŸãã ååïŒShobãRyobãMobãXiangãRyanãMansã å§ïŒç¿ã,ã,ãå€ãiaã銬ãMaãéŸã,ã ãã®ææã®äœæ°ã¯å€¢æ³å®¶ã§ã¯ãããŸããã
ããã¯æ¡ä»¶ã®æåŸã®éšåã§ãã ããã§ã¯ããã1ã€ã®åçŽãªã°ã«ãŒã
(||||||||) (|||||)
ãŸãã¯çã
([][]|[]) ([C]|[]||)
ã
ç°¡åã«ããããã«ãã°ã«ãŒããå€æ°ã«ä¿åããçµæã®æ£èŠè¡šçŸã§äœ¿çšããŸãã
const w = '[-][-]{2,7}';
ã¿ã¹ã¯2.ãšã©ãŒãããã³ãŒã
ç¶æ
æ¥äžãéçºããŒã ã¯ããã€ãã®æ°ããæ©èœãäœæããŸããã ãããããªãªãŒã¹ã®æºåäžã«ããŒãžã®ç«¶åãçºçãããããã解決ãããåŸãã¬ã€ã¢ãŠããåå²ãããŸããã ãªãªãŒã¹ãå®çšŒåã«å
¥ããŸã§ã®æéã確ä¿ããããã«ãã³ãŒãã®ä¿®æ£ãæå°éã«æããããŠããããããšã©ãŒãåãé€ãããšãæ¥åã§ãã
å£ããã¹ã¿ã€ã«ãšPNG圢åŒã®HTMLããŒãžãæäŸãããŸãïŒäºæ³ãããçµæïŒã Chromeã§è¡šç€ºãããšãã®çµæãå
ã®ã¹ã¯ãªãŒã³ã·ã§ãããšåãã«ãªãããã«ããšã©ãŒãä¿®æ£ããå¿
èŠããããŸãã ä¿®æ£ãããããŒãžãåé¡ã®è§£æ±ºçãšããŠéä¿¡ããŸãã
å£ããã¹ã¿ã€ã«ã®
HTMLããŒãž ã ã¬ã€ã¢ãŠãïŒ
解æ
ãã®ã¿ã¹ã¯ã§ã¯ãYandexéçºè
ãé »ç¹ã«ééããç¶æ³ãæš¡å£ããããšããŸããã巚倧ãªã³ãŒãããŒã¹ã§ãããå°æ°ã®åçŽãªã³ãŒãè¡ãèŠã€ãããã®ä¿®æ£ã«ããç®çã®çµæãåŸãããŸãã ã€ãŸããã³ãŒããæžãã®ãé£ããã£ãã®ã§ã¯ãªããæ£ç¢ºã«ã©ããæžãïŒãŸãã¯åé€ããïŒããç解ããã®ãé£ããã£ãã®ã§ãã
æ€çŽ¢çµæã®å®éã®ã³ãŒããååŸããã¬ã€ã¢ãŠããå£ããããããªä¿®æ£ãå ããŸããã ã³ã³ãã¹ãã®åå è
ã¯ãçŽ250ãããã€ãã®ã¬ã€ã¢ãŠããåŠçããã³ãŒããã¬ã€ã¢ãŠãã«å¯Ÿå¿ããç¶æ
ã«ããã®ã«1æéãããããŸããã§ããã
競äºã®æéå¶éãã³ãŒãå
šäœãèªãããšãèš±å¯ããªãã£ãããšã¯æããã§ãããããåå è
ã¯ãã©ãŠã¶ã§éçºè
åãã®ããŒã«ã䜿çšããå¿
èŠããããŸãã
4ã€ã®ã¿ã¹ã¯ãªãã·ã§ã³ã®ãããããä¿®æ£ããã«ã¯ã次ã®å€æŽã§ååã§ããã
diff --git a / blitz.html b / blitz.html
ã€ã³ããã¯ã¹36b9af8..1e30545 100644
--- a / blitz.html
+++ b / blitz.html
@@ -531.10 +531.6 @@
iframe [src $ = 'ext-analytics.html'] {
é«ãïŒèªå;
}
-.search2__button .suggest2-form__buttonïŒnth-ââchildïŒ1ïŒ{
-èæ¯ïŒïŒff0ïŒéèŠ;
-}
-
/ * ../../blocks-desktop/input/__control/input__control.styl end * /
/ * ../../node_modules/islands/common.blocks/input/__clear/input__clear.css begin * /
/ * input__boxã«å¯ŸããŠçžå¯Ÿçã«é
眮ãããŸãã
@@ -744.10 +740.6 @@
iframe [src $ = 'ext-analytics.html'] {
background-clipïŒããã£ã³ã°ããã¯ã¹ã
}
.input_theme_websearch .input__clear {
èæ¯ç»åïŒurlïŒ "/ static / web4 / node_modules / islands / common.blocks / input / _theme / input_theme_websearch.assets / clear.svg"ïŒ;
èæ¯ãµã€ãºïŒ16px;
@@ -857.6 +849.7 @@
iframe [src $ = 'ext-analytics.html'] {
èæ¯è²ïŒïŒf2cf46;
}
.websearch-button__textïŒbefore {
+äœçœ®ïŒçµ¶å¯Ÿå€;
äžïŒ-6px;
å³ïŒ-9px;
å¹
ïŒ0;
@@ -866.8 +859.6 @@
iframe [src $ = 'ext-analytics.html'] {
ããŒããŒã¹ã¿ã€ã«ïŒãœãªãã;
ããŒããŒã«ã©ãŒïŒrgbaïŒ255,219,76,0ïŒ;
border-left-colorïŒç¶æ¿;
-äœçœ®ïŒçžå¯Ÿ;
-z-indexïŒ-1000;
}
/ * ../../blocks-deskpad/websearch-button/websearch-button.styl end * /
@@ -1349.6 +1340.7 @@
iframe [src $ = 'ext-analytics.html'] {
ãã©ã³ããµã€ãºïŒ14px;
è¡ã®é«ãïŒ40px;
äœçœ®ïŒçžå¯Ÿ;
+衚瀺ïŒã€ã³ã©ã€ã³ãããã¯ã
é«ãïŒèªå;
ããã£ã³ã°ïŒ0;
åçŽæŽåïŒäžå€®;
ã¿ã¹ã¯3.æå®ãããå€åæ§ã®ããç»å
ç¶æ
ãã¶ã€ããŒãããŽããã¶ã€ã³ããŸããã ããŸããŸãªæ¡ä»¶ã§äœ¿çšããå¿
èŠããããŸãã ã§ããã ã䟿å©ã«ããããã«ãçŽç²ãªCSSã®1ã€ã®HTMLèŠçŽ ã§æ§æããŸãã
åçã䜿çšããããšã¯ã§ããŸããïŒããŒã¿ïŒuriã䜿çšããŠãïŒã
解æ
ã¿ã¹ã¯ã¯divã1ã€ã ã䜿çšããããšã§ãã£ããããdivèªäœãšç䌌èŠçŽ :: beforeããã³:: afterã®ã¿ããããŸãã
幞ããªããšã«ãã¬ã€ã¢ãŠãäžã®ç»åã¯ãç°ãªãè²ã®3ã€ã®é åã®ã¿ã§æ§æãããŠããŸãã ã¢ã¯ã»ã·ãã«ãªèŠçŽ ããšã«ç¬èªã®èæ¯ãäœæããã³ãŒããŒãæ£ããé
眮ããŠäžžãããŸãã ã¬ã€ã¢ãŠãã®ç°è²ã®é åã«åœ±ããããŸã-ã°ã©ããŒã·ã§ã³ã䜿çšããŠãã ããã
div { background: #0C0C0C; border-radius: 10px; position: relative; } div:before { border-radius: 9px 9px 0 0; position: absolute; width: 100%; height: 50%; background: #F8E34B; content: ''; } div:after { content: ''; background: linear-gradient(178deg, #C8C8C8 0px , transparent 7px), #EEEDEF; position: absolute; width: 50%; height: 50%; bottom: 0; border-radius: 0 0 0 9px; }
ã¿ã¹ã¯4
ç¶æ
Petyaã¯ãã¢ã¹ã¯ã¯ã®Frontenderæ°èã§ã·ãã¢ã¿ã€ãã»ãã¿ãŒãšããŠåããŠããŸãã æ°èã®ã¬ã€ã¢ãŠãã«ãPetyaã¯Webãã¯ãããžãŒã®ã¹ã¿ãã¯ã䜿çšããŠããŸãã PetyaãçŽé¢ããæãå°é£ãªã¿ã¹ã¯ã¯ãæ°èèšäºã®èŠåºãã®ã¬ã€ã¢ãŠãã§ãããåå·ã®æ°èã³ã©ã ã®å¹
ã¯ç°ãªããèŠåºãã®ãã©ã³ããšæåæ°ã¯ç°ãªããŸãã
Petyaã¯ããã©ã³ããµã€ãºãæ倧ã«ãªãããã«åèŠåºãã«ç¬èªã®ãã©ã³ããµã€ãºãéžæããå¿
èŠããããŸãããåæã«ãèŠåºãã®ããã¹ãå
šäœãããã«å²ãåœãŠãããã¹ããŒã¹ã«åãŸããŸãã
Petyaã®ãã«ãïŒcalcFontSizeé¢æ°ãå®è£
ããŸããããã«ããã転éãããããã¹ããã³ã³ãããŒã«å
¥åã§ããããã«ãªããã³ã³ãããŒå
šäœã«åãŸããå¯èœãªæ倧ãµã€ãºã«ãªããŸãã ããã倱æããå Žåããœãªã¥ãŒã·ã§ã³ã¯nullãè¿ããŸãã å
¥åè¡ã®æ倧é·ã¯100æåã§ãã å
¥åæååã空ã«ããããšã¯ã§ããŸããã ãœãªã¥ãŒã·ã§ã³ã«ã¯é¢æ°ã³ãŒãå
šäœãå«ãŸããŠããå¿
èŠããããPetyaããããèªåã®ãããžã§ã¯ãã«ã³ããŒããŠèªåã®ã³ãŒãã§åŒã³åºãããšãã§ããããã«ãå€éšäŸåé¢ä¿ã䜿çšããªãã§ãã ããã
ãœãªã¥ãŒã·ã§ã³ãã©ã®çšåºŠæé©ã«æ©èœãããã確èªããDOMã§æäœãå€ãããå Žåã¯è§£æ±ºããŸãã
解æ
æåã«è¡ãããšã¯ãã³ã³ããå
ã®ããã¹ããæ°è¡ãããå Žåãããã¹ããã³ã³ããã«åãŸããã©ãããå€æããããšãåŠã¶ããšã§ãã ãããè¡ãæãç°¡åãªæ¹æ³ã¯ã
element.getBoundingClientRectïŒïŒé¢æ°ã䜿çšããããšã§ããããã«ãããèŠçŽ ã®å¯žæ³ãååŸã§ããŸãã
ã³ã³ããå
ã«åå¥ã®spanèŠçŽ ã䜿çšããŠããã¹ããæç»ãããã®èŠçŽ ã®å¹
ãŸãã¯é«ããã³ã³ããã®ãµã€ãºãè¶
ããŠãããã©ããã確èªã§ããŸãã ãã®å Žåãããã¹ãã¯ã³ã³ããã«åãŸããŸããã
次ã«ãå¢çæ¡ä»¶ã確èªããŸãã ããã¹ããæå°ãã©ã³ããµã€ãºã§ãã³ã³ããã«åãŸããªãå Žåãå
¥åã§ããŸããã ããã¹ããæ倧蚱容ãµã€ãºã§éåããå Žåãmaxã¯æ£è§£ã«ãªããŸãã ãã®ä»ã®å Žåãç®çã®ãã©ã³ããµã€ãºã¯[minãmax]ã®ééã®ã©ããã«ãããŸãã
解決çãèŠã€ããã«ã¯ããã®ã®ã£ããå
šäœããœãŒãããŠãããã¹ããã³ã³ããã«é
眮ããããã©ã³ããµã€ãºã®å€ãèŠã€ããå¿
èŠããããŸããã1ãã€å¢ãããšåãŸããŸããã
ç¯å²[minãmax]ã®åçŽãªforã«ãŒãã§ãããè¡ãããšãã§ããŸããããœãªã¥ãŒã·ã§ã³ã¯ããŒãžã®å€ãã®ãã§ãã¯ãšåæç»ãè¡ããŸã-ç¯å²å
ã§ãã§ãã¯ãããå€ããšã«å°ãªããšã1ã€ã ãã®ãããªãœãªã¥ãŒã·ã§ã³ã®ã¢ã«ãŽãªãºã ã®è€éãã¯ç·åœ¢ã«ãªããŸãã
ãã§ãã¯ã®æ°ãæå°éã«æããOïŒlog nïŒã§æ©èœãããœãªã¥ãŒã·ã§ã³ãåŸãã«ã¯ããã€ããªæ€çŽ¢ã¢ã«ãŽãªãºã ã䜿çšããå¿
èŠããããŸãã ã¢ã«ãŽãªãºã ã®èãæ¹ã¯ãæ€çŽ¢ã®åå埩ã§ãå€ã®ç¯å²ã2ã€ã®ååã«åå²ãããæ€çŽ¢ã解ãäœçœ®ããååã§ååž°çã«ç¶ç¶ãããšãããã®ã§ãã ç¯å²ãåäžã®å€ã«çž®å°ããããšãæ€çŽ¢ã¯çµäºããŸãã
Wikipediaã®èšäºã§ãã€ããªæ€çŽ¢ã¢ã«ãŽãªãºã ã®è©³çŽ°ãèªãã§
ãã ãã ã
MutationObserverã䜿çšããŠãœãªã¥ãŒã·ã§ã³ã®ã¢ã«ãŽãªãºã ã®è€éãããã§ãã¯ããŸãããããŒãžã«é
眮ããDOMãçããèŠã€ããããã»ã¹ã§æ±ºå®ããçªç¶å€ç°ã®æ°ãèšç®ããŸããã äžéšã®ãã¹ãã§ã¯ããã€ããªæ€çŽ¢ã«åºã¥ããœãªã¥ãŒã·ã§ã³ã®ã¿ããã®å¶éã«åæ Œã§ããããã«ãçªç¶å€ç°ã®æ°ãäžèšããå³å¯ã«å¶éãããŠããŸããã
ã¿ã¹ã¯ã®å®å
šãªã¹ã³ã¢ãååŸããã«ã¯ãç°ãªãå¢çæ¡ä»¶ïŒå
¥åãšæå°ãæ倧ãããã¹ãã®ç©ºè¡ã«äžèŽïŒãæ
éã«ç¢ºèªããã³ãŒããå®è¡ãããããã€ãã®ç°å¢æ¡ä»¶ãæäŸããå¿
èŠããããŸããïŒããšãã°ãCSSããŒãžã®éèŠãªãã©ã³ããµã€ãºïŒ
ã¿ã¹ã¯5.ã³ãã¥ãã±ãŒã·ã§ã³ã®é£ãã
ããããã®èªå®ãªãã·ã§ã³ã«ã¯ãäœããã®ã€ã³ã¿ãŒãã§ã€ã¹ãæã€HTMLããŒãžãå
¥åãšããŠææ¡ãããã¿ã¹ã¯ããããŸããã ã¿ã¹ã¯ã«ã¯å¥ã®å¡äŸããããŸããããããŒãžããããã€ãã®ããŒã¿ãæœåºãããã®ããŒã¿ã䜿çšããŠäœããã®æ¹æ³ã§ã€ã³ã¿ãŒãã§ã€ã¹ãšããåãããå¿
èŠããããšããäºå®ã«ãã¹ãŠãèŠçŽãããŸããã
ãã®ã·ãªãŒãºã®ã¿ã¹ã¯ã®1ã€ã§ãããã³ãã¥ãã±ãŒã·ã§ã³ã®é£ããããšåŒã°ãã解決çãåæããŸãããã
ç¶æ
ããŒã¹ã»ã¢ãã«ãã¯é»è©±ã§å人ãšè©±ãã®ã倧奜ãã§ãã æ®å¿µãªãããããã¯ãŸãã§ãã ã¢ãã«ããé»è©±ãããããã³ã«ãå人ã®çªå·ããã€ã€ã«ããã®ã«1æé以äžããããŸãã ããã¯ã圌ã倪ãã²ã¥ãã§æ£ããããŒãæã€ããšãéåžžã«é£ããããã§ãã
幞ããªããšã«ãAdolfã®é»è©±ã¯JavaScriptããµããŒãããŠããŸãã ããŒããŒããã¯ãªãã¯ããŠAdolfã®å人ã«ãã€ã€ã«ããããã°ã©ã ãæžããŠãã ããã å¿
èŠãªçªå·ã¯ãã¹ãŠããŒãã«èšé²ãããŸãã äžå¹žãªéŠ¬ã¯ããªãã«ãšãŠãæè¬ããŠããŸãïŒ
解æ
å
¥åãšããŠæäŸãããããŒãžã¯æ¬¡ã®ãšããã§ãã
ãœãªã¥ãŒã·ã§ã³ã®æåã®éšåã¯ããŒã¿ã®ååŸã§ãé»è©±çªå·ã®åæ¡ã¯ãbackground-imageãä»ããç»åã«ãã£ãŠèšå®ãããŸãã åæã«ãæ€èšŒäžã«ãæ°å€ãåçã«çœ®ãæããããŸãã ãã©ãŠã¶ãŒã§ãããã¬ãŒãéããããŒãžã®DOMããªãŒãèŠããšãåDOMèŠçŽ ãã¯ãªã¢ã¯ã©ã¹ã䜿çšããŠããããšãããããŸãã
<div class="game"> <div class="target"> <div class="line"> <div class="symbol nine"></div> <div class="symbol eight"></div> <div class="symbol five"></div> <div class="symbol separator"></div> <div class="symbol four"></div> <div class="symbol one"></div> <div class="symbol two"></div> <div class="symbol separator"></div> </div> </div> </div>
ãã®å Žåããã£ã¯ã·ã§ããªãäœæããCSSã¯ã©ã¹ãæœåºãããããããã£ã¯ã·ã§ããªã«å¿ããæ°åã®æååã«å€æããã ãã§ååã§ããã ããšãã°ã次ã®ããã«ïŒ
const digits = document.querySelectorAll('.game .target .symbol:not(.separator)'); const dict = { 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9, 'zero': 0, }; const phoneNumber = Array.from(digits).reduce((res, elem) => { for (const className of elem.classList) { if (className in dict) { res.push(dict[className]); break; } } return res; }, []);
ãã®çµæã次ã®é
åãååŸããŸãïŒ[9ã8ã5ã4ã1ã2ã8ã0ã9ã0]ã
ãœãªã¥ãŒã·ã§ã³ã®2çªç®ã®éšåã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãšå¯Ÿè©±ããããšã§ããã®æ®µéã§ã¯ããã§ã«æ°åã®ãã¹ãŠã®æ°åãå«ãé
åããããããŒããŒãã®ã©ã®ãã¿ã³ãã©ã®æ°åã«å¯Ÿå¿ããããç解ããå¿
èŠããããŸãã HTMLã³ãŒããèŠããšãããŒããŒãäžã®æ°åã瀺ãç¹å¥ãªãã³ãã¯ã©ã¹ããªãããšãããããŸãã
<div class="keys"> <div class="key"></div> <div class="key"></div> </div>
ã€ã³ããã¯ã¹ã«ãã£ãŠå¥ã®èŸæžãç°¡åã«æåã§äœæã§ããŸããããã£ãšç°¡åãªæ¹æ³ããããŸãã Webã€ã³ã¹ãã¯ã¿ãŒã§ã¹ã¿ã€ã«ãããèŠããšããã¿ã³ã®çªå·ããç䌌èŠçŽ ã®åã®CSSããããã£ã³ã³ãã³ãã«ãã£ãŠèšå®ãããŠããããšãããããŸãã ããšãã°ãã3ãããŒã®å Žåãã¹ã¿ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
.key:nth-child(3):before { content: '3'; }
ãã®ããããã£ã®å€ãååŸããã«ã¯ãwindow.getComputedStyleã¡ãœããã䜿çšããŸãã
const keys = Array.from(document.querySelectorAll('.game .key')).reduce((res, elem) => { const key = window
ãã®çµæãããŒããã¹ãããã¿ã³äžã®ããã¹ãïŒæ°å€ãŸãã¯ãåŒã³åºããïŒã«ãªããå€ãDOMããŒãã«ãªããªããžã§ã¯ããååŸããŸãã
æåã®é
åïŒphoneNumberïŒããå€ãååŸããããããééããŠãèŸæžããŒã䜿çšããŠå¯Ÿå¿ãããã¿ã³ãã¯ãªãã¯ããã ãã§ãã
phoneNumber.push('call'); const call = () => { const event = new Event('click'); const next = phoneNumber.shift(); keys[next].dispatchEvent(event); if (phoneNumber.length) { setTimeout(call, 100); } } call();
泚ïŒãã€ã€ã«ããåã«ãå€åŒã³åºããé
åã®æåŸã«è¿œå ããŸãã ããã¯ã¿ã¹ã¯ã®æ¡ä»¶ã«å¿
èŠã§ããçªå·ããã€ã€ã«ããŠãåŒã³åºãããæŒããªããšããœãªã¥ãŒã·ã§ã³ã¯ãã¹ãã«åæ Œããªãããã§ãã
ãã1ã€ã®æ©èœã¯ãããŒããŒããã¿ã³ã®éåææŒäžã§ãã ãã€ã€ã«æã®ããŒã¹ãããŒã¯éã®æéééã50ããªç§æªæºã®å Žåããã®ãœãªã¥ãŒã·ã§ã³ããã¹ãã«åæ ŒããŸããã ãã®æ©èœã¯ã¿ã¹ã¯ã®æ¡ä»¶ã«æ瀺çã«èšè¿°ãããŠããªãã£ããããåå è
ãããŒãžã®ãœãŒã¹ã³ãŒããèªãã§èŠã€ããããšãæåŸ
ããŠããŸããã ãšããã§ããœãŒã¹ã³ãŒãã®åå è
ã«ã¯ã¡ãã£ãšããé©ããåŸ
ã£ãŠããŸããã ;ïŒ
ã¿ã¹ã¯6
ç¶æ
Fedor Rakushkinã¯ãäŒç€Ÿã§ã¿ã¹ã¯ç®¡çã·ã¹ãã ã管çããŠããŸãã ã·ã¹ãã ãé
眮ãããŠãããµãŒããŒãæ
éããŠããŸãïŒFedorã¯ããã¯ã¢ãããå®è¡ããŸããã§ããïŒã
ãµãŒããŒã®ã¡ã¢ãªã«ã¯ãã¿ã¹ã¯ããšã°ãŒãã¥ãŒã¿ãŒããªãã¶ãŒããŒãããã³ãããã®æ§é éã®é¢ä¿ãèšè¿°ããæ§é ã®ãã£ãã·ã¥ãæ®ã£ãŠããŸããã ããã«ãæåŸã«å€æŽãããæ§é ãžã®ãã£ãã·ã¥å
ã®ãªã³ã¯ãä¿æãããŸããã
Fedorãã¿ã¹ã¯ãšãŠãŒã¶ãŒéã®ãã¹ãŠã®å¯èœãªæ¥ç¶ã埩å
ããããããMarkdown圢åŒã®ããã¥ã¡ã³ãã«ä¿åã§ããé¢æ°ãäœæããFedorãããŒã¿ããŒã¹ãæ°ãããµãŒããŒã«åŸ©å
ããã®ãæ¯æŽããŸãã
ããŒã¯ããŠã³ããã¥ã¡ã³ãã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
## - % 1%, %username1%, : %username2% - % 2%, %username1%, : %username2%, %username3% - % 3%, %username1% // - % 4%, : %username1%, %username2% // - % 5% // - % 6%, : %username1% - % 1%, %username1% // - % 2% - % 3%, : %username1% ## - %username1% * % 1% // , * % 2% * % 3% * % 1% - %username2% * % 3%
ã¿ã¹ã¯ã®ãªã¹ããã¿ã¹ã¯ã®ãšã°ãŒãã¥ãŒã¿ãŒã®ãªã¹ããã¿ã¹ã¯ã®ãªãã¶ãŒããŒã®ãªã¹ãããŠãŒã¶ãŒã®ãªã¹ããããã³ãŠãŒã¶ãŒãå®è¡ããã¿ã¹ã¯ã®ãªã¹ãã¯ãèŸæžåŒã«ãœãŒãããå¿
èŠããããŸãã
ãã£ãã·ã¥å
ã®æ§é ã®èª¬æ
ãŠãŒã¶ãŒã¯ `User`åã®æ§é ãšããŠãã£ãã·ã¥ã«ä¿åãããŸãïŒ
type User = { login: string; tasks: Task[]; spectating: Task[]; };
ã¿ã¹ã¯ã¯ã¿ã€ã `Task`ã®æ§é ãšããŠãã£ãã·ã¥ã«ä¿åãããŸãïŒ
type Task = { title: string; assignee: User; spectators: User[]; subtasks: Task[]; parent: Task | null; };
ãœãªã¥ãŒã·ã§ã³ãã³ãã¬ãŒã
ãœãªã¥ãŒã·ã§ã³ã«ã¯ã次ã®çœ²åã«å¯Ÿå¿ããé¢æ°ããšã¯ã¹ããŒãããCommonJSã¢ãžã¥ãŒã«ãå«ãŸããŠããå¿
èŠããããŸãã
module.exports = function (data) {
äŸ
`lastEdited`ãžã®ãªã³ã¯ã衚瀺ãããšã次ã®æ§é ãåŸãããŸãã
{ type: 'task', title: 'Sub task', assignee: null, spectators: [], subtasks: [], parent: { type: 'task', title: 'Something else', assignee: null, spectators: [ { type: 'user', login: 'fedor', tasks: [ { type: 'task', title: 'Do something', assignee: [Circular], spectators: [ { type: 'user', login: 'arkady', tasks: [], spectating: [ [Circular] ] } ], subtasks: [], parent: null } ], spectating: [ [Circular] ] } ], subtasks: [ [Circular] ], parent: null } }
Markdown , :
## - Do something, fedor, : arkady - Something else, : fedor - Sub task ## - arkady - fedor * Do something
解æ
, .
, , . , :
function traverse(ctx, handlers) {
. , , âŠ
users.sort((u1, u2) => u1.login < u2.login ? -1 : (u1.login > u2.login ? 1 : 0)); tasks.sort((t1, t2) => t1.title < t2.title ? -1 : (t1.title > t2.title ? 1 : 0));
⊠â :
7.
, .. :
, . , «».
.
, . , . . . HTML CSS. JavaScript .
, , - . , .
解æ
HTML/CSS, , , - .
CSS, , â float, . float , , .
â , . (
jsfiddle.net .)
â padding-top, margin-top ( ). DOM- (). (
.)
8.
HTML-. , . , . .
(pixel perfect). .
. .
, , . , . , : - , , .
, . , , .
解æ
, â . â CSS- border ( ), background ( ) box-shadow ( ).
- « » ( ) . , , .
â , 70 70 . : , . CSS- , CSS- , .
â 210 210 , 70 70 .
9.
â , -. JavaScript, . , .
: . , , . .
, â . â . , JavaScript API . , -, , . 10 , HTTP- .
â . , , , .
-.
:
â API npm- @yandex-blitz/phone.
â
API .
â -, :
task.js .
â -
runkit- .
-, .
解æ
â GET- return connect.
: - . , , . .
, : , . :
const writeQueue = []; const processQueue = () => { if (writeQueue.length) { const fn = writeQueue.shift(); fn().then(() => { processQueue(); }); } }
, « ».
const writeQueue = []; let isWriteInProgress = false; const processQueue = () => { if (isWriteInProgress) { return; } if (writeQueue.length) { isWriteInProgress = true; const fn = writeQueue.shift(); fn().then(() => { isWriteInProgress = false; processQueue(); }); } }
, POST- . , , .
app.post("/speeddial/:digit/:phonenumber", (req, res) => { writeQueue.push(makeWriteJob(phone, req, res)); processQueue(); });
:
const express = require('express'); const { BEEP_CODES } = require('@yandex-blitz/phone'); const writeQueue = []; let isWriteInProgress = false; const processQueue = () => { if (isWriteInProgress) { return; } if (writeQueue.length) { isWriteInProgress = true; const fn = writeQueue.shift(); fn().then(() => { isWriteInProgress = false; processQueue(); }); } } const makeWriteJob = (phone, req, res) => { return () => { return phone.getData() .then(value => { const speeddialDict = JSON.parse(value); speeddialDict[req.params.digit] = Number(req.params.phonenumber); return phone .setData(JSON.stringify(speeddialDict)) .then(() => phone.beep(BEEP_CODES.SUCCESS)) .then(() => { res.sendStatus(200); }) }) .catch(e => { phone.beep(BEEP_CODES.ERROR).then(() => { res.sendStatus(500); }) }) } }; const createApp = ({ phone }) => { const app = express();
10.
. , «».
:
â , .
â , , .
â , , .
â , : â â â â.
â â , .
, , , , .
.
.
HTML- ( ).
, window.onMazeReady(). . 2 , .
CSS- map.
click CSS-:
â â control_direction_left,
â â control_direction_down,
â â control_direction_up,
â â control_direction_right.
CSS- :
background: radial-gradient(circle at 5px 5px, #eee, #000);
25 , 500 . äŸïŒ
window.map String. :
# â
ã â
o â
x â
, , , â . .
,
window.map = ` ##### #o#x# #.#.# #...# ##### `;
:
:
<!DOCTYPE html> <html lang=ru/> <head> <style> body { padding: 100px 0 0 100px; } .game-box { perspective: 500px; perspective-origin: center; } .map { transform-style: preserve-3d; } .map__tilt_left { transform: rotateY(-25deg); } .map__tilt_down { transform: rotateX(-25deg); } .map__tilt_up { transform: rotateX(25deg); } .map__tilt_right { transform: rotateY(25deg); } </style> <title></title> </head> <body> <div class="game-box"> <div class="map"> </div> </div> <script> </script> </body> </html>
解æ
(HTML, CSS, JS). , «» .
. ( ), , .
, , .
, :
<table class="map map__tilt_none"> <tr> <td class="map__cell map__cell_content_wall"></td> <td class="map__cell map__cell_content_empty"></td> <td class="map__cell map__cell_content_ball"></td> <td class="map__cell map__cell_content_exit"></td> <td class="map__cell map__cell_content_wall"></td> </tr> </table>
:
.map { border: 0; border-spacing: 0; border-collapse: separate; background-color: #ccc; transform-style: preserve-3d; } .map__cell { box-sizing: border-box; border: 1px solid; border-color: #9b9b9b #575757 #575757 #9b9b9b; width: 30px; height: 30px; text-align: center; vertical-align: middle; font-size: 0; line-height: 0; background-color: #707070; } .map__cell_content_ball:after { content: ''; display: inline-block; width: 20px; height: 20px; border-radius: 50%; background: radial-gradient(circle at 5px 5px, #eee, #000); } .map__cell_content_wall { border-width: 4px; } .map__cell_content_exit { background-color: #000; border: 5px solid; border-color: #222 #555 #555 #222; }
â â .
, .
«» , . , . , :
window.map = ` ####### ##.#### #..o..# ##x.#.# ###...# ####### `;
:
function convertMap(mapInput) { return mapInput .trim() .split(/\n\s*/) .map(row => row.split('')); }
, HTML :
const CELL_CONTENT = { '#': 'wall', 'o': 'ball', '.': 'empty', 'x': 'exit' }; function buildGameBoxHtml(map) { return ` <div class="game-box"> <table class="map map__tilt_none"> ${map.map(row => ` <tr> ${row.map(cell => ` <td class="map__cell map__cell_content_${CELL_CONTENT[cell]}"></td> `).join('')} </tr> `).join('')} </table> <!-- --> <div class="controls"> <button class="control control_direction_left">â</button> <button class="control control_direction_down">â</button> <button class="control control_direction_up">â</button> <button class="control control_direction_right">â</button> </div> </div> `; }
, :
let gameBox = document.querySelector('.game-box'); let map = gameBox.querySelector('.map');
â callback : window.onMazeReady(). .
, . , , . HTML, CSS JS â , .
, :
â ,
â , ,
â , ,
â , ,
â , ,
â , .
, :
â ,
â ,
â DOM API ,
â .
11.
, , . , . , .
, . , . . .js, :
module.exports = function solveCaptcha(captcha) {
. .
:
captcha = ' TRABWARH THSCAHAW WWBSCWAA CACACHCR '
:
â S â (sign)
â T â (tree)
â R â (road)
ââŠ
:
[ 'TRABWARH THSCAHAW' , 'WWBSCWAA CACACHCR' ]
:
â 1 10.
â .
â , .
â ( ).
â , , .
â , .
Cut the cake codewars.com.
解æ
, 10. , . , . :
â ;
â , .
, . : «⊠, ». . .
. . , . .
. «», .
module.exports = function solveCaptcha(captcha) { const n =
12. -
X . VCS , .
, -. â , .
, . , , . .
, . ( ) .
.
. â 1000, - â 20.
:
type PullRequest = { files: string[], id: string, created: number, }
(created) (id) â .
CommonJS- :
module.exports = function (pullRequests) {
NodeJS v9.11.2. .
function mergeAllPRs(prs) { } console.assert( mergeAllPRs([ { id: '#1', created: 1536077100, files: ['.gitignore', 'README.md'] }, { id: '#2', created: 1536077700, files: ['index.js', 'package-lock.json', 'package.json'] }, { id: '#3', created: 1536077800, files: ['.pnp.js', 'yarn.lock'] } ]) .join(',') === [ "#1", "#2", "#3" ].join(',') ); console.assert( mergeAllPRs([ { id: '#1', created: 1536074100, files: ['README.md'] }, { id: '#2', created: 1536078700, files: ['README.md'] }, { id: '#3', created: 1536097800, files: ['README.md'] } ]).join(',') === [ "#1" ].join(',') ); console.assert( mergeAllPRs([ { id: '#1', created: 1536077100, files: ['.gitignore', 'README.md'] }, { id: '#2', created: 1536077700, files: ['index.js', 'package-lock.json', 'package.json'] }, { id: '#3', created: 1536077800, files: ['.pnp.js', 'package-lock.json', 'yarn.lock'] }, { id: '#4', created: 1536077900, files: ['index.spec.js', 'index.spec.ts', 'index.ts'] } ]) .join(',') === [ "#1", "#2", "#4" ].join(',') );
解æ
â ,
.
, « » (, ).
, , , . ( some includes). â O(n
2 ).
, , ( .
). â O(n).
:
function conflicts(a, b) { let i = 0; let j = 0; while (i < a.length && j < b.length) { if (a[i] === b[j]) { return true; } else if (a[i] > b[j]) { j++; } else { i++; } } return false; } function mergeAllPrs (input) { let i = 0; const mergedFiles = []; const mergedPrs = []; while (i < input.length) { const pr = input[i]; if (!conflicts(mergedFiles, pr.files)) { mergedPrs.push(pr); mergedFiles.push(...pr.files); } i++; } return mergedPrs.map(x => x.id); };
, , . , :
console.assert( mergeAllPrs([ { "id": "1", "created": 1538179200, "files": [ "a", "b", "c", "d" ] }, { "id": "2", "created": 1538189200, "files": [ "a", "x" ] }, { "id": "3", "created": 1538199200, "files": [ "b", "g" ] }, { "id": "4", "created": 1538209200, "files": [ "c", "f" ] }, { "id": "5", "created": 1538219200, "files": [ "d", "w" ] } ]) .join(',') === ['2', '3', '4', '5'].join(',') );
, ( , ).
: «» -, «» â ( ). ( ).
:
[ { "id": "#1", "created": 1536077100, "files": [ ".gitignore", "README.md" ] }, { "id": "#2", "created": 1536077700, "files": [ "index.js", "package-lock.json", "package.json" ] }, { "id": "#3", "created": 1536077800, "files": [ "index.js" ] } ]
#2 #3 , ["#1", "#2"]. .
, .
, â O(n
2 ), . .
, , . , , .
conflicts , . :
const conflictMatrix = new Uint8Array(prs.length ** 2); const prToIndex = new WeakMap(); for (let i = 0; i < prs.length; i++) { const pr1 = prs[i]; prToIndex.set(pr1, i); conflictMatrix[i * prs.length + i] = 0; for (let j = i + 1; j < prs.length; j++) { const pr2 = prs[j]; conflictMatrix[i * prs.length + j] = conflictMatrix[j * prs.length + i] = conflicts(pr1.files, pr2.files); } } function doPRsConflict(pr1, pr2) { const i = prToIndex.get(pr1); const j = prToIndex.get(pr2); return conflictMatrix[i * prs.length + j] === 1; }
«» , . ( ) , . , , - .
, , .
function getNonConflictingPRs (prsSet, mergedPrs) { const result = []; const prsToTest = [...prsSet, ...mergedPrs]; prsSet.forEach((pr) => { if (!conflictsWithSomePR(pr, prsToTest)) { result.push(pr); } }); return result; }
.
const fullSearch = (prsSet, mergedPrs = [], mergedFilesCount = 0) => { hits++;
.