• # J'ai galéré :)

    Posté par . En réponse au message Avent du code jour 25. Évalué à 2. Dernière modification le 25 décembre 2022 à 11:52.

    Environ 2h40 pour faire ce fichu dernier problème. Je genre d'éxercice, ce n'est vraiment pas mon truc.

    J'y suis allé à la méthode ajustement test unitaire.

    Le parsing est assez simple à réaliser. En gros, c'est comme une conversion d'une base 5 avec des -1 , et -2 :)

    Le problème, c'est l'opération inverse. Mon algo est tellement tordu que je n'arrive pas à l'expliquer :)
    Je n'ai même pas l'excuse de l'alcool car je suis sous antibiotique. Résultat, c'est mon premier noël sans une goutte d'alcool.

    Joyeux noël à tous.

     static String toSnafu(long v) {
     String s =Long.toString(v, 5);
     if(s.indexOf("3") < 0 && s.indexOf("4") < 0) {
     return s;
     }
     long[] seek = prepareSeek(v);
     long seekValue = seek[0] * ((long)Math.pow(5, seek.length-1));
     for(int x=1;x < seek.length;x++) {
     long lowestGreater = 2;
     for(int e=VALUES.length-1;e >= 0;e--) {
     long add = VALUES[e] * ((long)Math.pow(5, seek.length-1-x));
     long s1 = seekValue + add + maxWithOnly2(seek.length-1-x) ;
     long s2 = v;
     if(s1 < s2) { 
     break;
     }
     lowestGreater = VALUES[e];
     }
     seek[x] = lowestGreater;
     //System.out.println(Arrays.stream(seek).mapToObj(i->Long.toString(i)).collect(Collectors.joining(",")));
     long add = lowestGreater * ((long)Math.pow(5, seek.length-1-x));
     seekValue += add;
     }
     return seekToString(seek);
     }
     private static String seekToString(long[] seek) {
     StringBuilder sb = new StringBuilder();
     for(int x=0;x < seek.length;x++) {
     if(seek[x] == 0 && x == 0) {
     continue;
     }
     if(seek[x] == -2) {
     sb.append('=');
     } else if(seek[x] == -1) {
     sb.append('-');
     } else {
     sb.append(Long.valueOf(seek[x]));
     }
     }
     return sb.toString();
     }
     static long[] prepareSeek(long v) {
     if(v == 0) {
     return new long[] {0};
     }
     long power = 0;
     boolean greater = false;
     long greaterNb = 0;
     while(! greater) {
     long max = maxWithOnly2(power);
     for(long x=1; x <= 2;x++) {
     long l = (x* ((long)Math.pow(5, power))) +max ;
     if(l >= v) {
     greater =true;
     greaterNb = x;
     break;
     }
     }
     power += 1;
     }
     long[] mask = new long[(int)power];
     mask[0]=greaterNb;
     return mask;
     }
     private static long maxWithOnly2(long power) {
     long max = 0;
     for(int j=0; j < power;j++) {
     max += 2* Math.pow(5, j);
     }
     return max;
     }