Ступенчатая лестница

12

Имея строку sи положительное целое число N, постепенно дублируйте каждый символ все больше и больше, пока не Nпоявятся дубликаты, а затем оставайтесь на уровне Nдубликатов до тех пор, пока Nсимволы не уйдут от конца, а затем отступите еще раз.

Например, учитывая abaloneи 3:

a    we start with 1 copy
bb   then 2 copies
aaa  then 3 copies, which is our second parameter
lll  so we continue using 3 copies
ooo  until we reach the end
nn   where we use 2 copies
e    and then finally 1 copy

и результат будет abbaaalllooonne.

Гарантируется, что длина строки больше чем 2Nи содержит только символы от aдо z.

Больше тестов:

N string       output
2 aaaaa        aaaaaaaa
3 abcdabcdabcd abbcccdddaaabbbcccdddaaabbbccd

Это . Кратчайший ответ в байтах побеждает. Применяются стандартные лазейки .

Дрянная Монахиня
источник

Ответы:

11

Желе , 6 байт

JṡFṢị⁸

Попробуйте онлайн!

Как это устроено

JṡFṢị⁸  Main link. Arguments: s (string), n (integer)

J       Get the indices of s.
 ṡ      Split the indices into overlapping chunks of length n.
  F     Flatten the array of chunks.
   Ṣ    Sort the resulting array of indices.
    ị⁸   Get the characters of s at these indices.

Пробный прогон

JṡFṢị⁸  "abalone", 3

J       [1, 2, 3, 4, 5, 6, 7].
 ṡ      [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]]
  F     [1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7]
   Ṣ    [1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7]
    ị⁸  "abbaaalllooonne"
Деннис
источник
3
Этот метод split + flatten + sort является чистым гением. Ницца! :)
HyperNeutrino
7

Python 2 , 57 байт

f=lambda s,n,i=1:s and s[0]*len(s[:i][:n])+f(s[1:],n,i+1)

Попробуйте онлайн!

Также 57:

Python 2 , 57 байт

f=lambda s,n,i=1:s and s[0]*len(s[:i])+f(s[1:],n,i+(i<n))

Попробуйте онлайн!

XNOR
источник
Можете ли вы объяснить свою логику позади len(s[:i][:n])? Я убежден, что есть более короткий способ получить это число, но я не уверен, как.
musicman523
Неважно, я понял! Но это на один байт меньше, чем min(len(s),i,n). Прекрасная работа!
musicman523
6

JavaScript (ES6), 67 65 байт

-2 байт благодаря короче метод Брауна Час использования min().

s=>n=>s.replace(/./g,(c,i)=>c.repeat(Math.min(i+1,s.length-i,n)))

Принимает ввод в синтаксисе Карринг: f("abalone")(3).

Тестовый фрагмент

f=
s=>n=>s.replace(/./g,(c,i)=>c.repeat(Math.min(i+1,s.length-i,n)))
<div oninput="O.value=f(S.value)(+N.value)">String: <input id=S> N: <input id=N size=3></div>Out: <input id=O size=50 disabled>

Джастин Маринер
источник
6

Желе , 8 7 байт

J««U$⁸x

Попробуйте онлайн!

Как это устроено

J««U$⁸x - main link, input e.g. abalone
J        - range of length of letters: [1,2,3,4,5,6,7]
 «       - minimum of each term with second input: [1,2,3,3,3,3,3]
  «U$    - termwise minimum with the reverse: 
                    min([1,2,3,3,3,3,3],[3,3,3,3,3,2,1])=[1,2,3,3,3,2,1]
     ⁸x  - repeat each character of the input a number of times corresponding to elements:
                    a*1;b*2;a*3...e*1 = abbaaalllooonne

-1 байт благодаря @LeakyNun

fireflame241
источник
Хорошая находка @LeakyNun! Самый близкий, который я получил в этом направлении, был J«¥@«U$x@для 9 байтов.
fireflame241
Пояснения пожалуйста?
Товарищ SparklePony
@ fireflame241 в общем, x@⁸эквивалентен ⁸x(я использовал здесь)
Leaky Nun
2

Haskell , 61 60 байт

Спасибо @Laikoni за помощь, чтобы сбрить 1 байт

n#s=do(i,c)<-zip[1..]s;replicate(minimum[n,i,length s-i+1])c

Попробуйте онлайн!

Ungolfed:

(#) n string = do
    (i, char) <- zip [1..] string
    replicate (minimum [n, i, length(string)-i+1]) char
Юлианский волк
источник
Отличное использование doблока! Сохраните байт, опустив скобки length(s).
Лайкони
1

Haskell (Lambdabot), 74 байта

r=replicate
f x n=join$zipWith r([1..n]++r(length x-2*n)n++reverse[1..n])x

Попробуйте онлайн!

ბიმო
источник
Импорт засчитывается в счет! Тебе будет лучше с>>=id
bartavelle
Да, я тоже так делал раньше, а потом увидел это (вот почему в скобках есть Lambdabot). Какой правильный путь?
მოიმო
Я исправлен, я думаю, что все в порядке!
Bartavelle
Полезно знать, что в этом списке много очень удобных импортов.
მოიმო
1

J, 24 байта

(<.&n<./(|.,:[)>:i.#s)#s

Бит в скобках - (<.&n<./(|.,:[)>:i.#s)- создает 1 2 ... n n n ... 2 1массив следующим образом:

                   #s    length of s, call it L
                 i.      numbers 0 1 ... L-1
               >:        increment by 1, now 1 2 ... L
        (|.,:[)          fork: |. = reverse, ,: = stack, [ = identity
                         resulting in  L ... 2 1
                                       1 2 ... L 
     <./                 min of each element of the top and bottom row
 <.&n                    min of each resulting elm and n

как только мы получим это, #оператор J автоматически сделает именно то, о чем просил, дублируя каждый элемент указанное количество раз.

Любопытно увидеть улучшение J эксперта по этому вопросу ...

Ион
источник
23 байта с совершенно другим подходом [#~#@[$([:>:<:,&:i.-)@](возможно, там попало свободное пространство). Я в растерянности относительно того, почему крюк не берет, xно не в слишком большом положении, чтобы заботиться.
Коул
1

PHP> = 7.1, 75 байт

for([,$a,$n]=$argv;--$z?:($x=$a[$i]).$z=min($n,strlen($a)-$i,++$i);)echo$x;

PHP Sandbox Online

PHP> = 7.1, 78 байт

for([,$a,$n]=$argv;~$x=$a[$i];)for($z=min($n,strlen($a)-$i,++$i);$z--;)echo$x;

PHP Sandbox Online

PHP> = 7.1, 80 байт

for([,$a,$n]=$argv;$i<$l=strlen($a);)echo str_repeat($a[$i],min($n,$l-$i,++$i));

PHP Sandbox Online

Йорг Хюльсерманн
источник
1

Japt , 11 10 байт

ËpVm°TEnUÊ

Проверь это


объяснение

Неявный ввод строки Uи целого числа V.

Ë

Карта Uи заменить каждого персонажа.

Vm

Получи минимум V...

°T

T(изначально 0) увеличивается на 1, ...

EnUÊ

И индекс текущего символа ( E) вычитается из ( n) длины ( Ê) из U.

p

Повторите текущий символ много раз.

Неявно выведите окончательную строку.

мохнатый
источник
0

Python 2 68 байт

f=lambda s,n:''.join(s[i]*min(i+1,len(s)-i,n)for i in range(len(s)))
Час Браун
источник
Вам не нужно f=в ответе; функция может быть анонимной. Имея это в виду, вы можете удалить 3 байта с помощью lambda s,n:''.join(c*min(i+1,len(s)-i,n)for i,c in enumerate(s)).
Notjagan
0

Шелуха , 10 9 байт

₁₁ṀR
↔z↑N

Попробуйте онлайн!

Первая строка является основной функцией, она повторяет каждую букву n раз, а затем дважды вызывает вторую строку.

Вторая строка содержит не более N букв из каждой группы повторяющихся букв, где N - это индекс группы, основанный на 1, а затем переворачивает список.

Лео
источник
0

APL (Dyalog) , 15 байтов

{⍵/⍨⍺⌊i⌊⌽i←⍳≢⍵}

{} Функция, в которой левый аргумент (cap) равен ⍺, а правый аргумент (строка) - :

≢⍵ посчитать количество символов в строке

 генерировать , что многие ɩ ntegers

i← магазин в я

 задний ход

i⌊ попарно минимум с I

⍺⌊ попарный минимум с заглушкой

⍵/⍨ использовать эти цифры для репликации букв строки

Попробуйте онлайн!

Адам
источник
0

Ушка - тип рыбы (ну, моллюск), поэтому ...

> <> , 79 байт

&i1\
0(?\:1+:&::&@)?$~i:@
&~}\&~1
0(?\:&::1+&@)?$~}}:
 ~r\
?!v>l?!;:o$1-:@
~~<^

Попробуйте онлайн или посмотрите на рыбной площадке !

Читает строку из STDIN и предполагает, что число уже находится в стеке.

Пояснение: вторая, четвертая и шестая строки являются основными циклами. Детали - это некрасивые манипуляции со стеком, но в общих чертах, во-первых, вторая строка заполняет стек, чередуя символы ввода и min ( in ), где n - это длина cap, а i - индекс символа в вход: для "ушка", 3, стек выглядит так

"a", 1, "b", 2, "a", 3, "l", 3, "o", 3, "n", 3, "e", 3, -1=EOF, 3

Затем строка 4 проходит через стек таким же образом в обратном порядке, чтобы правильно закрыть правую сторону:

"a", 1, "b", 2, "a", 3, "l", 3, "o", 3, "n", 2, "e", 1, -1

Затем шестая строка берет каждую пару символ-число и печатает символ столько раз, сколько число.

Не дерево
источник