Зробимо хвилю!


29

Вхід:

  • Рядок (фрагмент хвилі) з довжиною >= 2.
  • Позитивне ціле n >= 1 .

Вихід:

Виводимо однолінійну хвилю. Ми робимо це, повторивши вхідний рядок n разів.

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

  • Якщо перший і останній символ вхідного рядка збігаються, ми виводимо його лише один раз у загальному обсязі виводу (тобто ^_^довжина 2 стає ^_^_^і не є ^_^^_^).
  • Рядок введення не міститиме пробілів / вкладок / нових рядків / тощо.
  • Якщо ваша мова не підтримує символи, що не належать до ASCII, це добре. Поки вона все ще відповідає виклику з хвильовим входом, що відповідає лише ASCII.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з не кодовими гольф-мовами. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод з відповідними параметрами, повноцінні програми. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це необхідно.

Тестові приклади:

_.~"(              length 12
_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(

'°º¤o,¸¸,o¤º°'     length 3
'°º¤o,¸¸,o¤º°'°º¤o,¸¸,o¤º°'°º¤o,¸¸,o¤º°'

-__                length 1
-__

-__                length 8
-__-__-__-__-__-__-__-__

-__-               length 8
-__-__-__-__-__-__-__-__-

¯`·.¸¸.·´¯         length 24
¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯

**                 length 6
*******

String & length of your own choice (be creative!)

Було б чудово додати фрагмент з результатами до питання :)
Qwertiy

2
"Позитивне ціле n >= 1 " видається мені неначе плеонастичним ... :)
paolo

Відповіді:



23

Python 3, 32 байти

lambda s,n:s+s[s[0]==s[-1]:]*~-n

З’єднує nкопії рядка, видаляючи перший символ із усіх копій, але перший, якщо перший символ відповідає останньому.


Це неправильно обробляє рядок "¯` · .¸¸. · ´¯", чи не так? Коли я спробую це, s[0]і, s[-1]здається, посилається на перший і останній байт, а не на перший і останній символ. Редагувати: ах, зачекайте, це Python 2 проти Python 3. Це правильно працює в Python 3.
hvd

15

05AB1E , 13 байт

Використовує кодування CP-1252 .

D¬U¤XQi¦}I<×J

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

Пояснення

-___-і 3використовується як вхід, наприклад.

D              # duplicate input string
               # STACK: "-___-", "-___-"
 ¬U¤X          # push copies of the first and last element of the string
               # STACK: "-___-", "-___-", "-", "-"
     Q         # compare for equality 
               # STACK: "-___-", "-___-", 1
      i¦}      # if true, remove the first char of the copy of the input string
               # STACK: "-___-", "___-" 
         I<    # push input number and decrease by 1
               # STACK: "-___-", "___-", 2
           ×   # repeat the top string this many times
               # STACK: "-___-", "___-___-"
            J  # join with input string
               # STACK: "-___-___-___-"
               # implicitly output

11

JavaScript (ES6), 47 байт

f=
(s,n)=>s+s.slice(s[0]==s.slice(-1)).repeat(n-1)
;
<div oninput=o.textContent=n.value&&f(s.value,n.value)><input id=s><input id=n type=number min=1><div id=o>


1
З повагою 20k!
Аднан

2
@Adnan Дякую! 20002 теж приємно і симетрично.
Ніл

1
Чи можливий прийом карі в цьому випадку? Я маю на увазі робити s=>n=>...замість(s,n)=>
Zwei

8

Perl, 29 байт

28 байт код + 1 для -p.

Дякую @Dada за те, що допомогла мені відголити кілька байт!

s/^((.).*?)(\2?)$/$1x<>.$3/e

Використання

perl -pe 's/^((.).*?)(\2?)$/$1x<>.$3/e' <<< "'°º¤o,¸¸,o¤º°'
3"
'°º¤o,¸¸,o¤º°'°º¤o,¸¸,o¤º°'°º¤o,¸¸,o¤º°'
perl -pe 's/^((.).*?)(\2?)$/$1x<>.$3/e' <<< '**
6'
*******

