Concours de programmation CodinGame le 22 mars 2014

17
21
mar.
2014
Jeu

La prochaine édition de CodinGame, le challenge de code en ligne, aura lieu ce samedi 22 Mars 2014 à 18h (heure française).

L'événement accueillera des développeurs du monde entier pour leur permettre de passer un bon moment, défier leurs pairs, gagner des prix ou entrer en contact avec des sociétés qui leur plaisent et qui recrutent.

Kirk illustration

Parmi les nouveautés sur la plate-forme :

  • Groovy est ajouté aux langages disponibles
  • Le tchat est intégré à l'IDE pour échanger pendant l'épreuve
  • Le thème de cette édition est "Kirk's Quest", en hommage au célèbre capitaine de Star Trek. Comme pour la précédente édition, ce concours offrira aux participants une ambiance proche du jeu vidéo.
  • Objectif du challenge : résoudre deux problèmes de programmation dans le langage de son choix parmi les 18 proposés (C/C++, C#, Java, Javascript, PHP, Python, Python 3, Perl, Go, Dart, - Scala, Haskell, Objective-C, Pascal, Ruby, Bash et Groovy).
  • Durée moyenne estimée de l'épreuve : 2h.
  • Modalités de participation : c'est en ligne, c'est gratuit, et c'est anonyme pour ceux qui ne souhaitent pas communiquer leurs coordonnées.
  • L’environnement de développement proposé donne accès à un éditeur de code et un shell Bash, pour lancer son programme depuis le navigateur.
  • Comme d'habitude, le règlement prévoit que le code source des participants soit rendu public sous licence libre GPL v3 et affiché sur le site dès la fin du concours, pour que tout le monde puisse apprendre et progresser en consultant les solutions des autres.
  • # irc

    Posté par . Évalué à 1.

    J'ai participé au dernier, et c'était bien sympas.
    Est-ce qu'il y a un chan sur irc, en plus de celui proposé directement sur le site ?

    bépo powered

    • [^] # Re: irc

      Posté par . Évalué à 2.

      Bonjour Robin,
      Merci d'avoir été là sur Ragnarok.
      Le chat de l'IDE reprend irc.codingame.com (channels : #codingame pour l'international et #codingame_fr pour les francophones), qui peut aussi être accessible via n'importe quel client de chat.

      • [^] # Re: irc

        Posté par . Évalué à 1.

        Merci

        bépo powered

  • # Ada ?

    Posté par (page perso) . Évalué à 3.

    Est-ce que vous envisagez la possibilité de pouvoir coder en Ada ? Je ne suis pas particulièrement productif dans ce langage (je participe en Java, Python3 ou C/C++ selon mon humeur), mais s'il y a moyen de gagner un tshirt en finissant premier sur ce langage… :D

    • [^] # Re: OCaml ?

      Posté par . Évalué à 3.

      Quitte à demander des langages, pourquoi pas OCaml ?

      • [^] # Re: OCaml ?

        Posté par . Évalué à 1.

        Moi j'aimerais bien avoir du Common-Lisp. Mais après faut se mettre d'accord sur une implémentation…

        • [^] # Re: OCaml ?

          Posté par (page perso) . Évalué à 2.

          j’ai déjà demandé, mais pour moi, Lua est indispensable :)

          en attendant je reste sur C, mais bon mon code de drone est moins facilement maintenable/customisable :)

        • [^] # Re: OCaml ?

          Posté par (page perso) . Évalué à 2.

          SBCL est le choix gratuit optimal, non? CLisp est super lent…

          • [^] # Re: OCaml ?

            Posté par . Évalué à 1.

            C'est effectivement le choix que je privilégierais mais tout le monde n'est pas nécessairement d'accord.
            Et c'est en mode interpreter que clisp parait beaucoup plus lent que sbcl mais c'est parce que sbcl triche et compile même en mode interpreter, non ? Je peux me tromper, je ne suis pas un expert non plus.

            • [^] # Re: OCaml ?

              Posté par . Évalué à 0.

              Si tu écris du code portable (pas très difficile pour les problèmes proposés, on ne parle pas de réseau ou de système de fichiers ici), ça devrait tourner aussi bien sur l'un que sur l'autre. Et si quelqu'un veut développer avec CLisp, il lui suffit de vérifier de temps en temps que ça tourne avec SBCL, c'est assez simple.

              sbcl triche et compile même en mode interpreter, non ?

              Hum… ;)

              En fait SBCL compile automatiquement le code qui est chargé avec load, ce qui n'est pas le cas de CLisp. L'un et l'autre peuvent fonctionner en mode interprété ou compilé, mais par défaut SBCL compile le code chargé, ce qui est plus lent à charger mais plus rapide à exécuter.

      • [^] # Re: OCaml ?

        Posté par (page perso) . Évalué à 2.

        Pourquoi j'irais demander un langage que je ne connais pas :D ? (enfin, un langage que j'ai oublié, je savais résoudre des exos d'algo en Caml il y a quelques années…)

    • [^] # Re: Ada ?

      Posté par (page perso) . Évalué à 1.

      Le langage à venir c'est Clojure. Ada et OCaml sont prévus, mais pas encore planifiés.
      Sinon pour gagner un TShirt, avec Pascal ou Bash ça doit être possible de finir 1er (pour ce qui est d'avoir 50%+ par contre, c'est une autre affaire) :-)

      • [^] # Re: Ada ?

        Posté par (page perso) . Évalué à 2.

        Je pense qu'en bash, il faut anticiper le coup en se faisant un ensemble de fonctions pour le rendre plus utilisable. J'avoue avoir hésité la dernière fois mais je m'étais dit qu'il y aurait trop d'utilisateurs à cause de la nouveauté…

        Rah, ça se tente… :D. J'hésite aussi avec le Javascript car ça fait longtemps que j'ai pas codé avec et ce serait l'occasion d'actualiser mes connaissances. C'est quoi comme moteur pour le Javascript ? Ça n'a pas l'air d'être du nodejs à première vue. Genre je vois un printErr() pour le debug (pas évident à trouver l'info d'ailleurs), il y a d'autres fonctions du genre ?

        • [^] # Re: Ada ?

          Posté par (page perso) . Évalué à 2.

          Rah, ça se tente… :D. J'hésite aussi avec le Javascript car ça fait longtemps que j'ai pas codé avec et ce serait l'occasion d'actualiser mes connaissances. C'est quoi comme moteur pour le Javascript ? Ça n'a pas l'air d'être du nodejs à première vue. Genre je vois un printErr() pour le debug (pas évident à trouver l'info d'ailleurs), il y a d'autres fonctions du genre ?

          Pour javascript c'est SpiderMonkey 17 (JavaScript 1.8.5). D'autres fonctions du genre, je ne crois pas.

          • [^] # Re: Ada ?

            Posté par (page perso) . Évalué à 2.

            Est-ce qu'il y a une page qui détaille pour chaque langage le compilo et les options utilisées ? Si non, ce serait une bonne idée de rajouter ça.

            • [^] # Re: Ada ?

              Posté par (page perso) . Évalué à 2.

              C'est par ici : FAQ CodinGame
              il faut scroller une page vers le bas.

              • [^] # Re: Ada ?

                Posté par (page perso) . Évalué à 2.

                Ah mais je l'ai déjà lu en plus ce tableau :D. Merci !

                Aucune optimisation de type -O2 ou -O3 pour le C ? Pas de -funroll-loops ou autre opti du genre ?

              • [^] # Re: Ada ?

                Posté par . Évalué à 2.

                Rien de visible sans JS? A part un avertissement que sans JS c'est pas optimal… ( en meme temps, y'a rien, sans JS :/ )

                Après activation, rien non plus ne s'affiche.
                J'utilise opera en JS désactivé par défaut, je l'ai activé pour le site, mais… plus rien du tout.

                Pour certains usages, je peux comprendre, mais pour une FAQ? Ce n'est pas censé être juste une page avec:

                • un sommaire
                • une liste contenant:
                  • n questions
                  • une réponse associée à chaque question

                Et donc, pourquoi nécessiter JS pour si peu? Je sais, je suis chiant de désactiver JS par défaut. Mais c'est pour la sécurité de mon système, qui n'est en plus pas super musclé et donc, sur certains sites ( pas rares ) , JS pourrit l'utilisabilité de la machine.

      • [^] # Re: Ada ?

        Posté par (page perso) . Évalué à 3.

        Bon, je viens de voir la faisabilité du bash en refaisant le dernier concours. Et franchement c'est super jouable :D. Tout dépend de ce qui est à faire et des structures de données utiles.

        J'ai plus de 50pts avec ce code fait en 15-20mn (ça fait des mois que je n'avais pas fait de bash):

        #!/bin/bash
        
        # Read init information from standard input, if any
        read TX TY
        
        while true; do
            # Read information from standard input
            read H N
            geantsX=()
            geantsY=()
            sumX=0
            sumY=0
            close=0
            for ((i=0;i<$N;i++)); do
                read X Y
                geantsX[i]=$X
                geantsY[i]=$Y
                sumX=$((sumX + X))
                sumY=$((sumY + Y))
        
                diffX=$((TX - X))
                diffY=$((TY - Y))
                diffX=${diffX#-}
                diffY=${diffY#-}
        
                if (( diffX + diffY < 3 )); then
                    close=1
                fi
            done
        
            if (( $close )); then
                echo "STRIKE"
                continue
            fi
        
            bcX=$((sumX / N))
            bcY=$((sumY / N))
        
            echo `{mathjax} sumX `sumY 1>&2
        
            s=
            if (( TY > bcY )); then
                s="N"
                (( TY-- ))
            elif (( TY < bcY )); then
                s="S"
                (( TY++ ))
            fi
            if (( TX > bcX )); then
                s="${s}W"
                (( TX-- ))
            elif (( TX < bcX )); then
                s="${s}E"
                (( TX++ ))
            fi
        
            if [[ "vide$s" = "vide" ]]; then
                echo "WAIT"
            else
                echo $s
            fi
        done
        
        • [^] # Re: Ada ?

          Posté par (page perso) . Évalué à 1.

          Mouarf, tendu celui d'aujourd'hui en Bash. J'ai sorti le Python. :D

          Je suis assez dégoûté, j'ai perdu bien 20-30mn sur un bug stupide. Et au final je fais 94%… Donc tous ceux qui ont fait 100% me passent devant, même en mettant beaucoup plus de temps que moi.

    • [^] # Re: Ada ?

      Posté par . Évalué à 1.

      J'imagine que tu plaisantes, mais j'ai récemment songé sérieusement à me mettre à l'ADA, qui offre un certain nombre de points commun avec le C++, en mieux ( encore plus casse-pied sur les types, il paraît… J'aime bien l'idée! Et puis, un langage qui produit de vrais binaires, vraiment lisibles par le CPU, ça se fait rare de nos jours, alors en connaître 2 ( 4 si je compte le C et l'asm intel x86 - hum, et encore - … ) me ferait bien plaisir )

      Par contre, il semble qu'il y ait un manque critique de lib pour gérer correctement les IHM sous ce langage. Il y a aussi le fait que gnat soit infernal à utiliser. Ce truc est le pire IDE que j'aie tenté d'utiliser sérieusement… GUI bordélique à souhait, on sait même pas ou aller pour compiler un nouveau projet. Bref. Je ne parlerait pas du tuto qui présuppose un nombre élevé de trucs. Ca reste de la doc de gnou, dans le genre bestial on fait difficilement mieux (avis personnel).
      Et je n'ai pas trouvé grand chose (rien en fait, mais j'avoue que pour m'initier à un nouveau langage, j'aurait préféré un outil qui en fasse un maximum à ma place, pour commencer gentiment. Donc pas plus cherché que ça) au sujet de compiler en ligne de commande, non plus ( pourtant, ça me suffit amplement, compte tenu du fait que mon système utilisateur est un vrai IDE pour c++ en tant que tel, à condition de savoir taper 3-4 commandes ).
      SDL à un portage entamé pour ADA( sur github ), par quelqu'un qui veut prouver qu'on peut faire des jeux en ADA ( ce qui, compte tenu du fait que ce langage soit conçu pour créer des armes militaires, et donc pour être hyper fiable tout en pouvant gérer du bas niveau - comme C++ en fait, sauf pour les armes militaires - , me semble pas stupide! ). Mais je crains que ce portage ne soit pas spécialement utilisable.
      Le concurrent de la SDL, la SFML, ne supporte certainement pas l'ADA, et personne ne semble s'y être mis ( logique, SFML est déjà peu utilisée en C++, alors porter pour ADA… ).
      Et pour finir, il semble que, comme C++, ADA n'ait pas de lib pour créer des GUI, ou plutôt pas de "lib mainstream" ( mais pour un langage si peu connu… pas surprenant ).

      Pour un jeu vidéo… ces détails sont gênants, car le jeu vidéo fait une grande utilisation de l'écran, et pas juste pour afficher 3 caractères qui se battent en duel ( toujours, toujours compter le témoin! Sinon, c'est un assassinat ;) ).
      Du coup, coder un jeu en ADA serait… particulièrement intéressant, pour moi. Réinventer la roue n'est pas systématiquement mauvais ( la plupart des libs de toolkit le font, après tout, sauf wx ) si l'on fait un truc propre qui n'est pas lié par les contrainte historiques du langage.
      Mais je ne crois pas que tout le monde serait d'accord avec moi. Réinventer la roue, remettre en question les implémentations séculaires ( ou demi-séculaires pour les logiciels ) n'est pas toujours bien vu, surtout s'il existe un truc libre.
      Il s'agit de quelque chose que j'aimerais bien faire, en fait. Faire différemment des autres, par esprit de contradiction, mais aussi parce que je serais toujours moins bon que les autres dans leur domaine d'expertise si je me contente de les singer. Et faire différemment permets parfois de trouver de nouvelles façons efficaces de faire les choses. Les inventions et trouvailles majeures liées à des erreurs, ça existe, après tout (on peut rêver).

      PS: si t'as des document expliquant comment faire un vrai hello world, en ligne de commande, pas à pas, expliquant la syntaxe et les paradigmes du langage plutôt que des trucs aussi inutiles que la description de l'API des fonctions standard ( pour lesquelles un lien vers un document les expliquant de façon technique me suffit. Je ne suis peut-être pas un maître du dev, mais je suis un dev malgré tout, lire de la doc d'API me fait pas peur. )
      A partir d'un truc aussi petit, qui explique comment compiler et la syntaxe, on peut apprendre très vite le reste. Créer un mécanisme de GUI n'est pas si dur après tout: une classe fenetre, une sizer qui en hérite et agrège une liste de fenetre, une spacer qui hérite de fenetre, et une widget qui hérite de fenetre et agrège une image, et la moitié est faite. L'autre moitié, c'est dire que fenetre agrege des gestionnaires d'évènements… rien d'extraordinaire. Et avec la prog générique, on peut faire un truc qui aie le même comportement en mode graphique ou en mode texte en plus.)

      PPS: pardon pour le pavé

      • [^] # Re: Ada ?

        Posté par (page perso) . Évalué à 4.

        Rohh lui hé !

        Tu pousses mémé un peu fort !

        Visite un peu ces liens au lieu de dire des bêtises !

        Je suppose que tu connais :
        http://libre.adacore.com/

        GtkAda :
        http://libre.adacore.com/tools/gtkada/

        SDL :
        http://university.adacore.com/

        Et ça fonctionne plutôt pas mal :
        http://slo-ist.fr/sujet/ada4automation

        Tout n'est pas rose mais c'est bien utilisable.

        • [^] # Re: Ada ?

          Posté par . Évalué à 0.

          Hum…
          Le 1er lien, non.

          GtkAda, j'en ai entendu parler ( enfin… lu écrire ), mais… j'avoue, utiliser un binding ADA d'une lib C ( alors qu'ADA supporte l'objet, et pas le C ) me semble…hum… pas pertinent.
          Je voulais troller en disant que j'aurai préféré un binding qt, mais après une rapide recherche, j'en ai trouvé un… hé zut bon sang…

          Pour la SDL, j'avais cherché, mais n'était pas tombé sur ce lien.

          Conclusion: je vais éplucher tes liens plus en détail. Les recherches que j'ai faites sur le canard ne me les avaient pas pointées, si je ne me trompe pas.

          Comme sanction, je te pertinente un dredi, ça t'apprendra, na!

        • [^] # Re: Ada ?

          Posté par (page perso) . Évalué à 2. Dernière modification le 22/03/14 à 09:37.

          Heu non je plaisantais pas… J'ai fait 3 ans d'Ada pendant mes études et ça fait 3 ans que j'encadre des TP et TD d'Ada en première année (j'ai oublié tout ce qui est paquetages, threads, pointeurs et autre par contre vu que je n'ai pas à l'enseigner).

          Si je dis que je serais moins productif, c'est pour deux raisons :
          - J'ai beaucoup plus d'expérience en C, C++, Java et Python.
          - Le langage en lui-même est un peu trop verbeux. On code la même chose plus vite en Python.

          Edit: désolé je réponds au commentaire au dessus.

      • [^] # Re: Ada ?

        Posté par . Évalué à 3.

        Par contre, il semble qu'il y ait un manque critique de lib pour gérer correctement les IHM sous ce langage.

        Vraiment ?
        Pourtant il y a

        • GTKAda
        • QtAda
        • wxAda (mais il semble un peu vieux)
        • plusieurs SDL (dont celui-ci)
        • un SDL 2 en cours (pas encore utilisable apparemment), plus le mien ça ferait 2.

        Je crois qu’il y a aussi des trucs pour OpenGL.

        Par contre rien pour les EFL (j’ai commencé un bout de truc là-dessus) en effet.
        Et rien pour SFML (en même temps, autant faire un binding sur du C c’est trivial, surtout en Ada, autant en C++ avec le mangling non standard c’est chiant).

        Il y a aussi le fait que gnat soit infernal à utiliser. Ce truc est le pire IDE que j'aie tenté d'utiliser sérieusement… GUI bordélique à souhait, on sait même pas ou aller pour compiler un nouveau projet. Bref.

        GNAT c’est le compilateur.
        Là tu dois parler de l’IDE (GNAT Programming Studio).
        Je n’ai rien à dire dessus, je ne l’ai jamais utilisé…

        Je ne parlerait pas du tuto qui présuppose un nombre élevé de trucs. Ca reste de la doc de gnou, dans le genre bestial on fait difficilement mieux (avis personnel).

        Quel tuto ?

        Et je n'ai pas trouvé grand chose (rien en fait, mais j'avoue que pour m'initier à un nouveau langage, j'aurait préféré un outil qui en fasse un maximum à ma place, pour commencer gentiment. Donc pas plus cherché que ça) au sujet de compiler en ligne de commande, non plus ( pourtant, ça me suffit amplement, compte tenu du fait que mon système utilisateur est un vrai IDE pour c++ en tant que tel, à condition de savoir taper 3-4 commandes ).

        Ha bon ?
        Pourtant c’est super simple. En général, il suffit d’une commande.
        Genre pour un Hello World :

            with Ada.Text_IO;
        
            procedure Hello is
            begin
              Ada.Text_IO.Put_Line ("Hello, world!");
            end Hello;
        

        Tu écris ça dans un fichier appelé "hello.adb", ensuite tu tapes

            gnatmake hello.adb
        

        Et tu as un exécutable hello.
        Pour un programme un peu plus compliqué, tu peux écrire un fichier de projet (un exemple ici, la doc’ est ) que tu passes à gnatmake (genre hello.gpr)

            gnatmake -Phello
        

        Tu as une introduction ici.

        Et quand tu as des projets plus complexes (multi-language, disons C et Ada), tu peux passer le fichier de projet à grpbuild (la doc’ est ) qui se chargera de compiler et lier ensemble tout ce beau monde)

        Le concurrent de la SDL, la SFML, ne supporte certainement pas l'ADA, et personne ne semble s'y être mis ( logique, SFML est déjà peu utilisée en C++, alors porter pour ADA… ).

        SFML me semble pas mal utilisé en C++ (bon j’ai pas de stats là-dessus, juste une impression).
        Le souci de la SFML c’est que c’est du C++ et donc plus chiant de faire un binding (name mangling qui change d’un compilo’ à l’autre entre autres…).

        Et pour finir, il semble que, comme C++, ADA n'ait pas de lib pour créer des GUI, ou plutôt pas de "lib mainstream" (mais pour un langage si peu connu… pas surprenant ).

        Si, voir plus haut.

        PS: si t'as des document expliquant comment faire un vrai hello world, en ligne de commande, pas à pas, expliquant la syntaxe et les paradigmes du langage plutôt que des trucs aussi inutiles que la description de l'API des fonctions standard ( pour lesquelles un lien vers un document les expliquant de façon technique me suffit. Je ne suis peut-être pas un maître du dev, mais je suis un dev malgré tout, lire de la doc d'API me fait pas peur. )

        Pour le Hello World, je remet ce lien.

        Pour les particularités du langages il y a les gems qui sont parfois très intéressantes. Il y aussi le livre Ada Distilled: An Introduction to Ada Programming for Experienced Computer Programmers qui est disponible gratuitement en PDF ici par exemple.

        Y’a aussi un tuto’ sur openclassrooms mais je ne sais pas ce qu’il vaut.

        Pour les références (standard entre autres), tout est

  • # Durée

    Posté par (page perso) . Évalué à 2.

    Durée moyenne estimée de l'épreuve : 2h.
    C'est juste la durée moyenne ou la durée donné ? Parce que sinon, c'est de plus en plus court !
    1er: 4h
    2nd: 3h
    3ème: 2h

    Hého, faut nous laisser les 20 minutes pour se rendre compte qu'on à oublié le départ :).
    Sinon, je me suis éclaté à chaque fois. Merci aux auteurs. Et puis, j'ai fini 42ème sur le précédent, ça s'invente pas =).

    • [^] # Re: Durée

      Posté par (page perso) . Évalué à 1.

      Hello Snarky, la durée max. sera à priori de 4h.

      • [^] # Re: Durée

        Posté par (page perso) . Évalué à 2.

        Encore une fois, nickel la durée. Ça se fait effectivement en 2h si on sait coder une recherche de plus court chemin sans difficulté.

        • [^] # Re: Durée

          Posté par (page perso) . Évalué à 2.

          Bon, j'ai fait un 100% en 2h04, j'ai dépassé le délai estimé.
          Je ferai mieux la prochaine fois ;)

  • # Et après ?

    Posté par . Évalué à 1. Dernière modification le 23/03/14 à 12:50.

    Bon, encore une fois, je me suis bien régalé, et je finis avec un score "honorable" mais pas top (69%) !
    (ceci dit, même si je comprends vos contraintes, il faut reconnaître que 18-22h c'est pas l'idéal pour la paix des ménages)

    Par contre, comme j'ai buté sur un bug stupide sur les dernières minutes (corruption mémoire à cause d'une mauvaise lecture de l'énoncé), j'ai voulu refaire l'exercice ce matin : aucun soucis de ce côté, j'ai trouvé et corrigé rapidement mon bug.
    Mais je n'ai pu tester qu'avec les cas de tests fournis pendant le concours, et pas ceux utilisés pour la notation finale.

    Ca pourrait être intéressant de pouvoir calculer son score en mode "entrainement" avec les mêmes tests que ceux utilisés pour le concours, non ? Histoire en particulier de se faire du mal en se disant "Rhaaa, avec 5 minutes en rab, j'aurais pu avoir X points de plus !" ;)

    • [^] # Re: Et après ?

      Posté par (page perso) . Évalué à 3.

      (ceci dit, même si je comprends vos contraintes, il faut reconnaître que 18-22h c'est pas l'idéal pour la paix des ménages)

      Je confirme, j'ai dû abandonner la deuxième question parce que j'avais autre chose à faire, alors que j'aurais eu le temps de finir si ça avait commencé à 14h ou 16h.

      « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

      • [^] # Re: Et après ?

        Posté par (page perso) . Évalué à 1.

        C'est clair de le samedi soir… Les gens qui ont une vie, sortent.
        Le dimanche après midi, ça serait parfait ! Il y a jamais rien a faire le dimanche :)

    • [^] # Re: Et après ?

      Posté par . Évalué à 2.

      94% en un peu moins de deux heures, après avoir (évidemment) perdu du temps sur des bugs stupides et des « fautes de main » (écrire le nom d'une variable en pensant à une autre…). Ce que j'ai trouvé un peu frustrant, c'est de ne pas pouvoir voir sur le moment quel test ne passait pas et m'a donc privé de ces 6% (je marquais 100% sur les tests fournis). Je vois maintenant que dans le test « plusieurs chemins avec cycles », Kirk ne rentre pas assez vite au téléporteur.

      Par contre je suis plus souvent libre le samedi que le dimanche, donc moi ça me va très bien :-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.