public int minimumOperations(int[] nums, int start, int goal) {
        int n = nums.length;
        List<Operator> opList = new ArrayList<>();
        opList.add((a, b) -> {
            return a - b;
        });
        opList.add((a, b) -> {
            return a + b;
        });
        opList.add((a, b) -> {
            return a ^ b;
        });
        boolean[] marked = new boolean[1001];
        Queue<long[]> q = new LinkedList<>();
        q.add(new long[]{start, 0});
        marked[start] = true;
        while (!q.isEmpty()) {
            long[] poll = q.poll();
            for (int num : nums) {
                for (Operator operator : opList) {
                    long nx = operator.op(poll[0], num);
                    if (nx == goal) {
                        return (int)poll[1] + 1;
                    }
                    if (0 <= nx && nx <= 1000 && !marked[(int)nx]) {
                        marked[(int)nx] = true;
                        q.add(new long[]{nx, poll[1] + 1});
                    }
                }
            }

        }
        return -1;
    }
    public interface Operator {
        long op(long a, long b);
    }