NewbieContest

Challenges => Aide Programmation => Discussion démarrée par: pixis le 21 Décembre 2016 à 20:02:19



Titre: Prog - Longue vie au triangle !
Posté par: pixis le 21 Décembre 2016 à 20:02:19
Postez ici vos messages.


Titre: Re : Prog - Longue vie au triangle !
Posté par: jfcl1 le 20 Janvier 2017 à 10:00:48
Salut,
Je ne comprends pas l'exemple donné :
Exemple:
Chemin = SSSEEE
CRC = 0x181c307118953949

-> bb 57 50
16 bd f8 de
1a e3 0f 99
65 3b 38 []

pour SSSEEE, je trouve
crc64("0x161a653b38") => 0x3db12a93
ou
crc64("161a653b38") => 0xdd174280

Mais pas la valeur donnée en exemple ?
Où est l'erreur ?


Titre: Re : Prog - Longue vie au triangle !
Posté par: S0410N3 le 20 Janvier 2017 à 10:44:07
A vue de nez, on dirait bien que tu fais tourner le truc en php 32bits et non pas en 64 :)
De plus ça serait plutôt :

crc64(chr(0x16).chr(0x1a).chr(0x65).chr(0x3b).chr(0x38))

Je viens de vérifier ça donne bien 0x181c307118953949

Par contre exécuté sur du 32bits, ça donne : 0x2157eb17


Titre: Re : Prog - Longue vie au triangle !
Posté par: pixis le 20 Janvier 2017 à 11:27:47
Je confirme, l'erreur vient de ton côté.

Le fait de mettre cet exemple permet de lever les ambiguïtés sur le calcul du CRC afin d'être certain que tout le monde a la bonne fonction. Bon courage (que je m'auto-souhaite également, en passant)


