Напишите программу или функцию, которая дублирует буквы в слове, чтобы все дублированные буквы, расположенные слева направо в слове, образовывали входной массив.
Например:
input: chameleon, [c,a,l,n]
output: cchaamelleonn
вход
- Начальное слово (например
chameleon
)
- Массив символов (
[c,a,l,n]
) или строка для представления array ( caln
), или что-то подобное
- Ввод может быть через параметры функции, STDIN или языковые эквиваленты
- Все входные данные будут состоять из строчных букв (az)
Выход
Измененное слово
Если есть несколько решений, любое может быть напечатано
input: banana [n,a]
possible outputs: bannaana, banannaa
|-|---------|-|--->[n,a]
Вы можете предположить, что входное слово (не обязательно массив) будет иметь буквы в массиве (по порядку)
Вы также можете предположить, что входные данные не имеют одинаковых последовательных букв (НЕ apple, geek, green, glass, door ...)
Примеры
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.
Самая короткая программа выигрывает!
Таблица лидеров (спасибо Мартину Бюттнеру за фрагмент)
/* 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]
, а не[c,o]
.#answer-list
и#language-list
ширину , чтобы50%
избежать дублирования столбцов в вашем фрагменте кода.bash
+sed
ответ): Это незаконно дляbanana, na
=>baannana
? Я полагал, что «Вы можете предположить, что все входные данные будут иметь буквы в массиве (по порядку)», предназначенные для того , чтобы разрешать , но не требовать , ответы для последовательной обработки обоих списков, но @manatwork интерпретировал это по-разному.Ответы:
Pyth, 14 байт
Демонстрация.
Стиль ввода:
Объяснение:
источник
Brainfuck,
4645 (63 с печатными символами на входе)Совместим с bff Алекса Панкратова (интерпретатор brainfuck, используемый на SPOJ и ideone) и BFI Томаса Корта (используется на Anarchy Golf).
Версия для печати сначала берет массив в виде строки, затем следует вкладка, за которой следует начальная строка без завершающей строки.
Демонстрация на идеоне.
Мы можем сохранить несколько байтов, используя
\x00
вместо табуляции разделитель:источник
CJam, 15 байтов
Попробуйте онлайн.
Как это работает
источник
C, 62 байта
Ну, это на удивление конкурентно.
Мы определяем функцию,
f(char*, char*)
которая принимает строку в качестве первого ввода и массив символов для дублирования в качестве второго ввода.Некоторый тестовый код:
Какие отпечатки:
Попробуйте онлайн !
Если допустимо передавать макрос, а не функцию, следующее
#define g(s,c)
- это всего лишь 58 байтов , но оно требуетs
иc
должно быть фактическим указателем:источник
CJam, 15 байтов
Альтернативный подход CJam. Попробуйте онлайн
объяснение
Для каждого символа во второй строке мы делаем две вещи.
Разделить текущий суффикс строки на символ, например
"beeper" "e" -> ["b" "" "p" "r"]
Разъединяет первую строку в массиве, вставляет два символа, затем воссоединяет остальную часть массива с символом, например
"b" "ee" "eper"
. Последняя строка - это новый суффикс.источник
Сетчатка, 33 байта
Больше информации о Retina.
Это предполагает две строки в STDIN, разделенные новой строкой.
For counting purposes, each line goes into a separate file,
\n
should be replaced with an actual newline character (0x0A). If you actually want to test this, it's more convenient to put this in a single file where\n
remains as it is and then invoke Retina with the-s
option before passing the file.Explanation
(Outdated... I managed to get rid of the marker... I'll update this later.)
Each pair of lines is a regex substitution (first line the pattern, second line the substitution).
This puts a
#
as a marker at the start of the input string.This finds the first letter in the input (after the marker) corresponding to the next letter to be duplicated, duplicates that letter, moves the marker behind it, and drops the first character of the second string. The
+`
at the front tells Retina to do this repeatedly until the string stops changing (in this case, because the second string is empty and all required letters have been duplicated).Finally, we clean up the string by dropping the marker.
источник
Python, 61
A greedy recursive solution. Saves to
b
whether the first letter of the strings
is the first letter of the stringl
of letters to double. If so, take one of that letter and prepend it to the recursive call with the rest ofs
, removing the first element froml
. If notb
, do the same but don't double the letter and don't remove froml
.The code checks
s[:1]==l[:1]
rather thans[0]==l[0]
to avoid an index-out-of-bounds error whens
orl
is empty.источник
Prolog,
95837956 bytesExample:
returns
Edit: Saved 4 bytes thanks to Oliphaunt
Edit2: Saved 20 bytes using the deprecated
put/1
SWI-Prolog predicate instead ofwritef
. Saved one byte replacing the recursion end predicated([],_).
tod(_,_).
. Won't work if the ordering of the two definitions ofd
is swapped though, but we don't care about that in golfed code. Saved another 2 bytes removing the parenthesis aroundH=[A|T],put(A),d(S,T)
источник
H=[A|T]
. Also, why not make it a little more readable by replacing the spaces with newlines?Python 2,
83747265 BytesNo real special tricks here.
x
is the string,y
is the array of characters that are duplicated.To clarify if this doesn't copy properly, the first indentation level is a space, the next is a tab.Edit 1: Saved 9 bytes by using string manipulation instead of pop().
Edit 2: Saved 2 bytes by using
-~
to incrementg
by 1.Edit 3: Saved 7 bytes by using
y[:1]
trick, thanks to xnor for this!Check it out here.
Properly formatted and explained:
источник
y[:1]
.y=y[g:]
, so "quite a few" is quite an exaggeration.y[:1]==c
. Does that work?Excel VBA, 110 bytes
This is my first entry to CodeGolf so I hope this is ok.
You enter the input word in A1 and then the letters to be replaced in B1 and the resulting word is displayed in a message box.
источник
Haskell, 42 bytes
Usage example:
How it works:
If one string is empty, the result is the first string. Else: if the first characters of the strings match, take it two times and append a recursive call with the tails of the strings. If the characters don't match, take the first character of the first string and append a recursive call with the tail of the first string and the same second string.
источник
Pyth,
1817 bytesLive demo.
Saved 1 byte thanks to @Jakube.
Explanation:
Original version:
Live demo for original.
источник
Javascript, 47 bytes
Taking advantage of some ES6 features.
источник
onomatopoeia
,oao
?b.indexOf(d)==0
, чтобы попробовать~b.search(d)
search
применим только к строкам. Пришлось изменить b на массивPyth, 16 байт
Попробуйте онлайн: демонстрация
Это довольно глупо. Языки, основанные на стеке, могут иметь здесь преимущество.
объяснение
источник
JavaScript ES6, 47 байт
Предполагается, что
s
массив["c","a","l","n"]
источник
> <> (Рыба) ,
6834 байтаВы можете запустить его на http://fishlanguage.com/playground вводя строку в качестве начального стека (с «отметками, т.е.« хамелеон ») и массивом дополнительных букв в качестве входного стека (без« отметок », то есть caln).
Не забудьте нажать кнопку Give, чтобы заполнить входной стек.
РЕДАКТИРОВАТЬ: вдвое! :)
источник
R 119
Исходя из ответа @ Алекса , этот на пару байтов короче:
Ungolfed:
источник
Perl,
73625956Абсолютно новый подход дает гораздо лучшие результаты. Тем не менее, я уверен, что это может быть короче.
Звоните как
f('coconut', ['c','o'])
.Для каждого символа в массиве найдите первое вхождение, продублируйте его и переведите все в верхний регистр. Затем верните всю строку, преобразованную в нижний регистр.
РЕДАКТИРОВАТЬ: побрил еще пару персонажей, избавившись от
shift
иpop
.Предыдущая версия:
источник
foreach
Ключевое слово на самом деле является синонимом дляfor
ключевого слова, поэтому вы можете использовать любое из них». - Циклы Foreach .)for
подсказку. Это на самом деле короче сейчас.Рубин,
5247 байтРешение:
f=->(s,a){s.chars.map{|c|c==a[0]?a.shift*2:c}.join}
Пример:
p f.call('banana', ['n','a']) # => "bannaana"
Объяснение:
Proc форма метода, который принимает строку в качестве первого аргумента и массив символов в качестве второго аргумента. Сопоставляет блок с массивом символов в строковом аргументе, который проверяет каждый символ по первому элементу массива сравнения и, если есть совпадение, удаляет первый элемент массива сравнения и удваивает его.
Обновить
f=->s,a{s.chars.map{|c|c==a[0]?a.shift*2:c}*''}
источник
s,a
. И*''
эквивалентно.join
. Это 5 сохраненных байтов, но я все еще бью тебя на один (пока): DPerl, 51 байт
Ввод осуществляется через STDIN. Первый ввод - начальное слово (например
chameleon
), второй ввод - буквы в виде одной строки (напримерcaln
).Вышесказанное является просто обфусцированным (читай "красивее") способом сделать следующее:
Проходя каждую букву, мы заменяем от начала слова до буквы в исходном слове только новую букву и добавляем совпадение (сохраненное в
$&
) к нашему результату. Поскольку совпадение включает в себя букву, а затем заменяется буквой, каждая буква заканчивается дважды.Поскольку STDIN добавляет символ новой строки к обоим нашим входам, мы гарантированно фиксируем остатки полного слова в последнем совпадении, то есть символ новой строки.
источник
REGXY, 24 байта
Использует REGXY , язык подстановки регулярных выражений. Предполагается, что входными данными являются начальное слово и массив, разделенные пробелом (например, «хамелеон калн»).
Программа работает путем сопоставления символа в первой строке с первым символом после пробела. Если это соответствует, символ повторяется в подстановке, и символ в массиве удаляется (ну, не добавляется обратно в строку). Обработка переходит ко второй строке, которая является просто указателем на первую строку, что приводит к повторению обработки по результату предыдущей замены. В конце концов, после пробела не будет символов, после чего вторая ветвь чередования будет совпадать, удаляя завершающий пробел из результата. Затем регулярное выражение не будет соответствовать, обработка завершена и результат будет возвращен.
Если это помогает, итеративные шаги выполнения следующие:
Программа компилируется и выполняется правильно с помощью примера интерпретатора по ссылке выше, но решение, возможно, немного дерзкое, поскольку оно основано на допущении в неопределенности языковой спецификации. Спецификация утверждает, что первый токен в каждой строке (перед /) действует как метка, но предполагается, что нулевой указатель метки будет указывать на первую команду в файле с нулевой меткой (или другими словами, это 'null' является допустимой меткой). Менее нахальное решение было бы:
Что составляет 27 байтов
источник
JavaScript ES6, 72 байта
Это анонимная функция, которая принимает 2 параметра: начальное слово в виде строки и символы для растяжения в виде массива. Разгруженный код, который использует ES5 и тестовый интерфейс ниже.
источник
Python 2, 77
Звоните как:
Возможно, я неправильно подсчитал количество байтов ... Использует смесь пробелов и табуляции.
источник
RS, 39 байт
Больше информации о rs.
Уже есть ответ Retina, но я думаю, что этот использует немного другой подход. Они также были созданы отдельно: когда я начал работать над этим, этот ответ не был опубликован.
Кроме того, этот в любом случае на 6 байт длиннее. :)
Живая демо-версия и тестовый набор.
источник
JavaScript, 92 символа
Необъясненная версия:
источник
R
136128122 байтовЭто создает безымянную функцию, которая принимает строку и символьный вектор в качестве входных данных и печатает строку в STDOUT. Чтобы назвать это, дать ему имя.
Ungolfed + объяснение:
Примеры:
Благодаря MickeyT сэкономлено 8 байт, а jja - еще 3!
источник
cat(p,sep='')
для вывода прямо на STDOUT для парыmessage(p)
короче.message
, это круто! Благодарность! Отредактировано, чтобы использовать ваше предложение.Баш + Сед, 51
Ввод от stdin; символы, которые должны быть удвоены как один аргумент:
Это работает путем построения программы sed из
$2
и затем выполнения ее против$1
. Программа sed заменяет первое вхождение каждой буквы замены двумя копиями ее заглавной версии, а в конце преуменьшает значение всей партии. Для приведенного выше примера сгенерированная программа sedдовольно отпечатанный:
Я использую прописные буквы, чтобы отметить символы, обработанные до сих пор; это позволяет избежать повторного удвоения символов, которые уже были удвоены, или применения удвоения раньше, чем предыдущий.
Более ранняя версия, перед уточнением, что порядок замены списка является значительным (44 символа):
источник
strtech na <<< banana
выводит «baannana», но сначала вхождение на «n» должно быть удвоено, только после этого вхождение «a».Python,
5392 байтаНашел мое решение одинаковой длины в Python 2 и 3.
РЕДАКТИРОВАТЬ: Человек, исправление этого случая, когда выполнение нескольких замен одной и той же буквы (при этом все еще используя тот же метод) потребовалось немного работы.
Python 2:
Попробуй здесь
Python 3:
источник
Mathematica, 66 байт
Пример:
источник
Луа,
767876755853 байтаНовое, полностью переработанное решение с помощью wieselkatze и SquidDev! давай, ребята, мы можем победить мозговой трах: P
Объяснение грядущего завтра. Попробуй это здесь.
Оригинальное решение: экономия 2 байта благодаря @ kirbyfan64sos!
Lua - довольно ужасный язык для игры в гольф, так что, думаю, я неплохо справился с этим.
Объяснение кода вместе с негольфированной версией:
Попробуй это здесь. (Устаревший код, но та же концепция, чуть менее удачная, обновит завтра)
источник
function f(x,y)
и послеprint(x)
, сэкономив вам два байта.