La plupart des langues sont livrées avec une fonction intégrée pour rechercher dans une chaîne toutes les occurrences d'une sous-chaîne donnée et remplacer celles-ci par une autre. Je ne connais aucun langage qui généralise ce concept aux sous-séquences (pas nécessairement contiguës). Voilà donc votre tâche dans ce défi.
L'entrée sera composée de trois chaînes A
, B
et C
, où B
et C
sont garantis d'être de la même longueur. Si B
apparaît en tant que sous-séquence, A
il doit être remplacé par C
. Voici un exemple simple:
A: abcdefghijklmnopqrstuvwxyz
B: ghost
C: 12345
Il serait traité comme ceci:
abcdefghijklmnopqrstuvwxyz
|| | ||
abcdef12ijklmn3pqr45uvwxyz
S'il existe plusieurs façons de rechercher B
une sous-séquence, vous devez remplacer avidement la plus à gauche:
A: abcdeedcba
B: ada
C: BOB
Result: BbcOeedcbB
and NOT: BbcdeeOcbB
La même chose s'applique si elle B
peut être trouvée dans plusieurs endroits disjoints:
A: abcdeedcbaabcde
B: ed
C: 12
Result: abcd1e2cbaabcde
and NOT: abcd112cbaabc2e (or similar)
Lorsque B
n'apparaît pas dans A
, vous devez sortir A
inchangé.
Règles
Comme indiqué ci-dessus, prenez trois chaînes A
, B
et C
comme entrée et remplacez l'occurrence la plus à gauche de B
comme sous-séquence A
avec C
, s'il y en a.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
Vous pouvez prendre les trois chaînes dans n'importe quel ordre cohérent que vous devez spécifier dans votre réponse. Vous pouvez supposer queB
et C
avoir la même longueur. Toutes les chaînes ne contiendront que des caractères alphanumériques.
la norme règles de code-golf s'appliquent.
Cas de test
Chaque cas de test est de quatre lignes: A
, B
, C
suivi par le résultat.
abcdefghijklmnopqrstuvwxyz
ghost
12345
abcdef12ijklmn3pqr45uvwxyz
abcdeedcba
ada
BOB
BbcOeedcbB
abcdeedcbaabcde
ed
12
abcd1e2cbaabcde
121
121
aBc
aBc
abcde
acb
123
abcde
ABC
ABCD
1234
ABC
012345678901234567890123456789
42
TT
0123T5678901T34567890123456789
edcbaedcbaedcbaedcba
abcde
12345
edcbaedcbaedcbaedcba
edcbaedcbaedcbaedcbaedcba
abcde
12345
edcb1edc2aed3bae4cba5dcba
daccdedca
ace
cra
dcrcdadca
aacbcbabcccaabcbabcaabbbbca
abaaaccbac
1223334444
aacbcbabcccaabcbabcaabbbbca
aacbcbabcccaabcbabcaabbbbcac
abaaaccbac
1223334444
1ac2cb2bccc33b3bab4aa4bbbc44
Classement
L'extrait de pile au bas de cet article génère des classements à partir des réponses a) comme une liste des solutions les plus courtes par langue et b) comme un classement général.
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
où N
est 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 si 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 code:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
/* Configuration */
var QUESTION_ID = 77719; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8478; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "http://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "http://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
else console.log(body);
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
lang = jQuery('<a>'+lang+'</a>').text();
languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
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="language-list">
<h2>Shortest Solution 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>
<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>
<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>
[[1], [2], [3]]
.Réponses:
Gelée ,
232221 octetsEssayez-le en ligne! Notez que les deux derniers cas de test manqueront de mémoire.
Vérification
Comment ça marche
la source
Python 2, 88 octets
Une fonction qui prend les trois chaînes et renvoie le résultat à STDOUT. La fonction passe simplement sur la chaîne, en prenant le caractère approprié et en mettant
b,c
à jour au fur et à mesure.Pour les tests (après avoir remplacé le
print
parreturn
):la source
Java 7, 141
Je pense que je peux en faire plus, mais je dois courir pour l'instant. C'est juste une simple itération / remplacement, en gardant un index dans A et B.
Espace pour votre plaisir:
la source
Whitespaced
oui, c'est totalement lisiblej<k?a:d
Lua, 121 octets
Solution simple,
gsub
nous permet d'itérer exactement une fois sur chaque caractère et de les remplacer dans une nouvelle instance de la chaîne.Il prend l'entrée via 3 arguments de ligne de commande et génère une chaîne vers STDOUT.
Non golfé
la source
Python 3, 127 octets.
16 octets enregistrés grâce à Katenkyo.
Travaillant toujours un peu dessus, l'homme était plus méchant que je ne le pensais.
Explication: Awww ouais, récursivité.
Cas de test:
la source
all(x in a for x in b)
vérifie également que les éléments en b et a apparaissent dans le même ordre, ou seulement s'ils sont ici?return a.replace(b[0],c[0],1)[:l(b[0])+1]+f(a[l(b[0])+1:],b[1:],c[1:])if b and all(x in a for x in b)else a
vous ferait-il pas économiser quelques octets?Python 3.5, 87 octets
repl.it pour vérifier tous les cas de test .
Comment ça marche
'(.*?)'.join(p)
construit un modèle de recherche qui correspond à la sous-séquence à remplacer et à tout ce qui se trouve entre ses éléments.Comme les quantificateurs sont paresseux, chacun
(.*?)
correspondra au moins de caractères possible.Pour le modèle
ghost
, l'expression régulière construite estg(.*?)h(.*?)o(.*?)s(.*?)t
.'\g<%d>'.join(r)%(*range(1,len(r)),)
construit la chaîne de remplacement, en utilisant le formatage de la chaîne.Chacun
\g<n>
fait référence au n ème groupe capturé, tout comme\n
ferait.Pour le remplacement
12345
, la chaîne construite est1\g<1>2\g<2>3\g<3>4\g<4>5
.re.sub(...,...,s,1)
effectue au plus un remplacement dans la chaînes
.la source
Pyth, 27
Suite de tests
La suite de tests omet les deux derniers cas car ils manqueront de mémoire. L'algorithme utilisé ici consiste à rechercher tous les indices de chaque caractère dans la deuxième chaîne de la première chaîne, puis à trouver tous les ordres possibles de ces indices et à ne prendre que ceux qui sont triés. Utilisez ensuite le premier de ceux-ci dans l'ordre trié comme liste d'index dans la première chaîne pour mettre à jour avec les valeurs de la troisième chaîne.
Je pense qu'il devrait y avoir quelque chose de plus court que
.nM*F
...la source
MATL , 33 octets
Essayez-le en ligne!
Explication
la source
JavaScript (ES6), 84 octets
Explication / test
Afficher l'extrait de code
la source
JavaScript (ES6),
8476 octetsParce que j'étais sûr que c'était un travail pour RegExp.
Edit: 8 octets enregistrés grâce à @ MartinBüttner ♦.
Un port de la réponse Ruby de @ KevinLau a pris 82 octets:
J'ai également essayé une solution RegExp récursive mais qui a pris 90 octets:
la source
Julia,
8970 octetsUtilise un index
i
pour parcourir les chaînes de modèle / remplacement au fur et à mesure. -19 octets grâce à @Dennis!la source
C, 98 octets
/ * Code développé * /
Les arguments sont: i nput chaîne, o tampon utput, s chaîne echerchez, r eplacement.
Après avoir mémorisé le début de l'entrée et de la sortie, nous parcourons l'entrée, remplaçant et avançant la substitution chaque fois que nous en frappons une. À la fin, si nous n'avons plus de substitutions, renvoyez le tampon de sortie, sinon l'entrée non modifiée.
/ * Tests * /
la source
R, 76 octets
utilise
sub
pour remplacer la première correspondanceNon golfé
la source
C ++, 204 octets
Golfé
Non golfé
la source
std
assez pour justifier l'utilisationusing namespace std;
. L'utilisation destd::cin
,std::cout
etstd::string
économisera 5 octets, car ceux-ci semblent être les seules utilisations de cet espace de noms.b
dea
, mais les dernières lettres doivent également être postérieures aux premières. (Regardez le cas de test 3 et comparez avec votre sortie, je pense que vous constaterez que votre code sortiraitabc21ed...
quand la sortie attendue estabcd1e2...
!)Rétine , 63 octets
L'entrée est prise dans l'ordre
B
,C
,A
, séparés par des sauts de ligne.Essayez-le en ligne.
la source
Haskell, 87 octets
J'ai remarqué l'absence de réponse Haskell et j'ai décidé de corriger cela. Ceci définit une fonction ternaire
!
avec une chaîne de remplacement de motif d'ordre des arguments. Essayez-le ici.Explication
La fonction auxiliaire
#
prend une listex
de paires de caractères (modèle et remplacement) et une chaîney
. Si les caractères "modèle"x
forment une sous-séquence dey
, il retourne la liste vide ety
avec chaque caractère modèle remplacé par son homologue. Sinon, il renvoie la paire(x,y)
. La fonction!
zippe le modèle et les chaînes de remplacement dansx
, s'applique#
àx
et à la troisième chaîne et renvoie le deuxième composant du résultat.Si le modèle est une sous-séquence de la chaîne, le code s'exécute en temps O (n) , effectuant un passage récursif à travers la chaîne et construisant avidement le remplacement dans le processus. Cependant, si le motif n'est pas une sous-séquence, il s'exécute en temps O (2 n ) dans le pire des cas. En effet, à chaque position où le motif et la chaîne ont un caractère correspondant, la fonction s'appelle pour vérifier si le motif est réellement une sous-séquence, découvre que ce n'est pas le cas et s'appelle une deuxième fois pour calculer réellement le résultat.
la source
JavaScript (ES6),
100 à95 octetsIl s'agit d'une fonction Lambda JavaScript valide. Sorties comme fonction
return
. Prend trois arguments (a,b,c
). Ajoutezf=
au début et invoquez commef(arg1,arg2,arg3)
.la source
f=
sauf si votre fonction est récursive, mais elle ne semble pas l'être.a
ne contient pas le modèle. Je ne suis pas sûr non plus que le retour d'un tableau de chaînes soit acceptable.C (gcc),
67626159 octetsEssayez-le en ligne!
la source
Octave, 97 octets
Itérer sur la sous-séquence à remplacer; rechercher la première occurrence du premier caractère, rechercher le caractère suivant dans la chaîne restante, répéter. Le seul élément intéressant de ceci est:
Comme ideone n'accepte toujours pas les fonctions avec des noms autres que '', je vais laisser un exemple ici. Par souci de concision, les entrées ne sont affichées que pour les premiers cas de test.
key
est la sortie attendue,ans
est la sortie de la fonction.la source
D(t=...)
) continuent de me intriguer :-)Python 3, 123 octets
Une approche différente que je voulais partager, qui est plus courte de quelques octets. Il n'y a pas de règles contre les bibliothèques / expressions régulières standard, non?
PS. Ceci est mon premier golf. Faites-moi part de tout problème / amélioration.
la source
Pyth, 22 octets
Vérifiez tous les cas de test dans le compilateur Pyth .
Contexte
Nous construisons une expression régulière à partir du modèle en ajoutant un
$
et en plaçant(.*?)
entre tous les caractères. Cette expression régulière fera correspondre la sous-séquence à remplacer et tout ce qui se trouve entre ses éléments, et tout ce qui se trouve jusqu'à la fin de la chaîne.Étant donné que les quantificateurs sont paresseux, chacun
(.*?)
correspondra au moins de caractères possible.Pour le fantôme modèle, l'expression régulière construite est
g(.*?)h(.*?)o(.*?)s(.*?)t(.*?)$
.Si le modèle correspond à l'entrée, la fonction intégrée
r<str><regex>3
renverra un tableau contenant le prématch (tout avant la sous-séquence), tous les groupes capturés (tout entre et après la sous-séquence) et le postmatch (la chaîne vide).Si le modèle ne correspond pas, la fonction intégrée renverra un tableau singleton contenant l'entrée d'origine.
Comment ça marche
la source
Gelée , 23 octets
C'est deux octets de plus que mon autre réponse Jelly , mais cela se termine instantanément.Essayez-le en ligne!
Vérification
Comment ça marche
la source
CJam, 29 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
la source
Java 7, 102 octets
Essai détaillé ici
la source
Julia,
939086 octetsDevoir tester séparément si le match a réussi détruit un peu le score. Une substitution nécessiterait un casting
Base.SubstitutionString
, ce qui n'en vaut probablement pas la peine ...Essai
la source
Julia,
625958 octetsLes E / S se présentent sous la forme de tableaux de caractères.
Vérification
la source
PHP,
130109 octetsJe l'aimerais encore plus court; pourrait enregistrer 3 octets (
""<
) s'ilB
était garanti de ne pas contenir0
.prend les arguments de la ligne de commande. Courez avec
-r
.Remplace les personnages lorsqu'il les trouve;
imprime une copie si tous les caractères ont été remplacés; original autrement.
la source
Rubis,
70645958 octetsFonction anonyme. Parcourez la chaîne
a
pour créer une nouvelle chaîne avec des lettres remplacées conformément au caractère suivant dansb
etc
, alors si tous les caractèresb
sont épuisés à la fin, le retour de la chaîne nouvellement construit, sinon retourner la chaîne d' origine.@histocrat a permis d'économiser 6 octets via
gsub
.1 octet enregistré grâce à @Cyoce.
Essayez-le en ligne!
la source
-1+i+=1
par~-i+=1
Perl, 80 + 1 = 81 octets
Courir avec le
-p
drapeauEssayez-le en ligne!
Le code génère de manière procédurale une commande de recherche et de remplacement de regex, qu'il exécute ensuite dans le dernier bit de code.
La chaîne
ghost
du premier exemple est transformée en chaîneg(.*?)h(.*?)o(.*?)s(.*?)t(.*?)
, ce qui signifie ung
suivi de 0 ou plusieurs caractères, suivi d'unh
suivi de 0 ou plusieurs caractères, suivi de etc. Le*?
quantificateur signifie que la recherche doit être non gourmande et "engloutir" "le moins de caractères possible, au lieu de la valeur par défaut de correspondance autant que possible.La chaîne est
12345
ensuite transformée en1 .$1.2 .$2.3 .$3.4 .$4.5 .$5
, qui est évaluée après l'exécution de l'expression régulière. Chacun$1,$2,$3,$4,$5
est en fait une référence arrière à un groupe de capture (entre parenthèses) à partir de la première chaîne.la source
perl -pe 'eval"s/".<>=~s/.\K/(.*?)/gr."/".<>=~s/.\K/"\${".++$i."}"/gre."/"'
. Je l'ai rencontré moi-même, mais il est assez proche du vôtre, donc je ne le posterai pas, ce serait deux réponses très proches, mais n'hésitez pas à modifier le vôtre!perl -E 'chomp(($f,$t,$s)=(<>));$f=join"(.*?)",split"",$f;@r=split"",$t;@t=shift@r;push@t,"\${",++$x,"}"for(@r);$t=join"",@t;say$s=~s/$f/$t/r;'
Clojure, 113 octets
Une base
reduce
, pas trop content de tous les tempsfirst
,rest
et lesconj
appels de fonction. Espérant voir une meilleure approche.la source