Приклад в Інтернеті.


2
Приємно. Ви можете зберегти (опосередковано) 3 байти, використовуючи <>замість того $', що це дозволяє позбутися -0. І тоді ви можете використовувати s///eзамість того, //;$_=щоб виграти ще один байт :-)
Дада

@Dada nice ... Я повністю викрутив свою первісну спробу і спростив її, і в кінцевому підсумку зробив її значно більшою ... Я взяв ваші коментарі на борту, але мені здається, що мені потрібно, $щоб відповідати кінці, все ще зберігає мені байти як не використовуючи 'засоби, я можу скинути його, щоб зберегти у файл, щоб зберегти, додавши 3 для -pі повернути його до 1!
Дом Гастінгс

1
Хуху. Так, справді він потребує $замість нового рядка, який ви раніше мали. (Вибачте, що мій коментар був не дуже детальним, я поспішав ...)
Дада

Мені подобається ідея використання <>в рядку заміни. Але якщо nрозділений пробілом замість нового рядка, кількість символів може бути трохи зменшена:s/(.+?) (\d+)/$1x$2/e
писклява косточка

1
@DomHastings Ах, моя помилка. Не правильно прочитав питання :-)
пискливо костенеж

6

Perl, 23 байти

Включає +1 для -p

Наведіть рядок введення з наступним номером в окремих рядках на STDIN

wave.pl <<< "'°º¤o,¸¸,o¤º°'
3"

wave.pl:

#!/usr/bin/perl -p
$_ x=<>;s/(.)\K
\1?//g

Якщо перший символ у слові не є спеціальним символом регулярних виразів, ця версія 22 байтів також працює:

#!/usr/bin/perl -p
$_ x=<>;/./;s/
$&?//g

Акуратно! Думаю, ви забули /gмодифікатор, коли його вставили ;-)
Дада

@Dada На жаль Виправлено
Тонне Євангеліє

5

MATL, 19 17 14 байт

ttP=l):&)liX"h

Це працює для ASCII на онлайн-інтерпретаторі, а також для unicode та ASCII при запуску за допомогою MATLAB.

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

Пояснення

        % Implicitly grab the input as a string
        %   STACK:  {'abcdea'}
        %
tt      % Make two copies and push them to the stack
        %   STACK:  {'abcdea'    'abcdea'    'abcdea'}
        %
P       % Flip the second copy around
        %   STACK:  {'abcdea'    'abcdea'    'aedcba'}
        %
=       % Perform an element-wise comparison. Creates a boolean array
        %   STACK:  {'abcdea'    [1 0 0 0 1]}
        %
l)      % Get the first element. If the first and last char are the same this will be
        % TRUE (1), otherwise FALSE (0)
        %   STACK:  {'abcdea'    1 }
        %
:       % Create an array from [1...previous result]. If the first char was repeated,
        % this results in the scalar 1, otherwise it results in an empty array: []
        %   STACK: {'abcdea'    1 } 
        %
&)      % Break the string into pieces using this index. If there were repeated
        % characters, this pops off the first char, otherwise it pops off
        % an empty string
        %   STACK: {'a'    'bcdea'}
        %
li      % Push the number 1 and explicitly grab the second input argument
        %   STACK: {'a'    'bcdea'    1    3}
        %
X"      % Repeat the second string this many times
        %   STACK: {'a'    'bcdeabcdeabcdea'}
        %
h       % Horizontally concatenate the first char (in case of repeat) 
        % or empty string (if no repeat) with the repeated string
        %   STACK: {'abcdeabcdeabcdea'}
        %
        % Implicitly display the result


4

Пакетна, 117 байт

