Vamos fazer a onda!

29

Entrada:

  • Uma string (o trecho de onda) com um comprimento >= 2.
  • Um número inteiro positivo n >= 1 .

Saída:

Nós produzimos uma onda de linha única. Fazemos isso repetindo a sequência de entrada n vezes.

Regras do desafio:

  • Se o primeiro e o último caractere da string de entrada corresponderem, nós o produziremos apenas uma vez na saída total (ou seja, o ^_^comprimento 2 se tornará ^_^_^e não ^_^^_^).
  • A string de entrada não conterá espaços em branco / guias / novas linhas / etc.
  • Se o seu idioma não suportar caracteres não ASCII, tudo bem. Contanto que ainda cumpra o desafio com entrada de onda somente ASCII.

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, adicione uma explicação, se necessário.

Casos de teste:

_.~"(              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!)
Kevin Cruijssen
fonte
Seria bom para adicionar trecho com resultados na questão :)
Qwertiy
2
"Um número inteiro positivo n >= 1 " parece meio pleonastic para mim ... :)
paolo

Respostas:

8

Pyke, 15 14 10 bytes

tQQhQeq>*+

Experimente aqui!

  QhQeq    -    input_1[0] == input_1[-1]
 Q     >   -   input_1[^:]
        *  -  ^ * V
t          -   input_2 - 1
         + - input_1 + ^
Azul
fonte
+1 para uma explicação que se parece com uma onda em si!
Wastl
23

Python 3, 32 bytes

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

Concatena ncópias da sequência, removendo o primeiro caractere de todas as cópias, mas o primeiro se o primeiro caractere corresponder ao último.

xnor
fonte
Isso não lida adequadamente com a string "¯` · .¸¸. · ´¯" da pergunta, não é? Quando tento, s[0]e s[-1]pareço me referir ao primeiro e ao último byte, e não ao primeiro e ao último caractere. Edit: ah, espere, isso é Python 2 vs. Python 3. Ele funciona corretamente no Python 3. #
940
15

05AB1E , 13 bytes

Usa a codificação CP-1252 .

D¬U¤XQi¦}I<×J

Experimente online!

Explicação

-___-e 3usado como entrada, por exemplo.

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
Emigna
fonte
11

JavaScript (ES6), 47 bytes

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>

Neil
fonte
11
Parabéns por 20k!
Adnan
2
@Adnan Thanks! 20002 também, o que é legal e simétrico.
Neil
11
O curry é possível neste caso? Quero dizer fazendo s=>n=>...em vez de(s,n)=>
Zwei
8

Perl, 29 bytes

Código de 28 bytes + 1 para -p.

Agradeço ao @Dada por me ajudar a eliminar alguns bytes!

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

Uso

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

Exemplo online.

Dom Hastings
fonte
2
Agradável. Você pode salvar (indiretamente) 3 bytes usando em <>vez de $'como ele permite que você se livre -0. E então você pode usar em s///evez de //;$_=ganhar mais um byte :-)
Dada
@ Dadá legal ... Eu estraguei completamente minha tentativa original e simplifiquei demais e acabei tornando-a muito maior ... Aceitei seus comentários, mas pareço precisar de um $para corresponder ao final, ainda me salva bytes como não usar 'significa que eu posso soltá-lo tendo que ser salvo em um arquivo para salvar adicionando 3 -pe soltá-lo de volta para 1!
Dom Hastings
11
Huhu. Sim, de fato, ele precisa $da nova linha que você tinha anteriormente. (Desculpe o meu comentário não foi muito detalhado, eu estava com pressa ...)
Dada
Eu gosto da ideia de usar <>na string de substituição. Mas se né separada por um espaço em vez de uma nova linha, a contagem de caracteres pode ser reduzido um pouco:s/(.+?) (\d+)/$1x$2/e
ossifrage escrúpulos
11
@DomHastings Ah, meu erro. Não leu a pergunta corretamente :-)
ossifrage escrúpulos
6

Perl, 23 bytes

Inclui +1 para -p

Dê a sequência de entrada seguida pelo número em linhas separadas em STDIN

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

wave.pl:

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

Se o primeiro caractere da palavra não for um caractere especial de regex, esta versão de 22 bytes também funcionará:

#!/usr/bin/perl -p
$_ x=<>;/./;s/
$&?//g
Ton Hospel
fonte
Arrumado! Eu acho que você esqueceu o /gmodificador quando você colou-lo embora ;-)
Dada
@Dada Oops. Corrigido
Ton Hospel
5

MATL, 19 17 14 bytes

ttP=l):&)liX"h

