Розтягніть слово


50

Введення - це слово з малих літер, не розділене пробілом. Новий рядок в кінці необов’язковий.

Це ж слово має бути виведене в модифікованій версії: для кожного символу подвойте його вдруге, коли воно з’явиться в початковому слові, втричі - втретє і т.д.

Приклад введення:

bonobo

Приклад виводу:

bonoobbooo

Застосовуються стандартні правила вводу / виводу. Виграє найкоротший код у байтах.

Тести, надані @Neil:

tutu -> tuttuu
queue -> queuuee
bookkeeper -> boookkkeeepeeer
repetitive -> repeetittiiveee
uncopyrightables -> uncopyrightables
abracadabra -> abraacaaadaaaabbrraaaaa
mississippi -> misssiisssssssiiipppiiii

Відповіді:


36

Желе , 4 байти

;\f"

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

Як це працює

;\f"  Main link. Argument: S (string)

;\    Cumulatively reduce by concatenation.
      This yields the array of all prefixes of S.
  f"  Vectorized filter.
      Keep only occurrences of the nth letter in the nth prefix.

21
Ну тоді ... зірвіть Pyth.
Аднан

2
Цей сайт стає змаганням за найкращу мову для гри в гольф загального призначення ... не те, що це погано.
Шельваку

8
@shelvacu Останнє є дискусійним, 2 друзі, я показав PPCG, що сказав щось у відповідь на те, що "усі найкращі відповіді просто використовують мови для гольфу" як перше враження.
Божевільний

@Insane є / є. Код гольфу - досить поширена річ. Тому мови складаються виключно для цієї мети.
Еван Карслайк

Як це .... працює?
Ерік Аутгольфер

21

Pyth, 6 байт

Дякуємо @Doorknob за те, що він зняв 1 байт.

Дякуємо @Maltysen за те, що він зняв 5 байт.

s@VQ._

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

Як це працює


Наприклад, візьміть рядок "bonobo".

._ складає список: ['b', 'bo', 'bon', 'bono', 'bonob', 'bonobo']

VQ._означає "попередня функція, векторизована (застосовується паралельно) над Qі ._", що означає, що Q(вхід оцінюється) буде розглядатися як список:, ['b', 'o', 'n', 'o', 'b', 'o']і тоді вони будуть спарені @таким чином:

     Q      ._         @ (intersect)
0:  'b'     'b'       'b'
1:  'o'     'bo'      'o'
2:  'n'     'bon'     'n'
3:  'o'     'bono'    'oo'
4:  'b'     'bonob'   'bb'
5:  'o'     'bonobo'  'ooo'

Тому @VQ._буде виробляти ['b', 'o', 'n', 'oo', 'bb', 'ooo'].

sПотім з'єднує їх всі разом, створюючи рядок 'bonoobbooo', яка потім неявно роздрукований стати bonoobbooo.


2
Кенні, твоє пояснення неправильне. VQозначає лише for N in Qтоді, коли він не знаходиться всередині функції. У цьому випадку, що насправді відбувається, це @Vозначає, що @функція векторизована (застосовується паралельно) протягом наступних двох аргументів, Qі ._. Цього немає в документах, тому я це виправлю.
isaacg

14

Сітківка , 34 19 байт

Збережено 15 байт, взявши трохи натхнення з рішення isaacg.

Кількість байтів передбачає кодування ISO 8859-1.


$`¶
(\D)(?!.*\1¶)

Провідні та кінцеві порожні рядки є істотними.

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

Пояснення


$`¶

Це етап заміни, який відповідає порожньому регулярному вираженню (тобто кожному положенню нульової ширини в рядку) і замінює $`¶його, де $`є префіксом відповідності та вставляє підводний рядок. Це в основному обчислює всі префікси та розміщує їх в окремому рядку разом з останнім символом цього префікса:

bb
obo
oboo
kbook
kbookk
ebookke
ebookkee
pbookkeep
ebookkeepe
rbookkeeper

Будуть декілька провідних та кінцевих каналів, але ми можемо їх ігнорувати.

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

(\D)(?!.*\1¶)

