Backhanded ^ H ^ H ^ H ^ H ^ H ^ Hspaces


47

Sur certains terminaux, appuyer sur la touche Retour arrière génère le code de contrôle ^Hpour supprimer le caractère précédent. Cela a donné lieu à un langage sournois où les modifications sont simulées pour un effet comique :

Sois gentil avec cet imbécile ^ H ^ H ^ H ^ Hgentleman, il vient du QG de l'entreprise.

Avec une ou plusieurs chaînes ^H, affiche le résultat de l'espacement arrière sur chacune ^H. L'entrée utilisera uniquement des caractères imprimables (ASCII 32-126) et ^n'apparaîtra que ^H. Les espaces arrières ne se produiront jamais sur un texte vide.

Vous ne pouvez pas supposer que l’environnement de sortie prend en charge les codes de contrôle, en particulier le code de retour arrière \x08.

>> Horse^H^H^H^H^HCow
Cow

>> Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ.
Be nice to this gentleman, he's visiting from corporate HQ.

>> 123^H45^H^H^H78^H
17

>> Digital Trauma^H^H^H^H^H^H^H^H^H^H^H^H^H^HMaria Tidal Tug^H^H^H^H^H^H^H^H^H^H^H^H^H^H^HDigital Trauma
Digital Trauma

Classement

Voici un classement par langue, gracieuseté de Martin Büttner .

Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:

# Ruby, <s>104</s> <s>101</s> 96 bytes


4
Est AAA^HB^H^Hvalide?
Nathan Merrill

@NathanMerrill Oui, et cela se traduit par A.
xnor

3
Je pense que la rétine ferait bien ici.
Claudiu

1
@Fatalize: "Les espaces de retour ne se produiront jamais sur un texte vide."
Maltysen

16
@Maria Tidal Tug revient me hanter
Digital Trauma

Réponses:


69

GNU sed, 11 octets

:;s/.^H//;t

Test de sortie:

$ echo "Horse^H^H^H^H^HCow
Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ.
123^H45^H^H^H78^H
Digital Trauma^H^H^H^H^H^H^H^H^H^H^H^H^H^HMaria Tidal Tug^H^H^H^H^H^H^H^H^H^H^H^H^H^H^HDigital Trauma" | sed ':;s/.^H//;t'
Cow
Be nice to this gentleman, he's visiting from corporate HQ.
17
Digital Trauma
$ 

5
Regardez qui est arrivé! C'est Maria Tidal Tug ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ H ^ Traumatisme numérique!
Alex A.

@Alexa. Est-ce que je manque une blague?
user253751

@immibis: Voir le commentaire de Digital Trauma sur la question.
Alex A.

sed -r ':;s/(^|.)\^H//;t'- cela fonctionne au détriment de 6 octets supplémentaires
aragaer

@aragaer Pourquoi est-ce nécessaire? Le PO indique "Les espaces de retour ne se produiront jamais avec du texte vide ". Je pense que ^Hle début de la chaîne est un retour arrière sur un texte vide.
Digital Trauma

19

Pyth, 11 octets

.U+PbZcz"^H

Manifestation.

.U+PbZcz"^H
               Implicit: z = input()
      cz"^H    z.split("^H")
.U             reduce, with the first element of the list as the initial value.
   Pb          Remove the last character of what we have so far.
  +  Z         And add on the next segment.
               Print implicitly.

17

Gema, 6 octets

?#\^H=

Échantillon échantillon:

bash-4.3$ gema -p '?#\^H=' <<< 'pizza is alright^H^H^H^H^H^Hwesome'
pizza is awesome

CW, parce que l'exemple imbécile contre gentleman prend beaucoup trop de temps. (Tué après une journée. Peut-être un petit problème dans l'interprète? Tous les autres exemples ici sont traités en fractions de secondes.) Le motif récursif de Gema ne semble pas être affecté par le niveau de récursivité, mais la quantité de texte non concordant augmente le temps de traitement de manière exponentielle. .


Y a-t-il un lien vers la langue? Une recherche rapide sur Github en a révélé pas mal
Sp3000 le

