Écrivez un programme ou une fonction qui duplique des lettres dans un mot, de sorte que toutes les lettres dupliquées disposées de gauche à droite dans le mot forment le tableau d'entrée.
Par exemple:
input: chameleon, [c,a,l,n]
output: cchaamelleonn
Contribution
- Le mot de départ (par exemple
chameleon
)
- Un tableau de caractères (
[c,a,l,n]
) ou une chaîne pour représenter un tableau ( caln
), ou quelque chose de similaire
- L'entrée peut se faire via des paramètres de fonction, STDIN ou des équivalents de langue
- Toutes les entrées seront des lettres minuscules (az)
Sortie
Le mot changé
S'il existe plusieurs solutions, toutes peuvent être imprimées
input: banana [n,a]
possible outputs: bannaana, banannaa
|-|---------|-|--->[n,a]
Vous pouvez supposer que le mot d'entrée (pas nécessairement le tableau) aura les lettres dans le tableau (dans l'ordre)
Vous pouvez également supposer que les entrées n'ont pas de lettres consécutives qui sont les mêmes (PAS pomme, geek, vert, verre, porte ...)
Exemples
input: abcdefghij, [a,b,c]
output: aabbccdefghij
input: lizard, [i,a,r,d]
output: liizaarrdd
input: coconut, [c,o]
ouput: ccooconut or coccoonut or ccocoonut
input: onomatopoeia, [o,o,a,o,o]
output: oonoomaatoopooeia
input: onomatopoeia, [o,a,o]
output: oonomaatoopoeia or onoomaatoopoeia or oonomaatopooeia etc.
Le programme le plus court gagne!
Classement (merci à Martin Büttner pour l'extrait)
/* Configuration */
var QUESTION_ID = 51984; // 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";
/* App */
var answers = [], page = 1;
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 getAnswers() {
jQuery.ajax({
url: answersUrl(page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
if (data.has_more) getAnswers();
else process();
}
});
}
getAnswers();
var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^,]+)/;
function shouldHaveHeading(a) {
var pass = false;
var lines = a.body_markdown.split("\n");
try {
pass |= /^#/.test(a.body_markdown);
pass |= ["-", "="]
.indexOf(lines[1][0]) > -1;
pass &= LANGUAGE_REG.test(a.body_markdown);
} catch (ex) {}
return pass;
}
function shouldHaveScore(a) {
var pass = false;
try {
pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
} catch (ex) {}
return pass;
}
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
answers = answers.filter(shouldHaveScore)
.filter(shouldHaveHeading);
answers.sort(function (a, b) {
var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
answers.forEach(function (a) {
var headline = a.body_markdown.split("\n")[0];
//console.log(a);
var answer = jQuery("#answer-template").html();
var num = headline.match(NUMBER_REG)[0];
var size = (headline.match(SIZE_REG)||[0])[0];
var language = headline.match(LANGUAGE_REG)[1];
var user = getAuthorName(a);
if (size != lastSize)
lastPlace = place;
lastSize = size;
++place;
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", user)
.replace("{{LANGUAGE}}", language)
.replace("{{SIZE}}", size)
.replace("{{LINK}}", a.share_link);
answer = jQuery(answer)
jQuery("#answers").append(answer);
languages[language] = languages[language] || {lang: language, user: user, size: size, link: a.share_link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) 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: 50%;
float: left;
}
#language-list {
padding: 10px;
width: 50%px;
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="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>
[c,o,c,o]
plutôt que[c,o]
.#answer-list
et#language-list
largeur50%
pour éviter des colonnes qui se chevauchent dans votre extrait.bash
+sed
réponse): Est-ce illégal pourbanana, na
=>baannana
? Je pensais que «vous pouvez supposer que toutes les entrées auront les lettres dans le tableau (dans l'ordre)» est censé permettre , mais pas exiger , des réponses pour traiter les deux listes séquentiellement, mais @manatwork l'a interprété différemment.Réponses:
Pyth, 14 octets
Manifestation.
Style d'entrée:
Explication:
la source
Brainfuck,
4645 (63 avec caractères imprimables en entrée)Compatible avec le bff d' Alex Pankratov (interprète brainfuck utilisé sur SPOJ et ideone) et le BFI de Thomas Cort (utilisé sur Anarchy Golf).
La version imprimable prend d'abord le tableau sous forme de chaîne, suivie d'un onglet, suivie de la chaîne de départ sans retour à la ligne.
Démonstration sur ideone.
Nous pouvons enregistrer quelques octets en utilisant
\x00
comme séparateur au lieu de tabulation:la source
CJam, 15 octets
Essayez-le en ligne.
Comment ça marche
la source
C, 62 octets
Eh bien, c'est étonnamment compétitif.
Nous définissons une fonction
f(char*, char*)
qui prend la chaîne comme première entrée et le tableau de caractères à dupliquer comme deuxième entrée.Quelques codes de test:
Quelles impressions:
Essayez-le en ligne !
S'il est acceptable de soumettre une macro plutôt qu'une fonction, ce qui suit
#define g(s,c)
n'est que de 58 octets , mais nécessites
etc
doit être de véritables pointeurs:la source
CJam, 15 octets
Une approche CJam alternative. Essayez-le en ligne
Explication
Pour chaque caractère de la deuxième chaîne, nous faisons deux choses.
Fractionnez le suffixe actuel de la chaîne par le caractère, par exemple
"beeper" "e" -> ["b" "" "p" "r"]
Annule la première chaîne du tableau, insère deux du caractère, puis rejoint le reste du tableau avec le caractère, par exemple
"b" "ee" "eper"
. La dernière chaîne est le nouveau suffixe.la source
Rétine, 33 octets
Plus d'informations sur la rétine.
Cela attend les deux chaînes sur STDIN, séparées par une nouvelle ligne.
À des fins de comptage, chaque ligne va dans un fichier distinct,
\n
doit être remplacée par un caractère de nouvelle ligne réel (0x0A). Si vous voulez vraiment tester cela, il est plus pratique de le mettre dans un seul fichier où il\n
reste tel quel, puis d'appeler Retina avec l'-s
option avant de passer le fichier.Explication
(Obsolète ... J'ai réussi à me débarrasser du marqueur ... Je le mettrai à jour plus tard.)
Chaque paire de lignes est une substitution d'expression régulière (première ligne le motif, deuxième ligne la substitution).
Cela place un
#
comme marqueur au début de la chaîne d'entrée.Cela trouve la première lettre dans l'entrée (après le marqueur) correspondant à la lettre suivante à dupliquer, duplique cette lettre, déplace le marqueur derrière elle et supprime le premier caractère de la deuxième chaîne. L'
+`
avant indique à Retina de le faire à plusieurs reprises jusqu'à ce que la chaîne cesse de changer (dans ce cas, car la deuxième chaîne est vide et toutes les lettres requises ont été dupliquées).Enfin, nous nettoyons la chaîne en laissant tomber le marqueur.
la source
Python, 61
Une solution récursive gourmande. Enregistre
b
si la première lettre de la chaînes
est la première lettre de la chaînel
de lettres à doubler. Si c'est le cas, prenez une de ces lettres et ajoutez-la à l'appel récursif avec le reste des
, en supprimant le premier élément del
. Sinonb
, faites de même, mais ne doublez pas la lettre et n'enlevez pasl
.Le code vérifie
s[:1]==l[:1]
plutôt ques[0]==l[0]
d'éviter une erreur d'index hors limites lorsques
oul
est vide.la source
Prolog,
95837956 octetsExemple:
résultats
Edit: 4 octets enregistrés grâce à Oliphaunt
Edit2: 20 octets enregistrés à l'aide du
put/1
prédicat obsolète SWI-Prolog au lieu dewritef
. Enregistré en remplacement d' un octet à la fin de récursion prédicatd([],_).
àd(_,_).
. Ne fonctionnera pas si l'ordre des deux définitions ded
est inversé, mais nous ne nous en soucions pas dans le code golfé. Sauvegardé encore 2 octets en supprimant les parenthèses autourH=[A|T],put(A),d(S,T)
la source
H=[A|T]
. Aussi, pourquoi ne pas le rendre un peu plus lisible en remplaçant les espaces par des retours à la ligne?Python 2,
83747265 octetsPas de véritables astuces spéciales ici.
x
est la chaîne,y
est le tableau de caractères qui sont dupliqués.Pour clarifier si cela ne se copie pas correctement, le premier niveau de retrait est un espace, le suivant est un onglet.Édition 1: 9 octets enregistrés en utilisant la manipulation de chaînes au lieu de pop ().
Edit 2: enregistré 2 octets en utilisant
-~
pour incrémenterg
de 1.Edit 3: économisé 7 octets en utilisant une
y[:1]
astuce, merci à xnor pour cela!Vérifiez le ici.
Bien formaté et expliqué:
la source
y[:1]
.y=y[g:]
, donc "pas mal" est une exagération.y[:1]==c
. Est-ce que ça marche?Excel VBA, 110 octets
Ceci est ma première entrée sur CodeGolf, donc j'espère que ça va.
Vous entrez le mot d'entrée dans A1, puis les lettres à remplacer dans B1 et le mot résultant s'affiche dans une boîte de message.
la source
Haskell, 42 octets
Exemple d'utilisation:
Comment ça marche:
Si une chaîne est vide, le résultat est la première chaîne. Sinon: si les premiers caractères des chaînes correspondent, prenez-le deux fois et ajoutez un appel récursif avec la queue des chaînes. Si les caractères ne correspondent pas, prenez le premier caractère de la première chaîne et ajoutez un appel récursif avec la queue de la première chaîne et la même deuxième chaîne.
la source
Pyth,
1817 octetsDémo en direct.
1 octet enregistré grâce à @Jakube.
Explication:
Version originale:
Démo en direct pour l'original.
la source
Javascript, 47 octets
Profitant de certaines fonctionnalités ES6.
la source
onomatopoeia
,oao
?b.indexOf(d)==0
, essayez~b.search(d)
search
ne s'applique qu'aux chaînes. J'ai dû changer b en tableauPyth, 16 octets
Essayez-le en ligne: démonstration
C'est assez hacky. Les langues basées sur la pile pourraient avoir un avantage ici.
Explication
la source
JavaScript ES6, 47 octets
Suppose que
s
c'est un tableau["c","a","l","n"]
la source
> <> (Poisson) ,
6834 octetsVous pouvez l'exécuter sur http://fishlanguage.com/playground saisissant la chaîne comme pile initiale (avec "marks, ie" cameleon ") et le tableau de lettres supplémentaires comme pile d'entrée (no" marks ie caln).
N'oubliez pas d'appuyer sur le bouton Give pour amorcer la pile d'entrée.
EDIT: réduit de moitié! :)
la source
R, 119
D'après la réponse de @ Alex , celui-ci est plus court de quelques octets:
Ungolfed:
la source
Perl,
73625956Une approche entièrement nouvelle donne de bien meilleurs résultats. Pourtant, je parie que cela peut être plus court.
Appelez le
f('coconut', ['c','o'])
.Pour chaque caractère du tableau, recherchez la première occurrence et dupliquez-la, puis mettez tout en majuscule. Retournez ensuite la chaîne entière, convertie en minuscules.
EDIT: rasé quelques autres personnages en se débarrassant de
shift
etpop
.La version précédente:
la source
foreach
mot-clé est en fait un synonyme dufor
mot - clé, vous pouvez donc utiliser l'un ou l'autre." - Foreach Loops .)for
astuce. C'est en fait plus court maintenant.Rubis,
5247 octetsSolution:
f=->(s,a){s.chars.map{|c|c==a[0]?a.shift*2:c}.join}
Exemple:
p f.call('banana', ['n','a']) # => "bannaana"
Explication:
Forme Proc d'une méthode qui prend une chaîne comme premier argument et un tableau de caractères comme deuxième argument. Mappe un bloc sur un tableau de caractères dans l'argument chaîne, qui vérifie chaque caractère par rapport au premier élément du tableau de comparaison, et s'il existe une correspondance, supprime le premier élément du tableau de comparaison et le double.
mise à jour
f=->s,a{s.chars.map{|c|c==a[0]?a.shift*2:c}*''}
la source
s,a
. Et*''
est équivalent à.join
. C'est 5 octets économisés, mais je vous bat toujours par un (pour l'instant): DPerl, 51 octets
L'entrée est fournie via STDIN. La première entrée est le mot de départ (par exemple
chameleon
), la deuxième entrée est les lettres sous forme d'une seule chaîne (par exemplecaln
).Ce qui précède est juste une façon obscurcie (lire "plus jolie") de faire ce qui suit:
Au fur et à mesure que nous parcourons chaque lettre, nous remplaçons depuis le début du mot jusqu'à la lettre du mot source par juste la nouvelle lettre et ajoutons la correspondance (stockée dans
$&
) à notre résultat. Étant donné que la correspondance comprend la lettre et est ensuite remplacée par la lettre, chaque lettre finit par apparaître deux fois.Parce que STDIN ajoute un nouveau caractère de ligne à nos deux entrées, nous sommes garantis de capturer les restes du mot complet sur la dernière correspondance, c'est-à-dire le nouveau caractère de ligne.
la source
REGXY, 24 octets
Utilise REGXY , un langage basé sur la substitution d'expression régulière . L'entrée est supposée être le mot de départ et le tableau, séparés par des espaces (par exemple "cameleon caln").
Le programme fonctionne en faisant correspondre un caractère de la première chaîne avec le premier caractère après un espace. Si cela correspond, le caractère est répété dans la substitution et le caractère dans le tableau est supprimé (enfin, pas ajouté à nouveau dans la chaîne). Le traitement passe à la deuxième ligne, qui n'est qu'un pointeur vers la première ligne, ce qui provoque la répétition du traitement sur le résultat de la substitution précédente. Finalement, il n'y aura plus de caractères après l'espace, à quel point la deuxième branche de l'alternance correspondra, supprimant l'espace de fin du résultat. Le regex échouera alors à correspondre, le traitement est terminé et le résultat est retourné.
Si cela peut vous aider, les étapes d'exécution itératives sont les suivantes:
Le programme compile et s'exécute correctement avec l'exemple d'interpréteur dans le lien ci-dessus, mais la solution est peut-être un peu effrontée car elle repose sur une hypothèse dans le flou de la spécification de langue. La spécification indique que le premier jeton sur chaque ligne (avant le /) agit comme une étiquette, mais l'hypothèse est qu'un pointeur d'étiquette nul pointera vers 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:
Soit 27 octets
la source
JavaScript ES6, 72 octets
Il s'agit d'une fonction anonyme qui prend 2 paramètres: le mot de départ sous forme de chaîne et les caractères à étirer sous forme de tableau. Code non golfé qui utilise ES5 et testez l'interface utilisateur ci-dessous.
la source
Python 2, 77
Appelez comme:
J'ai peut-être mal compris le nombre d'octets ... Utilise un mélange d'espaces et de tabulations.
la source
rs, 39 octets
Plus d'informations sur rs.
Il y a déjà une réponse Retina, mais je pense que celle-ci utilise une approche légèrement différente. Ils ont également été créés séparément: lorsque j'ai commencé à travailler sur celui-ci, cette réponse n'avait pas été publiée.
De plus, celui-ci est de 6 octets de plus de toute façon. :)
Démo en direct et suite de tests.
la source
JavaScript, 92 characters
Unobfuscated version:
la source
R,
136128122 bytesThis creates an unnamed function that accepts a string and a character vector as input and prints a string to STDOUT. To call it, give it a name.
Ungolfed + explanation:
Examples:
Saved 8 bytes thanks to MickeyT and another 3 thanks to jja!
la source
cat(p,sep='')
to output straight to STDOUT for a couplemessage(p)
is shorter.message
, that's awesome! Thanks! Edited to use your suggestion.Bash+sed, 51
Input from stdin; characters to be doubled as a single argument:
This works by constructing a sed program from
$2
and then executing it against$1
. The sed program replaces the first occurrence of each replacement letter with two copies of its uppercase version, and downcases the whole lot at the end. For the example above, the generated sed program ispretty-printed:
I use the uppercase to mark characters processed so far; this avoids re-doubling characters that have already been doubled, or applying a doubling earlier than the previous one.
Earlier version, before clarification that order of replacement list is significant (44 chars):
la source
strtech na <<< banana
outputs “baannana”, but first an occurrence on “n” should be doubled, only after that an occurrence of “a”.Python,
5392 bytesFound my solution to be the same length in both Python 2 and 3.
EDIT: Man, fixing that case when doing multiple replaces of the same letter (while still using the same method) took a bit of work.
Python 2:
Try it here
Python 3:
la source
Mathematica, 66 bytes
Example:
la source
Lua,
767876755853 bytesNew, completely reworked solution with help from wieselkatze and SquidDev! come on guys, we can beat brainfuck :P
Explanation coming tommorow. Try it here.
Original solution: Saved 2 bytes thanks to @kirbyfan64sos!
Lua is a pretty terrible language to golf in, so I think I did pretty good for this one.
Code explanation, along with ungolfed version:
Try it here. (Outdated code but same concept, just less golfed, will update tommorow)
la source
function f(x,y)
and afterprint(x)
, saving you two bytes.