287. Writing a Quine

אחד הקונספטים המעניינים שיש בתכנות הוא כתיבת תוכנה המדפיסה את עצמה למסך.

לקונספט הזה קוראים Quine.

לפני שאתם קופצים וחושבים לעצמכם שהדבר בלתי אפשרי, תחשבו שוב: ברור שאפשר לכתוב תוכנה שקוראת את הקובץ קוד שלה, ומדפיסה אותו.

אבל טיפה יותר מפתיע היא העובדה שניתן לכתוב תוכנה שעושה זאת בלי לקרוא את עצמה.

איך זה נראה? משהו כזה:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
namespace Quine
{
public class Program
{
private const string PROGRAM =
@"using System;
namespace Quine
{
public class Program
{
private const string PROGRAM =
@""#"";
private static void Main(string[] args)
{
string[] programLines =
PROGRAM.Split(new[] {Environment.NewLine},
StringSplitOptions.None);
foreach (string line in programLines)
{
string lineToPrint = line;
if (line.Contains(@""@""""#""""""))
{
string programConstant =
PROGRAM.Replace(@"""""""", @"""""""""""");
lineToPrint =
lineToPrint.Replace(""#"", programConstant);
}
Console.WriteLine(lineToPrint);
}
}
}
}";
private static void Main(string[] args)
{
string[] programLines =
PROGRAM.Split(new[] {Environment.NewLine},
StringSplitOptions.None);
foreach (string line in programLines)
{
string lineToPrint = line;
if (line.Contains(@"@""#"""))
{
string programConstant =
PROGRAM.Replace(@"""", @"""""");
lineToPrint =
lineToPrint.Replace("#", programConstant);
}
Console.WriteLine(lineToPrint);
}
}
}
}

אם תפעילו את התוכנה הזו, היא תדפיס למסך את עצמה 😃

מה הקסם? התוכנה מכילה את עצמה, אלא שבקבוע המייצג אותה, היא אינה יכולה להכיל את הקבוע שוב (שהרי אז תהיה רקורסיה אינסופית)

במקום זאת, בקבוע המכיל את התוכנה, מיוצג הקבוע כזקיף #, ובהדפסה הוא מוחלף בייצוג הטקסטואלי של התוכנה…

תכלס זה רעיון ממש נחמד וממש נחמד להבין למה זה עובד..

המשך יום רקורסיבי טוב!

שתף