Це відповідає всім, що ми не хочемо зберігати, і замінює його нічим. Ми співставляємо будь-який символ (використовуючи, \Dоскільки ми знаємо, що у введенні цифр не буде), а потім переконаймося, що в кінці рядка немає іншої копії цього символу.


11

Пітон, 56 байт

Здається, я застряг у двох відповідях однакової довжини:

f=lambda x,*y:x and-~y.count(x[0])*x[0]+f(x[1:],x[0],*y)
f=lambda x,y=0:x[y:]and-~x[:y].count(x[y])*x[y]+f(x,y+1)

Редагувати: Дивіться відповідь @ pacholik для коротшого, альтернативного підходу Python.


Я не звик бити вас моїми <<> відповідями, я чекаю на відповідь Гол> <>, щоб виправити це;)
Аарон

@Aaron Шкода, я на самому ділі буду бити вас назад з> <>: P
Sp3000

Шум лінії в Python? Яка єресь !
кіт

Що робить - ~ робити? Я знаю, що це побіжно НЕ супроводжується запереченням, але що ви намагаєтесь зробити, щоб це економило кілька байтів?
Нік Хартлі

2
@QPaysTaxes Це приріст +1з достатньо високим пріоритетом, тому парен не потрібен
Sp3000

10

Хаскелл, 39 байт

f""=""
f x=f(init x)++filter(==last x)x

Приклад використання: f "bonobo"-> "bonoobbooo".

Досить відрізняється від відповіді @ Даміена . Побудує рядок праворуч, витягуючи з нього всі входження останнього символу та попереджаючи рекурсивний виклик з усіма, крім останнього символу.


9

> <> , 27 байт

