Większość języków ma wbudowaną funkcję wyszukiwania ciągu dla wszystkich wystąpień danego podłańcucha i zastąpienia go innym. Nie znam żadnego języka, który uogólniałby tę koncepcję na (niekoniecznie ciągłe) podsekwencje. To jest twoje zadanie w tym wyzwaniu.
Dane wejściowe będą się składały z trzech łańcuchów A
, B
a także C
, gdzie B
i C
na pewno, będą miały tę samą długość. Jeśli B
pojawia się jako podsekwencja A
, należy go zastąpić C
. Oto prosty przykład:
A: abcdefghijklmnopqrstuvwxyz
B: ghost
C: 12345
Byłoby przetwarzane w następujący sposób:
abcdefghijklmnopqrstuvwxyz
|| | ||
abcdef12ijklmn3pqr45uvwxyz
Jeśli istnieje kilka sposobów na znalezienie B
podsekwencji, należy koniecznie zastąpić skrajnie lewy:
A: abcdeedcba
B: ada
C: BOB
Result: BbcOeedcbB
and NOT: BbcdeeOcbB
To samo dotyczy sytuacji, w B
których można je znaleźć w wielu rozłącznych miejscach:
A: abcdeedcbaabcde
B: ed
C: 12
Result: abcd1e2cbaabcde
and NOT: abcd112cbaabc2e (or similar)
Kiedy B
nie pojawia się w A
, powinieneś wyjść A
niezmieniony.
Zasady
Jak wspomniano powyżej, wziąć trzy struny A
, B
a C
jako wejście i zastąpić lewej najwięcej występowanie B
jako podciąg w A
z C
, jeśli nie ma żadnych.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Możesz wziąć trzy ciągi znaków w dowolnej spójnej kolejności, którą powinieneś określić w swojej odpowiedzi. Możesz to założyć B
i C
mieć taką samą długość. Wszystkie ciągi będą zawierać tylko znaki alfanumeryczne.
Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
Każdy przypadek testowy jest cztery linie: A
, B
, C
a następnie wynik.
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
Tabela liderów
Fragment kodu u dołu tego postu generuje tabele wyników na podstawie odpowiedzi a) jako lista najkrótszych rozwiązań dla każdego języka oraz b) jako ogólna tabela wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](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]]
.Odpowiedzi:
Galaretka ,
232221 bajtówWypróbuj online! Zauważ, że w dwóch ostatnich przypadkach testowych zabraknie pamięci.
Weryfikacja
Jak to działa
źródło
Python 2, 88 bajtów
Funkcja, która przyjmuje trzy ciągi i przekazuje wynik do STDOUT. Ta funkcja po prostu przesuwa jeden ciąg znaków, pobierając odpowiedni znak i aktualizując go w
b,c
miarę upływu czasu .Do badania (po wymianie
print
zreturn
):źródło
Java 7, 141
Myślę, że mogę coś więcej z tym zrobić, ale na razie muszę uciekać. To tylko prosta iteracja / zamiana, z zachowaniem indeksu w A i B.
Biała przestrzeń dla Twojej przyjemności:
źródło
Whitespaced
tak, to całkowicie czytelnej<k?a:d
Lua, 121 bajtów
Proste rozwiązanie
gsub
pozwala nam iterować dokładnie jeden raz na każdym znaku i zastępować je w nowej instancji ciągu.Pobiera dane wejściowe za pomocą 3 argumentu wiersza poleceń i wysyła ciąg znaków do STDOUT.
Bez golfa
źródło
Python 3, 127 bajtów.
Zaoszczędź 16 bajtów dzięki Katenkyo.
Nadal nad tym trochę pracowałem, mężczyzna był o wiele bardziej paskudny, niż się spodziewałem.
Objaśnienie: Awww tak, rekurencja.
Przypadki testowe:
źródło
all(x in a for x in b)
sprawdzam również, czy elementy wb oraz a pojawiają się w tej samej kolejności, czy tylko jeśli są tutaj?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
zmusiłbyś do zaoszczędzenia niektórych bajtów?Python 3.5, 87 bajtów
repl.it, aby zweryfikować wszystkie przypadki testowe .
Jak to działa
'(.*?)'.join(p)
buduje wzorzec wyszukiwania, który pasuje do podsekwencji, która ma zostać zastąpiona, i wszystkiego między jej elementami.Ponieważ kwantyfikatory są leniwe, każdy
(.*?)
dopasuje jak najmniej znaków.Dla wzorca
ghost
konstruowane wyrażenie regularne tog(.*?)h(.*?)o(.*?)s(.*?)t
.'\g<%d>'.join(r)%(*range(1,len(r)),)
buduje ciąg zastępujący, używając formatowania ciągu.Każda
\g<n>
odnosi się do n- tej złapanej grupy, tak jak\n
by to zrobiła.Do zamiany
12345
skonstruowany ciąg to1\g<1>2\g<2>3\g<3>4\g<4>5
.re.sub(...,...,s,1)
wykonuje najwyżej jedną zamianę w ciągus
.źródło
Pyth, 27
Pakiet testowy
Zestaw testowy pomija dwa ostatnie przypadki, ponieważ zabraknie im pamięci. Zastosowany tutaj algorytm polega na znalezieniu wszystkich indeksów każdego znaku w drugim ciągu w pierwszym ciągu, a następnie znalezieniu wszystkich możliwych kolejności tych wskaźników i wzięciu tylko tych, które są posortowane. Następnie użyj pierwszego z nich w posortowanej kolejności jako listy indeksów w pierwszym ciągu, aby zaktualizować wartości z trzeciego ciągu.
Czuję, że powinno być coś krótszego niż
.nM*F
...źródło
MATL , 33 bajty
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6), 84 bajtów
Wyjaśnienie / test
Pokaż fragment kodu
źródło
JavaScript (ES6),
8476 bajtówPonieważ byłem pewien, że to zadanie dla RegExp.
Edycja: Zapisano 8 bajtów dzięki @ MartinBüttner ♦.
Port odpowiedzi Ruby @ KevinLau zajął 82 bajty:
Próbowałem także rekurencyjnego rozwiązania RegExp, ale zajęło to 90 bajtów:
źródło
Julia,
8970 bajtówKorzysta z indeksu
i
do iteracji po łańcuchach wzorca / zamiany. -19 bajtów dzięki @Dennis!źródło
C, 98 bajtów
/ * Rozszerzony kod * /
Argumentami są: i nput string, o bufor danych, s earch string, r eplacement.
Po zapamiętaniu początku wejścia i wyjścia przechodzimy przez dane wejściowe, zastępując i przyspieszając podstawienie za każdym razem, gdy trafimy na jeden. Na koniec, jeśli zabraknie podstawień, zwróć bufor wyjściowy, w przeciwnym razie niezmodyfikowane dane wejściowe.
/ * Testy * /
źródło
R, 76 bajtów
wykorzystuje
sub
do zastąpienia pierwszego dopasowaniaBez golfa
źródło
C ++, 204 bajty
Grał w golfa
Bez golfa
źródło
std
wystarczająco dużo, aby uzasadnić użycieusing namespace std;
. Użyciestd::cin
,std::cout
istd::string
pozwoli zaoszczędzić 5 bajtów, ponieważ wydaje się, że są to jedyne zastosowania tej przestrzeni nazw.b
wa
, ale późniejsze litery muszą być po wcześniejszych pism, jak również. (Spójrz na przypadek testowy 3 i porównaj go z wynikami, myślę, że zauważysz, że Twój kod wyświetliłby się,abc21ed...
gdy oczekiwany wynik toabcd1e2...
!)Siatkówka , 63 bajty
Wejście zostało zrobione w celu
B
,C
,A
, oddzielone karetki.Wypróbuj online.
źródło
Haskell, 87 bajtów
Zauważyłem brak odpowiedzi Haskella i postanowiłem to naprawić. Definiuje funkcję potrójną
!
z ciągiem argumentów wzorzec-zamiennik-ciąg. Wypróbuj tutaj.Wyjaśnienie
Funkcja pomocnicza
#
pobiera listęx
par znaków (wzorzec i zamiennik) oraz ciąg znakówy
. Jeśli znaki „wzorzec” wx
formie są podsekwencjąy
, zwraca pustą listę, ay
każdy znak wzorca zastępuje się swoim odpowiednikiem. W przeciwnym razie zwraca parę(x,y)
. Funkcja!
zamyka wzorce i łańcuchy zastępującex
, stosuje się#
dox
trzeciego łańcucha i zwraca drugi składnik wyniku.Jeśli wzorzec jest podciągiem łańcucha, kod działa w czasie O (n) , wykonując jeden cykl rekurencyjny przez ciąg i zachłannie konstruując zamianę w tym procesie. Jeśli jednak wzorzec nie jest podsekwencją, w najgorszym przypadku działa w czasie O (2 n ) . Wynika to z faktu, że w każdej pozycji, w której wzorzec i łańcuch mają pasujący znak, funkcja wywołuje samą siebie, aby sprawdzić, czy wzorzec jest faktycznie podsekwencją, dowiaduje się, że nie jest, i wywołuje się po raz drugi w celu obliczenia wyniku.
źródło
JavaScript (ES6),
10095 bajtówTo jest poprawna funkcja JavaScript Lambda. Wyjścia jako funkcja
return
. Pobiera trzy argumenty (a,b,c
). Dodajf=
na początku i wywołaj jakf(arg1,arg2,arg3)
.źródło
f=
chyba że twoja funkcja jest rekurencyjna, ale tak nie wygląda.a
nie będzie zawierało wzorca. Nie jestem również pewien, czy zwracanie tablicy ciągów jest dopuszczalne.C (gcc),
67626159 bajtówWypróbuj online!
źródło
Oktawa, 97 bajtów
Powtórz podsekwencję, aby zastąpić; znajdź pierwsze wystąpienie pierwszego znaku, znajdź następny znak w pozostałym ciągu, powtórz. Ciekawym tego jest:
Ponieważ ideone wciąż nie akceptuje funkcji o nazwach innych niż „”, zostawię tutaj próbkę. Dane wejściowe są wyświetlane tylko dla pierwszych kilku przypadków testowych dla zwięzłości.
key
jest oczekiwanym wyjściem,ans
jest wyjściem funkcji.źródło
D(t=...)
) wciąż mnie zastanawiają :-)Python 3, 123 bajtów
Inne podejście, którym chciałem się podzielić, czyli kilka bajtów krótszych. Nie ma żadnych reguł w stosunku do standardowej biblioteki / wyrażenia regularnego, prawda?
PS. To jest mój pierwszy golf. Daj mi znać o wszelkich problemach / ulepszeniach.
źródło
Pyth, 22 bajty
Sprawdź wszystkie przypadki testowe w kompilatorze Pyth .
tło
Budujemy wyrażenie regularne na podstawie wzoru, dodając
$
i umieszczając(.*?)
między wszystkimi znakami. Wyrażenie regularne będzie pasować do podsekwencji, która ma zostać zamieniona, i wszystkiego między jej elementami i wszystkiego aż do końca łańcucha.Ponieważ kwantyfikatory są leniwe, każdy
(.*?)
dopasuje jak najmniej znaków.Dla ducha wzorca skonstruowane wyrażenie jest
g(.*?)h(.*?)o(.*?)s(.*?)t(.*?)$
.Jeśli wzorzec pasuje do wejścia, wbudowane
r<str><regex>3
zwróci tablicę zawierającą przedmowę (wszystko przed podsekwencją), wszystkie przechwycone grupy (wszystko pomiędzy i po podsekwencji) oraz postmatch (pusty ciąg).Jeśli wzorzec nie pasuje, wbudowane zwróci tablicę singletonów zawierającą oryginalne dane wejściowe.
Jak to działa
źródło
Galaretka , 23 bajty
To dwa bajty dłużej niż moja inna odpowiedź na galaretkę , ale kończy się natychmiast. Wypróbuj online!
Weryfikacja
Jak to działa
źródło
CJam, 29 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
źródło
Java 7, 102 bajty
Szczegółowe spróbuj tutaj
źródło
Julia,
939086 bajtówKonieczność osobnego przetestowania, czy mecz był udany, niszczy wynik. Zmiana wymagałaby rzutowania na
Base.SubstitutionString
, co prawdopodobnie nie jest tego warte ...Testowe uruchomienie
źródło
Julia,
625958 bajtówI / O ma postać tablic znaków.
Weryfikacja
źródło
PHP,
130109 bajtówNadal chciałbym być krótszy; można zapisać 3 bajty (
""<
), jeśliB
gwarantuje się, że nie zawiera0
.pobiera argumenty z wiersza poleceń. Uruchom z
-r
.Zastępuje znaki, gdy je znajdzie;
drukuje kopię, jeśli wszystkie znaki zostały zastąpione; oryginał inny.
źródło
Ruby,
70645958 bajtówFunkcja anonimowa. Przejść przez ciąg
a
zbudować nowy ciąg z literami zastąpione zgodnie do następnego znaku wb
ic
, następnie, jeśli wszystkie znaki wb
są wyczerpane w końcu zwróci nowo skonstruowany ciąg, w przeciwnym razie zwraca oryginalny łańcuch.@histocrat pomógł zaoszczędzić 6 bajtów przez
gsub
.Zapisano 1 bajt dzięki @Cyoce.
Wypróbuj online!
źródło
-1+i+=1
z~-i+=1
Perl, 80 + 1 = 81 bajtów
Uruchom z
-p
flagąWypróbuj online!
Kod proceduralnie generuje polecenie wyszukiwania i zamiany wyrażenia regularnego, które następnie wykonuje w ostatnim bicie kodu.
Łańcuch
ghost
w pierwszym przykładzie zostaje zamieniony na łańcuchg(.*?)h(.*?)o(.*?)s(.*?)t(.*?)
, co oznacza, żeg
następuje 0 lub więcej znaków, po którychh
następuje 0 lub więcej znaków, a następnie itd.*?
Kwantyfikator oznacza, że wyszukiwanie nie powinno być zachłanne i „pożerać” ”jak najmniej znaków, zamiast domyślnego dopasowywania jak największej liczby znaków.Następnie ciąg
12345
zostaje przekształcony w1 .$1.2 .$2.3 .$3.4 .$4.5 .$5
, który jest oceniany po wykonaniu wyrażenia regularnego. Każda z nich$1,$2,$3,$4,$5
jest faktycznie odniesieniem do grupy przechwytywania (w nawiasach) od pierwszego ciągu.źródło
perl -pe 'eval"s/".<>=~s/.\K/(.*?)/gr."/".<>=~s/.\K/"\${".++$i."}"/gre."/"'
. Przyszedłem z tym sam, ale jest dość blisko ciebie, więc nie opublikuję tego, to byłyby dwie bardzo bliskie odpowiedzi, ale możesz edytować swoją!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 bajtów
Podstawowym
reduce
, nie jest zbyt zadowolony z tych wszystkich, długofirst
,rest
iconj
wywołań funkcji. Mając nadzieję na lepsze podejście.źródło