¡Hagamos la ola!

29

Entrada:

  • Una cadena (el fragmento de onda) con una longitud >= 2.
  • Un entero positivo n >= 1 .

Salida:

Producimos una onda de una sola línea. Hacemos esto repitiendo la cadena de entrada n veces.

Reglas de desafío:

  • Si el primer y último carácter de la cadena de entrada coincide, solo lo sacamos una vez en la salida total (es decir, ^_^de longitud 2 se convierte ^_^_^y no ^_^^_^).
  • La cadena de entrada no contendrá espacios en blanco / tabulaciones / nuevas líneas / etc.
  • Si su idioma no admite caracteres que no sean ASCII, entonces está bien. Siempre que cumpla con el desafío con la entrada de onda solo ASCII.

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados, programas completos. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código.
  • Además, agregue una explicación si es necesario.

Casos de prueba:

_.~"(              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
fuente
Sería bueno agregar un fragmento con resultados en la pregunta :)
Qwertiy
2
"Un número entero positivo n >= 1 " me parece un poco pleonástico ... :)
paolo

Respuestas:

8

Pyke, 15 14 10 bytes

tQQhQeq>*+

Pruébalo aquí!

  QhQeq    -    input_1[0] == input_1[-1]
 Q     >   -   input_1[^:]
        *  -  ^ * V
t          -   input_2 - 1
         + - input_1 + ^
Azul
fuente
¡+1 para una explicación que parece una ola en sí!
wastl
23

Python 3, 32 bytes

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

Concatena ncopias de la cadena, eliminando el primer carácter de todas las copias, pero el primero si el primer carácter coincide con el último.

xnor
fuente
Esto no maneja correctamente la cadena "¯` ​​· .¸¸. · ´¯" de la pregunta, ¿verdad? Cuando lo intento, s[0]y s[-1]parezco referirme al primer y último byte, en lugar del primer y último carácter. Editar: ah, espera, eso es Python 2 vs. Python 3. Funciona correctamente en Python 3.
hvd
15

05AB1E , 13 bytes

Utiliza la codificación CP-1252 .

D¬U¤XQi¦}I<×J

Pruébalo en línea!

Explicación

-___-y 3usado como entrada por ejemplo.

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
fuente
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
fuente
1
¡Felicidades por 20k!
Adnan
2
@Adnan Gracias! 20002 también, que es agradable y simétrico.
Neil
1
¿Es posible el curry en este caso? Me refiero a hacer en s=>n=>...lugar de(s,n)=>
Zwei
8

Perl, 29 bytes

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

¡Gracias a @Dada por ayudarme a reducir algunos 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'
*******

Ejemplo en línea.

Dom Hastings
fuente
2
Agradable. Podrías guardar (indirectamente) 3 bytes usando en <>lugar de hacerlo, $'ya que te permite deshacerte de él -0. Y luego puede usar en s///elugar de //;$_=ganar un byte más :-)
Dada
@Dada nice ... arruiné por completo mi intento original y lo simplifiqué demasiado y terminé haciéndolo mucho más grande ... He tomado en cuenta sus comentarios, pero parece que necesito $que coincidan con el final, todavía me ahorra bytes como no usar 'significa que puedo soltarlo y guardarlo en un archivo para guardarlo agregando 3 -py volver a soltarlo en 1.
Dom Hastings
1
Huhu Sí, de hecho, necesita el $lugar de la nueva línea que tenía anteriormente. (Lo siento, mi comentario no fue muy detallado, tenía prisa ...)
Dada
Me gusta la idea de usar <>en la cadena de reemplazo. Pero si nestá separada por un espacio en lugar de una nueva línea, el recuento de caracteres se puede reducir un poco:s/(.+?) (\d+)/$1x$2/e
quebrantahuesos aprensivos
1
@DomHastings Ah, mi error. No leí la pregunta correctamente :-)
aprensivo ossifrage
6

Perl, 23 bytes

Incluye +1 para -p

Dé la cadena de entrada seguida de un número en líneas separadas en STDIN

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

wave.pl:

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

Si el primer carácter de la palabra no es un carácter especial regex, esta versión de 22 bytes también funciona:

#!/usr/bin/perl -p
$_ x=<>;/./;s/
$&?//g
Ton Hospel
fuente
¡Ordenado! Creo que olvidaste el /gmodificador cuando lo pegaste ;-)
Dada
@Dada Oops. Corregido
Ton Hospel
5