Titre: Re : Prog - Longue vie au triangle !
Posté par: harvey le 23 Janvier 2017 à 21:27:19
À tout hasard, le code de la fonction utilisée est donné (https://www.newbiecontest.org/epreuves/prog/progcrc.php?s) par le script de l'épreuve (pas l'énoncé).
Elle est inspirée d'un commentaire sur une page du manuel php, qui en donne une version optimisée:
http://www.php.net/manual/fr/function.crc32.php#111699

Je n'ai pas été voir ce que ça donne sur une machine 32 bits, mais je suis d'accord avec S0410N3 que ça risque de ne pas trop marcher...
Voici une version en python qui fait la même chose, sans le souci de la taille des entiers:
Code:
def crc64(s):
    poly = 0xC96C5795D7870F42
    crc=0
    for c in map(ord,s):
        for b in range(8):
            if (crc^c) & 1:
                _poly = poly
            else:
                _poly = 0
            crc = (crc>>1) ^ _poly
            c >>= 1
    return crc


Titre: Re : Prog - Longue vie au triangle !
Posté par: harvey le 12 Mars 2017 à 20:41:57
Et comme j'ai donné cette indication en privé plusieurs fois je la redonne ici :
les tableaux sont générés entièrement au hasard.
Ça implique qu'il y a une probabilité (astronomiquement faible) que vous receviez un énoncé non-solvable. Vous aurez plus de chances de trouver une grille de loto gagnante en fouillant les poubelles de Pyongyang.


Titre: Re : Prog - Longue vie au triangle !
Posté par: dadacode le 24 Mai 2018 à 23:14:27
Pas évidente !
Je pensais juste essayer l'ensemble des parcours mais ca en fait beaucoup trop ...

je poste le code java pour la fonction CRC64

Code: (java)

private final static long poly = ((long) 0xC96C5795D7870F42L);

public long crc64(String string) {
long crc = 0;
for (int i = 0; i < string.length(); i++) {
long c = (int) string.charAt(i);
for (long bit = 0; bit < 8; bit++) {
if (((crc ^ c) & 0x0000000000000001L) == 1)
crc = (crc >>> 1 & 0xFFFFFFFFFFFFFFFFL) ^ poly & 0xFFFFFFFFFFFFFFFFL;
else
crc = (crc >>> 1 & 0xFFFFFFFFFFFFFFFFL);

c = (c >>> 1) & 0xFFFFFFFFFFFFFFFFL;
}
}
return crc;
}


Titre: Re : Prog - Longue vie au triangle !
Posté par: sirk390 le 09 Décembre 2018 à 21:55:52
Le CRC n'est pas tout à fait standard d'après ce que j'ai compris.
Il s'agirait d'une variante de CRC64-ECMA-182 avec "reflected bytes" et "reflected output" mais sans initilisation ou xor final à 0xffffffffffffffff

Il faudrait lui donner les paramètres suivants dans le catalogue ici: http://reveng.sourceforge.net/crc-catalogue/17plus.htm#crc.cat-bits.64:
   width=64 poly=0x42f0e1eba9ea3693 init=0x0000000000000000 refin=true refout=true xorout=0x0000000000000000 check=0x2b9c7ee4e2780c8a residue=0x0000000000000000



Titre: Re : Prog - Longue vie au triangle !
Posté par: darkanonymous le 13 Avril 2019 à 13:35:32
Hello,

J'ai le même souci, le CRC donné en exemple ne me donne pas la même valeur avec la chaine d'entrée

Code PHP
Code:
function crc64($string)
{
    $poly = (0xC96C5795 << 32) | 0xD7870F42;
    $crc = 0;
    for($i=0;$i<strlen($string);$i++)
    {
        $byte = ord($string[$i]);
        for($bit=0;$bit<8;$bit++,$byte>>=1)
        {
            $crc = (($crc>>1)& ~(1<<63)) ^ ((($crc^$byte)&1)?$poly:0);
        }
    }
    return $crc;
}

Code C
Code:
unsigned long long int crc64( const char* s )
{
    unsigned long long int poly = 0xc96c5795d7870f42ULL;//(0xC96C5795ULL << 32) | 0xD7870F42ULL;
    unsigned long long int crc  = 0;
    for ( size_t i=0 ; i< strlen(s) ; i++ )
    {
        unsigned long long int byte = s[i];
        for ( size_t bit=0 ; bit<8 ; bit++, byte>>=1 )
            crc = ((crc>>1) & 0x7fffffffffffffffULL) ^ ( ((crc^byte)&1)?poly:0 );
    }
    return crc;
}


Code:
int main()
{
    printf("\n CRC = %016llx", crc64("161a653b38"));
    return 0;
}

Néanmoins la fonction C me retourne CRC = 0x46c4478f73cd3b20 au lieu de 0x181c307118953949.
Comprends pas =(


Titre: Re : Prog - Longue vie au triangle !
Posté par: harvey le 18 Avril 2019 à 15:48:37
Les deux codes sont bons, mais tu as donné la représentation hexadécimale en entrée à la fonction C.

Le calcul doit se faire sur les octets (donc crc64("\x16\x1a\x65\x3b\x38") ou utiliser une fonction pour la conversion).


Titre: Re : Prog - Longue vie au triangle !
Posté par: darkanonymous le 18 Avril 2019 à 21:14:31
AHAHAHA,

Merci =)
J'ai trop le seum xD
Reste plus qu'à !


Titre: Re : Prog - Longue vie au triangle !
Posté par: harvey le 21 Avril 2019 à 22:52:07
De rien, bon courage !
Et maintenant que j'y pense, à cause de strlen la fonction va donner un mauvais résultat si l'entrée contient un octet nul...


Titre: Re : Prog - Longue vie au triangle !
Posté par: dsancho le 13 Septembre 2019 à 08:35:37
Bonjour,

Je suis un peu sec sur cette épreuve qui me turlupine. "Longue vie au triangle"... de pascal ?
Un petit indice svp ?

Merci !


Titre: Re : Prog - Longue vie au triangle !
Posté par: sirk390 le 18 Septembre 2019 à 22:08:16
Salut dsancho, passe plutôt sur discord, comme ça tu peux expliquer à quelqu'un ce que tu as déjà essayé.
Sache que c'est une des épreuves les plus difficile du site, donc c'est normal si tu bloques pendant des jours ou même des semaines...


Titre: Re : Prog - Longue vie au triangle !
Posté par: dsancho le 19 Septembre 2019 à 09:51:31
Ok. Je vais faire un tour sur discord !
Merci


Titre: Re : Prog - Longue vie au triangle !
Posté par: redroot le 23 Janvier 2022 à 17:14:51
Bonjour à tous,

ça fait 2 jours que je me casse la tête sur cette épreuve.
Pour savoir dans quelle direction aller, j'ai une question.

Est-ce que je doit (A) chercher du côté d'une faille CRC ou (B) améliorer mon algo pour tester plus de possibilités à la seconde (actuellement +/-200 check/s)?

si réponse B, faut-il un PC de gamer pour trouver la réponse en 5 secondes ?  =D

ou alors y a-t-il une réponse C?  :rolleyes:


Titre: Re : Prog - Longue vie au triangle !
Posté par: sirk390 le 24 Janvier 2022 à 08:58:33
Salut redroot,
C'est un des challenge les plus dur du site.
Comme du pose la question s'il faut "(B) tester plus de possibilités à la seconde" alors qu'on peut calculer facilement combien de temps l'algo va prendre dans ce cas, je pense que tu n'as pas encore le niveau. Pour ce chall, tu ne peux pas survoler en utilisant des libs.
Il faut y aller à fond, comprendre le CRC dans les détails et d'avoir de bonnes connaissances des maths crypto.


Titre: Re : Prog - Longue vie au triangle !
Posté par: redroot le 24 Janvier 2022 à 10:38:45
Ok, ça répond à ma question.
Oui, j'avoue j'ai tenté la méthode bourrin en me disant que ça passerait peut-être.
Mais avec le taux de réussite de cette épreuve, j'aurais dû m'y attendre.
J'ai sauté volontairement quelques étapes pour justement ne pas avoir à utiliser de lib et me concentrer sur les épreuves d' "algo pur".

Au fait, j'ai retranscrit l'algo CRC64 en C# et je ne suis pas certain de sa fiabilité, serait-il possible d'avoir un autre tableau de byte ainsi que le résultat attendu pour le CRC64?
histoire de m'assurer que la base fonctionne bien =D

Merci pour la réponse rapide et ...
longue vie au triangle !  =D


Titre: Re : Prog - Longue vie au triangle !
Posté par: sirk390 le 24 Janvier 2022 à 11:19:11
Il y a le code plein de langages de programmation sur le forum et le nom de la variante de CRC utilisée. Tu peux générer toi-meme le tableau de bytes avec le résultat attendu et les compilant/executant.
Ca ira plus vite et tu pourras vérifier par toi-même.
Hésite pas à passer sur discord si t'as d'autres questions.