>i:0g1+:\
:{-1v!?:<}o
/p${/

Потрібен офіційний перекладач, який виходить із помилкою при спробі друкувати кодову точку -1. Спробуйте в Інтернеті!

Код зчитує введення по одному символу за один раз і використовує перший рядок кодової коробки як великий масив, який зберігає кількість разів, коли кожна таблиця була переглянута до цього часу (> <> ініціалізує непрограмні комірки до 0). Другий ряд - це цикл для виведення символу кілька разів.

Крім того, ось версія, яка виходить чисто (37 байтів, не належним чином для гольфу):

>i:0(?;:0g1+:\
}o:{-1v!?:   <
v  p${<

Чорт, це добре! Я повинен перестати так сильно покладатися на онлайн-перекладача, я б ніколи не замислювався над тим, щоб просто скористатися таким величезним кодовим кодом, і я навіть не знав, що офіційний перекладач вийшов на друк -1
Аарон

2
@Aaron Так, це наслідок помилок Python при спробі зробити chr(-1). Анімований перекладач чудово підходить для візуалізації, але, на жаль, деякі розбіжності з офіційним перекладачем трохи дратують: /
Sp3000

9

JavaScript (ES6), 48 45 байт

s=>s.replace(n=/./g,c=>c.repeat(n[c]=-~n[c]))

Редагувати: збережено 3 байти завдяки @ user81655.


8

Haskell, 50 42 41 байт

Збережено 8 байт завдяки Лінн

f t=[c|(i,c)<-zip[1..]t,x<-take i t,c==x]

1
Як щодо:f t=[c|(i,c)<-zip[0..]t,j<-[0..i],c==t!!j]
Лінн

8

MATL , 8 байт

tt!=RsY"

Спробуйте в Інтернеті! Або перевірити всі тестові справи одразу .

Пояснення

t    % take input string implictly. Duplicate
t!   % duplicate and transpose into a column
=    % test for equality with broadcast. Gives an NxN array, where N is
     % input string length
R    % upper triangular part: set entries below the diagonal to 0
s    % sum of each column. For each postion in the input, gives how many
     % times that letter has appeared up to that position
Y"   % replicate elements (run-length decoding). Display implicitly

8

Лабіринт , 54 25 байт

<#; "#: ={},>
 }=}(.);("@

Інший спів з @ MartinBüttner, який на самому ділі зробив більшість майже всі ігри в гольф для цього. Переробивши алгоритм, нам вдалося зовсім небагато зменшити розмір програми!

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

Пояснення

Швидкий ґрунтовник Labrinth:

  • Лабіринт - це двоскладова мова на основі стека. Є два стеки, основний і допоміжний стек, і вискакування з порожнього стека дає нуль.

  • На кожному перехресті, де є кілька шляхів, щоб покажчик інструкцій рухався вниз, верхня частина основного стеку перевіряється, щоб побачити, куди йти далі. Негатив - поворот ліворуч, нуль - прямо вперед, а позитив - поворот праворуч.

Два стеки цілих чисел з довільною точністю - це не велика гнучкість у відношенні параметрів пам'яті. Щоб здійснити підрахунок, ця програма фактично використовує два стеки як стрічку, при цьому зміщення значення з однієї стеки на іншу схоже на переміщення вказівника пам'яті вліво / вправо по комірці. Це не зовсім так, як це, оскільки нам потрібно перетягнути лічильник циклу з нами по дорозі вгору.

введіть тут опис зображення

По-перше, <і >на будь-якому кінці спливають зміщення та обертають рядок коду, який зміщений на один або вліво, або вправо. Цей механізм використовується для того, щоб змусити код працювати в циклі - <з'являється нуль і обертає поточний рядок ліворуч, ставлячи IP праворуч від коду, а >з'являється ще один нуль і фіксує рядок назад.

Ось що відбувається з кожною ітерацією стосовно діаграми, наведеної вище:

[Section 1]
,}    Read char of input and shift to aux - the char will be used as a counter
      to determine how many elements to shift

[Section 2 - shift loop]
{     Shift counter from aux
"     No-op at a junction: turn left to [Section 3] if char was EOF (-1), otherwise
      turn right
(     Decrement counter; go forward to [Section 4] if zero, otherwise turn right
=     Swap tops of main and aux - we've pulled a value from aux and moved the
      decremented counter to aux, ready for the next loop iteration

[Section 3]
@     Terminate

[Section 4]
;     Pop the zeroed counter
)     Increment the top of the main stack, updating the count of the number of times
      we've seen the read char
:     Copy the count, to determine how many chars to output

[Section 5 - output loop]
#.    Output (number of elements on stack) as a char
(     Decrement the count of how many chars to output; go forward to [Section 6]
      if zero, otherwise turn right
"     No-op

[Section 6]
}     Shift the zeroed counter to aux

[Section 7a]
This section is meant to shift one element at a time from main to aux until the main
stack is empty, but the first iteration actually traverses the loop the wrong way!

Suppose the stack state is [... a b c | 0 d e ...].

=     Swap tops of main and aux               [... a b 0 | c d e ...]
}     Move top of main to aux                 [... a b | 0 c d e ...]
#;    Push stack depth and pop it (no-op)
=     Swap tops of main and aux               [... a 0 | b c d e ...]
      Top is 0 at a junction - can't move
      forwards so we bounce back
;     Pop the top 0                           [... a | b c d e ... ]

The net result is that we've shifted two chars from main to aux and popped the
extraneous zero. From here the loop is traversed anticlockwise as intended.

[Section 7b - unshift loop]

#     Push stack depth; if zero, move forward to the <, else turn left
}=    Move to aux and swap main and aux, thus moving the char below (stack depth)
      to aux
;     Pop the stack depth


7

Pyth, 7 байт

s@Led._

Тестовий набір

Тестовий набір завдяки DenkerAffe

Пояснення:

s@Led._
     ._    All prefixes, implicitly applied to the input.
 @L        Filter each prefix for characters equal to
   ed      the last character of the prefix
s          Concatenate and implicitly print.

6

Пітон 3, 52

def f(s):*s,x=s;return s and f(s)+x+x*s.count(x)or x

4
Ах, йти від кінця має набагато більше сенсу! Ви можете зробити це коротше в лямбда, без потреби в Python 3:f=lambda s:s and f(s[:-1])+s[-1]*s.count(s[-1])
Sp3000

Я, хоча це можна зробити так. Але мені не подобається підписка на Python: P
pacholik

5

PowerShell v2 +, 52 47 байт

$b=@{};-join([char[]]$args[0]|%{"$_"*++$b[$_]})

Конструює порожній хештел, зберігає його $b. Це наш «лічильник» того, які букви ми бачили. Потім беремо введення $args[0], передаємо його як масив char та відправляємо через цикл. Кожну ітерацію ми беремо поточний символ "$_"і множимо його на попередньо збільшений лічильник на задане значення, що зробить перше виникнення помножене на 1, друге на 2і так далі. Ми інкапсулюємо це за допомогою a-join так, що все це одне слово виводиться.

