تحدي برمجي[003][سهل]: كيف تجد الروبوت

  • afaki

هناك روبوت في المستوى الإحداثي الديكارتي يقف عند النقطة (0,0)

اذا علمت ان الروبوت سيتحرك عدد N حركة

في الحركة رقم 1 يتحرك وحدة واحدة إلى اليمين موقعه الجديد هو (1,0)

في الحركة رقم 2 يتحرك وحدتين إلى الأعلى موقعه الجديد هو (1,2)

في الحركة رقم 3 يتحرك ثلاث وحدات إلى اليسار موقعه الجديد هو (-2,2)

في الحركة رقم 4 يتحرك أربع وحدات إلى الأسفل موقعه الجديد هو (-2,-2)

في الحركة رقم 5 يتحرك خمس وحدات إلى اليمين موقعه الجديد هو (3,-2)

وهكذا...

قم بإيجاد موقع الروبوت بعد N حركة

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

assassinateur أضف ردا

يمكن القيام عبر تفقد هل يقبل القسمة على إثنان وإن كان كذلك هل يقبل القسمة على 4 ومن ثم حساب الاحداثيات

هذه دالة للقيام بالأمر

(بالمناسبة أنت قمت بقلب كتابتك للإحداثيات بالنسبة ل3 و5 فالمفترض العكس)

function  robot(num) {
  if(num % 2 === 0) {
    if (num % 4 === 0) {
      x = num / 2 * -1
      y = num / 2 * -1
    }
    else {
      x = num / 2
      y = num / 2 + 1
    }
  }
  else {
    if (num % 4 === 1) {
      x = Math.ceil(num / 2)
      y = Math.ceil(num / 2 * -1)
    }
    else {
      x = Math.floor(num / 2 * -1)
      y = Math.ceil(num / 2)
    }
  }
  return "for N = " + num + " position is: (" + x + "," + y + ")"
}

مثال حي

assassinateur أضف ردا

رسم بالجافاكسربت يوضع المسار المتبع ورقم المرحلة عند كل محطة

رسم جميل لتتبع المسار، قمت بتعديل بسيط لطابعة الإحداثيات لإستنباط أسهل لخوارزمية الحل

تحسين على الفكرة:

تحتاج لحساب باقي القسمة على الاربعة فقط.

تطبيق:

حل جميل و الاجمل هو ان ال Complexity هي constant يعني O(1)

حلي يعمل في O(n) :3

هل يمكن من فضلك توضيح هذا الحل فلا يبدو لي مسلما

يبدو أنك استعنت بحساب رياضي

هناك نوعان من الحلول

إما أن تأخذ رقما N

تبدأ من الصفر، تقوم بحساب مكانه كل مرة ثم تزيد الرقم وهذا الحل سيستهلك الذاكرة لو كان الرقم كبيرا

أو تقوم بملاحظة النمط الذي تتبعه الأرقام، فتلاحظ أن كل رقم يتخذ مكان معين

مثلا إذا كان الرقم زوجيا، ويقبل القسمة على 4 (4، 8، 12، 16...) فسيكون مكانه في الجهة السالبة تماما وتكون إحداثياته هي نصف قيمته

لأستنتج النمط، قمت برسم المسار في ورقة ومددت الرسم إلى المرحلة ال17، ولاحظت نمطا واضحا يتكرر كل 4 مرات، ومنه استخرجت الخوارزمية

هذا الكود يقوم برسم المسار الذي يتبعه الروبوت ومنه تلاحظ النمط

الأمر وكأنه متتالية أو متسلسلة.

اتجاه حركات الروبوت هي على التوالي: (يمين، أعلى، يسار ثمّ أسفل)

وفي كل حركة تزيد أو تنقص قيمة أحد الإحداثيين بمقدار واحد بينما تبقى قيمة الإحداثي الآخر كما هي، هذه العملية تحدث بالتبادل حسب اتجاه الروبوت.

ذكرتني ببرنامج ++TurboC المتخصص في الرسم بالحاسوب

سأحاول أن أقوم بتنفيذه

في الحّركة رقم 6 تَحرك ست وحدات إلى الأعلى موقعه الجديد هو (4,3)

