سؤال

حل المبتدئ لمشروع Euler #1

+/((0=3|1+i.1000-1) +. (0=5|1+i.1000-1)) * (1+i.1000-1)

أعلم أن هذا يمكن إعادة تمهيده ، وتحوله إلى وظيفة ، لا أعرف كيفية القيام بذلك ، وسأضطر إلى قراءة جميع المختبرات لتعلمها.

هل كانت مفيدة؟

المحلول

ليس من الضروري "التعامل مع الصفر" لأن إضافة الصفر لن يغير الإجابة حتى تتمكن فقط من استخدام i. لإنشاء قائمة الأرقام الخاصة بك أقل من 1000 ، على سبيل المثال:

   i. 10
0 1 2 3 4 5 6 7 8 9

يعمل J بشكل أفضل مع المصفوفات ، لذا يجب أن تكون قادرًا على طلب البقايا (|) من 3 و 5 في نفس الوقت ، يمكنك استخدام الرتبة (") للسيطرة على كيفية تغذية الحجج إلى البقايا:

   3 5 |"0 1 i. 10
0 1 2 0 1 2 0 1 2 0
0 1 2 3 4 0 1 2 3 4

ال |"0 1 يقول لإطعام الحجة اليسرى | AN-INTEM-A-A-A مع إطعام الحجج الصحيحة A-LINE-A-A-A-TIM. لأن الحجة الصحيحة تتكون فقط من سطر واحد ، يتم تغذيةها بشكل متكرر لكل من عناصر الحجة اليسرى.

الآن يمكننا أن نفعل 0= إلى المصفوفة بأكملها:

   0 = 3 5 |"0 1 i. 10
1 0 0 1 0 0 1 0 0 1
1 0 0 0 0 1 0 0 0 0

أدخل شرطًا أو شرطًا بين العنصرين (الخطوط) من المصفوفة:

  +./ 0 = 3 5 |"0 1 i. 10
1 0 0 1 0 1 1 0 0 1

احصل على فهرس كل 1 في القائمة/المتجه:

  I. +./ 0 = 3 5 |"0 1 i. 10
0 3 5 6 9

والمبلغ:

 +/ I. +./ 0 = 3 5 |"0 1 i. 10

23

يمكنك جعل هذه وظيفة/فعل صريح بسهولة إلى حد ما:

   euler1=: verb define
+/ I. +./ 0 = 3 5 |"0 1 i. y
)

أو بمجرد أن تحصل على تعليق Tacit J يمكنك تحديد:

   euler1=: +/@I.@(+./)@(0 = 3 5 |"0 1 i.)

نصائح أخرى

  • Refactor 0= (سوف يزيد من حجم البرنامج)

+/((3|1+i.1000-1)+.&(0=])5|1+i.1000-1)*1+i.1000-1

  • Refactor 1+i.1000-1

+/(((3|])+.&(0=[)5|])1+i.1000-1)*1+i.1000-1

  • Refactor 1+i.1000-1 تكرارا

+/(*(3|])+.&(0=[)5|])1+i.1000-1

الشيء الوحيد الذي لم أستطع إعادة تشكيله حتى الآن هو | المشغل أو العامل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top