Збережено 5 байт завдяки TessellatingHeckler , використовуючи хешблет замість масиву, тому нам не потрібно було декрементувати символ ASCII, 97щоб досягти відповідного індексу. Це працює тому, що попереднє збільшення хеш-індексу неявно викликає .Add()у фоновому режимі, якщо цього індексу не існує, оскільки хештелі є змінними.

PS C:\Tools\Scripts\golfing> .\stretch-the-word.ps1 tessellatingheckler
tessseelllattingheeeckllleeeer

@TessellatingHeckler Дійсно - спасибі!
AdmBorkBork

5

Діалог APL , 6 байт

∊,\∩¨⊢

СпробуйтеAPL!

4 функції - на вершині (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'

Нарешті, (список) застосовується до результату, щоб вирівняти його, даючи'bonoobbooo'

Гей, принаймні, це відповідає Pyth ! Очевидно, Jelly коротший, оскільки це версія для гольфу J, що, в свою чергу, є вдосконаленим діалектом APL з 2 символами на функцію.


4

Pyth, 11 байт

s.e*b/<Qhkb

Спробуйте тут!

Пояснення

se * b / <Qhkb # Q = вхід

 .e # відобразити над входом з b як значення та k як індекс (Q додається в кінці неявно)
      <Qhk # візьміть перші k + 1 символи Q
     / b # порахуйте виникнення b там
   * b # повторити b, що багато разів
s # об'єднати отриманий список в один рядок

4

J, 11 байт

#~+/@(={:)\

Це монадійне дієслово. Спробуйте тут. Використання:

   f =: #~+/@(={:)\
   f 'tutu'
'tuttuu'

Пояснення

#~+/@(={:)\
     (   )\  For each non-empty prefix:
       {:      Take last element,
      =        compare for equality to the others and itself
  +/@          and take sum (number of matches).
#~           Replicate original elements wrt the resulting array.

4

05AB1E , 10 байт

Код:

$vy«Dy¢y×?

Пояснення:

$           # Push the number 1 and input
 v          # Map over the input string
  y«        # Concat the letter to the previous string (initial 1)
    D       # Duplicate this string
     y¢     # Count the occurences of the current character in the string
       y×   # Multiply this number with the current character
         ?  # Pop and print without a newline

Використовує кодування CP-1252 . Спробуйте в Інтернеті!


3

CJam, 14

q:A,{)A<_)--}/

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

Пояснення:

q:A      read the input and store in A
,        get the string length
{…}/     for each number from 0 to length-1
  )      increment the number
  A<     get the prefix of A with that length
  _      duplicate it
  )      separate the last character
  -      remove it from the rest of the prefix
  -      remove all the remaining characters (different from the last one)
          from the prefix


2

> <> , 52 байти

i:0(?;&l:?!v1-$:&:&=?\}70.>
6f+0.00o:&~/         \:o

Він укладає кожен прочитаний лист, друкує їх раз і ще раз для кожного подібного листа в стопі.
Він використовує &регістр, тому що обробляти 3 змінні на стеку (поточний лист для читання, позиція в стеку, літера в цій позиції) - це біль.

Ви можете спробувати тут !


2

Іржа, 176 байт

fn s(w:&str)->String{let mut m=std::collections::HashMap::new();w.chars().map(|c|{let mut s=m.remove(&c).unwrap_or(String::new());s.push(c);m.insert(c,s.clone());s}).collect()}

Тут використовується карта для зберігання рядка для кожного символу у вхідному документі. Для кожного символу рядок буде вилучено з карти, об'єднано з символом, вставиться назад у карту та додається до виводу.

Мені б хотілося скористатися get(...)замість цього remove(...), але позичальна перевірка змусила мене змінити свою думку.


2

Mathcad, 66 байт

На жаль, Mathcad не має особливо хорошої обробки рядків, тому я перетворив вхідну рядок у векторну, а потім використав (індексований код символу) вектор, щоб відстежувати кількість зустрічей символу, додаючи символ, який кількість разів до вектору результату. Нарешті, вектор результату перетворюється назад у рядок. На жаль, досить довго.

