ํƒœ๊ทธ ๋ณด๊ด€๋ฌผ: code-golf

code-golf

Stack Exchange ๋Œ€ํ™”๋ฐฉ์„์œ„ํ•œ ์ฑ—๋ด‡ ๋งŒ๋“ค๊ธฐ ์—†์ง€๋งŒ ์ œ๋ชฉ)์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค

๋„์ „

์ด ๊ณผ์ œ์˜ ๋ชฉํ‘œ๋Š” Stack Exchange์˜ ๋Œ€ํ™”๋ฐฉ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ์ฑ—๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ด‡์€ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ช…๋ น์„ ๊ฒŒ์‹œ ํ•œ ์‹œ์ ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ด์— ์‘๋‹ต ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ช…๋ น ๋ชฉ๋ก์ด๋ฉฐ ๋ด‡์ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค.

  • !!newest:์ด ์‚ฌ์ดํŠธ์— ๊ฒŒ์‹œ ๋œ ์ตœ์‹  ์งˆ๋ฌธ์˜ ์ œ๋ชฉ (๋งํฌ๋Š” ์—†์ง€๋งŒ ์ œ๋ชฉ)์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค (codegolf.SE).
  • !!metanewest: ๋ฉ”ํƒ€ ์‚ฌ์ดํŠธ (meta.codegolf.SE)์— ๊ฒŒ์‹œ ๋œ ์ตœ์‹  ์งˆ๋ฌธ์˜ ์ œ๋ชฉ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • !!questioncount: ํ˜„์žฌ ์งˆ๋ฌธ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • !!metaquestioncount: ๋ฉ”ํƒ€ ์‚ฌ์ดํŠธ์—์„œ ํ˜„์žฌ ์งˆ๋ฌธ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • !!tag tagname: ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ œ๊ณต๋œ ํƒœ๊ทธ์˜ ํƒœ๊ทธ ๋ฐœ์ทŒ (์งง์€ ์„ค๋ช…)๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • !!metatag tagname: ์œ„์™€ ๋™์ผํ•˜์ง€๋งŒ ๋ฉ”ํƒ€ ์‚ฌ์ดํŠธ ์šฉ.
  • !!featured: ํ˜„์ƒ๊ธˆ์ด์žˆ๋Š” ์งˆ๋ฌธ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • !!metafeatured: ๋ฉ”ํƒ€์— [featured] ํƒœ๊ทธ ๊ฐ€์žˆ๋Š” ์งˆ๋ฌธ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค .

๊ทœ์น™

  1. ์Šค ๋‹ˆํŽซ์ด๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์™„์ „ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  2. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ (์ž…๋ ฅ, STDIN, ๋ช…๋ น ํ–‰ ์ธ์ˆ˜ ํ”„๋กฌํ”„ํŠธ)์œผ๋กœ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Python ๋˜๋Š” Ruby๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•˜์ง€๋งŒ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋Œ€ํ™”๋ฐฉ ํŽ˜์ด์ง€์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. WebSocket๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฌธ์ž ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  4. ๋‹น์‹ ์€ ์ˆ˜์žˆ๋Š” ๋ฌธ์ž ์ˆ˜์— ๋Œ€ํ•œ ์นด์šดํŠธ๊ฐ€ ๊ทธ ๋‹ค์Œ ์™ธ๋ถ€ ์ฑ„ํŒ… ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉ (ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ์ž์‹ ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ). ๋žฉํผ์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์„ธ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ž์‹ ์˜ ๋ž˜ํผ๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ํŽ˜๋„ํ‹ฐ์ž…๋‹ˆ๋‹ค).

    ๋žฉํผ ์ž์ฒด์˜ ์ฝ”๋“œ ๋งŒ ๊ณ„์‚ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  5. URL ๋‹จ์ถ•๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ URL์„ ์งง๊ฒŒ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋ฌธ์ œ๋Š” URL์„ ๊ณจํ”„ํ•˜์ง€ ์•Š๊ณ  ์ฑ—๋ด‡์„ ๊ณจํ”„ํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  6. ์ฑ„ํŒ… ๋ฐ ๋ช…๋ น์— ์‘๋‹ตํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š” ๋ฐ ํ•„์š”ํ•œ ์›น ์š”์ฒญ์„ ์ œ์™ธํ•˜๊ณ  ์›น ์š”์ฒญ์ด ์—†์Šต๋‹ˆ๋‹ค.
  7. ์˜ ์‚ฌ์šฉ ๊ธฐ์ค€ โ€œํ—ˆ์ โ€๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  8. ๋ˆ„๊ตฐ๊ฐ€ ๋ช…๋ น์„ ๊ฒŒ์‹œํ•˜๋ฉด ๋‹ค์Œ ํ˜•์‹์˜ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๋กœ ์‘๋‹ตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค @user response. ๋”ฐ๋ผ์„œ ๋ช…๋ น์„ ์ž‘์„ฑํ•˜๊ณ  !!featured5 ๊ฐœ์˜ ์ถ”์ฒœ ์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด ๋ด‡์ด ๊ฒŒ์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค @ProgramFOX 5.
  9. ๋ด‡์„ ํ…Œ์ŠคํŠธํ•˜๋ฉด ์ฑ—๋ด‡ ๊ณ„์ • ์—์„œ ๋ด‡์„ ์‹คํ–‰ ํ•˜๊ณ ์ด ์ฑ„ํŒ…๋ฐฉ ์—์„œ ๋ด‡์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค . ๋‚˜๋Š” ํ•ญ์ƒ ๊ทธ ๋ฐฉ์—์„œ ๋ด‡์„ ํ…Œ์ŠคํŠธ ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐฉ ID๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์ œ๊ณต ํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ ํ•ญ์ƒ 14697์ž…๋‹ˆ๋‹ค.์ด ID๋Š” ์ž…๋ ฅ์œผ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉฐ ํ•˜๋“œ ์ฝ”๋”ฉ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  10. ๋ช…๋ น์„ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด์„ ์ถœ๋ ฅํ•˜์‹ญ์‹œ์˜ค @user The command [command] does not exist. ๊ต์ฒด [command]๊ฐ€ ์•„๋‹Œ ๊ธฐ์กด ๋ช…๋ น์˜ ์ด๋ฆ„์œผ๋กœ. ๋ช…๋ น์— ์ธ์ˆ˜๊ฐ€ ์ œ๊ณต๋˜๋ฉด ์ธ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ๋ง๊ณ  ๋ช…๋ น ์ด๋ฆ„ ๋งŒ ์ถœ๋ ฅํ•˜์‹ญ์‹œ์˜ค.
  11. ๋ช…๋ น์— ์—ฌ๋Ÿฌ ์ธ์ˆ˜๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ธ์ˆ˜๋Š” ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค.
  12. ๋ช…๋ น์— ์ธ์ˆ˜๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉด ์ถœ๋ ฅ @user You have not provided enough arguments
  13. ์‹œ์Šคํ…œ์€ ์งง์€ ์‹œ๊ฐ„ ๋ฒ”์œ„ ๋‚ด์— ์ค‘๋ณต ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฒŒ์‹œ๋˜์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ด‡์„ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ๋™์ผํ•œ ์ถœ๋ ฅ์„ ์—ฐ์†์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ฆ‰, ์˜ˆ๋ฅผ ๋“ค์–ด ์ ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ค‘๋ณต๋˜๋ฉด ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค).
  14. ์‹œ์Šคํ…œ์€ ์งง์€ ์‹œ๊ฐ„ ๋ฒ”์œ„ ๋‚ด์— ๋„ˆ๋ฌด ๋งŽ์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฒŒ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ์งง์€ ์‹œ๊ฐ„ ๋ฒ”์œ„ ๋‚ด์— ๋„ˆ๋ฌด ๋งŽ์€ ๋ช…๋ น์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ด‡์ด์ด๋ฅผ ์ฒ˜๋ฆฌ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒŒ์‹œํ•˜๊ธฐ ์ „์—).
  15. ์ด๊ฒƒ์€ ๊ฐ€์žฅ ์ ์€ ์–‘์˜ ๋ฐ”์ดํŠธ๋กœ ์Šน๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ธ ์ž…๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ

๋‹ค์Œ์€ ๋ด‡ ์ž‘์„ฑ์„ ์‹œ์ž‘ํ•˜๊ธฐ์œ„ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์ง€์นจ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋กœ๊ทธ์ธํ•˜๋ ค๋ฉด ๋จผ์ € OpenID ๊ณต๊ธ‰์ž์— ๋กœ๊ทธ์ธํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ํ•ญ์ƒ ์Šคํƒ ๊ตํ™˜ OpenID ( https://openid.stackexchange.com)์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ์–‘์‹์€์— ์žˆ์œผ๋ฉฐ https://openid.stackexchange.com/account/login์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ์— ๋กœ๊ทธ์ธํ•˜์‹ญ์‹œ์˜ค stackexchange.com. ๋กœ๊ทธ์ธ ์–‘์‹์€์— ์žˆ์Šต๋‹ˆ๋‹ค https://stackexchange.com/users/login. ์Šคํƒ ๊ตํ™˜์„ OpenID ๊ณต๊ธ‰์ž๋กœ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋กœ๊ทธ์ธํ•˜์—ฌ ์ฑ„ํŒ…ํ•˜์‹ญ์‹œ์˜ค. ๋กœ๊ทธ์ธ ์–‘์‹์€์— ์žˆ์Šต๋‹ˆ๋‹ค http://stackexchange.com/users/chat-login. ์Šคํƒ ๊ตํ™˜์„ OpenID ๊ณต๊ธ‰์ž๋กœ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ์„ ๋ฐ›์•„์•ผํ•ฉ๋‹ˆ๋‹ค fkey. ์ด๋ฅผ ์œ„ํ•ด, ์ด๋™ http://chat.stackexchange.com/chats/join/favorite๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ fkey์ˆจ๊ฒจ์ง„ ์ž…๋ ฅ ํ•„๋“œ์—์„œ.
  • ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋ ค๋ฉด์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋ฉ”์‹œ์ง€ ํ…์ŠคํŠธ๋ฅผ ํฌํ•จ http://chat.stackexchange.com/chats/14697/messages/newํ•˜๋Š” text๋งค๊ฐœ ๋ณ€์ˆ˜์™€๋ฅผ ํฌํ•จ ํ•˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ผ๋Š” ๋‘ ๊ฐœ์˜ POST ๋งค๊ฐœ fkey๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค fkey.
  • ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฒŒ์‹œ๋˜๋Š”์‹œ๊ธฐ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด WebSocket์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋‹จ, ๋” ์งง์€ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค). ์ด Meta Stack Exchange ๋‹ต๋ณ€์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค .

    ์žก๋‹ด

    (wss://chat.sockets.stackexchange.com/events/<roomnumber>/<somehash>?l=<timethingy>)

    ๋ฃธ ID์™€ fkey๋ฅผ POSTํ•˜์—ฌ POST๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. http://chat.stackexchange.com/ws-auth

    timethingy๋Š”์— ์˜ํ•ด ๋ฐ˜ํ™˜ ๋œ json์˜ ์‹œ๊ฐ„ ํ‚ค์ž…๋‹ˆ๋‹ค /chats/<roomno>/events.

    ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฒŒ์‹œ ๋  ๋•Œ์˜ ์ด๋ฒคํŠธ ID๋Š”์ž…๋‹ˆ๋‹ค 1.

  • Doorknob ์˜ StackExchange-Chatty ๋ฐ Manishearth์˜ ChatExchange ์™€ ๊ฐ™์€ ๊ธฐ์กด ๋Œ€ํ™” ๋ž˜ํผ ๋ฅผ๋ณด๊ณ  ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ์ด ์œ ์šฉ ํ•ฉ๋‹ˆ๋‹ค.


๋‹ต๋ณ€

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ + jQuery, 1362 1258 ๋ฐ”์ดํŠธ

์ถ•์†Œ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณจํ”„ :

$(function(){function e(){function e(e,t){$("#input").val("@"+$(e).parents(".user-container").find(".username").eq(0).text()+" "+t),$("#sayit-button").click()}var i,a=$(t),s=a.map(function(e,t){return t.id}),r=s.slice(-1)[0]
n!=r&&(i=a.slice($.inArray(n,s)+1),n=r,i.map(function(t,n){var i,a,s,r,o,u,c,f=n.textContent.match(/!!(\S+)(?:\s+(\S+))?/)
if(f){switch(i=f[1],a=f[2],s="codegolf",0==i.indexOf("meta")&&(s="meta."+s,i=i.slice(4)),r="?site="+s,c=0,i){case"newest":o=["questions","&order=desc&sort=creation"],u=function(e){return e.items[0].title}
break
case"questioncount":o=["info",""],u=function(e){return e.items[0].total_questions}
break
case"tag":if(!a){c=1
break}o=["tags/"+a+"/wikis",""],u=function(e){return 0==e.items.length?"Tag not found":e.items[0].excerpt}
break
case"featured":o=0==s.indexOf("meta.")?["questions","&tagged=featured"]:["questions/featured",""],u=function(e){var t=e.items.length
return(e.items.has_more?"more than ":"")+t}}c?e(n,"You have not provided enough arguments"):o?$.get("http://api.stackexchange.com/2.2/"+o[0]+r+o[1],function(t){e(n,u(t))}):e(n,"The command "+i+" does not exist")}}))}var t="[id^=message-]",n=$(t).eq(-1).attr("id")
new MutationObserver(e).observe($("#chat").get(0),{childList:!0,subtree:!0})})

Stack Exchange์˜ jQuery ์ž‘๋™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  1. http://chat.stackexchange.com/rooms/14697/chatbot-challenge-on-programming-puzzles-code-golf๋ฅผ ์—ฝ๋‹ˆ ๋‹ค .
  2. ์ฝ˜์†”์— ์œ„ ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ ๋„ฃ๊ธฐ
  3. ์ฑ„ํŒ…์— ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค

ํ›จ์”ฌ ๋” ๊ณจํ”„๋ฅผ ์น  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๊ท€์ฐฎ๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.


์–ธ ๊ณจํ”„ :

$(function() {
    var sel = '[id^=message-]';
    var latestMessage = $(sel).eq(-1).attr('id');
    function update() {
        var messages = $(sel);
        var ids = messages.map(function(i, x) { return x.id; });
        var newest = ids.slice(-1)[0];
        if(latestMessage == newest) {
            return;
        }
        var newMessages = messages.slice($.inArray(latestMessage, ids) + 1);
        latestMessage = newest;
        newMessages.map(function(i, x) {
            var m = x.textContent.match(/!!(\S+)(?:\s+(\S+))?/);
            if(!m) {
                return;
            }
            var c = m[1];
            var a = m[2];
            var s = 'codegolf';
            if(c.indexOf('meta') == 0) {
                s = 'meta.' + s;
                c = c.slice(4);
            }
            var site = '?site=' + s;
            var url;
            var extractor;
            var too_few_args = 0;
            switch(c) {
                case 'newest':
                    var url = ['questions', '&order=desc&sort=creation'];
                    extractor = function(data) {
                        return data.items[0].title;
                    };
                    break;
                case 'questioncount':
                    url = ['info', ''];
                    extractor = function(data) {
                        return data.items[0].total_questions;
                    };
                    break;
                case 'tag':
                    if(!a) {
                        too_few_args = 1;
                        break;
                    }
                    url = ['tags/' + a + '/wikis', ''];
                    extractor = function(data) {
                        if(data.items.length == 0) {
                            return 'Tag not found';
                        }
                        return data.items[0].excerpt;
                    };
                    break;
                case 'featured':
                    url = s.indexOf('meta.') == 0? ['questions', '&tagged=featured']: ['questions/featured', ''];
                    extractor = function(data) {
                        var l = data.items.length;
                        return (data.items.has_more? 'more than ': '') + l;
                    }
                    break;
            }
            if(too_few_args) {
                write(x, 'You have not provided enough arguments');
            } else if(!url) {
                write(x, 'The command ' + c + ' does not exist');
            } else {
                $.get('http://api.stackexchange.com/2.2/' + url[0] + site + url[1], function(data) {
                    write(x, extractor(data));
                });
            }
        });

        function write(x, m) {
            $('#input').val('@' + $(x).parents('.user-container').find('.username').eq(0).text() + ' ' + m);
            $('#sayit-button').click();
        }
    }
    new MutationObserver(update).observe($('#chat').get(0), {childList: true, subtree: true});
});

๋‹ต๋ณ€


์ด ๊ธ€์€ ์ฝ”๋”ฉ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋ถ„๋ฅ˜๋˜์—ˆ๊ณ  ํƒœ๊ทธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋‹˜์— ์˜ํ•ด ์— ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.