@set/ps=
@set t=%s%
@if %s:~0,1%==%s:~1% set t=%s:~1%
@for /l %%i in (2,1,%1)do @call set s=%%s%%%%t%%
@echo %s%

Приймає кількість повторень як параметр командного рядка і зчитує рядок з STDIN.



3

Гема, 41 персонаж

* *=@subst{\? \$1=\?\; =;@repeat{$2;$1 }}

Проба зразка:

bash-4.3$ gema '* *=@subst{\? \$1=\?\; =;@repeat{$2;$1 }}' <<< '_.~"( 12'
_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(

bash-4.3$ gema '* *=@subst{\? \$1=\?\; =;@repeat{$2;$1 }}' <<< "'°º¤o,¸¸,o¤º°' 3"
'°º¤o,¸¸,o¤º°'°º¤o,¸¸,o¤º°'°º¤o,¸¸,o¤º°'

bash-4.3$ gema '* *=@subst{\? \$1=\?\; =;@repeat{$2;$1 }}' <<< '** 6'
*******

3

PowerShell v2 +, 48 байт

Param($s,$n)$s+$s.Substring($s[0]-eq$s[-1])*--$n

Виводить весь рядок один раз, а потім - n-1 копій рядка або підрядка, залежно від того, чи відповідають перші та останні символи.

У .Substring()метод виходу з індексу подається в кінці рядка, так що якщо має $s[0]-eq$s[-1]значення FALSE (0), ми отримуємо весь рядок. Якщо це твердження вірно (1), отримуємо підрядку, починаючи з другого символу.


Dangit, ти побив мене кілька хвилин. Я мав таку ж відповідь (використовуючи $ a і $ b замість $ s і $ n).
AdmBorkBork

3

VBA 119 байт

Новачок у цій грі перемагає vba з найвищими байтами: P

PS: не можу повірити, що vba стоїть близько до JAVA HAHA

Function l(s,x)
l=s: s=IIf(Left(s,1)=Right(s,1),Mid(s,2,Len(s)),s)
z: x=x-1: If x>0 Then l=l & s: GoTo z:
End Function

Пояснення:

+------------------------------------------------------------+-----------------------------------------------------------------------------------+
|                            code                            |                                     function                                      |
+------------------------------------------------------------+-----------------------------------------------------------------------------------+
| l=s                                                        | input string s is saved to base                                                   |
| s = IIf(Left(s, 1) = Right(s, 1), Right(s, Len(s) - 1), s) | checks whether 1 and last char is equal,                                          |
|                                                            | if yes removes the first char from s and that s will be used to for further joins |
| z:                                                         | z: is a label                                                                     |
| x = x - 1:                                                 | decreases looping round                                                           |
| If x > 0 Then l = l & s: GoTo z:                           | join strings until no more rounds to do                                           |
+------------------------------------------------------------+-----------------------------------------------------------------------------------+

3
Ласкаво просимо до PPCG! Як сам програміст QBasic, я б сказав, що ви можете видалити більшість пробілів і все ще маєте дійсний код VBA, оскільки ви можете набрати або вставити скорочений код (з автоформатом додаючи пробіли), натисніть запустити, і це працює. Це значно покращить ваш рахунок. :)
DLosc

3

CJam, 16 15 байт

l]li*{(s@)@|@}*

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

Пояснення:

l]li*            Create a list of n-times the input string.
{(s@)@|@}*       Fold this list by taking out the last character of the first 
                 argument and the first character of the second argument and 
                 replacing them by their unique set union.
                 e.g.: "aba" "aba" -> "ab" 'a"a"| "ba" -> "ab" "a" "ba"
                       "abc" "abc" -> "ab" 'c"a"| "bc" -> "ab" "ca" "bc

2
Мені подобається ваш хвильовий вхід. :)
Кевін Круїссен

3

К, 12 байт

