Napisz program lub funkcję, która powiela litery w słowie, aby wszystkie zduplikowane litery ułożone od lewej do prawej słowa tworzyły tablicę wejściową.
Na przykład:
input: chameleon, [c,a,l,n]
output: cchaamelleonn
Wkład
- Słowo początkowe (np.
chameleon
)
- Tablica znaków (
[c,a,l,n]
) lub ciąg znaków reprezentujący tablicę ( caln
) lub coś podobnego
- Dane wejściowe mogą być wprowadzane za pomocą parametrów funkcji, STDIN lub odpowiedników językowych
- Wszystkie dane wejściowe będą pisane małymi literami (az)
Wydajność
Zmienione słowo
Jeśli istnieje wiele rozwiązań, można je wydrukować
input: banana [n,a]
possible outputs: bannaana, banannaa
|-|---------|-|--->[n,a]
Możesz założyć, że słowo wejściowe (niekoniecznie tablica) będzie zawierać litery w tablicy (w kolejności)
Możesz również założyć, że na wejściach nie ma kolejnych liter, które są takie same (NIE jabłko, maniak, zielony, szkło, drzwi ...)
Przykłady
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.
Najkrótszy program wygrywa!
Tabela liderów (podziękowania dla Martina Büttnera za fragment)
/* 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]
, a nie[c,o]
.#answer-list
i#language-list
szerokość,50%
aby uniknąć nakładania się kolumn w Twoim fragmencie.bash
+sed
odpowiedź): Czy to jest nielegalne dlabanana, na
=>baannana
? Wierzyłem, że „Możesz założyć, że wszystkie dane wejściowe będą miały litery w tablicy (w kolejności)” ma na celu umożliwienie , ale nie wymaganie , odpowiedzi na przetwarzanie obu list sekwencyjnie, ale @manatwork zinterpretował to inaczej.Odpowiedzi:
Pyth, 14 bajtów
Demonstracja.
Styl wprowadzania:
Wyjaśnienie:
źródło
Brainfuck,
4645 (63 z wejściowymi znakami do wydrukowania)Kompatybilny z bff Alexa Pankratova (interpreter pieprzenia mózgu używany na SPOJ i ideone) oraz BFI Thomasa Corta (używany na Anarchy Golf).
Wersja do wydruku najpierw przyjmuje tablicę jako ciąg, następnie tabulator, a następnie ciąg początkowy bez końca nowej linii.
Demonstracja na ideonie.
Możemy zapisać niektóre bajty, używając
\x00
jako separatora zamiast tab:źródło
CJam, 15 bajtów
Wypróbuj online.
Jak to działa
źródło
C, 62 bajty
Jest to zaskakująco konkurencyjne.
Definiujemy funkcję,
f(char*, char*)
która przyjmuje ciąg znaków jako pierwsze wejście, a tablicę znaków do skopiowania jako drugie wejście.Niektóre kody testowe:
Które wydruki:
Wypróbuj online !
Jeśli dopuszczalne jest przesłanie makra zamiast funkcji, poniższe
#define g(s,c)
to tylko 58 bajtów , ale wymagas
ic
musi być rzeczywistymi wskaźnikami:źródło
CJam, 15 bajtów
Alternatywne podejście do CJam. Wypróbuj online
Wyjaśnienie
Dla każdego znaku w drugim ciągu wykonujemy dwie rzeczy.
Podziel aktualny sufiks ciągu na znak, np
"beeper" "e" -> ["b" "" "p" "r"]
Odznacz pierwszy ciąg w tablicy, wstaw dwa znaki, a następnie ponownie dołącz do reszty tablicy ze znakiem, np
"b" "ee" "eper"
. Ostatni ciąg to nowy przyrostek.źródło
Siatkówka, 33 bajty
Więcej informacji o Retina.
Oczekuje to dwóch ciągów w STDIN, oddzielonych znakiem nowej linii.
Do celów zliczania każda linia przechodzi do osobnego pliku,
\n
należy ją zastąpić rzeczywistym znakiem nowej linii (0x0A). Jeśli naprawdę chcesz to przetestować, wygodniej jest umieścić to w jednym pliku, w którym\n
pozostaje bez zmian, a następnie wywołać Retinę z-s
opcją przed przekazaniem pliku.Wyjaśnienie
(Nieaktualne ... Udało mi się pozbyć znacznika ... Zaktualizuję to później.)
Każda para linii jest podstawieniem wyrażenia regularnego (pierwsza linia wzoru, druga linia podstawienia).
To umieszcza
#
jako znacznik na początku ciągu wejściowego.Znajduje pierwszą literę na wejściu (za znacznikiem) odpowiadającą następnej literze, która ma zostać powielona, powtarza tę literę, przesuwa znacznik za nią i upuszcza pierwszy znak drugiego ciągu. Z
+`
przodu nakazuje Retinie powtarzanie tej czynności, aż łańcuch przestanie się zmieniać (w tym przypadku, ponieważ drugi łańcuch jest pusty i wszystkie wymagane litery zostały zduplikowane).Na koniec oczyszczamy sznurek, upuszczając znacznik.
źródło
Python, 61
Chciwe rekurencyjne rozwiązanie. Zapisuje,
b
czy pierwsza litera ciągus
jest pierwszą literą ciągul
liter, która ma zostać podwojona. Jeśli tak, weź jeden z tego listu i dołącz go do wywołania rekurencyjnego wraz z resztąs
, usuwając z niego pierwszy elementl
. Jeśli nieb
, zrób to samo, ale nie podwajaj litery i nie usuwaj z niejl
.Kod sprawdza,
s[:1]==l[:1]
zamiasts[0]==l[0]
unikać błędu indeksu poza zakresem, gdys
lubl
jest pusty.źródło
Prolog,
95837956 bajtówPrzykład:
zwraca
Edycja: Oszczędność 4 bajtów dzięki Oliphauntowi
Edycja2: Zapisano 20 bajtów przy użyciu przestarzałego
put/1
predykatu SWI-Prolog zamiastwritef
. Zapisano jeden bajt zastępując predykat końca rekurencjid([],_).
nad(_,_).
. Nie zadziała, jeśli kolejność dwóch definicjid
jest zamieniona, ale nie obchodzi nas to w kodzie golfowym. Zapisano kolejne 2 bajty usuwając nawias wokółH=[A|T],put(A),d(S,T)
źródło
H=[A|T]
. Dlaczego by nie uczynić go bardziej czytelnym, zastępując spacje nowymi liniami?Python 2,
83747265 BajtówNie ma tu żadnych specjalnych trików.
x
jest ciągiem,y
jest tablicą powielonych znaków.Aby wyjaśnić, czy nie powiela się to poprawnie, pierwszy poziom wcięcia to spacja, następny to tabulator.Edycja 1: Zapisano 9 bajtów, używając manipulacji ciągami zamiast pop ().
Edycja 2: Zapisano 2 bajty, używając
-~
do zwiększeniag
o 1.Edycja 3: Zaoszczędzono 7 bajtów za pomocą
y[:1]
sztuczki, dzięki xnor za to!Sprawdź to tutaj.
Prawidłowo sformatowane i wyjaśnione:
źródło
y[:1]
.y=y[g:]
, więc „sporo” to dość przesada.y[:1]==c
. Czy to działa?Excel VBA, 110 bajtów
To mój pierwszy wpis do CodeGolf, więc mam nadzieję, że jest w porządku.
Wpisujesz słowo wejściowe w A1, a następnie litery, które chcesz zastąpić w B1, a słowo wynikowe jest wyświetlane w oknie komunikatu.
źródło
Haskell, 42 bajty
Przykład użycia:
Jak to działa:
Jeśli jeden ciąg jest pusty, wynikiem jest pierwszy ciąg. W przeciwnym razie: jeśli pierwsze znaki ciągów pasują do siebie, weź to dwa razy i dołącz rekurencyjne połączenie z ogonami ciągów. Jeśli znaki nie pasują, weź pierwszy znak pierwszego łańcucha i dołącz rekurencyjne wywołanie z ogonem pierwszego łańcucha i tym samym drugim łańcuchem.
źródło
Pyth,
1817 bajtówDemo na żywo.
Zapisano 1 bajt dzięki @Jakube.
Wyjaśnienie:
Orginalna wersja:
Wersja demonstracyjna na żywo dla oryginału.
źródło
JavaScript, 47 bajtów
Korzystając z niektórych funkcji ES6.
źródło
onomatopoeia
,oao
?b.indexOf(d)==0
, spróbuj~b.search(d)
search
ma zastosowanie tylko do ciągów znaków. Musiałem zmienić b na tablicęPyth, 16 bajtów
Wypróbuj online: demonstracja
To jest dość zuchwałe. Zaletą mogą być języki oparte na stosie.
Wyjaśnienie
źródło
JavaScript ES6, 47 bajtów
Zakłada, że
s
jest tablicą["c","a","l","n"]
źródło
> <> (Ryby) ,
6834 bajtówMożesz uruchomić go na stronie http://fishlanguage.com/playground, wprowadzając ciąg znaków jako początkowy stos (ze znakami „tj.„ Kameleon ”) i tablicę dodatkowych liter jako stos wejściowy (brak znaków„ tj. Caln).
Nie zapomnij nacisnąć przycisku Daj, aby zapełnić stos wejściowy.
EDYCJA: O połowę! :)
źródło
R 119
Na podstawie @ Alexa odpowiedzi , ten jest kilka bajtów krócej:
Nie golfowany:
źródło
Perl,
73625956Całkowicie nowe podejście daje znacznie lepsze wyniki. Mimo to założę się, że może być krótszy.
Jak zadzwonić
f('coconut', ['c','o'])
.Dla każdego znaku w tablicy znajdź pierwsze wystąpienie i zduplikuj je, a następnie zmień wszystko na wielkie. Następnie zwróć cały ciąg, przekonwertowany na małe litery.
EDYCJA: ogoliłem kilka innych postaci, pozbywając się
shift
ipop
.Poprzednia wersja:
źródło
foreach
for
for
podpowiedź. Teraz jest krótszy.Rubin,
5247 bajtówRozwiązanie:
f=->(s,a){s.chars.map{|c|c==a[0]?a.shift*2:c}.join}
Przykład:
p f.call('banana', ['n','a']) # => "bannaana"
Wyjaśnienie:
Proc postaci metody, która przyjmuje ciąg jako pierwszy argument, a tablica znaków jako drugi argument. Mapuje blok na tablicę znaków w argumencie łańcuchowym, który sprawdza każdy znak względem pierwszego elementu tablicy porównawczej, a jeśli istnieje dopasowanie, usuwa pierwszy element tablicy porównawczej i podwaja go.
aktualizacja
f=->s,a{s.chars.map{|c|c==a[0]?a.shift*2:c}*''}
źródło
s,a
. I*''
jest równoważne z.join
. To 5 zaoszczędzonych bajtów, ale wciąż cię pokonałem o jeden (na razie): DPerl, 51 bajtów
Dane wejściowe są dostarczane przez STDIN. Pierwsze wejście to słowo początkowe (np.
chameleon
), Drugie wejście to litery jako pojedynczy ciąg (npcaln
.).Powyższe jest tylko zaciemnionym (czytaj „ładniejszym”) sposobem na wykonanie następujących czynności:
Podczas przeglądania każdej litery zastępujemy od początku słowa do litery w słowie źródłowym tylko nową literą i dołączamy dopasowanie (zapisane w
$&
) do naszego wyniku. Ponieważ dopasowanie obejmuje literę, a następnie zostaje zastąpione literą, każda litera pojawia się dwukrotnie.Ponieważ STDIN dołącza nowy znak linii do obu naszych danych wejściowych, gwarantujemy, że przechwycimy resztki pełnego słowa z ostatniego dopasowania, tj. Nowy znak linii.
źródło
REGXY, 24 bajty
Używa REGXY , języka opartego na podstawieniu wyrażenia regularnego. Przyjmuje się, że wejście jest słowem początkowym i tablicą oddzieloną spacją (np. „Calele kameleona”).
Program działa poprzez dopasowanie znaku w pierwszym ciągu do pierwszego znaku po spacji. Jeśli to pasuje, znak jest powtarzany w podstawieniu, a znak w tablicy jest usuwany (cóż, nie jest dołączany z powrotem do łańcucha). Przetwarzanie przechodzi do drugiej linii, która jest tylko wskaźnikiem z powrotem do pierwszej linii, co powoduje, że przetwarzanie powtarza się na wyniku poprzedniego podstawienia. Ostatecznie po spacji nie będzie żadnych znaków, w którym to momencie dopasuje się druga gałąź alternacji, usuwając końcowe spacje z wyniku. Wyrażenie regularne nie będzie wtedy pasować, przetwarzanie zostanie zakończone, a wynik zostanie zwrócony.
Jeśli to pomoże, iteracyjne kroki wykonania są następujące:
Program kompiluje się i wykonuje poprawnie za pomocą przykładowego interpretera w powyższym linku, ale rozwiązanie może być nieco bezczelne, ponieważ opiera się na założeniu niejasności specyfikacji języka. Specyfikacja określa, że pierwszy token w każdym wierszu (przed /) działa jako etykieta, ale założenie jest takie, że pusty wskaźnik-wskaźnik wskazuje z powrotem na pierwsze polecenie w pliku z pustą etykietą (lub innymi słowy, że „null” jest prawidłową etykietą). Mniej bezczelnym rozwiązaniem byłoby:
Co odpowiada 27 bajtom
źródło
JavaScript ES6, 72 bajty
Jest to anonimowa funkcja, która przyjmuje 2 parametry: słowo początkowe jako ciąg znaków oraz znaki, które rozciągają się jako tablica. Nieskluczony kod, który używa ES5 i testuje interfejs użytkownika poniżej.
źródło
Python 2, 77
Zadzwoń jako:
Mogłem mieć strasznie błędną liczbę bajtów ... Używa kombinacji spacji i tabulatorów.
źródło
rs, 39 bajtów
Więcej informacji o rs.
Istnieje już odpowiedź Retina, ale myślę, że ta metoda jest nieco inna. Zostały one również utworzone osobno: kiedy zacząłem nad tym pracować, ta odpowiedź nie została opublikowana.
Poza tym ten i tak jest o 6 bajtów dłuższy. :)
Demo na żywo i pakiet testowy.
źródło
JavaScript, 92 znaki
Wersja nieobjawiona:
źródło
R,
136128122 bajtówSpowoduje to utworzenie nienazwanej funkcji, która przyjmuje ciąg znaków i wektor znaków jako dane wejściowe i drukuje ciąg znaków do STDOUT. Aby to nazwać, nadaj mu nazwę.
Niegolfowane + wyjaśnienie:
Przykłady:
Zaoszczędź 8 bajtów dzięki MickeyT i kolejne 3 dzięki Jja!
źródło
cat(p,sep='')
abymessage(p)
jest krótszy.message
tym, to niesamowite! Dzięki! Edytowane, aby użyć Twojej sugestii.Bash + sed, 51
Dane wejściowe ze standardowego wejścia; znaki, które należy podwoić jako pojedynczy argument:
Działa to poprzez zbudowanie programu sed z,
$2
a następnie wykonanie go przeciwko$1
. Program sed zastępuje pierwsze wystąpienie każdej litery zastępczej dwiema kopiami jej wielkiej wersji, a na końcu zmniejsza całą partię. W powyższym przykładzie wygenerowany program sed toładnie wydrukowane:
Używam wielkich liter do oznaczania znaków przetworzonych do tej pory; pozwala to uniknąć ponownego podwojenia postaci, które zostały już podwojone, lub zastosowania podwojenia wcześniejszego niż poprzedni.
Wcześniejsza wersja, przed wyjaśnieniem, że kolejność listy zamienników jest znacząca (44 znaki):
źródło
strtech na <<< banana
wyprowadza „baannana”, ale najpierw wystąpienie „n” powinno zostać podwojone, a dopiero potem wystąpienie „a”.Python,
5392 bajtyStwierdziłem, że moje rozwiązanie ma tę samą długość zarówno w Pythonie 2, jak i 3.
EDYCJA: Człowieku, naprawienie tego przypadku przy wykonywaniu wielu zamian tej samej litery (wciąż przy użyciu tej samej metody) zajęło trochę pracy.
Python 2:
Wypróbuj tutaj
Python 3:
źródło
Mathematica, 66 bajtów
Przykład:
źródło
Lua,
767876755853 bajtówNowe, całkowicie przerobione rozwiązanie z pomocą wieselkatze i SquidDev! chodźcie chłopaki, możemy pokonać bzdury: P
Wyjaśnienie nadchodzi jutro. Wypróbuj tutaj.
Oryginalne rozwiązanie: zaoszczędzono 2 bajty dzięki @ kirbyfan64sos!
Lua jest dość okropnym językiem do gry w golfa, więc myślę, że dobrze sobie z tym poradziłem.
Objaśnienie kodu wraz z wersją bez golfa:
Wypróbuj tutaj. (Nieaktualny kod, ale ta sama koncepcja, tylko mniej golfa, zaktualizuje jutro)
źródło
function f(x,y)
i poprint(x)
, oszczędzając ci dwa bajty.