انتشرت في الفترة الاخيرة اللغز الموجود في الصورة عن طريق وسائل التواصل الاجتماعي ، مع ان اللغز مستحيل الحل رياضياً بسبب وجود قاعدة تنص على “مجموع اعداد فردية لعدد فردي هو عدد فردي , ومجموع عدد زوجي لاعداد زوجية هو عدد زوجي” ولكن ساقوم بكتابة Class لإثبات ذلك ويمكن استخدامه في حل امثلة اخرى لنفس طريقة اللغز .

اولا يجب ان نعرف ان هذا النوع من الالغاز يمكن حله عن طريق التباديل مع السماح له بالتكرار “permutations with repetition” , فـ بالتالي قمت بكتابة كلاس يمكن استخدامه عن طريق استدعاء “getResult” وتمرير له القيم التالية:

numbers As Array – مصفوفة تحتوي على قائمة بالارقام المسموح استخدامها في حساب الناتج النهائي.
numberOfSpace As int – متغير رقمي وهو عدد الفراغات او عدد الارقام الممكن استخدامها في الحل.
target As int – متغيير رقمي يمثل الناتج النهائي المراد الوصول له.
اما القيمة المرتجعه من getResult فهي عبارة عن كائن “Object” من نوع ArrayList يحتوي على جميع الاحتمالات الصحيحة لحل اللغز .

public class MyClass {
    private static ArrayList<String> reslut;
    private int[] numbers;
    private int numberOfSpaces;
    private int target;
    public MyClass(){
        reslut=new ArrayList<String>();
    }
    public ArrayList<String> getResult(int target,int[] numbers , int numberOfSpaces){
        this.target=target;
        for (int i=0;i<numbers.length;i++)
            checkNumbers(numbers, numberOfSpaces, numbers[i] + "", 0);
        return reslut;

    }
    public  void checkNumbers(int[] numbers, int numberOfSpaces, String start,int count){
        if(count >= numberOfSpaces-1){
           if(checkTarget(start))
               reslut.add(start+"="+target);
        }else{
            for(int x : numbers)
                checkNumbers(numbers, numberOfSpaces, start+"+"+x,count+1);
        }
    }
    private  boolean checkTarget(String current){
        String[] numbers=current.split("\\+");
        int sum=0;
        for(String n : numbers)
            sum+=Integer.parseInt(n);
        return sum==target;
    }

طريقة استخدام الـ Class :

public static void main(String[] args) {
        MyClass m=new MyClass();
        ArrayList<String> results=m.getResult(30,new int[]{1,3,5,7,9,11,13,15},5);
        for(String r : results)
            System.out.println(r);
    }

بما ان اللغز لا حل له فإن البرنامج لان يطبع اي قيمة , ولكن عند تجربة القيم التالية:

ArrayList<String> results=m.getResult(5,new int[]{1,2},3);

Output:

run:
1+2+2=5
2+1+2=5
2+2+1=5