Sûr. gema.sourceforge.net (En passant , le projet Gema a été enregistré le 23-10-10, tandis que GitHub a été lancé le 2008-04-10. Cela peut être une raison pour ne pas le trouver ici.)
manatwork

Je crois que la profondeur de récursivité est égale à la longueur de la chaîne qui ne correspond pas, car elle sera répétée encore et encore jusqu'à ce que les \^Hmaches correspondent à un caractère à la fois ?.
isaacg

15

C, 52 octets

j;f(char*s){for(j=0;*s=s[j];s[j]==94?s--,j+=3:s++);}

Nous définissons une fonction fqui prend un pointeur sur la chaîne en entrée. Après l'appel de la fonction, ce pointeur contiendra une chaîne modifiée.

Un test simple:

int main(int argc, char** argv) {
    char buf[300] = "Digital Trauma^H^H^H^H^H^H^H^H^H^H^H^H^H^HMaria Tidal Tug^H^H^H^H^H^H^H^H^H^H^H^H^H^H^HDigital Trauma";
    f(buf);
    printf(buf);
    return 0;
}

Les impressions ci-dessus:

Digital Trauma

1
C'était vraiment intelligent. J'ai remarqué quelques choses: les globales sont déjà initialisées à zéro, donc pas besoin d'initier jvotre forboucle (bien sûr, c'est à usage unique, mais je ne vois rien à ce sujet dans les règles :)). Vous pouvez également combiner la tâche avec le décrément: j;f(char*s){for(;s[j]==94?*s--=s[j],j+=3:s++);}(47 bytes)
Cole Cameron


@undergroundmonorail dang, je vérifiais deux fois si j'avais raté ça. Je suis encore nouveau dans le domaine du golf, mais je m'en souviendrai pour l'avenir :). Merci pour l'info!
Cole Cameron

1
@ColeCameron Cela a une modification non séquencée et un accès (UB), et provoque un EXC_BAD_ACCESS immédiat sur mon compilateur / machine, malheureusement.
BrainSteel

1
@Quentin J'ai essayé, mais à cause de la virgule s--, j+=3et de la priorité des opérateurs, cela ne fonctionne pas correctement.
BrainSteel

14

Haskell, 47 octets

h(a,_:_:b)=f$init a++b;h(x,_)=x
f=h.span(/='^')

Définit une fonction f :: String -> String. Comment ça fonctionne:

    f "ab^Hc^Hd"
=== h ("ab", "^Hc^Hd")   (find ^H)
=== f ("a" ++ "c^Hd")    (backspace)
=== f "ac^Hd"            (join)
=== h ("ac", "^Hd")      (find ^H)
=== f ("a", "d")         (backspace)
=== f "ad"               (join)
=== h ("ad", "")         (find ^H)
=== "ad"                 (no ^H: base case)

1
Je pense que vous pouvez sauvegarder un octet en échangeant les deux cas de het en faisant h(x,_)=xpour le cas de chaîne vide.
Zgarb

12

CJam, 14 à 13 octets

q"^H"/{W\ts}*

Comment ça fonctionne

q                   e# Read the entire input
 "^H"/              e# Split it on occurrences of string "^H"
      {    }*       e# Reduce on the split array
       W\t          e# This is the tricky part. We know that if there are two parts that we
                    e# are reducing on, they must be separated by "^H". Which in turn means
                    e# that from the first part, last characters needs to be deleted
                    e# So we simply put the second part in place of the last character of the
                    e# first part.
          s         e# Doing the above makes it a mixed array of character and string.
                    e# So we convert it to a single string, ready to be served as first part
                    e# in next reduce iteration

UPDATE: 1 octet enregistré grâce à jimmy23013

Essayez-le en ligne ici


2
1 octet plus courte: W\ts.
jimmy23013

11

Retina, 13 octets

Rétine

