Schreiben Sie ein Programm oder eine Funktion, die Buchstaben in einem Wort dupliziert, sodass alle duplizierten Buchstaben, die im Wort von links nach rechts angeordnet sind, das Eingabearray bilden.
Beispielsweise:
input: chameleon, [c,a,l,n]
output: cchaamelleonn
Eingang
- Das Startwort (zB
chameleon
)
- Ein Array von Zeichen (
[c,a,l,n]
) oder eine Zeichenfolge zur Darstellung eines Arrays ( caln
) oder ähnliches
- Die Eingabe kann über Funktionsparameter, STDIN oder Sprachäquivalente erfolgen
- Alle Eingaben erfolgen in Kleinbuchstaben (az)
Ausgabe
Das veränderte Wort
Wenn es mehrere Lösungen gibt, kann jede gedruckt werden
input: banana [n,a]
possible outputs: bannaana, banannaa
|-|---------|-|--->[n,a]
Sie können davon ausgehen, dass das Eingabewort (nicht unbedingt das Array) die Buchstaben im Array enthält (in der angegebenen Reihenfolge).
Sie können auch davon ausgehen, dass die Eingaben keine aufeinander folgenden Buchstaben haben, die gleich sind (NICHT Apfel, Aussenseiter, Grün, Glas, Tür ...)
Beispiele
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.
Kürzeste Sendung gewinnt!
Leaderboard (Danke an Martin Büttner für das Snippet)
/* 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]
, eher als[c,o]
.#answer-list
und#language-list
Breite50%
zu überlappenden Spalten in Ihrem Snippet zu vermeiden.bash
+sed
Antwort): Ist es illegal fürbanana, na
=>baannana
? Ich war der Ansicht, dass "Sie davon ausgehen können, dass alle Eingaben die Buchstaben im Array (in der angegebenen Reihenfolge) enthalten" Antworten zulassen , aber nicht erfordern sollen , um beide Listen nacheinander zu verarbeiten. @Manatwork interpretierte sie jedoch unterschiedlich.Antworten:
Pyth, 14 Bytes
Demonstration.
Eingabestil:
Erläuterung:
quelle
Brainfuck,
4645 (63 mit druckbaren Zeichen in der Eingabe)Kompatibel mit Alex Pankratovs BFF (Brainfuck-Interpreter für SPOJ und Ideone) und Thomas Corts BFI (für Anarchy Golf).
In der druckbaren Version wird das Array zuerst als Zeichenfolge gefolgt von einem Tabulator gefolgt von der Startzeichenfolge ohne abschließende Zeilenumbrüche verwendet.
Demonstration auf ideone.
Wir können einige Bytes einsparen, indem wir
\x00
als Trennzeichen anstelle des Tabulators verwenden:quelle
CJam, 15 Bytes
Probieren Sie es online aus.
Wie es funktioniert
quelle
C 62 Bytes
Nun, das ist überraschend wettbewerbsfähig.
Wir definieren eine Funktion
f(char*, char*)
, die den String als erste Eingabe und das zu duplizierende Array von Zeichen als zweite Eingabe verwendet.Einige Testcodes:
Welche Drucke:
Probieren Sie es online !
Wenn es akzeptabel ist, ein Makro anstelle einer Funktion zu übergeben, ist das Folgende
#define g(s,c)
nur 58 Bytes , erfordert aber tatsächliche Zeigers
und mussc
diese sein:quelle
CJam, 15 Bytes
Ein alternativer CJam-Ansatz. Probieren Sie es online aus
Erläuterung
Für jedes Zeichen in der zweiten Zeichenfolge machen wir zwei Dinge.
Teilen Sie das aktuelle Suffix des Strings durch das Zeichen, z
"beeper" "e" -> ["b" "" "p" "r"]
Löscht die erste Zeichenfolge im Array, fügt zwei Zeichen ein und setzt den Rest des Arrays wieder mit dem Zeichen zusammen, z
"b" "ee" "eper"
. Die letzte Zeichenfolge ist das neue Suffix.quelle
Retina, 33 Bytes
Weitere Informationen zu Retina.
Das erwartet die zwei Zeichenfolgen auf STDIN, die von einem Newline getrennt werden.
Zu Zählzwecken wird jede Zeile in eine separate Datei geschrieben,
\n
die durch ein tatsächliches Zeilenumbruchzeichen (0x0A) ersetzt werden sollte. Wenn Sie dies tatsächlich testen möchten, ist es bequemer, dies in eine einzelne Datei zu\n
schreiben, in der es unverändert bleibt, und dann Retina mit der-s
Option aufzurufen, bevor Sie die Datei übergeben.Erläuterung
(Veraltet ... Ich habe es geschafft, den Marker loszuwerden ... Ich werde dies später aktualisieren.)
Jedes Zeilenpaar ist eine reguläre Ersetzung (erste Zeile das Muster, zweite Zeile die Ersetzung).
Dadurch wird ein
#
als Markierung am Anfang der Eingabezeichenfolge eingefügt.Dies findet den ersten Buchstaben in der Eingabe (nach der Markierung), der dem nächsten zu duplizierenden Buchstaben entspricht, dupliziert diesen Buchstaben, verschiebt die Markierung dahinter und legt das erste Zeichen der zweiten Zeichenfolge ab. Das
+`
Symbol an der Vorderseite weist Retina an, dies wiederholt zu tun, bis sich die Zeichenfolge nicht mehr ändert (in diesem Fall, weil die zweite Zeichenfolge leer ist und alle erforderlichen Buchstaben dupliziert wurden).Zum Schluss räumen wir den String auf, indem wir den Marker fallen lassen.
quelle
Python, 61
Eine gierige rekursive Lösung. Speichert,
b
ob der erste Buchstabe der Zeichenfolges
der erste Buchstabe derl
zu verdoppelnden Zeichenfolge ist . Wenn ja, nehmen Sie einen dieser Buchstaben und stellen Sie ihn vor den rekursiven Aufruf mit dem Rest vons
und entfernen Sie das erste Element vonl
. Wenn nichtb
, machen Sie dasselbe, aber verdoppeln Sie den Buchstaben nicht und entfernen Sie ihn nicht vonl
.Der Code prüft
s[:1]==l[:1]
anstatts[0]==l[0]
einen Indexfehler zu vermeiden, wenns
oderl
leer ist.quelle
Prolog
95,837956 BytesBeispiel:
kehrt zurück
Bearbeiten: 4 Bytes dank Oliphaunt gespeichert
Edit2: 20 Bytes mit dem veralteten
put/1
SWI-Prolog-Prädikat statt gespeichertwritef
. 1 Byte gespeichert, das das Rekursionsendprädikatd([],_).
von ersetztd(_,_).
. Funktioniert nicht, wenn die Reihenfolge der beiden Definitionen vond
vertauscht ist, aber das ist uns im Golfcode egal. Weitere 2 Bytes gespeichert, wobei die Klammern entfernt wurdenH=[A|T],put(A),d(S,T)
quelle
H=[A|T]
. Machen Sie es außerdem ein wenig lesbarer, indem Sie die Leerzeichen durch Zeilenumbrüche ersetzen.Python 2,
83747265 BytesHier gibt es keine besonderen Tricks.
x
ist die Zeichenfolge,y
ist das Array von Zeichen, die dupliziert werden.Um zu klären, ob dies nicht richtig kopiert wurde, ist die erste Einrückungsstufe ein Leerzeichen, die nächste ein Tabulator.Edit 1: 9 Bytes mit String-Manipulation anstelle von pop () gespeichert.
2 bearbeiten: 2 Bytes mit gespeichert,
-~
umg
um 1 zu erhöhen .Edit 3: 7 Bytes mit
y[:1]
Trick gespeichert, danke an xnor dafür!Schau es dir hier an.
Richtig formatiert und erklärt:
quelle
y[:1]
.y=y[g:]
so macht. " Nicht wenige" sind also eine Übertreibung.y[:1]==c
. Funktioniert es?Excel VBA, 110 Bytes
Dies ist mein erster Einstieg in CodeGolf, also hoffe ich, dass dies in Ordnung ist.
Sie geben das eingegebene Wort in A1 ein und anschließend die zu ersetzenden Buchstaben in B1. Das resultierende Wort wird in einem Meldungsfeld angezeigt.
quelle
Haskell, 42 Bytes
Anwendungsbeispiel:
Wie es funktioniert:
Wenn eine Zeichenfolge leer ist, ist das Ergebnis die erste Zeichenfolge. Andernfalls: Wenn die ersten Zeichen der Zeichenfolgen übereinstimmen, nehmen Sie sie zweimal und fügen Sie einen rekursiven Aufruf mit den Enden der Zeichenfolgen hinzu. Wenn die Zeichen nicht übereinstimmen, nehmen Sie das erste Zeichen der ersten Zeichenfolge und fügen Sie einen rekursiven Aufruf mit dem Ende der ersten Zeichenfolge und derselben zweiten Zeichenfolge hinzu.
quelle
Pyth,
1817 BytesLive-Demo.
1 Byte dank @Jakube gespeichert.
Erläuterung:
Originalfassung:
Live-Demo für Original.
quelle
Javascript, 47 Bytes
Nutzung einiger ES6-Funktionen.
quelle
onomatopoeia
,oao
?b.indexOf(d)==0
Versuchen Sie stattdessen~b.search(d)
search
gilt nur für Zeichenfolgen. Musste b in ein Array ändernPyth, 16 Bytes
Probieren Sie es online aus: Demonstration
Das ist ziemlich abgedreht. Stack-basierte Sprachen könnten hier einen Vorteil haben.
Erläuterung
quelle
JavaScript ES6, 47 Bytes
Angenommen,
s
ist ein Array["c","a","l","n"]
quelle
> <> (Fisch) ,
6834 BytesSie können es unter http://fishlanguage.com/playground ausführen, indem Sie den String als Anfangsstapel (mit "Marken", dh "Chamäleon") und das Array zusätzlicher Buchstaben als Eingangsstapel (ohne "Marken", dh "Caln") eingeben.
Vergessen Sie nicht, die Give-Taste zu drücken, um den Eingabestapel zu setzen.
EDIT: Halbiert es! :)
quelle
R 119
Basierend auf der Antwort von @ Alex ist diese um ein paar Bytes kürzer:
Ungolfed:
quelle
Perl,
73,62,59,56Ein völlig neuer Ansatz führt zu viel besseren Ergebnissen. Trotzdem wette ich, dass es kürzer sein kann.
Anrufen als
f('coconut', ['c','o'])
.Suchen Sie für jedes Zeichen im Array das erste Vorkommen, duplizieren Sie es und setzen Sie alles in Großbuchstaben um. Geben Sie dann die gesamte Zeichenfolge zurück, die in Kleinbuchstaben konvertiert wurde.
BEARBEITEN: Rasiert ein paar weitere Charaktere, indem
shift
und entfernt werdenpop
.Die vorherige Version:
quelle
foreach
Schlüsselwort ist eigentlich ein Synonym für dasfor
Schlüsselwort, Sie können also auch eines verwenden." - Foreach Loops .)for
Hinweis. Es ist jetzt tatsächlich kürzer.Rubin,
5247 BytesLösung:
f=->(s,a){s.chars.map{|c|c==a[0]?a.shift*2:c}.join}
Beispiel:
p f.call('banana', ['n','a']) # => "bannaana"
Erläuterung:
Proc-Form einer Methode, die als erstes Argument einen String und als zweites Argument ein Array von Zeichen verwendet. Ordnet einen Block einem Array der Zeichen im Zeichenfolgenargument zu, das jedes Zeichen mit dem ersten Element des Vergleichsarrays vergleicht. Wenn eine Übereinstimmung vorliegt, wird das erste Element des Vergleichsarrays entfernt und verdoppelt.
aktualisieren
f=->s,a{s.chars.map{|c|c==a[0]?a.shift*2:c}*''}
quelle
s,a
. Und*''
ist gleichbedeutend mit.join
. Das ist 5 Bytes gespeichert, aber ich immer noch schlagen Sie von einem (bis jetzt): DPerl, 51 Bytes
Die Eingabe erfolgt über STDIN. Die erste Eingabe ist das Startwort (z. B.
chameleon
), die zweite Eingabe sind die Buchstaben als einzelne Zeichenfolge (zcaln
. B. ).Das Obige ist nur eine verschleierte ("hübschere") Methode, um Folgendes zu tun:
Während wir jeden Buchstaben durchgehen, ersetzen wir vom Wortanfang bis zum Buchstaben im Quellwort nur den neuen Buchstaben und hängen die Übereinstimmung (gespeichert in
$&
) an unser Ergebnis an. Da die Übereinstimmung den Buchstaben enthält und dann durch den Buchstaben ersetzt wird, erscheint jeder Buchstabe zweimal.Da STDIN an beide Eingaben ein neues Zeilenzeichen anfügt, erfassen wir garantiert die Reste des vollständigen Wortes der letzten Übereinstimmung, dh des neuen Zeilenzeichens.
quelle
REGXY, 24 Bytes
Verwendet REGXY , eine auf Regex-Substitution basierende Sprache. Es wird angenommen, dass die Eingabe das Startwort und das durch Leerzeichen getrennte Array ist (z. B. "Chamäleon Caln").
Das Programm vergleicht ein Zeichen in der ersten Zeichenfolge mit dem ersten Zeichen nach einem Leerzeichen. Wenn dies zutrifft, wird das Zeichen in der Ersetzung wiederholt und das Zeichen im Array wird entfernt (also nicht zurück in die Zeichenfolge angehängt). Die Verarbeitung wird in die zweite Zeile verschoben, die nur einen Zeiger zurück auf die erste Zeile darstellt, wodurch die Verarbeitung für das Ergebnis der vorherigen Ersetzung wiederholt wird. Eventuell gibt es nach dem Leerzeichen keine Zeichen. An diesem Punkt stimmt der zweite Zweig der Abwechslung überein, wodurch das nachfolgende Leerzeichen aus dem Ergebnis entfernt wird. Der reguläre Ausdruck stimmt dann nicht überein, die Verarbeitung ist abgeschlossen und das Ergebnis wird zurückgegeben.
Wenn es hilft, sind die iterativen Schritte der Ausführung wie folgt:
Das Programm wird mit dem Beispielinterpreter im obigen Link korrekt kompiliert und ausgeführt, aber die Lösung ist möglicherweise etwas frech, da sie auf einer Annahme beruht, dass die Sprachspezifikation nicht genau ist. Die Spezifikation gibt an, dass das erste Token in jeder Zeile (vor dem /) als Beschriftung fungiert. Es wird jedoch davon ausgegangen, dass ein Null-Beschriftungszeiger auf den ersten Befehl in der Datei mit einer Null-Beschriftung verweist (oder mit anderen Worten, das 'null' ist ein gültiges Etikett). Eine weniger freche Lösung wäre:
Das sind 27 Bytes
quelle
JavaScript ES6, 72 Byte
Dies ist eine anonyme Funktion, die zwei Parameter verwendet: das Startwort als Zeichenfolge und die Zeichen, die als Array gespannt werden sollen. Ungolfed-Code, der ES5 verwendet und die unten stehende Benutzeroberfläche testet.
quelle
Python 2, 77
Anrufen als:
Möglicherweise ist die Anzahl der Bytes furchtbar falsch ... Verwendet eine Mischung aus Leerzeichen und Tabulatoren.
quelle
rs, 39 bytes
Weitere Informationen zu rs.
Es gibt bereits eine Retina-Antwort, aber ich denke, diese verwendet einen etwas anderen Ansatz. Sie wurden auch separat erstellt: Als ich anfing, an dieser zu arbeiten, war diese Antwort noch nicht veröffentlicht worden.
Außerdem ist dieser ohnehin 6 Bytes länger. :)
Live-Demo und Testsuite.
quelle
JavaScript, 92 Zeichen
Freie Version:
quelle
R,
136128122 BytesDadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge und einen Zeichenvektor als Eingabe akzeptiert und eine Zeichenfolge an STDOUT ausgibt. Um es zu nennen, geben Sie ihm einen Namen.
Ungolfed + Erklärung:
Beispiele:
8 Bytes dank MickeyT und weitere 3 dank jja!
quelle
cat(p,sep='')
könntest es benutzen, um ein paar direkt an STDOUT auszugebenmessage(p)
ist kürzer.message
, das ist großartig! Vielen Dank! Bearbeitet, um Ihren Vorschlag zu verwenden.Bash + sed, 51
Eingabe von stdin; Zeichen, die als einzelnes Argument verdoppelt werden sollen:
Dies funktioniert, indem ein sed-Programm erstellt
$2
und dann ausgeführt wird$1
. Das sed-Programm ersetzt das erste Vorkommen jedes Ersetzungsbuchstabens durch zwei Kopien seiner Großbuchstaben und setzt am Ende das gesamte Los zurück. Im obigen Beispiel lautet das generierte sed-Programmhübsch gedruckt:
Ich benutze den Großbuchstaben, um Zeichen zu markieren, die bisher verarbeitet wurden. Dies vermeidet das erneute Verdoppeln von Zeichen, die bereits verdoppelt wurden, oder das Anwenden einer Verdopplung vor der vorherigen.
Frühere Version, vor der Klarstellung, dass die Reihenfolge der Ersatzliste wichtig ist (44 Zeichen):
quelle
strtech na <<< banana
gibt "baannana" aus, aber zuerst sollte ein Vorkommen auf "n" verdoppelt werden, erst danach ein Vorkommen von "a".Python,
5392 BytesIch habe festgestellt, dass meine Lösung in Python 2 und 3 gleich lang ist.
BEARBEITEN: Mann, diesen Fall zu beheben, wenn mehrere Ersetzungen desselben Buchstabens durchgeführt werden (während immer noch dieselbe Methode angewendet wird), war ein wenig arbeitsaufwendig.
Python 2:
Probieren Sie es hier aus
Python 3:
quelle
Mathematica, 66 Bytes
Beispiel:
quelle
Lua,
767876755853 BytesNeue, komplett überarbeitete Lösung mit Hilfe von Wieselkatze und SquidDev! komm schon Jungs, wir können Brainfuck schlagen: P
Erklärung kommt morgen. Probieren Sie es hier aus.
Originelle Lösung: 2 Bytes gespart dank @ kirbyfan64sos!
Lua ist eine ziemlich schreckliche Sprache zum Golfspielen, deshalb denke ich, dass ich für diese eine ziemlich gute Sprache gemacht habe.
Code Erklärung, zusammen mit der ungolfed Version:
Probieren Sie es hier aus. (Veralteter Code, aber dasselbe Konzept, nur weniger erfolgreich, wird morgen aktualisiert.)
quelle
function f(x,y)
und nach entfernen undprint(x)
sparen Sie zwei Bytes.