MATL, 19 17 14 bytes

ttP=l):&)liX"h

Esto funciona para ASCII en el intérprete en línea y tanto para Unicode como para ASCII cuando se ejecuta con MATLAB.

Pruébalo en línea!

Explicación

        % 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
fuente
4

Retina , 29 bytes

Las líneas 2 y 5 tienen un espacio final.

 .+
$* 
 $


 $`
(.) +\1?
$1

Pruébalo en línea! (La primera línea habilita un conjunto de pruebas separado por salto de línea).

Martin Ender
fuente
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 el número de repeticiones como un parámetro de línea de comandos y lee la cadena de STDIN.

Neil
fuente
3

Gema, 41 personajes

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

Ejecución de muestra:

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'
*******
hombre trabajando
fuente
3

PowerShell v2 +, 48 bytes

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

Emite la cadena completa una vez, seguida de n-1 copias de la cadena o subcadena, dependiendo de si el primer y el último carácter coinciden.

El .Substring()método sale del índice suministrado al final de la cadena, por lo que si se $s[0]-eq$s[-1]evalúa como falso (0), obtenemos la cadena completa. Si esa afirmación es verdadera (1), obtenemos la subcadena que comienza en el segundo carácter.

Ben Owen
fuente
Dangit, ya me ganaste por unos minutos. Tuve la misma respuesta (usando $ a y $ b en lugar de $ sy $ n).
AdmBorkBork
3

VBA 119 bytes

Nuevo en este juego y vba gana con los bytes más altos: P

PD: no puedo creer que vba esté cerca 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

Explicación:

+------------------------------------------------------------+-----------------------------------------------------------------------------------+
|                            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
fuente
3
Bienvenido a PPCG! Como programador de QBasic, diría que puede eliminar la mayoría de los espacios y aún tener un código VBA válido, ya que puede escribir o pegar el código acortado (con el autoformatter agregando los espacios), presione ejecutar y funciona. Eso mejoraría tu puntaje considerablemente. :)
DLosc
3

CJam, 16 15 bytes

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

Pruébalo en línea

Explicación:

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
fuente
2
Me gusta tu 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 ,/[("-_";"-_")] --> "-_-_"

Gracias

Chromozorz
fuente
Esto rompe la Regla 1. {,/y#,$[(*x)~*|x;-1;0]_x}para 25 bytes maneja la primera / última coincidencia. Si eres feliz rompiendo la Regla 1, entonces puedes tener {,/y#,x}por 8.
streetter
2

PHP, 72 bytes

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

con PHP 7.1 podría reducirse a 65 Bytes

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

Pip , 18 bytes

Solución de expresiones regulares, aprovechando la regla "sin espacios en la entrada". Toma la cadena de stdin y el número como argumento de línea de comando.

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

Pruébalo en línea!

Explicación:

 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

Por lo tanto, se a bconvierte en ab, se a aconvierte en ay se elimina el espacio al final de la cadena. Entonces el resultado se imprime automáticamente.

DLosc
fuente
2

Haskell, 59 bytes

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

Versión sin golf:

-- 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
fuente
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;}

Pruébalo en línea.

Alternativa con el mismo conteo de bytes ( 79 bytes ):

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

Pruébalo en línea.

Por supuesto, intentaré responder mi propia pregunta. ;)
-5 bytes gracias a @ dpa97 .
-21 bytes de conversión de Java 7 a 10.

Explicación:

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
fuente
1
s.split ("^.") [1] en lugar de s.replaceAll ("^.", "") debería funcionar, guarde un par de bytes
dpa97
@ dpa97 ¡Gracias! Lo he editado Siempre me olvido de utilizar .split.
Kevin Cruijssen
@ dpa97 Creo que lo he (o hemos estado) pensando demasiado ... s.substring(1)es dos bytes más corto. ;)
Kevin Cruijssen
@KevinCurijssen, sí, debería haber visto eso, buen hallazgo. Creo que estaba atrapado en la idea de usar
expresiones
1

Javascript ES6, 49 caracteres

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

Prueba:

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
fuente
1

QBIC , 65 bytes

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

Supongo que debería agregar LEFT $ y RIGHT $ a QBIC ...

Explicación:

;          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
fuente
1

C #, 79 bytes

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

Un método un poco absurdo de repetir una cadena. Cree una nueva cadena de la longitud de repetición deseada y luego reemplace cada carácter con la cadena para repetir. Aparte de eso, parece más o menos la misma estrategia que muchos otros.

/*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
    )
;
Leche
fuente
1
Hmm, ¿qué pasa si la cadena de entrada contiene un x? Tal vez sería mejor cambiar eso a un espacio, ya que " La cadena de entrada no contendrá espacios en blanco / tabulaciones / nuevas líneas / etc. ".
Kevin Cruijssen
1
Funcionará bien si la entrada tiene x. Primero crea la xx...xcadena y luego la reemplaza xsin volver a evaluar la cadena desde el principio con lo que debe reemplazarse.
leche
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))

Utiliza en línea IFpara verificar si el primer y el último carácter son iguales. De lo contrario, imprima el nnúmero de cadena varias veces De lo contrario, empalme la cadena a longitud-1, repita eso y ponga el último carácter al final.

Solo puede aceptar caracteres ASCII (o caracteres integrados en SpecBAS IDE)

ingrese la descripción de la imagen aquí

Brian
fuente
1

APL, 19 bytes

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

Uso:

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

Explicación:

  • ⊃⍺=⊃⌽⍺: ver si el primer personaje coincide con el último personaje
  • ⍺↓⍨: si este es el caso, suelte el primer carácter
  • : adjunte el resultado
  • ⍵⍴: replicarlo veces
  • 1↓: suelte el primero (esto es más corto que (⍵-1)⍴)
  • : obtener todos los elementos simples (deshacer el boxeo)
  • ⍺,: agrega una instancia de toda la cadena al frente
marinus
fuente
1

Postdata, 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

... pero es posible que necesite agregar una 'descarga' para que su intérprete de PS vacíe el búfer de comunicación, otros seis bytes :(

Dee Dub
fuente
1

Lisp común (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

Explicación:

~~ =>   ~

\" =>   " 

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
fuente
1

Vim, 17 bytes

La manera fácil de hacer esto es utilizar una expresión regular de referencia inversa que pueda determinar si el primer y el último carácter coinciden. Pero las expresiones regulares largas son largas. No queremos eso.

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

La ola para repetir está en el búfer. Supongo que el número que se repetirá está en el registro "a(escriba qaNqcon N como el número para configurarlo). La idea es:

  • Si el primer y el último byte coinciden, elimine todo hasta el último carácter.
  • Si el primer y el último byte no coinciden, elimine todos los caracteres.

Entonces Pel texto eliminado @aveces.

  • lDg*: Esta maniobra crea una expresión regular que coincide con cualquier primer carácter, independientemente de si necesita escapar o no, o si es una palabra o no. ( *sería suficiente para hacer la expresión regular escapó correctamente, pero agregaría \<\>basura no deseada si fuera un carácter de palabra, como _).
  • p^: El último paso fue desordenado. Limpiar a la posición original, al comienzo de la línea.
  • v$: En modo visual, $por defecto se mueve a después del final de la línea.
  • ?<C-P>$<CR>hd: Si la expresión regular anterior existe al final de la línea, esta búsqueda se moverá a ella; de lo contrario, quédese más allá del final de la línea. Mover a la izquierda desde allí y logramos la eliminación (tediosa) que necesitamos.
  • @aP: Ejecute el número de repetición como macro para utilizarlo como argumento P.
udioica
fuente
1

Rubí, 38 bytes.

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

Creo que esto se explica por sí mismo. Todavía me pregunto si hay una forma más concisa de representar el s[0..-2]bloque, pero aún no lo he encontrado.

Lee W
fuente
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
fuente
1
Hola, bienvenido a PPCG! Hmm, ya publiqué una respuesta Java 7 más corta aquí . El suyo utiliza un enfoque similar al que tenía anteriormente. Al utilizar este mismo enfoque, podría campo b>0;b--a b-->0;. Además, ¿por qué hay b+allí c+=b+a.substring? Aún así, es una excelente primera respuesta si se te ocurrió de forma independiente. ¡Disfruta tu estadía aquí en PPCG! :) Además, puede encontrar consejos para jugar golf en Java interesantes para leer.
Kevin Cruijssen