+`.\^H(.*)
$1

Les deux lignes doivent aller dans leurs propres fichiers, mais vous pouvez exécuter le code sous la forme d'un fichier avec l' -sindicateur.

A chaque étape, nous supprimons la première correspondance de .\^Hla chaîne. Nous répétons cela (avec le +modificateur) jusqu'à ce qu'aucune suppression ne se produise.


Juste une curiosité: pourquoi la capture de (.*), comme il semble être tout simplement remis en arrière?
manatwork

1
@manatwork De cette façon, nous ne capturons que le premier .\^Hen une étape. Sinon, abc^H^H^Hil en résulterait ab^après la première étape.
randomra

4
Toutes mes excuses pour ne pas avoir encore mis en place de limite de remplacement (ce qui permettrait probablement quelque chose comme +1`.\^H). ;)
Martin Ender

10

JavaScript ( ES6 ), 39 octets

f=s=>(t=s.replace(/.\^H/,''))!=s?f(t):t

// TEST

Out=x=>O.innerHTML+=x+'\n'

Test=_=>(Out(I.value + "\n-> " + f(I.value)),I.value='')

;["Horse^H^H^H^H^HCow"
,"Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ."
,"123^H45^H^H^H78^H"
,"Digital Trauma^H^H^H^H^H^H^H^H^H^H^H^H^H^HMaria Tidal Tug^H^H^H^H^H^H^H^H^H^H^H^H^H^H^HDigital Trauma"]
.forEach(t => Out(t + "\n-> " + f(t)))
#I { width:400px }
<pre id=O></pre>
<input id=I><button onclick='Test()'>-></button>


10

Perl, 20 16 15 octets

(Code de 14 caractères + Option de ligne de commande à 1 caractère.)

s/.\^H//&&redo

Échantillon échantillon:

bash-4.3$ perl -pe 's/.\^H//&&redo' <<< "Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ."
Be nice to this gentleman, he's visiting from corporate HQ.

1
Sauvegardez 4 personnages:1while s/.\^H//
Kevin Reid

Hou la la! C'est génial @KevinReid. Je vous remercie.
manatwork

1
Un de plus:s/.\^H//&&redo
Dennis

Merci, @Dennis. redoen quelque sorte pas fait son chemin dans mon ensemble de compétences. Devra changer cela.
manatwork

2
Notez que la version de @ Dennis ne fonctionnera (comme prévu) que si elle est la seule instruction dans une boucle ou un { }bloc. (La raison pour laquelle cela fonctionne perl -pest que le -pcommutateur enveloppe automatiquement votre code dans une whileboucle.) La version de Kevin fonctionne dans n'importe quel paramètre.
Ilmari Karonen

9

Julia, 58 42 41 octets

Économisé 16 octets grâce à manatwork et 1 grâce à Glen O!

f(s)='^'s?f(replace(s,r".\^H","",1)):s

Cela crée une fonction récursive qui accepte une chaîne et renvoie une chaîne.

Ceci remplace une occurrence de ^Hà la fois par une chaîne vide pendant que l'entrée contient ^.

Exemples:

julia> f("123^H45^H^H^H78^H")
"17"

julia> f("pizza is alright^H^H^H^H^H^Hwesome")
"pizza is awesome"

C'est la première fois que je vois Julia à l'état sauvage. Agréable!
Ogaday

8

REGXY, 10 octets

Utilise REGXY , un langage basé sur la substitution regex. Remplace tout caractère suivi de ^ H par rien. La deuxième ligne est ensuite exécutée, ce qui n’est qu’un pointeur sur la ligne précédente et répète la substitution jusqu’à ce qu’elle ne corresponde pas.

/.\^H//
//

