Закрита дратувальна драбина


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
Цей метод розділення + вирівнювання + сортування - чистий геній. Приємно! :)
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))

Спробуйте в Інтернеті!


Чи можете ви пояснити свою логіку позаду 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


Гарна знахідка @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

Спробуйте в Інтернеті!

Безголівки:

(#) 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

Біт у parens - (<.&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

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⌊ парний мінімум з i

⍺⌊ мінімум попарно з цоколем

⍵/⍨ використовувати ці числа для тиражування літер рядка

Спробуйте в Інтернеті!




0

Абалон - це тип риби (ну, молюсків), тому ...

> <> , 79 байт

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

Спробуйте в Інтернеті або подивіться це на рибному майданчику !

Читає рядок з STDIN і припускає, що число вже є в стеку.

Пояснення: Другий, четвертий та шостий рядки - основні петлі. Деталі є деякими потворними маніпуляціями стеком, але в широких штрихах, по-перше, другий рядок заповнює стек, чергуючи символ введення та min ( in ), де n - обмеження довжини, а i - індекс символу в вхід: для "abalone", 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

Потім шостий рядок бере кожну пару символів і цифр і друкує символ стільки разів, скільки число.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.