Isso funciona para o ASCII no interpretador online e para o Unicode e o ASCII quando executados usando o MATLAB.

Experimente Online!

Explicação

        % 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
Suever
fonte
4

Retina , 29 bytes

As linhas 2 e 5 têm um espaço à direita.

 .+
$* 
 $


 $`
(.) +\1?
$1

Experimente online! (A primeira linha ativa um conjunto de testes separado por avanço de linha.)

Martin Ender
fonte
4

Lote, 117 bytes

@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%

Toma o número de repetições como um parâmetro da linha de comandos e lê a string em STDIN.

Neil
fonte
4

Pitão, 13 bytes

+z*@tBzqhzezt

Suíte de teste!

Explicação a seguir.

Steven H.
fonte
3

Gema, 41 caracteres

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

Exemplo de execução:

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'
*******
homem a trabalhar
fonte
3

PowerShell v2 +, 48 bytes

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

Produz a sequência inteira uma vez, seguida por n-1 cópias da sequência ou substring, dependendo se o primeiro e o último caracteres correspondem.

O .Substring()método sai do índice fornecido até o final da string, portanto, se for $s[0]-eq$s[-1]avaliado como false (0), obteremos a string inteira. Se essa afirmação for verdadeira (1), obtemos a substring começando no segundo caractere.

Ben Owen
fonte
Dangit, você me venceu por alguns minutos. Eu tive a mesma resposta (usando $ aeb $ em vez de $ se $ n).
AdmBorkBork # 7/16
3

VBA 119 bytes

Novo neste jogo e o vba vence com os bytes mais altos: P

PS: não posso acreditar que vba fica perto de 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

Explicação:

+------------------------------------------------------------+-----------------------------------------------------------------------------------+
|                            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                                           |
+------------------------------------------------------------+-----------------------------------------------------------------------------------+
krish KM
fonte
3
Bem-vindo ao PPCG! Como programador do QBasic, eu diria que você pode remover a maioria dos espaços e ainda ter um código VBA válido, pois você pode digitar ou colar o código abreviado (com o autoformatter adicionando os espaços), clicar em Executar e funcionar. Isso melhoraria consideravelmente sua pontuação. :)
DLosc
3

CJam, 16 15 bytes

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

Experimente online

Explicação:

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
Neorej
fonte
2
Eu gosto da sua entrada de onda. :)
Kevin Cruijssen
3

K, 12 bytes

{,/[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 ,/[("-_";"-_")] --> "-_-_"

obrigado

Chromozorz
fonte
Isso quebra a Regra 1. {,/y#,$[(*x)~*|x;-1;0]_x}Para 25 bytes lida com a primeira / última correspondência. Se você é regra quebra feliz 1, então você pode ter {,/y#,x}para 8.
streetster
2

PHP, 72 bytes

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

com o PHP 7.1 pode ser reduzido para 65 bytes

<?=($a=$argv[1]).str_repeat(substr($a,$a[0]==$a[-1]),$argv[2]-1);
Jörg Hülsermann
fonte
2

Pip , 18 bytes

Solução Regex, aproveitando a regra "sem espaços na entrada". Retorna a string de stdin e o número como um argumento da linha de comando.

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

Experimente online!

Explicação:

 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

Assim, a bvira ab, a avira ae o espaço no final da string é removido. Em seguida, o resultado é impresso automaticamente.

DLosc
fonte
2

Haskell, 59 bytes

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

Versão não destruída:

-- 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)
Craig Roy
fonte
2

Java 10, 123 111 109 107 102 100 79 bytes

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

Experimente online.

Alternativa com a mesma contagem de bytes ( 79 bytes ):

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

Experimente online.

Claro que tentarei responder minha própria pergunta. ;)
-5 bytes graças a @ dpa97 .
-21 bytes convertidos do Java 7 para 10.

Explicação:

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
Kevin Cruijssen
fonte
11
s.split ("^.") [1] em vez de s.replaceAll ("^.", "") deve funcionar, salve alguns bytes
dpa97 7/16
@ dpa97 Obrigado! Eu editei. Eu sempre esqueço de utilizar .split.
Kevin Cruijssen
@ dpa97 Acho que eu (ou estamos) pensando demais nele ... s.substring(1)é dois bytes mais curto. ;)
Kevin Cruijssen
@KevinCurijssen sim, deveria ter visto isso, boa descoberta. Acho que eu estava preso na idéia de usar regex ...
dpa97
1

Javascript ES6, 49 caracteres

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

Teste:

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>

Qwertiy
fonte
1

QBIC , 65 bytes

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

Acho que devo adicionar LEFT $ e RIGHT $ ao QBIC ...

Explicação:

;          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$
steenbergh
fonte
1

C #, 79 bytes

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

Um pouco de um método absurdo de repetir uma string. Crie uma nova sequência do tamanho de repetição desejado e substitua cada caractere pela sequência a ser repetida. Fora isso, parece praticamente a mesma estratégia que muitas outras.

/*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
    )
;
leite
fonte
11
Hmm, o que acontece se a string de entrada contiver um x? Talvez seja melhor mudar isso para um espaço, pois " A string de entrada não conterá espaços em branco / tabs / new-lines / etc. ".
Kevin Cruijssen
11
Funcionará bem se a entrada tiver x. Ele cria a xx...xcadeia primeiro e depois substitui cada uma xsem reavaliar a cadeia desde o início pelo que precisa ser substituído.
milk
1

SpecBAS - 68 bytes

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

Usa inline-IF para verificar se o primeiro e o último caracteres são os mesmos. Caso contrário, imprima o nnúmero da sequência de vezes. Caso contrário, divida a string no comprimento 1, repita isso e coloque o último caractere no final.

Só pode aceitar caracteres ASCII (ou caracteres incorporados no SpecBAS IDE)

insira a descrição da imagem aqui

Brian
fonte
1

APL, 19 bytes

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

Uso:

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

Explicação:

  • ⊃⍺=⊃⌽⍺: veja se o primeiro caractere corresponde ao último caractere
  • ⍺↓⍨: se for esse o caso, solte o primeiro caractere
  • : coloque o resultado
  • ⍵⍴: replicar vezes
  • 1↓: solte o primeiro (este é menor que (⍵-1)⍴)
  • : obtenha todos os elementos simples (desfaça o boxe)
  • ⍺,: adicione uma instância da cadeia inteira à frente
marinus
fonte
1

Postscript, 98 bytes

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

... mas você pode precisar de um 'flush' alinhado para que o seu interpretador PS libere o buffer de comunicação, outros seis bytes :(

Dee Dub
fonte
1

Lisp comum (LispWorks), 176 bytes

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

Uso:

    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

Explicação:

~~ =>   ~

\" =>   " 

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))))
sadfaf
fonte
1

Vim, 17 bytes

A maneira mais fácil de fazer isso é usar uma regex de referência remota que possa dizer se o primeiro e o último caracteres correspondem. Mas longas expressões regulares são longas. Nós não queremos isso.

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

A onda a repetir está no buffer. Estou assumindo que o número a ser repetido está no registro "a(digite qaNqN como o número para configurá-lo). A ideia é:

  • Se o primeiro e o último bytes corresponderem, exclua tudo até o último caractere.
  • Se o primeiro e o último bytes não corresponderem, exclua todos os caracteres.

Em seguida, Po texto excluído é exibido @a.

  • lDg*: Essa manobra cria um regex que corresponde a qualquer primeiro caractere, independentemente de ser necessário escapar ou não, ou se é uma palavra ou não. ( *seria o suficiente para criar a regex com escape adequado, mas adicionaria \<\>lixo indesejado se fosse um caractere de palavra, como_ .)
  • p^: O último passo foi confuso. Limpe até a posição original, iniciando a linha.
  • v$: No modo visual, $por padrão, move para após o final da linha.
  • ?<C-P>$<CR>hd: Se o regex anterior existir no final da linha, essa pesquisa será movida para ele; caso contrário, fique além do fim da linha. Mova para a esquerda a partir daí e realizamos a exclusão (tediosa) necessária.
  • @aP: Execute o número de repetição como uma macro a ser usada como argumento para P.
udioica
fonte
1

Ruby, 38 bytes

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

Eu acho que isso é bastante auto-explicativo. Ainda estou pensando se há uma maneira mais concisa de representar o s[0..-2]bloco, mas ainda não o encontrei.

Lee W
fonte
0

Java (117 bytes)

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;}
codecubed
fonte
11
Olá, seja bem-vindo ao PPCG! Hmm, eu já postei uma resposta mais curta do Java 7 aqui . O seu utiliza uma abordagem semelhante à que eu tinha anteriormente. Ao usar essa mesma abordagem, você poderia golf b>0;b--para b-->0;. Além disso, por que está b+c+=b+a.substring? Ainda assim, é uma ótima primeira resposta se você a criar de forma independente. Aproveite a sua estadia aqui no PPCG! :) Além disso, você pode encontrar dicas de golfe em Java interessantes para ler.
Kevin Cruijssen