سؤال ما علاقة هذا بالبرمجة ؟

المطلوب هو ان تكتب كود يجد الروبوت بعد اي عدد تطلبه مثلا N = 1000

السؤال يقبع برائحة الواجب الدراسي

الأصح هو أن تقول يعبق وليس يقبع ^_^

العطلة الصيفية لم تنتهي بالإضافة إنني ما زلت في الثانوية ومن المستحيل أن تجد أسئلة مثل هذه في كتاب للمدارس الثانوية(على الأقل هنا في بلدي)

حلى

لا اعلم ولكني متاكد ان هناك حل رياضي اسهل

ساذهب للتجول خارجا ربما اتذكر الحل

agashe أضف ردا

كود على السريع مكتوب بواسطة QBasic

Dim x, y, i, dir, moves As Integer

print "Enter the number of moves :"

input moves

 dir = 0

x = 0

y = 0

For i = 1 To Int(Abs(moves))

dir = dir + 1
Select Case dir
    Case 1
        x = x + i
    Case 2
        y = y + i
    Case 3
        x = x - i
    Case 4
        y = y - i
        dir = 1
    End Select

Next i

Print "the robot position is :"

Print "X:"; x

Print "Y:"; y

و هذه صورة من قلب الحدث

tundev أضف ردا

 

  public class Robot {
        private int x ;
        private int y ;

    public Robot (){
        x = 0; 
        y = 0;
        }

    public void moveX(int x){
        this.x += x ;
        }
    public void moveY(int y){
        this.y += y ;
    }

    @Override
    public String toString() {
        return "POSITION : ["+x+","+y+"]";
    }


package robot;

import java.util.Scanner;

public class Main {


    private static Scanner scan;

    public static void main(String[] args) {

        scan = new Scanner(System.in);
        System.out.println("veuillez saisir un nombre ");
        int n  =scan.nextInt();
        Robot r = new Robot() ;
        for(int i = 1 ; i <= n ; i++ ){
            switch (i%4) {
            case 1:
                r.moveX(i);
                break;
            case 2:
                r.moveY(i);
                break;
            case 3:
                r.moveX(i*(-1) ); 
                break;
            case 4:
                r.moveY(i * (-1));
                break;


            }
            System.out.println("N = "+i + " "+r);


            }




    }

}


}

التنفيذ

veuillez saisir un nombre

5

N = 1 POSITION : [1,0]

N = 2 POSITION : [1,2]

N = 3 POSITION : [-2,2]

N = 4 POSITION : [-2,2]

N = 5 POSITION : [3,2]

oussama_oux أضف ردا

هذا حلي بإستخدام جافاسكريبت

و أضنها أسهل خوارزمية لأنني إستعملت بعض الحيل دون أن تصبح معقدة

تعطيه رقم N و يرجع لك الإحداثيات :

var a = prompt("Enter Number of N :"),
  i = 0,
  x = 0,
  y = 0;
function oux(a) {
  do {
    i++;
    if (i % 2 === 0) {
      x = x;
    } else if (i % 4 === 0 || (i + 1) % 4 === 0) {
      x = x - i;
    } else {
      x = x + i;
    }
    if (i % 2 !== 0) {
      y = y;
    } else if (i % 4 === 0 || (i + 1) % 4 === 0) {
      y = y - i;
    } else {
      y = y + i;
    }
  }
  while (i < a);
 return "for N= " + a + " : " + "( " + x + " , " + y + " )";
}
alert(oux(a));
thisisyusuf أضف ردا

شيء يشبه هذا

dim int as integer

for i = 1 to 1000

int += 1

if i mod 1 = 0 يمين
if i mod 2 = 0 أعلى
if i mod 3 = 0 يسار
if i mod 4 = 0 أسفل

int خطوة

next

هل عند أحد منكم فكرة أو خبرة حول روبوتات NXT وكيفية شرائها وكيفية برمجتها؟

@assassinateur @mustafaihssan @supercoder @ahmedsaoud31 @ahmedsaoud31 @afaki @agashe @ahmed issa @Zaineb_Mohammed @محمد عزيز الكناني @abderrahimdz24