{,/[y#(,)x]}


/in action
{,/[y#(,)x]}["lollol";4]
"lollollollollollollollol"
{,/[y#(,)x]}["-_";10]
"-_-_-_-_-_-_-_-_-_-_"

/explanation (read function from right to left)
x is the string and y is the number of repetitions
(,)y    --enlist x so it becomes 1 value (rather than a list)
y#x     --take y many items of x
,/      --coalesce the list ,/[("-_";"-_")] --> "-_-_"

Спасибі


Це порушує правило 1. {,/y#,$[(*x)~*|x;-1;0]_x}на 25 байт обробляє першу / останню відповідність. Якщо ви щасливі, порушуючи правило 1, тоді ви можете мати {,/y#,x}8.
Стрітер

2

PHP, 72 байти

<?=($a=$argv[1]).str_repeat(substr($a,$a[0]==substr($a,-1)),$argv[2]-1);

з PHP 7.1 його можна зменшити до 65 байт

<?=($a=$argv[1]).str_repeat(substr($a,$a[0]==$a[-1]),$argv[2]-1);

2

Піп , 18 байт

Рішення Regex, скориставшись правилом "немає пробілів у введенні". Візьме рядок з stdin та число як аргумент командного рядка.

(q.s)XaR`(.) \1?`B

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

Пояснення:

 q.s                Read from stdin and append a space
(   )Xa             String-multiply by first cmdline arg
       R            Replace
        `(.) \1?`     Regex: char followed by space followed by (optional) same char again
                 B    Callback function, short for {b}: return 1st capturing group

Таким чином, a bперетворюється на ab, a aперетворюється на a, а пробіл в кінці рядка видаляється. Потім результат роздруковується автоматично.


2

Haskell, 59 байт

a%b=concat$replicate a b
a@(s:z)#n|s/=last z=n%a|1<2=s:n%z

Безгольова версія:

-- Helper: Appends str to itself n times
n % str = concat (replicate n str)

-- Wave creating function
(x:xs) # n
 -- If start and end of wave differ, 
 | x /= last xs = n%(x:xs)
 | otherwise   = x:(n%xs)

2

Java 10, 123 111 109 107 102 100 79 байт

s->n->{var r=s;for(;n-->1;r+=s.matches("(.).*\\1")?s.substring(1):s);return r;}

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

Альтернатива з таким же числом байтів ( 79 байт ):

(s,n)->{for(var t=s.matches("(.).*\\1")?s.substring(1):s;n-->1;s+=t);return s;}

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

Я, звичайно, спробую відповісти на власне запитання. ;)
-5 байт завдяки @ dpa97 .
-21 байт перетворення з Java 7 на 10.

Пояснення:

s->n->{                // Method with String and integer parameters and String return-type
  var r=s;             //  Result-String, starting at the input-String
  for(;n-->1;          //  Loop `n-1` times
    r+=s.matches("(.).*\\1")?
                       //   If the first and last characters are the same:
        s.substring(1) //    Append the result-String with the input-String, 
                       //    excluding the first character
       :               //   Else:
        s);            //    Append the result-String with the input-String
  return r;}           //  Return the result-String

1
s.split ("^.") [1] замість s.replaceВсі ("^.", "") повинні працювати, збережіть пару байтів
dpa97

@ dpa97 Дякую! Я це відредагував. Я завжди забуваю про використання .split.
Kevin Cruijssen

@ dpa97 Я думаю, що я (або ми) це переосмислив .. s.substring(1)на два байти коротше. ;)
Кевін Круїссен

@KevinCurijssen так, я мав би це бачити, хороша знахідка. Я думаю, що я застряг у ідеї використання
регексу

1

Javascript ES6, 49 символів

(s,n)=>s.replace(/(.).*?(?=\1?$)/,m=>m.repeat(n))

Тест:

f=(s,n)=>s.replace(/(.).*?(?=\1?$)/,m=>m.repeat(n))
console.log(document.querySelector("pre").textContent.split(`
`).map(s=>s.split` `).every(([s,n,k])=>f(s,n)==k))
<pre>_.~"( 12 _.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(
'°º¤o,¸¸,o¤º°' 3 '°º¤o,¸¸,o¤º°'°º¤o,¸¸,o¤º°'°º¤o,¸¸,o¤º°'
-__ 1 -__
-__ 8 -__-__-__-__-__-__-__-__
-__- 8 -__-__-__-__-__-__-__-__-
¯`·.¸¸.·´¯ 24 ¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯
** 6 *******</pre>


1

QBIC , 65 байт

;:~left$$|(A,1)=right$$|(A,1)|A=left$$|(A,len(A)-1)][1,a|B=B+A]?B

Я думаю, я повинен додати лівий $ та правий $ до QBIC ...

Пояснення:

;          make the first cmd line parameter into A$
:          make the second cmd line parameter into a (num)
~left..]   Drop the last char if equal to the first char
[1,a...]   FOR the given number of repetitions, concat A$ to B$ (starts out empty)
?B         print B$

1

C #, 79 байт

(s,n)=>s+new string('x',n-1).Replace("x",s[0]==s[s.Length-1]?s.Substring(1):s);

Трохи абсурдний метод повторення рядка. Створіть новий рядок потрібної довжини повтору, а потім замініть кожен символ рядком для повторення. Крім цього, схожа майже на таку ж стратегію, як і багато інших.

/*Func<string, int, string> Lambda =*/ (s, n) =>
    s                                      // Start with s to include first char at start
    + new string('x', n - 1).Replace("x",  // Concatenate n-1 strings of...
        s[0] == s[s.Length - 1]            // if first/last char are the same
            ? s.Substring(1)               // then skip the first char for each concat
            : s                            // else concat whole string each time
    )
;

1
Хм, що станеться, якщо рядок введення містить a x? Можливо, було б краще змінити це в пробіл, оскільки " Вхідний рядок не міститиме пробілів / вкладок / нових рядків / тощо ".
Кевін Крейссен

1
Він буде добре працювати, якщо вхід є x. Спочатку він створює xx...xрядок, а потім замінює кожну, xне переоцінюючи рядок з самого початку, тим, що потрібно замінити.
молоко

1

SpecBAS - 68 байт

1 INPUT a$,n: l=LEN a$: ?IIF$(a$(1)<>a$(l),a$*n,a$( TO l-1)*n+a$(l))

Використовує вбудований рядок, IFщоб перевірити, чи перший і останній символи однакові. Якщо ні, то друкуйте рядок nкілька разів. В іншому випадку зробіть рядок на довжину-1, повторіть це і поставте останній символ у кінці.

Можна приймати лише символи ASCII (або символи, вбудовані в SpecBAS IDE)

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


1

APL, 19 байт

{⍺,∊1↓⍵⍴⊂⍺↓⍨⊃⍺=⊃⌽⍺}

Використання:

      '^_^' {⍺,∊1↓⍵⍴⊂⍺↓⍨⊃⍺=⊃⌽⍺} 5
^_^_^_^_^_^

Пояснення:

  • ⊃⍺=⊃⌽⍺: подивіться, чи відповідає перший символ символу останнього
  • ⍺↓⍨: якщо це так, киньте перший символ
  • : додайте результат
  • ⍵⍴: повторити його разів
  • 1↓: скиньте перший (цей коротший (⍵-1)⍴)
  • : отримати всі прості елементи (скасувати бокс)
  • ⍺,: додайте один екземпляр цілого рядка на передню частину

1

Постскрипт, 98 байт

exch/s exch def/l s length 1 sub def s 0 get s l get eq{/s s 0 l getinterval def}if{s print}repeat

... але, можливо, вам знадобиться "флеш", який накладається на те, щоб ваш інтерпретатор PS промивав кому-буфер ще шість байтів :(


1

Звичайний Lisp (LispWorks), 176 байт

(defun f(s pos)(if(equal(elt s 0)(elt s #1=(1-(length s))))(let((s1(subseq s 0 1))(s2(subseq s 0 #1#)))(dotimes(j pos)(format t s2))(format t s1))(dotimes(j pos)(format t s))))

Використання:

    CL-USER 130 > (f "_.~~\"(" 12)
    _.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(_.~"(
    NIL

    CL-USER 131 > (f "'°o¤o,??,o¤o°'" 3)
    '°o¤o,??,o¤o°'°o¤o,??,o¤o°'°o¤o,??,o¤o°'
    NIL

    CL-USER 132 > (f "-__" 1)
    -__
    NIL

    CL-USER 133 > (f "-__" 8)
    -__-__-__-__-__-__-__-__
    NIL

    CL-USER 134 > (f "ˉ`·.??.·′ˉ" 24)
    ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ`·.??.·′ˉ
    NIL

    CL-USER 135 > (f "**" 6)
    *******
    NIL

Пояснення:

~~ =>   ~

\" =>   " 

Ungolf:

    (defun f (s pos)
      (if (equal (elt s 0) (elt s (1- (length s))))
          (let ((s1 (subseq s 0 1)) (s2 (subseq s 0 (1- (length s)))))
            (dotimes (j pos)
              (format t s2))
            (format t s1))        
        (dotimes (i pos)
          (format t s))))

1

Vim, 17 байт

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

lDg*p^v$?<C-P>$<CR>hd@aP

Хвиля, яку потрібно повторити, знаходиться в буфері. Я припускаю, що число, яке потрібно повторити, знаходиться в реєстрі "a(введіть qaNqN як число, щоб його встановити). Ідея така:

  • Якщо перший і останній байти збігаються, видаліть усе до останнього символу.
  • Якщо перший і останній байти не збігаються, видаліть усі символи.

Потім Pвидалені текстові @aрази.

  • lDg*: Цей маневр створює регулярний вираз, який відповідає будь-якому першому символу, незалежно від того, чи потрібно його уникати чи ні, чи це слово чи ні. ( *Було б достатньо, щоб зробити регулярно виражену форму, але додав би небажане \<\>сміття, якби це був символ слова, наприклад _.)
  • p^: Останній крок був безладним. Очистіть до початкового положення, починаючи з рядка.
  • v$У візуальному режимі, $за замовчуванням рухається до після того, як в кінці рядка.
  • ?<C-P>$<CR>hd: Якщо попередній регулярний вираз існує в кінці рядка, цей пошук переміститься до нього; в іншому випадку залишайтеся поза межами кінця рядка. Перемістіться ліворуч звідти, і ми виконаємо потрібне (нудне) видалення.
  • @aP: Запустіть повтор числа як макрос, який буде використовуватися як аргумент P.

1

Рубін, 38 байт

->s,n{s[0]==s[-1]?s[0..-2]*n+s[0]:s*n}

Я думаю, що це досить зрозуміло. Мені все ще цікаво, чи є більш стислий спосіб представити s[0..-2]блок, але я його ще не знайшов.


0

Java (117 байт)

String w(String a,int b){String c=a;for(;b>0;b--)c+=b+a.substring(a.charAt(a.length()-1)==a.charAt(0)?1:0);return c;}

1
Привіт, Ласкаво просимо до PPCG! Хм, я вже розмістив тут коротшу відповідь Java 7 . Ваш використовує підхід, аналогічний тому, який я мав раніше. Використовуючи цей же підхід, ви могли гольф b>0;b--в b-->0;. Крім того, чому b+там c+=b+a.substring? І все-таки це чудова перша відповідь, якщо ви придумали її самостійно. Насолоджуйтесь перебуванням тут на PPCG! :) Крім того, вам можуть бути цікаві читання поради щодо гольфу на Java .
Кевін Кройсейсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.