חידת C

slallum

New member
יש לי רעיון מצויין =]

אפשר להשאיר את התוכנית ריקה. אין שומדבר בתוכנית, ככה שלא צריך להיות כתוב שומדבר בפלט. :) טכנית זה נכון, לא?
 
אני יודע שזה ישמע מטומטם, אבל לדעתי

זה בלתי אפשרי! אין לי בדיוק הוכחה לכך, ואולי בגלל שאמרת שיש לך פיתרון אז באמת יש פיתרון, אבל אני אנסה לעשות לעצמי פדיחא ו"להסביר" למה לדעתי אין פיתרון. נניח שאנחנו עוסקים בשפת פסקל, ויש לך את הפקודה הבאה:
writeLn(a);​
זוהי פקודה, שחוץ מזה שהיא מתפקדת בתוכנית אתה גם צריך להדפיס אותה. נניח שניקח מחרוזת כדי להדפיס אותה(אני לא מראה את ההצהרה על המחרוזת, אבל נניח שההצהרה עליה קיימת[וגם אותה צריך להדפיס
]):
s:="writeLn(a);"​
(אגב אני לא זוכר אם בפסקל צריך " או ', אבל זה לא משנה..). ברגע שיש לך מחרוזת כזו, היא חלק מהתוכנית. זאת אומרת, היא מדפיסה פקודה מן התוכנית, וגם כאן(
), ההשמה של הטקסט בתוך המחרוזת הופכת להיות חלק מהתוכנית, וגם אותה צריך להדפיס
אז לדוגמא הקטע הבא של התוכנית יהיה:
s2:="s:="writeLn(a);"";​
ו, כאמור, גם הפקודה הזו היא חלק מהתוכנית ואז גם אותה צריך להדפיס. כאן אתה בעצם נכנס למין רקורסיה מטורפת, ולפי ה"היגיון הבריא שלי
" אין דרך לעשות זאת, אלא מקריאה ממקור חיצוני, או פקודה שמדפיסה את התוכנית, שזה כמובן לא פיתרון. מקווה שהסברתי את עצמי טוב
 

inbal76

New member
הכל נכון, אבל יש דרכים לעקוף את זה

הכל תלוי בתחביר של השפה. מצאתי עכשיו את התוכנית ב-C שזכרתי שראיתי, והיא נחמדה.
 
אפשר אותה? זאת אומרת אני דבק בדעה ש

שלי, ובגלל זה אני צריך משהו כדי שיראה לי איך "עוקפים" את זה. מה זאת אומרת לעקוף את זה? ותלוי בתחביר של השפה?
 

inbal76

New member
תראה, אני לא יודעת איך זה בפסקל

בכל אופן ב-C, פקודת הדפסה של מחרוזת נראית למשל כך:
printf("Hello Everyone!");​
ואם רוצים שהמחרוזת תכלול משתנים, אז עושים זאת למשל כך:
char str[] = "inbal"; printf("Hello %s", str);​
זה ידפיס Hello inbal ה-s% אומר שכאן יבוא ערך של משתנה מסוג מחרוזת, ואחרי המחרוזת מציינים מהו המשתנה. אפשר כמובן יותר ממשתנה אחד במחרוזת, ואפשר גם משתנים מסוג "תו" ע"י c% או מסוג int ע"י d% וכן הלאה. עכשיו, בהסתמך על תחביר כזה, יש דרך לעקוף את הפרדוקס של "מחרוזת המכילה את עצמה". אתה מוזמן לנסות לחשוב איך, או מה המקביל של זה בפסקל, אם יש. אני לא חושבת שהייתי פותרת את זה בעצמי.
 
אפשר ככה

program WriteMySelf; var S:string; begin S:=' writeln('program WriteMySelf'); writeln('Var S:string'); writeln('begin'); writeln('S:='''); writeln(S); writeln(''';'); writeln(S); end. '; writeln('program WriteMySelf'); writeln('Var S:string'); writeln('begin'); writeln('S:='''); writeln(S); writeln(''';'); writeln(S) end.​
 
אני לא הרצתי את זה בעצמי, אבל

אני לא רואה סיבה שזה לא יעבוד, אולי רק אי אפשר להשים ככה מחרוזת למשתנה..אבל מקסימום לעשות את זה בלי שורות ולעשות write במקום writeln
 
אוך נו...

זה לא יעשה את זה בגלל הקטע של הגרשיים :\ - תחביר פסקלי..אבל בעקרון אפשר לעשות את זה בPHP כי גם " וגם ' משמעים לגרשיים...אז באותה צורה,
<?PHP $S=' echo "<"; echo "?PHP"; echo "$"; echo "S="; echo chr(39); echo $S; echo chr(39); echo ";"; echo $S; echo "?"; echo ">"; '; echo "<"; echo "?PHP"; echo "$"; echo "S="; echo chr(39); echo $S; echo chr(39); echo ";"; echo $S; echo "?"; echo ">"; ?>​
 

Tesseract

New member
לא עובד

לפחות לא בטורבו פסקל (אבל אני די בטוח שגם בכל קופמיילר אחר). בעיקר בגלל חריגת שורות, אבל גם יש עוד סיבות שאני אשאיר לכותב לעלות עליהן בעצמו..
 

עריסטו

Active member
בחר מהאתר הבא

את הפתרון המוצא חן בעיניך... http://www.nyx.net/~gthompso/self_pasc.txt
 
למעלה