введіть тут опис зображення

Зауважте, що Mathcad використовує 2D інтерфейс "дошки" із поєднанням звичайного тексту та операторів; оператори зазвичай вводяться за допомогою панелі інструментів або комбінації клавіш; наприклад, ctl- # входить до оператора циклу for, який містить ключове слово for, елемент-символ символу та 3 порожніх "заповнювача" для змінної ітерації, діапазону та виразів тіла відповідно. Введення тексту [після того, як ім'я змінної переходить у режим індексу масиву, "Введення тексту" переходить у збірну пару круглих дужок ( переважно ... є винятки залежно від того, що ще є в оточуючому виразі )


2

Javascript ES6 44 байти

q=>q.replace(/./g,a=>x[a]=(x[a]||'')+a,x=[])

стара відповідь

Javascript ES6 46 байт

q=>(x=[...q]).map(a=>x[a]=(x[a]||'')+a).join``

//thanks user81655 for -1 byte

1
Ви можете зберегти байт, перейшовши xдо вхідного масиву ->q=>(x=[...q]).map(a=>x[a]=(x[a]||'')+a).join``
user81655

2

Джулія, 38 35 байт

!s=[]==s?s:[!s[1:end-1];ss[end]]

Введення / виведення знаходиться в масиві символів. Спробуйте в Інтернеті!

Як це працює

Ми (пере) визначаємо монадичний оператор ! для наших цілей.

Коли ! Викликається, він перевіряє, чи аргумент s порожній. Якщо це так, він повертає свій аргумент.

Якщо s не порожній, ми перетинаємо s з його останнім символом ( s[end]), який дає всі входження цього символу в s . Цей результат поєднується із значенням повернення рекурсивного виклику до ! з s мінусом останній символ ( s[1:end-1]) як аргумент.


2

PHP, 54 51 50 47 байт

for(;$C=$argn[$X++];)echo str_repeat($C,++$$C);

Бігайте так:

echo abracadabra | php -nR 'for(;$C=$argn[$X++];)echo str_repeat($C,++$$C); echo"\n";'

Налаштування

  • Збережено 3 байти за допомогою змінних змінних. Для запобігання зіткнення змінено використані змінні великі регістри
  • Збережено байт, видаливши тип cast nullдо intзміщення рядка, оскільки зміщення рядка передається int у будь-якому випадку
  • Збережено 3 байти, використовуючи $argnзамість $argv(thx Titus)

Використовуйте $argnдля, -Rщоб зберегти ще три байти.
Тит

О, і -nслід робити те саме, що і ваше -d error_reporting: nрозшифровується no config file, а сповіщення вимкнено у конфігурації за замовчуванням; тому -nr(відповідно -nR) повинно вистачити.
Тит

@Titus 2-річна відповідь, але все-таки THX :)
188

1

Математика, 57 байт

StringReplace[Clear@c;c@_=0;#,x_:>x~StringRepeat~++c[x]]&

Ми використовуємо c[x]як таблицю пошуку того, як часто персонаж xуже траплявся. Це збільшується щоразу, коли його завантажують x~StringRepeat~++c[x]. На жаль, щоб зробити функцію багаторазовою, нам потрібно кожного разу скидати таблицю пошуку Clear@c;c@_=0;, що досить дорого.


1

awk, 72 байти

BEGIN{FS=""}{for(i=1;i<=NF;i++){a[$i]++;for(j=0;j<a[$i];j++)printf $i}}

Ідея полягає в тому, щоб зберегти кількість фігур, що з'являються, в асоціативному масиві і надрукувати цей символ підрахунку разів.


1

Промінь, 32 33 42 байт

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

 >+\
vus/
>rnH
  >g'\
(@v's/
^`<

Спробуйте в цьому фрагменті

Загальне пояснення.

  • Встановіть усі гнізда пам'яті від 0-255 до 0
  • Прочитайте у вхідному значенні ascii промінь
  • Якщо промінь 0 стоп (промінь = магазин)
  • Отримайте значення [промінь] пам'яті в магазині, збільште його і збережіть назад
  • Зменшіть значення 0 до друку символу променя
  • Повторіть

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