Вводимые слова - это строчные буквы, не разделенные пробелами. Новая строка в конце необязательна.
Одно и то же слово должно быть выведено в измененной версии: для каждого символа удвойте его во второй раз, когда оно появляется в исходном слове, в три раза в третий раз и т. Д.
Пример ввода:
bonobo
Пример вывода:
bonoobbooo
Применяются стандартные правила ввода / вывода. Самый короткий код в байтах побеждает.
Тесты предоставлены @Neil:
tutu -> tuttuu
queue -> queuuee
bookkeeper -> boookkkeeepeeer
repetitive -> repeetittiiveee
uncopyrightables -> uncopyrightables
abracadabra -> abraacaaadaaaabbrraaaaa
mississippi -> misssiisssssssiiipppiiii
Pyth, 6 байт
Спасибо @Doorknob за удаление 1 байта.
Спасибо @Maltysen за удаление 5 байтов.
Попробуйте онлайн!
Как это устроено
Например, возьмите строку
"bonobo"
.._
составляет список:['b', 'bo', 'bon', 'bono', 'bonob', 'bonobo']
VQ._
означает «предшествующая функция, векторизованная (примененная параллельно) надQ
и._
», что означаетQ
(оцениваемый вход) будет обрабатываться как список:['b', 'o', 'n', 'o', 'b', 'o']
и затем они будут соединены@
следующим образом:Поэтому
@VQ._
будем производить['b', 'o', 'n', 'oo', 'bb', 'ooo']
.Затем
s
он объединяет их все вместе, создавая строку'bonoobbooo'
, которая затем неявно распечатывается, чтобы статьbonoobbooo
.источник
VQ
означает толькоfor N in Q
когда он не внутри функции. В этом случае на самом деле происходит то, что@V
означает, что@
функция векторизована (применяется параллельно) для следующих двух аргументов,Q
и._
. Этого нет в документации, поэтому я исправлю это.Сетчатка ,
3419 байтСэкономьте 15 байт, вдохновившись решением Исаака.
Количество байтов предполагает кодировку ISO 8859-1.
Ведущие и конечные пустые строки имеют большое значение.
Попробуйте онлайн!
объяснение
Это этап замены, который соответствует пустому регулярному выражению (то есть каждой позиции нулевой ширины в строке) и заменяет
$`¶
его, где$`
есть префикс соответствия и¶
вставляет перевод строки. Это в основном вычисляет все префиксы и помещает их в отдельную строку вместе с последним символом этого префикса:Будут некоторые ведущие и конечные переводы строк, но мы можем их игнорировать.
Из каждого из этих префиксов мы хотим сохранить символы, равные последнему символу. Для этого мы используем другой этап замены:
Это соответствует всему, что мы не хотим хранить, и заменяет его ничем. Мы сопоставляем любой символ (используя,
\D
так как мы знаем, что на входе не будет цифр), а затем проверяем, что в конце строки нет другой копии этого символа.источник
Python, 56 байт
Кажется, я застрял с двумя ответами одинаковой длины:
Изменить: см . Ответ @ pacholik для более короткого, альтернативного подхода Python.
источник
+1
с достаточно высоким приоритетом, так что парены не нужныHaskell, 39 байт
Пример использования:
f "bonobo"
->"bonoobbooo"
.Достаточно отличается от ответа @ Damien . Создает строку справа, извлекая все вхождения последнего символа из строки и добавляя рекурсивный вызов со всеми, кроме последнего символа.
источник
> <> , 27 байт
Требуется официальный интерпретатор, который выходит с ошибкой при попытке напечатать кодовую точку -1. Попробуйте онлайн!
Код читает входные данные по одному символу за раз и использует первую строку кодового окна в виде большого массива, в котором хранится количество раз, которое каждый символ просматривался до сих пор (> <> инициализирует непрограммные ячейки равными 0). Вторая строка представляет собой цикл для вывода символа несколько раз.
Кроме того, вот версия, которая выходит чисто (37 байт, не правильно гольф):
источник
chr(-1)
. Анимационный переводчик отлично подходит для визуализации, но, к сожалению, некоторые расхождения с официальным переводчиком немного раздражают: /JavaScript (ES6),
4845 байтРедактировать: 3 байта сохранены благодаря @ user81655.
источник
Haskell,
504241 байтСохранено 8 байтов благодаря Линн
источник
f t=[c|(i,c)<-zip[0..]t,j<-[0..i],c==t!!j]
MATL , 8 байт
Попробуйте онлайн! Или проверьте все тестовые случаи одновременно .
объяснение
источник
Лабиринт ,
5425 байтДругой сотрудни с @ MartinBüttner, который на самом деле сделал
большинствопочти все игры в гольф для этого. Переработав алгоритм, нам удалось значительно сократить размер программы!Попробуйте онлайн!
объяснение
Быстрый лабринтный учебник:
Лабиринт - это двумерный язык на основе стека. Есть два стека, основной и вспомогательный, и выталкивание из пустого стека дает ноль.
На каждом перекрестке, где есть несколько путей перемещения указателя инструкции вниз, проверяется вершина основного стека, чтобы увидеть, куда идти дальше. Отрицательный - поворот налево, ноль - прямой, а положительный поворот направо.
Два стека целых чисел произвольной точности не очень гибки с точки зрения параметров памяти. Чтобы выполнить подсчет, эта программа фактически использует два стека в качестве ленты, смещая значение из одного стека в другой, сродни перемещению указателя памяти влево / вправо по ячейке. Это не совсем то же самое, поскольку нам нужно тащить счетчик петель с собой по пути вверх.
Во-первых,
<
и>
на каждом конце вставьте смещение и поверните строку кода, которая смещена на единицу влево или вправо. Этот механизм используется для того, чтобы код выполнялся в цикле - он<
выталкивает ноль и поворачивает текущую строку влево, помещая IP-адрес справа от кода, а>
выталкивает еще один ноль и фиксирует строку обратно.Вот что происходит на каждой итерации по отношению к диаграмме выше:
источник
Perl, 17
(16-байтовый код, +1 для -p)
Использование:
источник
Pyth, 7 байт
Тестирование
Тестовый набор благодаря DenkerAffe
Объяснение:
источник
Python 3, 52
источник
f=lambda s:s and f(s[:-1])+s[-1]*s.count(s[-1])
PowerShell v2 +,
5247 байтСоздает пустую хеш-таблицу, сохраняет ее в
$b
. Это наш «счетчик» того, какие буквы мы видели. Затем мы берем входные данные$args[0]
, приводим их как массив символов и отправляем через цикл. На каждой итерации мы берем текущий символ"$_"
и умножаем его на предварительно увеличенный счетчик с заданным значением, что приведет к умножению первого вхождения1
, второго на2
и так далее. Мы инкапсулируем это-join
так, чтобы выводилось все одно слово.Благодаря TessellatingHeckler мы сохранили 5 байтов , используя вместо массива хеш-таблицу, поэтому нам не нужно уменьшать символ ASCII,
97
чтобы получить соответствующий индекс. Это работает, потому что предварительное увеличение индекса хеша неявно вызывает.Add()
в фоновом режиме, если этот индекс не существует, поскольку хеш-таблицы являются изменяемыми.источник
Дьялог АПЛ , 6 байтов
TryAPL!
Четыре функции наверху (2 поезда) вилки (3 поезда):
Сначала
⊢
(справа - без операции) в данной строке, давая'bonobo'
Затем
,\
(сканирование конкатенации) на строку, давая'b' 'bo' 'bon' 'bono' 'bonob' 'bonobo'
Два разветвляются вместе с (дано как правый и левый аргументы)
∩¨
(пересечение каждого), то('b'∩'b') ('bo'∩'o') ('bon'∩'n') ('bono'∩'o') ('bonob'∩'b') ('bonobo'∩'o')
есть'b' 'o' 'n' 'oo' 'bb' 'ooo'
Наконец,
∊
(enlist) применяется к результату, чтобы сгладить его, давая'bonoobbooo'
Эй, по крайней мере, это соответствует Pyth ! Очевидно, что Jelly короче, так как это версия J для гольфа, которая, в свою очередь, представляет собой продвинутый диалект APL с 2 символами на функцию.
источник
Pyth, 11 байт
Попробуй это здесь!
объяснение
источник
J 11 байт
Это монадический глагол. Попробуй это здесь. Использование:
объяснение
источник
05AB1E , 10 байтов
Код:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
CJam, 14
Попробуйте онлайн
Объяснение:
источник
Perl 6, 37 байт
источник
> <> , 52 байта
Он складывает каждое прочитанное письмо, печатает их один раз и снова для каждого подобного письма в стопке.
Он использует
&
регистр, потому что необходимость обрабатывать 3 переменные в стеке (текущая буква чтения, позиция в стеке, буква в этой позиции) - это боль.Вы можете попробовать это здесь !
источник
Ржавчина, 176 байт
Это использует карту для хранения строки для каждого символа на входе. Для каждого символа строка будет удалена с карты, соединена с символом, вставлена обратно в карту и добавлена к выходным данным.
Я хотел бы использовать
get(...)
вместоremove(...)
, но проверка заимствования заставила меня передумать.источник
Mathcad, 66 байт
К сожалению, Mathcad не обладает особенно хорошей обработкой строк, поэтому я преобразовал входную строку в вектор, а затем использовал вектор (индексированный код символа), чтобы отслеживать количество встречений символа, добавляя символ, который количество раз, чтобы вектор результата. Наконец, вектор результата преобразуется обратно в строку. Довольно долго, к сожалению.
Обратите внимание, что Mathcad использует двумерный интерфейс «белой доски» со смесью обычного текста и операторов; операторы обычно вводятся с помощью панели инструментов или сочетания клавиш; например, ctl- # вводит оператор цикла for, который содержит ключевое слово for, символ element-of и 3 пустых "заполнителя" для переменной итерации, выражений range и body соответственно. Typing [после того, как имя переменной входит в режим индекса массива, Typing 'вводит пару подходящих скобок (в основном ... есть исключения в зависимости от того, что еще находится в окружающем выражении )
источник
Javascript ES6 44 байта
старый ответ
Javascript ES6 46 байтов
источник
x
во входной массив ->q=>(x=[...q]).map(a=>x[a]=(x[a]||'')+a).join``
Юлия,
3835 байтI / O находится в массивах символов. Попробуйте онлайн!
Как это устроено
Мы (пере) определяем монадический оператор ! для наших целей.
Когда ! вызывается, он проверяет, является ли его аргумент s пустым. Если это так, он возвращает свой аргумент.
Если s не пусто, мы пересекаем s с последним символом (
s[end]
), который возвращает все вхождения этого символа в s . Этот результат объединяется с возвращаемым значением рекурсивного вызова ! с s минус последний символ (s[1:end-1]
) в качестве аргумента.источник
PHP,
54515047 байтЗапустите так:
Tweaks
null
вint
строку смещения, как строка смещения отливают междунар все равно$argn
вместо$argv
(thx Titus)источник
$argn
с,-R
чтобы сохранить еще три байта.-n
должен сделать то же самое, что и your-d error_reporting
:n
означаетno config file
, что в конфигурации по умолчанию уведомления отключены; так-nr
(соответственно-nR
) должно хватить.Mathematica, 57 байт
Мы используем
c[x]
в качестве справочной таблицы, как часто персонажx
уже встречался. Это увеличивается каждый раз, когда это извлекается вx~StringRepeat~++c[x]
. К сожалению, чтобы сделать функцию многократно используемой, нам нужно каждый раз сбрасывать таблицу поискаClear@c;c@_=0;
, что довольно дорого.источник
awk, 72 байта
Идея состоит в том, чтобы сохранить счетчик появляющегося символа в ассоциативном массиве и напечатать символ это число раз.
источник
Луч, 32
3342байтаЭто должно было быть меньше, но я потерял несколько байтов, инициализируя слоты памяти равными 0. Замена некоторых направлений потока позволила устранить много пустого пространства.
Попробуйте это в этом фрагменте
Общее объяснение.
источник
Python,
6662 байтаПопробуй здесь
Golfed
Ungolfed
источник