Défi de remplacement de lettre

17

L'idée est simple. Vous devez créer un remplacement de lettre "visualisé", en fournissant 3 chaînes (l'entrée peut être séparée par des virgules, des entrées séparées ou comme un tableau). Le premier segment est le mot que vous souhaitez corriger, et le deuxième segment est les lettres que vous souhaitez remplacer, et le troisième segment est le remplacement des lettres du segment 2.

Par exemple:

|    | Input                       | Starting Word | Output      |
|----|-----------------------------|---------------|-------------|
| #1 | Hello world -wo -ld +Ea +th | Hello world   | Hello Earth |
| #2 | Hello World -wo -ld +Ea +th | Hello World   | Hello Worth |
| #3 | Hello -llo +y               | Hello         | Hey         |
| #4 | Red -R -d +Gr +en           | Red           | Green       |
| #5 | mississippi -is -i +lz +p   | mississippi   | mlzslzspppp |
| #6 | Football -o -a +a +i        | Football      | Fiitbill    |
| #7 | mississippi -is -i +iz +p   | mississippi   | mpzspzspppp |

Explication

Les remplacements doivent être effectués étape par étape avec leur paire respective. Voici une illustration avec une entrée de mississippi -is -i +iz +ppour donner la sortie mpzspzsppp(voir l'exemple #7ci-dessus)

| Step  | Input                         | Output        |
|------ |---------------------------    |-------------  |
| #1    | mississippi -is -i +iz +p     |               |
| #2    | mississippi -is +iz           | mizsizsippi   |
| #3    | mizsizsippi -i +p             | mpzspzspppp   |

Règles

  • Les entrées sont toujours dans cet ordre <starting_string> <list_of_letters_to_replace> <replacement_letters>.
  • Les lettres de remplacement et les groupes de remplacement ne seront jamais mélangés (c.-à-d. Qu'il n'y en aura jamais -a +i -e +o).
  • Les lettres à remplacer sont toujours préfixées par -et les lettres de remplacement sont toujours préfixées par +. (Le préfixe est obligatoire)
  • Il peut y avoir plus d'un jeu de lettres à remplacer, vous devez donc regarder le préfixe.
  • Supposons que le nombre de groupes de lettres à remplacer et le nombre de groupes de lettres de remplacement sont toujours égaux (c.-à-d. Qu'il n'y en aura jamais -a -e +i)
  • Les remplacements sont sensibles à la casse (voir exemple #1et #2).
  • Les remplacements se font dans l'ordre dans lequel ils ont été donnés en entrée.
  • Les remplacements de lettres peuvent être remplacés par d'autres remplacements. Voir l'exemple #6.
  • Le premier segment (mot de départ) ne comprendra jamais de caractères -ou +.
  • C'est le code-golf donc les octets les plus courts gagnent.

Classements

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec 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 dans le titre, en les rayant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

# Perl, 43 + 2 (-p flag) = 45 bytes

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=96473,OVERRIDE_USER=38505;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>

ʰᵈˑ
la source
1
Étant donné les règles 2 et 5, vous n'avez vraiment pas besoin de regarder le préfixe. Avec n entrées, l'entrée 0 est la chaîne de base, les entrées 1 à int (n / 2) sont letter to replace(avec préfixe -) et l'entrée int (n / 2) +1 à n-1 sont replacement(avec préfixe +)
edc65
@ edc65 100% vrai, bien que le défi ait été conçu pour avoir le préfixe (et je pourrais faire une explication étrange que je suis un étranger qui ne peut pas traiter les remplacements de lettres sans leur préfixe) mais en réalité, c'est juste un autre obstacle pour arrêter cela étant trop insignifiant - bien qu'en regardant les réponses actuelles (toutes sont excellentes en passant), ce n'était pas un obstacle complexe. Fait également amusant, l'idée derrière ce défi est née de mon ami dans un chat Skype. Il avait mal orthographié un mot ( gello), puis m'envoyait les remplacements de lettres ( -g +h) parce qu'il voulait être ennuyeux au lieu de l'envoyer hello*.
ʰᵈˑ
1
Les entrées sont toujours dans cet ordre Pourquoi si restrictif?
Luis Mendo
@LuisMendo Je suppose que cela n'a pas vraiment d'importance - mais c'est la façon dont mon ami et moi l'avons formaté, mais depuis que des réponses ont été postées pour cette exigence, je ne peux pas vraiment faire de changement de règle. Cela n'a pas été remis en question sur le bac à sable, donc je ne l'ai pas considéré comme négatif.
ʰᵈˑ
1
@udioica a parfaitement raison et prend en charge la règle "Les remplacements sont sensibles à la casse". Exécutez l'extrait dans la réponse JavaScript pour le voir implémenté. (# 1 w orld` vs # 2 W
orld

Réponses:

6

05AB1E , 15 17 octets

IIð¡€áIð¡€á‚øvy`:

Essayez-le en ligne!

Explication

I                   # read starting string
 I                  # read letters to be replaced
  ð¡                # split on space
    ۇ              # and remove "-"
      I             # read replacement letters
       ð¡           # split on space
         ۇ         # and remove "+"
           ‚ø       # zip to produce pairs of [letters to replace, replacement letters]
             vy`:   # for each pair, replace in starting string

Ou avec un format d'entrée moins strict

vy`:

Essayez-le en ligne

Emigna
la source
6

JavaScript (ES6), 85 83 octets

f=(s,n=1,l=s.split(/ \W/))=>(r=l[n+l.length/2|0])?f(s.split(l[n]).join(r),n+1):l[0]

Cas de test

Arnauld
la source
5

Pyke, 13 11 octets

z[zdcmt)[.:

Essayez-le ici!

z           - input()
 [zdcmt)    - def func():
  zdc       -  input().split(" ")
     mt     -  map(>[1:], ^)
            - func()
        [   - func()
         .: - translate()

Ou 2 octets si dans un format d'entrée différent:

.:

Essayez-le ici!

Bleu
la source
Au travail, catbus.co.uk est bloqué. Pouvez-vous lier une suite de tests alternative s'il vous plaît?
ʰᵈˑ
2
@ ʰᵈˑ Je ne pense pas qu'il soit raisonnable de se conformer à vos paramètres (arbitraires) de pare-feu de travail.
orlp
1
@orlp - Je suis d'accord, c'est de la merde. Mais je ne définis pas les paramètres du pare-feu. Je voulais juste le tester
ʰᵈˑ
2
@hd vous pouvez télécharger Pyke sur github.com/muddyfish/pyke
Blue
4

Perl, 58 octets

Code 57 octets + 1 pour -p .

Nécessite le premier article sur une ligne, puis les remplacements sur la suivante. Un grand merci à @Dada qui a proposé une approche différente pour aider à réduire de 4 octets!

$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee

Usage

perl -pe '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee' <<< 'Football
-o -a +a +i'
Fiitbill
perl -pe '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee' <<< 'mississippi
-is -i +iz +p'
mpzspzspppp
perl -pe '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee' <<< 'mississippi
-ippi -i -mess +ee +e +tenn'
tennessee
Dom Hastings
la source
Il y a 4 octets de plus perl -pE 's/(.*?) -(\S*)(.*?)\+(\S*)/"(\$1=~s%$2%$4%gr).\"$3\""/ee&&redo'. Je n'arrive pas à le raccourcir, mais vous pouvez peut-être le faire :)
Dada
1
Je t'ai eu! 58 octets: perl -pE '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee'. (prend la chaîne sur une ligne et les "drapeaux" sur la ligne suivante)
Dada
1
Impressionnant! Je ne suis pas devant un ordinateur mais je le mettrai à jour demain! Merci!
Dom Hastings
Êtes-vous sûr de vouloir supprimer le q {} entourant $ 2? Cela n'échouerait-il pas lorsqu'il y a 3 - et 3 + commutateurs? (Je ne peux pas le tester maintenant, alors peut-être que vous aviez raison alors retirez-le;))
Dada
@Dada ahhh, je me demandais pourquoi vous l'aviez ajouté, j'ai testé tous les cas dans la suite de tests, mais je n'ai pas pensé à un remplacement 3 pour 3 ...
Dom Hastings
3

GNU sed 86 octets

Comprend +1 pour -r

:;s,^([^-]*)(\w+)([^-]*-)\2( [^+]*\+)(\w*),\1\5\3\2\4\5,
t;s,-[^-+]*,,;s,\+[^-+]*,,;t

Essayez-le en ligne!

Exemple:

$ echo 'Hello world -wo -ld +Ea +th'|sed -rf replace.sed
Hello Earth
Riley
la source
3

PHP, 98 97 octets

for($s=$argv[$i=1];$v=$argv[++$i];)$r[$v[0]>'+'][]=substr($v,1);echo str_replace($r[1],$r[0],$s);

Ce défi décrit le comportement exact de str_replace, donc pour php, il s'agit de créer des tableaux de remplacements. J'ai essayé de le faire en utilisant une seule "sous-chaîne" mais ce n'est peut-être pas la meilleure solution. Utilisez comme:

php -r "for($s=$argv[$i=1];$v=$argv[++$i];)$r[$v[0]>'+'][]=substr($v,1);echo str_replace($r[1],$r[0],$s);" "mississippi" "-is" "-i" "+iz" "+p"

edit: 1 octet sauvé grâce à Titus

user59178
la source
C'est probablement la chose la plus courte possible. Mais $v[0]>'+'enregistre un octet de plus $v[0]=='-'. Vous pouvez également utiliser à la ord($v)&4place.
Titus
2

Java 7, 153 133 octets

String c(String[]a){String r=a[0],z[]=a[1].split(" ?-");for(int i=0;i<z.length;r=r.replace(z[i],a[2].split(" ?[+]")[i++]));return r;}

Code non testé et testé:

Essayez-le ici.

class M{
  static String c(String[] a){
    String r = a[0],
           z[] = a[1].split(" ?-");
    for(int i = 0; i < z.length; r = r.replace(z[i], a[2].split(" ?[+]")[i++]));
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(new String[]{ "Hello world", "-wo -ld", "+Ea +th" }));
    System.out.println(c(new String[]{ "Hello World", "-wo -ld", "+Ea +th" }));
    System.out.println(c(new String[]{ "Hello", "-llo", "+y" }));
    System.out.println(c(new String[]{ "Red", "-R -d", "+Gr +en" }));
    System.out.println(c(new String[]{ "mississippi", "-is -i", "+lz +p" }));
    System.out.println(c(new String[]{ "Football", "-o -a", "+a +i" }));
    System.out.println(c(new String[]{ "mississippi", "-is -i", "+iz +p" }));
  }
}

Production:

Hello Earth
Hello Worth
Hey
Green
mlzslzspppp
Fiitbill
mpzspzspppp
Kevin Cruijssen
la source
Est-ce que cela fonctionne pour l'entrée new String[]{'Rom Ro. Rom", "-Ro." , "+No."}? Juste écrire quelque chose qui (espérons-le) correspond à une mauvaise expression rationnelle.
Roman Gräf
@ RomanGräf Oui, fonctionne et sort Rom No. Rom. Btw, vous pouvez l'essayer vous-même en cliquant sur leTry it here. lien dans le post, puis en le forçant. :)
Kevin Cruijssen
Je sais mais je suis actuellement sur mon mobile. :(
Roman Gräf
2

PHP, 164 octets

preg_match_all("#^[^-+]+|-[\S]+|[+][\S]+#",$argv[1],$t);for($s=($a=$t[0])[0];++$i<$c=count($a)/2;)$s=str_replace(trim($a[+$i],"-"),trim($a[$i+$c^0],"+"),$s);echo$s;
Jörg Hülsermann
la source
2

Vim, 25 octets

qq+dE+r-PdiW:1s<C-R>"-g<CR>@qq@q

Suppose une entrée dans ce format:

mississippi
-is -i
+lz +p
  • +dE+r-PdiW: Combine -et +en registre unique, avec le +transformé en un- .
  • :1s<C-R>"-g: Utilise le registre comme extrait de code, inséré directement dans la :scommande, avec -comme séparateur.
udioica
la source
2

R, 98 94 octets

Edit: sauvé 4 octets grâce à @rturnbull

i=scan(,"");s=i[1];i=gsub("\\+|-","",i[-1]);l=length(i)/2;for(j in 1:l)s=gsub(i[j],i[l+j],s);s

Cas non testés et testés

Parce que scan(lit l'entrée de stdin) ne fonctionne pas correctement dans R-fiddle, je présente le programme en l'enveloppant dans une fonction à la place. Notez que la fonction prend un vecteur d'entrée et peut être exécuté par exemple: f(c("Hello world", "-wo", "-ld", "+Ea", "+th")). Le programme gofled ci-dessus inviterait l'utilisateur à entrer à l'aide de stdin, en tapant"Hello world" -wo -ld -Ea +th dans la console donnerait le même résultat.

Exécutez le code sur R-fiddle

f=function(i){
    s=i[1]                                   # Separate first element
    i=gsub("\\+|-","",i[-1])                 # Remove + and - from all elements except first, store as vector i
    l=length(i)/2                            # calculate the length of the vector i (should always be even)
    for(j in 1:l)s=gsub(i[j],i[l+j],s)       # iteratively match element j in i and substitute with element l+j in i
    s                                        # print to stdout
}
Billywob
la source
Pouvez-vous également fournir un lien vers la suite de tests, s'il vous plaît?
ʰᵈˑ
@ ʰᵈˑ a ajouté une suite de tests R-fiddle. Notez que la suite de tests utilise une fonction au lieu de lire les entrées de stdin comme expliqué dans la réponse modifiée.
Billywob
Cette réponse est-elle valable, car vous devez utiliser "autour de la chaîne d'entrée?
rturnbull
@rturnbull Je ne vois pas pourquoi. Envelopper chaque entrée avec des guillemets et en appuyant sur Entrée donnerait le résultat équivalent (par exemple:) "Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th"qui est généralement la façon dont les chaînes sont lues de toute façon.
Billywob
1
Ouais c'est vraiment à l'OP! Personnellement, j'aime votre réponse telle quelle, mais je craignais qu'elle ne soit pas valide. En regardant les réponses pour d'autres langues, il semble que les citations soient assez acceptées. Pendant que j'ai votre attention, je pense que vous pouvez jouer au golf sur 4 octets en modifiant et en mettant l=length(i)à l=length(i)/2jour les références ultérieures l.
rturnbull
2

Haskell, 85 78 octets

import Data.Lists
g=map tail.words
a#b=foldl(flip$uncurry replace)a.zip(g b).g

Exemple d'utilisation: ("mississippi" # "-is -i") "+lz +p"-> "mlzslzspppp".

Comment ça fonctionne:

g=map tail.words              -- helper function that splits a string into a
                              -- list of words (at spaces) and drops the first
                              -- char of each word

                zip(g b).g    -- make pairs of strings to be replaced and its
                              -- replacement
foldl(flip$uncurry replace)a  -- execute each replacement, starting with the
                              -- original string
                              -- -> "flip" flips the arguments of "uncurry replace"
                              --           i.e. string before pair of replacements
                              -- "uncurry" turns a function that expects two
                              --           lists into one that expects a list of pairs

Edit: @BlackCap a trouvé 6 octets à enregistrer et j'en ai moi-même un autre.

nimi
la source
6 octets: import Data.Lists;a#b=foldl(uncurry replaceflip)a.zip(g b).g;g=map tail.words
BlackCap
@BlackCap: Nice, merci! Pas besoin de faire d' flipinfixe. Le préfixe standard est un octet plus court.
nimi
1

Python 3, 93 octets

def f(s):
  s,m,p=s
  for n,o in zip(m.split(),p.split()):s=s.replace(n[1:],o[1:])
  return s

Essayez-le en ligne!

L'entrée est une liste de chaînes, les chaînes de remplacement sont séparées par des espaces.

Exemple d'entrée: ['mississippi','-is -i','+iz +p']

Gábor Fekete
la source
Pouvez-vous ajouter un lien de suite de tests, s'il vous plaît?
ʰᵈˑ
Lien fourni et taille également un peu réduite.
Gábor Fekete
1

PowerShell v2 +, 90 octets

param($a,$b,$c)-split$b|%{$a=$a-creplace($_-replace'-'),((-split$c)[$i++]-replace'\+')};$a

Prend l'entrée comme trois arguments, avec les chaînes -et +séparées par des espaces. Effectue un -spliton $b(le -splitquand il agit de façon unaire se divise sur les espaces blancs), puis passe en boucle |%{...}dans chacun d'eux. À chaque itération, nous supprimons le -, trouvant la [$i++]chaîne de remplacement suivante et le supprimant +de celui-ci, et en utilisant le -creplace(remplacement sensible à la casse) pour découper et couper en dés $aet le stocker dans $a. Ensuite, $aest laissé sur le pipeline et la sortie est implicite.

PS C:\Tools\Scripts\golfing> .\letter-replacement-challenge.ps1 'mississippi' '-is -i' '+iz +p'
mpzspzspppp

PS C:\Tools\Scripts\golfing> .\letter-replacement-challenge.ps1 'Hello world' '-wo -ld' '+Ea +th'
Hello Earth

PS C:\Tools\Scripts\golfing> .\letter-replacement-challenge.ps1 'Hello World' '-wo -ld' '+Ea +th'
Hello Worth
AdmBorkBork
la source
1

PHP, 106 octets

for($s=($v=$argv)[$i=1];$i++<$n=$argc/2;)$s=str_replace(substr($v[$i],1),substr($v[$n+$i-1],1),$s);echo$s;

approche directe. Courez avec php -r '<code> <arguments>.

Titus
la source