في المغامرات السابقة لسلسلة مدونات Quine، اكتشفنا كيفية كتابة Quines وIntrons الخاصة بنا. سنرى اليوم ما هي QuineRelays وكيف يمكنك الاستفادة من الإنترونات في إنشائها.
تخيل دائرة من البرامج، كل منها مكتوب بلغة مختلفة. كل برنامج في هذه الدائرة له غرض واحد: طباعة الكود المصدري للبرنامج التالي في التسلسل. يقوم البرنامج الأخير بعد ذلك بإغلاق الحلقة عن طريق طباعة الكود المصدري للبرنامج الأول.
في الأساس، QuineRelays عبارة عن مجموعة من البرامج بعدد n من اللغات المختلفة مثل:
دعونا نرى بعض الأمثلة لفهم المفهوم بشكل أفضل.
يتميز QuineRelay من الدرجة الثانية ببرنامج JavaScript الذي يطبع برنامج Python، والذي يقوم بعد ذلك بطباعة برنامج JavaScript الأصلي مرة أخرى. إنه ثنائي ديناميكي للتكرار الذاتي.
جافا سكريبت → بايثون ⥀
جافا سكريبت: جربه عبر الإنترنت!
console.log((q=_=>`print(${JSON.stringify(`console.log((q=${q []})())`)})`)())
بايثون: جربه عبر الإنترنت!
print("console.log((q=_=>`print(${JSON.stringify(`console.log((q=${q []})())`)})`)())")
تصبح الأمور أكثر إثارة للاهتمام مع QuineRelay من الدرجة الثالثة. يبدأ هذا ببرنامج هاسكل، الذي يُخرج برنامج بايثون، الذي يُخرج برنامج روبي، وأخيرًا، يعود برنامج روبي إلى برنامج هاسكل الأصلي.
هاسكل → بايثون2 → روبي ⥀
هاسكل: جربه عبر الإنترنت!
q a b c=putStrLn $ b [toEnum 10,'q','('] show b [','] show c [','] show a [')'] main=q "q a b c=putStrLn $ b [toEnum 10,'q','('] show b [','] show c [','] show a [')']" "def q(a,b,c):print b chr(10) 'q(' repr(b) ',' repr(c) ',' repr(a) ')'" "def e(x) return 34.chr x 34.chr end;def q(a,b,c) print b 10.chr 'main=q ' e(b) ' ' e(c) ' ' e(a) ' ' 10.chr end"
Python2: جربه عبر الإنترنت!
def q(a,b,c):print b chr(10) 'q(' repr(b) ',' repr(c) ',' repr(a) ')' q("def q(a,b,c):print b chr(10) 'q(' repr(b) ',' repr(c) ',' repr(a) ')'","def e(x) return 34.chr x 34.chr end;def q(a,b,c) print b 10.chr 'main=q ' e(b) ' ' e(c) ' ' e(a) ' ' 10.chr end","q a b c=putStrLn $ b [toEnum 10,'q','('] show b [','] show c [','] show a [')']")
روبي: جربه عبر الإنترنت!
def e(x) return 34.chr x 34.chr end;def q(a,b,c) print b 10.chr 'main=q ' e(b) ' ' e(c) ' ' e(a) ' ' 10.chr end q("def e(x) return 34.chr x 34.chr end;def q(a,b,c) print b 10.chr 'main=q ' e(b) ' ' e(c) ' ' e(a) ' ' 10.chr end","q a b c=putStrLn $ b [toEnum 10,'q','('] show b [','] show c [','] show a [')']","def q(a,b,c):print b chr(10) 'q(' repr(b) ',' repr(c) ',' repr(a) ')'")
إليك QuineRelay من الدرجة الرابعة: Ruby → Java → C# → Python ⥀
جيثب
هناك العديد من الرموز المشتركة عبر الثقافات. إحداها هي Ouroboros، التي لها مراجع في الأساطير المصرية واليونانية والرومانية والهندوسية والسيبيرية والإسكندنافية والإفريقية وأمريكا الجنوبية. Ouroboros هو رمز قديم يصور ثعبانًا أو تنينًا يلتهم ذيله، وهو ما يمثل الدورة الأبدية للخلق والدمار.
في الأساطير الإسكندنافية، يورمونجاندر هو ثعبان ضخم، وهو الابن الأوسط للوكي والعملاقة أنجربوا. ألقى أودين يورمونجاندر في المحيط المحيط بمدجارد (عالم البشر)، حيث نما الثعبان بشكل هائل لدرجة أنه طوق العالم وأمسك بذيله. نتيجة لمحيط مدكارد (الأرض) يشار إليه باسم الثعبان العالمي - أوروبوروس. يعد إطلاق يورمونجاندر لذيله إحدى علامات بداية راجناروك (المعركة الأخيرة في العالم).
تجسد مرحلات Quine هذه الرمزية بدقة تامة، حيث أن كل برنامج في الدورة يؤدي إلى البرنامج التالي، فقط ليولد من جديد في النهاية، ومن ثم يطلق عليه اسم برامج Ouroboros.
التمسكوا بمقاعدكم. إليكم الرتبة 128 من Ouroboros QuineRelay. نعم، لقد قرأت ذلك بشكل صحيح. 128 !!!
روبي → روست → سكالا → ... (120 آخرين) ... → بايثون → R → راتفور → RC → REXX ⥀
جيثب
كما لو لم يكن هذا مثيرًا للإعجاب بدرجة كافية، فهو يتضمن بيضة عيد الفصح. يحتوي رمز روبي الأصلي عند تصغيره على تنين Ouroboros!
لنبدأ إنترون بايثون الذي كتبناه سابقًا ونحاول تحويله إلى QuineRelay من الدرجة الثانية.
بايثون إنترون: جربه عبر الإنترنت!
intron = 'wubbalubbadubdub' data = "print('intron =', repr(intron)); print('data =', repr(data)); print(data)" print('intron =', repr(intron)); print('data =', repr(data)); print(data)
باستخدام سحر الإنترونات، يمكننا الآن بسهولة وضع جزء الكود من شقيق كواين الذي يتحدث لغة مختلفة في الإنترون. إنتاج برنامج على شكل:
بايثون:
intron = "code part of sibling" data = "code part of self" print('intron =', repr(intron)); print('data =', repr(data)); print(data)
نظرًا لأن كل متغير يعمل فقط كـ بيانات لكوين مختلف. دعونا نعيد تسمية البيانات والإنترون إلى d1 وd2 على التوالي.
بايثون:
d1 = "code part of self" d2 = "code part of sibling" print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d1)
الآن، يعمل d2 بمثابة إنترون، لكن البرنامج أعلاه لا يزال يحاول طباعة جزء من الكود ذاتيًا. لجعله يطبع المصدر التالي، فلنطبع (d2) بدلاً من print(d1) في النهاية.
بايثون:
d1 = "code part of self" d2 = "code part of sibling" print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)
نحن نعلم بالفعل أن محتويات d1 هي مجرد نسخة من السطر 3. ولكن ليس لدينا محتويات d2 بعد.
لنفترض أننا أردنا إنشاء QuineRelay باستخدام JavaScript. دعونا نكتب إنترون مماثل في JS.
جافا سكريبت:
d1 = "code part of sibling" d2 = "code part of self" console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1);
الآن، السطر 3 من إنترون JS أعلاه، هو كود لبرنامج الأخوة الذي أردناه!
قم بلصق كود بعضهم البعض كإنترونات في الآخر.
ملحوظة. نحتاج إلى إضافة d1 '' في js لتجنب بعض حالات عدم تطابق الاقتباس
d1 = "print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)" d2 = "console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1 '');" print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)جافا سكريبت: جربه عبر الإنترنت!
d1 = "print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)" d2 = "console.log(`d1 = ${JSON.stringify(d1)}`); console.log(`d2 = ${JSON.stringify(d2)}`); console.log(d1 '');" print('d1 =', repr(d1)); print('d2 =', repr(d2)); print(d2)ها أنت ذا. إنه أمر QuineRelay الثاني المناسب! برنامج بايثون، الذي يطبع برنامج جافا سكريبت، الذي يطبع برنامج بايثون الأصلي مرة أخرى في دورة.
في جوهره، يعد ترحيل الترتيب nth لعبة من الطرق الذكية للهروب من علامات الاقتباس عبر لغات البرمجة n.ترقبوا المنشور التالي على MultiQuine!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3