Ceci se compile et s’exécute correctement avec l’exemple d’interprète présenté dans le lien ci-dessus, mais la solution est peut-être un peu effrontée, car elle repose sur une hypothèse concernant le caractère vague de la spécification du langage. La spécification indique que le premier jeton sur chaque ligne (avant le /) agit en tant qu'étiquette, mais l'hypothèse est qu'un pointeur d'étiquette null renverra à la première commande du fichier avec une étiquette nulle (ou, en d'autres termes, que 'null' est une étiquette valide). Une solution moins effrontée serait:

a/.\^H//
b//a

Ce qui équivaut à 13 octets.


7

Python 3, 53 octets

o=""
for x in input().split("^H"):o=o[:-1]+x
print(o)

Mais personnellement, j'aime mieux cette version plus verbeuse:

H=input().split("^H")
print(eval("("*~-len(H)+")[:-1]+".join(map(repr,H))))

La chose intéressante est que

'B''a''c''k''h''a''n''d''e''d'[:-1][:-1][:-1][:-1][:-1][:-1]

fonctionne réellement et donne 'Back', alors j’ai essayé de mapper ^H -> [:-1]et tout autre caractère c -> 'c'alors eval, mais malheureusement vous ne pouvez pas avoir de chaînes après sans un +, donc cela échoue:

'B''a''c''k''h''a''n''d''e''d'[:-1][:-1][:-1][:-1][:-1][:-1]'s''p''a''c''e''s'

Heyy ... c'est plutôt chouette.
Alex Van Liew

+=travaille dans la boucle
CalculatorFeline

@CatsAreFluffy Ce n'est o=o[:-1]+xpaso=o+x
Sp3000

Oups, j'ai raté ça. Est-ce que quelque chose comme le o[:-2]=xtravail?
CalculatriceFeline

@CatsAreFluffy Vous ne pouvez pas affecterstr
Sp3000 le

7

Haskell, 52 47 octets

import Data.Lists
foldl1((++).init).splitOn"^H"

Exemple d'utilisation:

> map (foldl1((++).init).splitOn"^H") ["Horse^H^H^H^H^HCow", "123^H45^H^H^H78^H", "Digital Trauma^H^H^H^H^H^H^H^H^H^H^H^H^H^HMaria Tidal Tug^H^H^H^H^H^H^H^H^H^H^H^H^H^H^HDigital Trauma"]
["Cow","17","Digital Trauma"]

Comment ça fonctionne:

                  splitOn"^H"     -- split on substring "^H", e.g "Horse^H^H^H^H^HCow" -> ["Horse","","","","","Cow"]
                 .                -- then
foldl1(         )                 -- fold from left by
            init                  --   first dropping the last char from the left argument
       (++).                      --   second concatenating left and right argument

6

Ruby, 27 24 20 octets

(19 caractères de code + option de ligne de commande de 1 caractère.)

$_=$`+$'while/.\^H/

Grâce à:

  • Ventero pour avoir suggéré d'utiliser les variables globales (-4 caractères)

Échantillon échantillon:

bash-4.3$ ruby -pe '$_=$`+$'"'"'while/.\^H/' <<< "Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ."
Be nice to this gentleman, he's visiting from corporate HQ.

+1 Je pensais que je ferais une réponse Ruby jusqu'à ce que je voie cela - je suis à peu près sûr que c'est aussi petit que ça va l'être. Grand usage de []!
daniero

Il y avait une autre version au début: loop{$_[/.\^H/]=""}rescue""Celle-ci est plus jolie car elle démontre la fraîcheur dans la gestion des exceptions de Ruby.
manatwork

Haha, c'est un super :)
daniero

1
Mieux vaut tard que jamais: $_=$`+$'while~/.\^H/pour 20 (vous pouvez même laisser tomber le tilde si vous ne vous souciez pas de l' regexp literal in conditionavertissement).
Ventero

1
@manatwork: Techniquement , il apparaît dans toutes les versions de rubis> = 1,9 (littéraux regex et cordes dans des conditions ont été désapprouvées après 1,8), je suppose que vous rubysimplement toujours par défaut 1.8, alors que les irbutilisations rubis 2.1.5.
Ventero

4

Python 2, 50

C'est un peu bizarre d'avoir une seconde lambda, mais semble être le meilleur Python à ce jour.

lambda s:reduce(lambda a,b:a[:-1]+b,s.split('^H'))

3

Pyth - 19 octets

Réduire fonctionne vraiment, très bien avec cela, mais comme il ne fait qu'un seul personnage à la fois, je suis ^Hobligé de dépenser presque autant de personnages que l’algo lui-même pour remplacer le saut de ligne. Vous cherchez un meilleur moyen de le faire.

u?+GHnHbPGjbcz"^H"k

Essayez-le en ligne ici .


3

TeaScript , 7 bytes [Non en compétition]

Pas en compétition car TeaScript a été créé après la publication de ce défi. Ceci est ici comme référence.

xW/.\^H

Cela utilise le nouveau TeaScript 3, et remplace récursive pour supprimer les caractères


1
Pour une raison quelconque, cela compte pour 8859 octets dans le classement en raison du lien ISO 8859 ...
ev3commander

regerence? xD
chat

2

K5, 64 octets

K n'est pas vraiment conçu pour ce genre de travail ...

{[s]$[2>#s;s;`=t:*&{"^H"~2#x_s}'1+!-2+#s;s;,/2#2!|(0,t,3+t)_s]}/

2

golflua, 36 octets

\f(s)@o!=s o=s;s=s:g(".^H","",1)$~s$

Échantillon échantillon:

Lua 5.2.2  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> \f(s)@o!=s o=s;s=s:g(".^H","",1)$~s$
> w(f("Be nice to this fool^H^H^H^Hgentleman, he's visiting from corporate HQ."))
Be nice to this gentleman, he's visiting from corporate HQ.

2

Javascript, 62 octets

Pas le plus court, mais fonctionne bien.

t=prompt();while(t.match(R=/.\^H/))t=t.replace(R,'');alert(t);

Cela peut probablement être raccourci beaucoup!


1
Pas le plus court et ne fonctionne pas non plus (essayez l'un des cas de test). L’expression rationnelle ne doit pas être globale (enlever / g)
edc65

@ edc65 Merci pour le tuyau. J'ai essayé certaines choses et elles ont fonctionné. C'est pourquoi j'ai posté comme ça
Ismael Miguel

2

R, 54 52 octets

f=function(s)ifelse(s==(r=sub(".\\^H","",s)),r,f(r))

Même idée de base que ma réponse Julia . Cela crée une fonction récursive qui accepte une chaîne et renvoie une chaîne. Si l'entrée est égale à elle-même avec une seule occurrence de ^Hremove, retournez-la, sinon appelez à nouveau la fonction.

Vous pouvez l' essayer en ligne !


2

ECMAScript 6, 57 octets

s=>{while(~s.indexOf`^H`)s=s.replace(/.\^H/,'');return s}

C'est probablement golfable, il faut juste penser à un moyen probablement pas


2
Que diriez- s=>{while(s!=(s=s.replace(/.\^H/,""));return s}vous
lrn

Ou, si whileet returnsont trop longs, il pourrait être récursive:var f=s=>s==(s=s.replace(/.\^H/))?s:f(s)
LRN

@lm vous devriez ajouter le second paramètre "" pour remplacer. Ensuite, vous avez ma réponse :)
edc65

Vrai. Et l'argument chaîne vide doit être là, je dois avoir copié la mauvaise version :(
lrn

~s.indexOf`^H`peut devenir/\^H/.test(s)
Pas que Charles

2

Java, 78 77 octets

String f(String a){while(!a.equals(a=a.replaceFirst(".\\^H","")));return a;}

1
Vous pouvez supprimer l'espace après la virgule pour enregistrer un caractère.
ProgramFOX le

2

(Visual) FoxPro toute version 80 octets

PARA t
DO WHILE AT('^H',t)>0
t = STRT(t,SUBS(t,AT('^H',t)-1,3))
ENDDO
RETU t

Répéter la traduction de chaîne pour vider en recherchant ^ H et en sauvegardant un caractère.


2

Julia, 41 39 octets

s->foldl((t,v)->chop(t)v,split(s,"^H"))

Cela consiste à utiliser ^ H en tant que séparateur, puis à supprimer le dernier caractère de chaque chaîne, puis à concaténer la chaîne suivante avant de supprimer à nouveau le dernier caractère. Contrairement à l'autre réponse de Julia, il ne s'agit pas d'une fonction récursive.

Remarque: j'ai supprimé le nom de la fonction de la définition. À l'origine, elle disait f(s)=plutôt que s->, et vous l'utilisiez comme f("AAA^HB^H^H")... mais je sauve deux octets en le laissant "anonyme" et m'utilise comme nom. Vous l'utilisez comme ceci:

(s->foldl((t,v)->chop(t)v,split(s,"^H")))("AAA^HB^H^H")

(vous pouvez également lui affecter une variable comme f=s->foldl((t,v)->chop(t)v,split(s,"^H")), alors f("AAA^HB^H^H")cela fonctionnera)


2

rs, 8 octets

Techniquement, cela ne compte pas, car cela dépend d'une fonctionnalité que j'ai ajoutée après la publication de cette question. Cependant, je pense que c'est assez chouette.

+?1.\^H/

Démo en direct et cas de test .


La nouvelle fonctionnalité remplace-t-elle la limite?
xnor

@xnor Oui: le ?1.
Kirbyfan64sos

Pourquoi Optimizer? De toute façon, tu perds contre Gema. : O
kirbyfan64sos

Yeah :( Vu gema après avoir posté un commentaire
Optimizer le

1

Python 2, 74 + 2 = 76 octets

J'ai essayé quelques approches jusqu'à présent, c'est le meilleur que j'ai pu trouver jusqu'à présent.

n=input();o='';c=0
for l in n:d=l=='^';o=[o+l*(1-c),o[:-1]][d];c=d
print o

4
D'où viennent ces 2 octets supplémentaires?
xnor

L'entrée @xnor doit être entourée de guillemets pour que cela fonctionne. J'ai oublié de mettre ça dans le post.
Kade

1
Je pense que la convention habituelle a été de permettre que les arguments de chaîne soient pris entre guillemets gratuitement, mais je ne suis pas tout à fait sûr.
xnor

1

Oreillons, 84 octets

R Z S T="",Y=$L(Z,"^H") F I=1:1:Y{S T=T_$P(Z,"^H",I) S:I<Y T=$E(T,1,$L(T)-1)} W !,T

Cela pourrait probablement être raccourci en fonction (1 octet que j'ai pu économiser lors d'un test rapide) mais j'aime un peu l'aspect one-liner ... :-)

Les accolades viennent de la saveur cache Intersystems de Mumps, ce que je connais le mieux.


1

Java - 123 octets

Personnellement, j'aime la g---1partie la meilleure.

String f(char[] a){String b="";for(int g=-1;++g<a.length;b=(a[g++]=='^'?b.substring(0,b.length()-1):b+a[g---1]));return b;}

élargi (légèrement):

  String f(char[] a) {
      String b = "";
      for (int g = -1;
           ++g < a.length;
           b = (a[g++]=='^' 
                ? b.substring(0, b.length() - 1) 
                : b + a[g---1])
      );
      return b;
  }

1

Lot - 138 octets

@!! 2>nul||cmd/q/v/c%0 %1&&exit/b
set s=%1&for /F %%a in ('"prompt $H&echo on&for %%b in (1)do rem"')do set D=%%a
echo %s:^H=!D! !D!%

La première ligne permet d'économiser quelques octets sur une longue période @echo off&setLocal enableDelayedExpansion(ce qui désactive l'écho et permet le développement retardé des variables, au cas où vous vous le demanderiez). Je l'ai expliqué dans Conseils pour jouer au golf par lots .

La deuxième ligne est une astuce intéressante pour enregistrer le caractère de contrôle de retour arrière dans une variable. C'est assez hacky, et je ne peux pas prétendre en prendre le crédit. C'est en quelque sorte expliqué ici . Utilise essentiellement la commande prompt pour générer un caractère de retour arrière et le capture dans une variable - dans ce cas !D!.

La dernière ligne exécute ensuite la simple manipulation de chaîne suivante: remplacer ^Hpar !D!<SPACE>!D!.

C:\>bsp.bat "testing^H^H^H test"
"test test"

Malheureusement, il rompt avec des cas tels que "AAA^HB^H^H"- là où il devrait produire "A", il produit plutôt "A"B. Ce qui est un peu déroutant. Je vais devoir examiner comment la manipulation de chaînes par lots fonctionne plus en profondeur.

C:\>bsp.bat "AAA^HB^H^H"
"A"B

Merci à certaines personnes utiles ici - je réalise maintenant que je ne faisais que sauvegarder le caractère de retour arrière (0x08) et que je ne faisais donc que remplacer les caractères. Cela fonctionne maintenant avec des exemples comme ceux-ci:

C:\>bsp.bat "AAA^HB^H^H"
"A"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.