ç§ã¯é·ãéãquainsã«é¢é£ããèå³æ·±ãäœããå®è£ ãããšããèããæã£ãŠããŸããã ãããŠæåŸã«ããã®åé¡ãçµããããããšãå€æããŸããã ã©ã€ãã²ãŒã ã®å®è£ ããœãŒã¹ã³ãŒãã§èŠããšãïŒ Life of Self Printing GameãšäŒŒããããªããšããããã£ãã çèããåŸã ASCIIã°ã©ãã£ãã¯ãããããšãæãåºããŸããã ããããASCIIã°ã©ãã£ãã¯ã¹ã§ã¢ãã¡ãŒã·ã§ã³ãäœæããããšã¯ããã«é¢çœããå°é£ã«ãªããŸãã é·ãéãµã³ãã«ãæ¢ãå¿ èŠã¯ãããŸããã§ããããã»ãšãã©ããã«ã¹ã¿ãŒãŠã©ãŒãºã®ã¢ãã¡ãŒã·ã§ã³ããŸãã¯AsciimationãšåŒã°ãã4ã€ã®æ°ããåžæã®ãšããœãŒããèŠã€ããŸãã ã æ¥æ¬ã®ããã°ã©ããŒã§ããé è€è£ä»ã®ä»äºã岞å£ãªã¬ãŒããããã®ã¢ã€ãã¢ãå®è£ ããããã«é§ãç«ãŠãŸããã ãã®ãããªããã£ã«ã ããå®è£ ããéçšã§ãç§ã¯ä»ã®å€ãã®åé¡ã解決ããªããã°ãªããŸããã§ããããåŸæããå¿ èŠã¯ãããŸããã§ããã
çµæã®ãœãŒã¹ã¯gistã§ãã ã衚瀺ãã容æã«ããããã«ãã¢ãã¡ãŒã·ã§ã³å šäœãã²ããã¹ã¯ãªãããå«ãŸããŠããŸãã çæãã€ã³ã¿ãŒãã§ãŒã¹ãããã³ãã®ä»ã®ãŠãŒãã£ãªãã£ã®ãããžã§ã¯ãå šäœã®ãœãŒã¹ã³ãŒãã¯ãgithubã«ã¬ã€ã¢ãŠããããŠããŸãïŒ Freaky-Sources ïŒç§ãæ¢ã«æžãã Quine palindromesã¯ããã«å«ãŸããŠããŸãïŒã ãã®ãããªããšã¯å®éçãªå©ç¹ãæããªãããšã¯æããã§ããããã ã®æ¥œãã¿ã®ããã ãã§ãã
ã¯ããã«
ã¯ã€ã³ã®ã¢ãã¡ãŒã·ã§ã³ã¯1ã€ã®æ¹æ³ã§ã®ã¿è¡šç€ºã§ããŸããã³ã³ãã€ã«ããšã«æ¬¡ã®åãã¬ãŒã ãã³ã³ãœãŒã«ã«åºåããŸãã ãããã£ãŠããã®å Žåã®ãã ãŒããŒãã®é床ã¯ãã³ãŒãã®ãµã€ãºïŒã³ãŒãã倧ããã»ã©ãã³ã³ãœãŒã«ãã³ã³ãã€ã«ããŠã¹ã¯ããŒã«ããæéãé·ããªãïŒãã¢ã³ããã¯ã¢ã«ãŽãªãºã ãããã³ã³ã³ãã€ã«é床ïŒããŒããŠã§ã¢ïŒã«äŸåããŸãã ããã«ãã³ãŒãã¯äž»ã«å§çž®ãããã¢ãã¡ãŒã·ã§ã³ãã¬ãŒã ã«ãã£ãŠå æãããŸãã
åè¿°ã®ãGame of Lifeãã¯ãããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®æåã«åæåããã³è¡šç€ºããããã£ãŒã«ãæååãšããŠäœ¿çšããŸãã ã³ãŒãã®éãå°ãªãå Žåããã®ã¢ãããŒãã¯åãå ¥ããããã³ã³ãã€ã«äžã¯åžžã«è¡šç€ºãããŸãã ãã ããç§ã®å Žåãã³ãŒããµã€ãºã¯æ°çŸãããã€ãã§ããã€ãŸãããã¬ãŒã ãæåŸã«è¡šç€ºããŠè¡šç€ºã§ããããã«ããå¿ èŠããããŸãã ãã¬ãŒã ãå®éã®è¡ã®åœ¢åŒã§ã¯ãªããåäžè¡ã®ã³ã¡ã³ãïŒè€æ°è¡ã䜿çšå¯èœïŒã®åœ¢åŒã§åºåããããšã決å®ãããŸããã
ã¯ã€ã³çæ段é
ãããã£ãŠãç§ã¯ã¯ã€ã³ãæžãããã»ã¹ã次ã®ã¹ãããã«åå²ããããšã«ããŸããïŒ
- ã³ãŒãçæã
- ããŒã¿çæã
- ã³ãŒãã®çž®å°ã
- ã³ãŒãã®ãã©ãŒãããã
- ããäžä»£ã
ãããã®ãã¹ãŠã®æé ã¯ãç¹å¥ã«èšèšããããã³ãã¬ãŒãã«å¯ŸããŠå®è¡ãããŸãã ã¹ã¿ãŒãŠã©ãŒãºã«é©çšããããã³ãŒãããšã¯ãå§çž®ãããããŒã¿ã解åããã³ãŒããæå³ããŸãã ãããŠãããŒã¿ã¯ã¢ãã¡ãŒã·ã§ã³ãã¬ãŒã ã®ããã¯ãããé åã§ãã
確ãã«ãæåã¯ãå§çž®ããŒã¿ã解åããããã®éåžžã®.NETã¯ã©ã¹GZipââStreamã§ããŒãžã§ã³ãèšè¿°ãããŠããŸããã ãããããã®ã¯ã©ã¹ã¯ãã®ãã©ãããã©ãŒã å°çšã§ããããšã«å ããŠãã¹ããŒãã§ã¯ãªããšèããŸããã ãããã£ãŠãç§ã¯èªåã®ã¢ãŒã«ã€ãã§ããè€éãªããŒãžã§ã³ãæžããŸããã
ãããã®æ®µéã§ããã²ãŒãããããããããã«ãWinFormsã§ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸããã
- å·Šäžã«ã¯ããã¹ãŠã®ããŒã«ãŒãåããã¯ã€ã³ãã³ãã¬ãŒããå ¥åãããããã¹ãããã¯ã¹ããããŸãã ãããã®ç®çã以äžã«èª¬æããŸãã ãã®ãã£ãŒã«ãã§ã¯ãæåã®4ã€ã®ã¹ããŒãžãå®è¡ãããŸãã
- å·Šäžã«ã¯ãäžèšã®æé ãå®è¡ããããã®ããŸããŸãªãã©ã¡ãŒã¿ãŒãšãã¿ã³ããããŸãã ãŸããã³ã³ãã€ã«ã䜿çšããŠããã³ãã¬ãŒãã®ã³ãŒããŸãã¯çµæã®ã¯ã€ã³ã®ãšã©ãŒãããã«ãã§ãã¯ã§ããŸãã
- å³äžã®æåŸã®æé ã§çæãããã¯ã€ã³ã³ãŒãã§æºãããããã£ãŒã«ãã
- ã³ã³ãã€ã«åŸã®ã¯ã€ã³ã®æ¬¡ã®å埩ãåºåããããã£ãŒã«ãã®å³äžã ãŸããã¯ã€ã³ãã³ã³ãã€ã«ãããã¬ãŒã ããšã®ã¢ãã¡ãŒã·ã§ã³ïŒãŸãã¯ä»ã®äœãïŒã衚瀺ããããã»ã¹ãã«ãŒãããã«ã¯ãå埩åæ°ãå«ã[ã³ã³ãœãŒã«åºå->åºå]ãã¿ã³ãå¿ èŠã§ãã
CïŒæ§æã匷調ããããã«ã BigObfuscator FastColoredTextBoxã³ã³ããŒãã³ãã 䜿çšãããŸãã ã æ®å¿µãªãããåäœã¯ããªãé ããããçµæã®ãæ ç»ããéåžžã®ã³ã³ãœãŒã«ã§èŠãæ¹ã䟿å©ã§ãïŒæ®å¿µãªãããããŸãé«éã§ããããŸããïŒã
ã¯ã€ã³ãã¿ãŒã³
ãã³ãã¬ãŒãã¯ããã®ãããªè€éãªã¯ã€ã³ã®åºçºç¹ã§ããã次ã®ããã«ãªããŸãã
ã¯ã€ã³ãã¿ãŒã³
using System; using System.Text; using System.Collections.Generic; namespace Asciimation_1_3 { class Program { /*#Asciimation_1_3*/ /*Asciimation_1_3#*/ /*#DecodeBase64*/ /*DecodeBase64#*/ /*#HuffmanTree*/ /*HuffmanTree#*/ /*#HuffmanRleDecode2*/ /*HuffmanRleDecode2#*/ /*#Enums*/ /*Enums#*/ /*#Utils*/ /*Utils#*/ static string Data = /*%Data_1_3*/""/*Data_1_3%*/; static int CurrentFrame = /*$CurrentFrame*/0/*CurrentFrame$*/; static void Main() { var output = Decompress_v_1_3(Data, CurrentFrame++); if (CurrentFrame == 3591) CurrentFrame = 3590; /*$@$*/ } } } /*$Output_1_3$*/
ã芧ã®ãšãããäžèšã®ã³ãŒãã«ã¯å€ãã®ãããŸããªã³ã¡ã³ãããããŸãã ãããå®éã«ã¯ãç¹å®ã®ã³ãŒããŸãã¯ããŒã¿ãæ¿å ¥ããå Žæã瀺ãããŒã«ãŒã§ãã ãã®ã¢ãããŒãã®å©ç¹ã¯ãã¯ã©ã¹ã®ä»ã®å®å šãªããŒãžã§ã³ããã³ãŒããæ¿å ¥ã§ããããããé çªã«ãã¹ãã§ããããšã§ãïŒç§ã¯NUnitã䜿çšããŠããŸãïŒã ãããã®ããŒã«ãŒã次ã®ããã«åé¡ããŸããã
- /*#...*/.../*...#*/-ã³ãŒãã ãããã®ããŒã«ãŒéã®ã³ãŒãã®æçã¯ãæå®ããããã£ã¬ã¯ããªã®ãã¡ã€ã«ã«ãã£ãŠæ€çŽ¢ãããŸãã
- /*%...*/.../*...%*/-ããŒã¿ã ãããã®ããŒã«ãŒã®éã«ãç¹å®ã®ã¡ãœããã䜿çšããŠçæãããããŒã¿ãæ¿å ¥ãããŸããããã¯ãæåå圢åŒïŒã€ãŸããéåžžã®æååãæååã®é åããã€ãã®é åãæŽæ°ãªã©ïŒã§æ瀺ããå¿ èŠããããŸãã äžè¬çã«ãã¡ãœããã«é¢ããæ å ±ãããŒã¿ããŒã«ãŒããæœåºããã³ã³ãã€ã«æžã¿ã®ã¢ã»ã³ããªã§æ€çŽ¢ãããªãã¬ã¯ã·ã§ã³ã䜿çšããŠåŒã³åºãããšãã§ããŸãã ãããä»ã®ãšãããå¿ èŠãªã¡ãœãããæåã§åŒã³åºãããšã«éå®ããããšã«ããŸãããããã¯ããæ®éçãªã¢ãããŒãã ããã§ãïŒãã®æ¹æ³ã§ä»ã®èšèªã«ç§»æ€ããæ¹ãç°¡åã§ãïŒã
- /*$...*/.../*...$*/-ãã©ã¡ãŒã¿ãŒã ãããã®ããŒã«ãŒã¯ãã¯ã€ã³ã®è¡šç€ºã®åŸç¶ã®å埩ããšã«å€åããã³ãŒãã瀺ããŸãã ãããã¯ç¹å¥ãªè¡šã«ç€ºãããŠããã眮æã®ã³ãŒãã瀺ãããŠããŸãã ãã®å Žåããã©ã¡ãŒã¿ãŒã¯ãçŸåšã®ãã¬ãŒã ã®çªå·ïŒæ¯åã€ã³ã¯ãªã¡ã³ããããïŒãšãåäžè¡ã®ã³ã¡ã³ãã䜿çšããŠå®è£ ãããäžã®ãã¬ãŒã ã®åºåãã£ãŒã«ãã§ãã ããã€ãã®ãã©ã¡ãŒã¿ãŒã¯ã€ã³ããã³ã§ãã 次ã®å埩ã§ã³ãŒãã«åœ±é¿ãäžããªãè¡ã ãã®å Žåãã€ã³ããã³ã¯åºåãã£ãŒã«ãã§ãã
- / * @ * /-å°å·ã ããã¯ç¹å¥ãªããŒã«ãŒã§ãã³ãŒãå šäœãã¯ã€ã³å šäœã衚瀺ããããã«å®éã«æ¿å ¥ãããŸãã åäžã®ã³ããŒã«ã®ã¿ååšããŸãã åã®æé ã§ã³ãŒããšããŒã¿ãçæããåŸãæåŸã«çœ®æãè¡ãããŸãã ããŒã¿ã»ã¯ã·ã§ã³ã®éè€ãé²ãããïŒã¯ã€ãŒã³èªäœãšãã®è¡ã«å°å·ããªãããã«ïŒããã®æ®µéã§ãããŒã¿ã¯ããŒã¿èªäœã§ã¯ãªããã©ã¡ãŒã¿ãŒïŒã€ãŸããåºåã«å«ãŸãããasdfãã®ä»£ããïŒã«çœ®ãæããããããšã«æ³šæããŠãã ãã'' '+åºå+' "'ã¯åºåã§ãïŒã
ãããã£ãŠãã¹ããŒãžãšããŒã«ãŒã«é¢ããæ å ±ãçµã¿åãããŠã次ã®å³ãäœæã§ããŸãã
ãããã©ã€ã¶ãŒãã¯ã€ã³èªäœã®ãã©ã¡ãŒã¿ãŒãå€æŽããªããŸãŸã«ããŠãããšããã©ã¡ãŒã¿ãŒã«å¥ã®ååãä»ããããç¶æ³ãçºçãããã®ãããã¯ã€ã³ãã³ã³ãã€ã«ãããªãããå¿ èŠã§ãªããã®ãåºåãããããšã«æ³šæããŠãã ããã ïŒç¢ºãã«ããã©ã¡ãŒã¿ãŒã¯ãŸã çž®å°ãããŠããŸãããããããªãããŒãªæ¹æ³ã§ãïŒã
ãã¹ãŠã®ã¹ããŒãžã®è©³çŽ°ã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
ã³ãŒãçæ
ã³ãŒããçæãããšããæå®ããããã©ã«ããŒã®ãã¹ãŠã®ãœãŒã¹ã³ãŒããã¡ã€ã«ãåæãããŸãã ãŸããããŒã«ãŒ/*#...*/.../*...#*/ã®éã®ã³ãŒãã¯ãå ã®ãã³ãã¬ãŒãã®é©åãªå Žæã«ã³ããŒãããŸãã ããšãã°ã次ã®äŸã§ã¯ãHuffmanRle2ã¯ã©ã¹å šäœã/ *ïŒHuffmanRleDecode2 * // * HuffmanRleDecode2ïŒ* /ã®éã®ã»ã¯ã·ã§ã³ã«ã³ããŒãããŸãã ãããã®ããŒã«ãŒå ã®ã³ãŒãã®äžéšã®ãã©ã°ã¡ã³ããç¡èŠããããã«ïŒããšãã°ã.ToStringïŒïŒã¡ãœããã¯ã¯ã€ã³ã§ã¯äžèŠã§ããããããã°ã«å¿ èŠã§ãïŒããã®ãã©ã°ã¡ã³ãã2ã€ã«åå²ãããããŒã«ãŒ/ *ïŒIgnore * // * IgnoreïŒãå°å ¥ãããŸãã* / ããããã®ã³ãŒãå ã®ãã¹ãŠã®ã³ãŒããç¡èŠã§ããŸãã
ãœãŒã¹ã³ãŒãã®ãµã³ãã«ããŒã«ãŒ
/*#HuffmanRleDecode2*/ public class HuffmanRle2 { public static byte[] Decode(HuffmanTree tree, byte[] bytes, ref int curBit, int bytesCount, int bitsCountPerRepLength = 8, int bitsCountPerNotRepLength = 8) { int minLength = Math.Min(bitsCountPerRepLength, bitsCountPerNotRepLength); var maxCount = 1 << (minLength - 1); var root = tree.Root; var result = new List<byte>(bytes.Length * 2); int curBytesCount = 0; int i = 0; while (curBytesCount < bytesCount) { var length = Utils.GetInt(bytes, ref curBit, minLength); if ((length & maxCount) == 0) { curBit -= minLength; length = Utils.GetInt(bytes, ref curBit, bitsCountPerRepLength); var repeatCount = length + 2; byte value = Utils.GetValue(root, bytes, ref curBit); for (int j = 0; j < repeatCount; j++) { result.Add(value); curBytesCount++; } } else { curBit -= minLength; length = Utils.GetInt(bytes, ref curBit, bitsCountPerNotRepLength); var notRepeatCount = (((1 << (bitsCountPerNotRepLength - 1)) - 1) & length) + 1; for (int j = 0; j < notRepeatCount; j++) { byte value = Utils.GetValue(root, bytes, ref curBit); result.Add(value); curBytesCount++; } } i++; } return result.ToArray(); } } /*HuffmanRleDecode2#*/
ããŸããŸãªãã¡ã€ã«ããåéãããã³ãŒãã¯ãæå°é·ã®åºæºã®èŠ³ç¹ããæé©ã§ã¯ãªãå¯èœæ§ããããšããäºå®ã«ããããããã ããã«ãããããããããã¯æšæºã¹ã¿ã€ã«ã§èšè¿°ãããŠããããããã®ã¢ãããŒãã«ãããçæã®çŽåã«ã¯ã€ã³ããŒã¿ãå§çž®ããã³æœåºããããã®ãã¹ãïŒNUnitïŒãèšè¿°ããã³å®è¡ã§ããŸãããããã«ãããéçºããã»ã¹ãç°¡çŽ åãããé¢åãå°ãªããªããŸããã åŸã§èª¬æããã³ãŒãã®æå°åã«ããããã®ã¢ãããŒãã®æ¬ ç¹ãå®éã«è»œæžã§ããŸãã
ããŒã¿çæ
RLEãHuffmanã³ãŒãã£ã³ã°ãªã©ãæãåçŽãªãã¹ã¬ã¹å§çž®ã¢ã«ãŽãªãºã ã䜿çšããŠããŒã¿ãå§çž®ããŸããã ãã ãããã®ã¢ãã¡ãŒã·ã§ã³ã¯ãä»ã®ãã£ã«ã ãšåæ§ã«ãã¡ã€ã³ãã¬ãŒã ãšäžéãã¬ãŒã ã«åå²ã§ããŸãã äžéãã¬ãŒã ã«ã¯ãæåŸã®ãã¬ãŒã 以éã«å€æŽãããæ å ±ãå«ãŸããã¡ã€ã³ãã¬ãŒã ã«ã¯ãã¬ãŒã ã«é¢ãããã¹ãŠã®æ å ±ãå«ãŸããŸãã ãããã£ãŠãäžéãã¬ãŒã ã®ãã¹ãŠã®æåãååŸããã«ã¯ãåã®ãã¬ãŒã ããã¹ãŠã¡ã€ã³ãã¬ãŒã ã«ãã³ãŒããããã®åŸãåä¿¡ããå€æŽãèæ ®ããŠãã¹ãŠã®ãã¬ãŒã ãçŸåšã®ãã¬ãŒã ã«ã¬ã³ããªã³ã°ããå¿ èŠããããŸãã ããã¯äžçš®ã®æ¬äŒŒMPEGã§ããã ã¡ã€ã³ããã³äžéãã¬ãŒã ã®æ§é ã以äžã«ç€ºããŸãã éåžžã®ãã¬ãŒã ãšäžéãã¬ãŒã ã«å ããŠãå·Šãå³ãäžäžã«ã·ããããŠåŸãããäžéãã¬ãŒã ãå«ããããšã決å®ããŸããã
ãã¬ãŒã ïŒ
0..3-ã¿ã€ãïŒ
- 000-ããŒã¹ïŒ
3..13-æåæ°
13 ...-ãããã³RLEã³ãŒã - 001-å·ŠïŒ
010-ãããïŒ
011-å³ïŒ
100-äžïŒ
101-å€æŽïŒ
3..10-ã«ãŠã³ãã®å€æŽ
10 ...-å€æŽ
å€æŽïŒ
0..2-ã¿ã€ãïŒ
- 00-1æåïŒ
2..12-äœçœ®
12 ...-ãããã³ã³ãŒã - 01-æ°Žå¹³ç·ïŒ
2..12-äœçœ®
12.19-æåæ°
19 ...-ãããã³ã³ãŒã - 10-åçŽç·ïŒ
2..12-äœçœ®
12..16-æåæ°
16 ...-ãããã³ã³ãŒã
æ®å¿µãªãããæçµçãªå§çž®ã¯åžæããã»ã©å€§ããã¯ãããŸããã§ããããããªã蚱容ç¯å²ã§ããã ç§ã¯7-zipã®lzmaã¬ãã«ã§ãã€ãŸã 100 kbæªæºã ãããããããé«åºŠãªã¡ãœããïŒééã³ãŒãã£ã³ã°ãèŸæžã¡ãœããïŒã䜿çšãããšãããã«é«åºŠãªå§çž®ãå®çŸã§ããŸãã
ã³ãŒãã®çž®å°
ããã¹ã圢åŒã®ã³ãŒãã®ãµã€ãºãå°ããããã«ã¯ãçž®å°ãå¿ èŠã§ãã CïŒã³ãŒããåŠçããããã«ã NRefactoryã©ã€ãã©ãªã䜿çšãããŸãã ã Roslynã«å¯Ÿããå©ç¹ã¯ãæå°åã¿ã¹ã¯ã§å¿ èŠãªããã»ã¹ã§è§£æããªãŒãå€æŽã§ããããšã§ãã
ã¯ã©ã¹åãã¡ãœããããã£ãŒã«ããããŒã«ã«å€æ°ãççž®ãã
ãããã¡ã€ã€ã®äž»ãªã¿ã¹ã¯ã¯ããŸãã«ãã®æ®µéã§ããã æ§ç¯ãããæ§æããªãŒããã€ãã¹ããããã«ãVisitorãã¿ãŒã³ã䜿çšãããŸãããããã¯ãæ·±ãã暪æãããšãã«ããŒãã暪æããããã«å¿ èŠãªã¡ãœããã®ãªãŒããŒããŒãã®åœ¢åŒã§å®è£ ãããŸããã
èå¥åã®æå°æ°ã䜿çšããäžæ¹ã§ãéè€ããªãããã«ããŠã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ããããã«ãççž®ã¢ã«ãŽãªãºã ã¯æ¬¡ã®æé ã«åå²ãããŸããã
- ããŒã«ã«å€æ°ã®çž®å°ã ãã®æ®µéã§ã ããŒã«ã«å€æ°ã®ãã¹ãŠã®ååã®ãªã¹ããå®çŸ©ããã®ã¡ãœããã®åŒæ°ãããã³ããªãŒå ã®å¯Ÿå¿ããããŒããéçŽãããŸãã åå€æ°ã¯ç¹å®ã®ã¡ãœããã«é¢é£ä»ããããŠããŸãã ãã®åŸã1ã€ã®ã¡ãœããå ã®å€ãèå¥åããšã«ãæ°ããèå¥åã«çœ®ãæããããŸãã
- ã¡ã³ããŒã¿ã€ãã®çž®å°ã ãã®æ®µéã§ãããªãŒå ã®ãã¹ãŠã®ãã£ãŒã«ãåã ã¡ãœãã ã ãããã㣠ã åæã¡ã³ã㌠ã ã€ãã³ããããã³ãããã«å¯Ÿå¿ããããŒãã®ãªã¹ããéçŽãããŸãã åã¡ã³ããŒã¯ç¹å®ã®ã¿ã€ãïŒ class ã structure ã interface ïŒã«é¢é£ä»ããããŠããŸã ã ãã®åŸã1ã€ã®ã¿ã€ãå ã®å€ãèå¥åããšã«ãæ°ããèå¥åã«çœ®ãæããããŸãã
- ååã®çž®å°ã ãã®æ®µéã§ããã¹ãŠã®ååïŒ ã¯ã©ã¹ ã æ§é äœ ã ã€ã³ã¿ãŒãã§ãŒã¹ ïŒãšããã«å¯Ÿå¿ããããªãŒå ã®ããŒãã®ãªã¹ããéçŽãããŸãã ãã®åŸãåååã¯æ°ããååã«çœ®ãæããããŸãã
眮æãçæããã«ã¯ãæå°ã®é·ããŸãã¯ã©ã³ãã ãªèå¥åãçæã§ããã¯ã©ã¹ã䜿çšãããŸãã ãã®ãããžã§ã¯ãã¯æåã®ãªãã·ã§ã³ã䜿çšããŸãã å段éã§çœ®æãçæããå Žåãæ€åºãããèå¥ååã¯ç¡èŠãããŸãïŒãã®ããã亀差ç¹ãæœåšçãªãšã©ãŒã¯ãããŸããïŒã
ã©ã€ãã©ãªãç¡èŠãããèå¥åããµããŒãããŠããããšã¯æ³šç®ã«å€ããŸãã ãã®ãããžã§ã¯ãã§äœ¿çšãããŠãããäœããã®çç±ã§ççž®ãã¹ãã§ãªããã®ïŒã¯ã€ã³ãã©ã¡ãŒã¿ãŒïŒã
䜿çšãããèå¥åãžã®ãã¹ãŠã®ãªã³ã¯ã®ãªã¹ããååŸããã«ã¯ïŒVisual Studioã§ãã¹ãŠã®åç §ãæ€çŽ¢ïŒãNRefactory解決ã¡ã«ããºã ã䜿çšãããŸãã ãããè¡ãã«ã¯ãæåã«ããªãŒãã³ã³ãã€ã«ããå¿ èŠããããŸãïŒå段éïŒããŒã«ã«å€æ°ãåã¡ã³ããŒãåïŒïŒ
var unresolvedFile = SyntaxTree.ToTypeSystem(); var projectContent = projectContent.AddOrUpdateFiles(_unresolvedFile); var compilation = projectContent.CreateCompilation(); var resolver = new CSharpAstResolver(_compilation, SyntaxTree, _unresolvedFile);
次ã«ã次ã®ããã«ãªã³ã¯ãæ€çŽ¢ã§ããŸãã
var resolveResult = resolver.Resolve(node); var findReferences = new FindReferences(); ... findReferences.FindLocalReferences(); ... findReferences.FindReferencesInFile();
ãã®ä»ã®çž®å°
次ã®å°ããªçž®å°ãå®è£ ãããŸããã
- ãã©ã€ããŒãããŒã¯ãŒãã®åé€
- åå空éã®åé€
- å€æ°åæååŒã®ç¥èªïŒ
List<byte> a = new List<byte>() -> var a = new List<byte>()
var a = new b() -> ba = new b()
泚ïŒãã®çœ®æã¯ãèšäºã§èª¬æãããŠãããã³ãã¬ãŒãæ€çŽ¢ã䜿çšããŠå®è¡ããããšãã§ããŸãã
NRefactoryã䜿çšããŠCsharpã³ãŒããåæãã
- åŒã1ã€ãããªãäžæ¬åŒ§ãåé€ãã
if (a) { b; } => if (a) b;
ïŒif (a) { b; } => if (a) b;
if (a) { b; } => if (a) b;
- ããŒã«åã䜿çšããæ¯èŒã¬ã³ãŒãã®åæžïŒ
if (a == true) => if (a); if (a == false) => if (!a)
if (a == true) => if (a); if (a == false) => if (!a)
- ãªãŒãžã§ã³ãšã³ã¡ã³ãã®åé€ã
空çœãšæ¹è¡ã®åé€
ããããçš®é¡ã®çž®å°ãè¡ãããåŸãäžèŠãªç©ºçœãšç¿»èš³ã®ã¿ãã³ãŒãããåé€ããè¡ã®é·ããç¹å®ã®å€ãè¶ ããªãããã«ããŸãïŒçŸããã®ããïŒã
ãããã¡ã€ã€ã¯å¥ã®ãããžã§ã¯ãã§å®è£ ãããŠããã CSharp-MinifierããããŠã³ããŒãã§ããŸãã ããã¯ãäž»ã«ã¯ã€ã³ã®ã³ãŒããæžããããšãç®çãšããŠéçºããããããå°ãå¥åŠãªæ©èœãåããŠãããšããäºå®ã«ã¯é©ãã¹ãããšã¯ãããŸããã ããããç§ã¯ããªãã®ã³ã¡ã³ãããã³/ãŸãã¯ãã«ã¯ãšã¹ããåãã§åãå ¥ããŸãã
ã³ãŒãã®ãã©ãŒããã
ãã®æ®µéã§ãçž®å°ãããã³ãŒããããçš®ã®ç»åã®ããã«èŠããããšãã§ããŸãã çæãããã³ãŒãã¯åºæ¬çã«åäžã®æåã®é åã§ããããïŒç Žæããå¯èœæ§ãããããïŒãç»åã®äœæã容æã«ãªãããããã©ãŒãããã¯çž®å°åŸã«æ£ç¢ºã«è¡ãããŸãã ã·ã³ãã«ãçœããã¯ã»ã«ãè¡šããé»-ãã®äžåšãè¡šãããã«ãç»åã¯çœé»åœ¢åŒã®ã¿ã«ããå¿ èŠããããŸãã ããäžèŽãããã«ã¯ãä»»æã®ãã¥ãŒãªã¹ãã£ãã¯ãœãŒãã¢ã«ãŽãªãºã ïŒéºäŒçïŒã䜿çšã§ããŸãã ç§ã®ãã©ãŒãããã¯å®è£ ãããŠããŸããã
ã¯ã€ã³ãžã§ãã¬ãŒã·ã§ã³
次ã¯ãæçµçãªè¡ãå°å·ããããŒã«ãŒãšããŠäœ¿çšãããŸããã/ * @ * /
段éçã«ããã¹ãŠã¯æ¬¡ã®ããã«ãªããŸãã ãã¹ãŠã®ã³ãŒãã¯å®å šã«ä»»æã§ãããäŸã§ã¯èªã¿ãããããããã«æ¹è¡ãè¿œå ãããŠããŸãã
- ãã³ãã¬ãŒãã®åæåïŒ
ãã³ãã¬ãŒã=
class P { static void Main() { var a = 6; /*@*/ int b = 10; } }
- ã¯ã€ã³ã®å°å·ã«äœ¿çšããæååãã³ãã¬ãŒããçæããŸãã åŒçšç¬Šãããã¯ã¹ã©ãã·ã¥ãããã³æ¹è¡ã¯ããã©ãŒããããããæååã衚瀺ãããšãã«åå¥ã®ãã©ã¡ãŒã¿ãŒã§è¡šãããããã«ãšã¹ã±ãŒãããå¿
èŠããããŸãã
kernel ="var s = {1}{0}{1}; System.Console.Write(s,s,'{1}','{2}{2}',{1}{2}r{2}n{1});"
- ãã³ãã¬ãŒãå
ã®ããŒã«ãŒããåã®æé ã®å°å·ã«äœ¿çšããè¡ã«çœ®ãæããŸãã ãªããªã CïŒã§ã¯ããã©ã¡ãŒã¿ãŒã®åºåæã«äžæ¬åŒ§ã䜿çšãããŸããããšã¹ã±ãŒãããå¿
èŠããããŸãã ããã¯ãããããè€è£œããããšã«ãã£ãŠè¡ãããŸãã
str =template.Replace("{", "{{").Replace("}", "}}").Replace("/*@*/", kernel)
str =
class P {{ static void Main() {{ var a = 6; var s = {1}{0}{1}; System.Console.Write(s,s,'{1}','{2}{2}',{1}{2}r{2}n{1}); int b = 10; }} }}
- ã¯ã€ã³ã®å°å·ã«äœ¿çšãããçµææååã®çæïŒ
insertToResult ="var s=\"" + str + "\""
insertToResult =
var s=" class P {{ static void Main() {{ int a=6; var s={1}{0}{1}; Console.Write(s,s,'{1}','{2}{2}',{1}{2}r{2}n{1}); int b=10; }} }}"; Console.Write(s,s,'"', '\\', "\r\n");
- ãœãŒã¹ãã³ãã¬ãŒãã®ããŒã«ãŒãçµæã®æååã«çœ®ãæããŸãã
result =template.Replace("/*@*/", insertToResult)
çµæ=
using System; class c { static void Main() { int a=6; var s="using System;class c{{static void Main(){{int a=6;var s={1}{0}{1};Console.Write(s,s,'{1}','{2}{2}',{1}{2}r{2}n{1});int b=10;}}}}"; Console.Write(s,s,'"', '\\', "\r\n"); int b=10; } }
å®äºïŒèªåèªèº«ãå°å·ã§ããããã°ã©ã ãåä¿¡ãããŸããã
説æããã¢ãããŒãã¯ãããªã³ãããŒã ããŒã®çæã«äžè¬åã§ããŸããããŸã å®è£ ããŠããŸããã
æã¡äžã
çæãããã¯ã€ã³ã¯ãããšãã°Asciimation.csãã¡ã€ã«ã«ä¿åããã次ã®ã³ãã³ãã§1ã€ã®ãã¬ãŒã ãåºåã§ããŸãã
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe" Asciimation.cs && (Asciimation > Asciimation.cs) && Asciimation
çæããããæ ç»ãå šäœãèŠãã«ã¯ã次ã®ã¹ã¯ãªããã䜿çšããå¿ èŠããããŸãã
echo off SET /ai=0 :LOOP IF %i%==3591 GOTO END "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe" Asciimation.cs && (Asciimation > Asciimation.cs) && Asciimation SET /ai=%i%+1 GOTO LOOP :END pause
ãããã«
ãã®èšäºã§èª¬æãããŠããååã¯ãä»ã®ããã°ã©ãã³ã°èšèªã§ã®ããŸããŸãªã¯ã€ã³ã®å®è£ ã«é©çšã§ããŸãã æ®å¿µãªããããªã³ã©ã€ã³ãµãŒãã¹ïŒ ideone.com ã compileonline ïŒã䜿çšãããšãå§çž®ãããŠããã«ããããããæ倧ãµã€ãºãè¶ ããŠãããããéçºãããã³ãŒãããã¹ãããããšã¯ã§ããŸããã
çæããããã¡ã€ã«ãšããããã¡ã€ã«ã¯ã AscimationQuine_1_3.7zããããŠã³ããŒãã§ããŸãã å°æ¥çã«ã¯ãæåã§ã ãã§ãªãèªåçæã䜿çšããŠããã§ãŒã³ãŠã§ã€ã³ãå®è¡ããããããé è€è£ä»ã®åæ¥ãç¹°ãè¿ãããšãã§ããŸãã
ç¹ã«ãã³ã³ãã€ã«ããèœåã¯ãªãããããã»ã¹ã確èªãããå ŽåïŒ