Zróbmy falę!

29

Wkład:

  • Łańcuch (fragment fali) o długości >= 2.
  • Dodatnia liczba całkowita n >= 1 .

Wydajność:

Wyprowadzamy falę jednoliniową. Robimy to, powtarzając n wejściowy ciąg znaków .

Zasady konkursu:

  • Jeśli pierwszy i ostatni znak ciągu wejściowego jest zgodny, wypisujemy go tylko raz w całości wyniku (tj. ^_^O długości 2 staje się, ^_^_^a nie ^_^^_^).
  • Łańcuch wejściowy nie będzie zawierał żadnych białych znaków / tabulatorów / nowych linii / etc.
  • Jeśli twój język nie obsługuje znaków spoza ASCII, to w porządku. Tak długo, jak jest to zgodne z wyzwaniem z wejściem falowym tylko ASCII.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Odpowiedzi dotyczą standardowe zasady , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe:

_.~"(              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
źródło
Byłoby miło dodać fragment pytania z wynikami do pytania :)
Qwertiy
2
„Dodatnia liczba całkowita n >= 1 ” wydaje mi się trochę pleonastyczna ... :)
paolo,

Odpowiedzi:

8

Pyke, 15 14 10 bajtów

tQQhQeq>*+

Wypróbuj tutaj!

  QhQeq    -    input_1[0] == input_1[-1]
 Q     >   -   input_1[^:]
        *  -  ^ * V
t          -   input_2 - 1
         + - input_1 + ^
niebieski
źródło
+1 za wyjaśnienie, które wygląda jak sama fala!
wastl
23

Python 3, 32 bajty

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

Łączy nkopie ciągu, usuwając pierwszy znak ze wszystkich kopii, ale pierwszy, jeśli pierwszy znak pasuje do ostatniego.

xnor
źródło
To nie obsługuje poprawnie ciągu „¯¯ · .¸¸. · ´¯”, prawda? Kiedy próbuję, s[0]i s[-1]wydaje się, że odnosi się do pierwszego i ostatniego bajtu, a nie do pierwszego i ostatniego znaku. Edycja: ach, czekaj, to jest Python 2 vs. Python 3. Działa poprawnie w Python 3.
hvd
15

05AB1E , 13 bajtów

Wykorzystuje kodowanie CP-1252 .

D¬U¤XQi¦}I<×J

Wypróbuj online!

Wyjaśnienie

-___-i 3używane na przykład jako dane wejściowe.

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
źródło
11

JavaScript (ES6), 47 bajtów

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
źródło
1
Gratulacje za 20k!
Adnan
2
@Adnan Thanks! 20002 też, co jest miłe i symetryczne.
Neil,
1
Czy w tym przypadku jest możliwe curry? Mam na myśli robić s=>n=>...zamiast(s,n)=>
Zwei
8

Perl, 29 bajtów

Kod 28 bajtów + 1 dla -p.

Dzięki @Dada za pomoc w goleniu kilku bajtów!

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

Stosowanie

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

Przykład online.

Dom Hastings
źródło
2
Miły. Możesz zapisać (pośrednio) 3 bajty, używając <>zamiast, $'ponieważ pozwala to się pozbyć -0. A potem możesz użyć s///ezamiast //;$_=wygrać jeszcze jeden bajt :-)
Dada
@Dada miło ... Całkowicie spieprzyłem moją pierwotną próbę i nadmiernie ją uprościłem i ostatecznie zrobiłem ją znacznie większą ... Wziąłem twoje uwagi na pokład, ale wydaje mi się, że muszę $dopasować koniec, wciąż oszczędza mi bajtów, ponieważ nieużywanie 'oznacza, że ​​mogę go upuścić, zapisując go w pliku, aby zapisać, dodając 3 -pi upuszczając go z powrotem do 1!
Dom Hastings,
1
Huhu. Tak, rzeczywiście potrzebuje $nowej linii zamiast poprzedniej linii. (Przepraszam, że mój komentarz nie był zbyt szczegółowy, spieszyłem się ...)
Dada,
Podoba mi się pomysł użycia <>ciągu zastępującego. Ale jeśli njest oddzielony spacją zamiast nowej linii, liczbę znaków można nieco zmniejszyć:s/(.+?) (\d+)/$1x$2/e
piskliwy ossifrage
1
@DomHastings Ach, mój błąd. Nie przeczytałem poprawnie pytania :-)
piskliwy ossifrage
6

Perl, 23 bajty

Obejmuje +1 dla -p

Podaj ciąg wejściowy, a następnie liczbę w osobnych wierszach na STDIN

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

wave.pl:

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

Jeśli pierwszy znak w słowie nie jest znakiem specjalnym wyrażenia regularnego, ta 22 bajtowa wersja również działa:

#!/usr/bin/perl -p
$_ x=<>;/./;s/
$&?//g
Ton Hospel
źródło
Schludny! Myślę, że zapomniałeś /gmodyfikatora, kiedy go wkleiłeś ;-)
Dada
@Dada Oops. Naprawiono
Ton Hospel
5

MATL, 19 17 14 bajtów

ttP=l):&)liX"h

Działa to dla ASCII na interpretera online oraz zarówno dla Unicode, jak i ASCII, gdy jest uruchamiany przy użyciu MATLAB.

Wypróbuj online!

Wyjaśnienie

        % 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
źródło
4

Siatkówka , 29 bajtów

Linie 2 i 5 mają spację końcową.

 .+
$* 
 $


 $`
(.) +\1?
$1

Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).

Martin Ender
źródło
4

Partia, 117 bajtów

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

Pobiera liczbę powtórzeń jako parametr wiersza polecenia i odczytuje ciąg z STDIN.

Neil
źródło
4

Pyth, 13 bajtów

+z*@tBzqhzezt

Zestaw testowy!

Wyjaśnienie do naśladowania.

Steven H.
źródło
3

Gema, 41 znaków

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

Przykładowy przebieg:

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'
*******
człowiek w pracy
źródło
3

PowerShell v2 +, 48 bajtów

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

Wysyła jeden raz cały ciąg, a następnie n-1 kopii ciągu lub podłańcucha, w zależności od tego, czy pierwszy i ostatni znak są zgodne.

Do .Substring()wyjścia z indeksu metoda dostarczana do końca łańcucha, więc jeśli $s[0]-eq$s[-1]FALSE (0), otrzymujemy cały ciąg. Jeśli to stwierdzenie jest prawdziwe (1), otrzymujemy podciąg zaczynający się od drugiego znaku.

Ben Owen
źródło
Cholera, pokonałeś mnie o kilka minut. Miałem tę samą odpowiedź (używając $ a i $ b zamiast $ s i $ n).
AdmBorkBork,
3

VBA 119 bajtów

Nowość w tej grze i vba wygrywa z najwyższymi bajtami: P

PS: Nie mogę uwierzyć, że VBA stoi blisko 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

Wyjaśnienie:

+------------------------------------------------------------+-----------------------------------------------------------------------------------+
|                            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
źródło
3
Witamy w PPCG! Jako programista QBasic sam powiedziałbym, że możesz usunąć większość spacji i nadal mieć poprawny kod VBA, ponieważ możesz wpisać lub wkleić skrócony kod (z automatycznym formatowaniem dodającym spacje), nacisnąć i uruchomić, i to działa. To znacznie poprawiłoby twój wynik. :)
DLosc
3

CJam, 16 15 bajtów

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

Wypróbuj online

Wyjaśnienie:

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
źródło
2
Lubię twoje wejście falowe. :)
Kevin Cruijssen
3

K, 12 bajtów

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

Dzięki

Chromozorz
źródło
To łamie Regułę 1. {,/y#,$[(*x)~*|x;-1;0]_x}dla 25 bajtów obsługuje pierwsze / ostatnie dopasowanie. Jeśli jesteś szczęśliwy, że {,/y#,x}
złamałeś
2

PHP, 72 bajty

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

w PHP 7.1 można go zmniejszyć do 65 bajtów

<?=($a=$argv[1]).str_repeat(substr($a,$a[0]==$a[-1]),$argv[2]-1);
Jörg Hülsermann
źródło
2

Pip , 18 bajtów

Rozwiązanie Regex, wykorzystujące zasadę „brak spacji na wejściu”. Pobiera ciąg ze standardowego wejścia i liczby jako argument wiersza polecenia.

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

Wypróbuj online!

Wyjaśnienie:

 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

W ten sposób a bzmienia się w ab, a azmienia się a, a spacja na końcu łańcucha jest usuwana. Następnie wynik jest drukowany automatycznie.

DLosc
źródło
2

Haskell, 59 bajtów

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

Wersja bez golfa:

-- 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
źródło
2

Java 10, 123 111 109 107 102 100 79 bajtów

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

Wypróbuj online.

Alternatywnie z taką samą liczbą bajtów ( 79 bajtów ):

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

Wypróbuj online.

Spróbuję oczywiście odpowiedzieć na własne pytanie. ;)
-5 bajtów dzięki @ dpa97 .
-21 bajtów konwertujących z Java 7 na 10.

Wyjaśnienie:

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
źródło
1
s.split („^.”) [1] zamiast s.replaceAll („^.”, „”) powinien działać, z wyjątkiem kilku bajtów
dpa97
@ dpa97 Dzięki! Zredagowałem to. Zawsze zapominam o wykorzystaniu .split.
Kevin Cruijssen
@ dpa97 Wydaje mi się, że (lub my) to przemyśleliśmy .. s.substring(1)jest o dwa bajty krótszy. ;)
Kevin Cruijssen
@KevinCurijssen tak, powinienem to zobaczyć, dobre znalezisko. Myślę, że utknąłem na pomysł użycia wyrażenia regularnego ...
dpa97 10.10.16
1

JavaScript ES6, 49 znaków

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

Test:

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
źródło
1

QBIC , 65 bajtów

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

Chyba powinienem dodać LEFT $ i RIGHT $ do QBIC ...

Wyjaśnienie:

;          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
źródło
1

C #, 79 bajtów

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

Trochę absurdalnej metody powtarzania łańcucha. Utwórz nowy ciąg o żądanej długości powtarzania, a następnie zamień każdy znak na ciąg, który chcesz powtórzyć. Poza tym wygląda na prawie taką samą strategię jak wiele innych.

/*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
    )
;
mleko
źródło
1
Hmm, co się stanie, jeśli ciąg wejściowy zawiera x? Być może lepiej byłoby zmienić to na spację, ponieważ „ Łańcuch wejściowy nie będzie zawierał białych znaków / tabów / nowych linii / itp. ”.
Kevin Cruijssen
1
Będzie działać dobrze, jeśli wejście ma x. xx...xNajpierw tworzy ciąg, a następnie zamienia każdy z nich xbez ponownej oceny ciągu od początku z tym, co należy wymienić.
mleko
1

SpecBAS - 68 bajtów

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

Używa wbudowanego, IFaby sprawdzić, czy pierwszy i ostatni znak są takie same. Jeśli nie, wydrukuj ciąg znaków nkilka razy. W przeciwnym razie podziel łańcuch na długość-1, powtórz go i umieść ostatni znak na końcu.

Akceptuje tylko znaki ASCII (lub znaki wbudowane w SpecBAS IDE)

wprowadź opis zdjęcia tutaj

Brian
źródło
1

APL, 19 bajtów

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

Stosowanie:

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

Wyjaśnienie:

  • ⊃⍺=⊃⌽⍺: sprawdź, czy pierwszy znak pasuje do ostatniego znaku
  • ⍺↓⍨: w takim przypadku upuść pierwszy znak
  • : dołącz wynik
  • ⍵⍴: powtórz to razy
  • 1↓: upuść pierwszy (jest krótszy niż (⍵-1)⍴)
  • : zdobądź wszystkie proste elementy (cofnij boks)
  • ⍺,: dodaj jedną instancję całego łańcucha z przodu
marinus
źródło
1

Postscript, 98 bajtów

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

... ale możesz potrzebować „flush” przypiętego do tego, aby twój interpreter PS opróżnił bufor komunikacyjny, kolejne sześć bajtów :(

Dee Dub
źródło
1

Common Lisp (LispWorks), 176 bajtów

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

Stosowanie:

    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

Wyjaśnienie:

~~ =>   ~

\" =>   " 

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
źródło
1

Vim, 17 bajtów

Najłatwiejszym sposobem na to jest użycie wyrażenia regularnego, które może stwierdzić, czy pierwszy i ostatni znak są zgodne. Ale długie wyrażenia regularne są długie. Nie chcemy tego.

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

Fala do powtórzenia znajduje się w buforze. Zakładam, że liczba do powtórzenia znajduje się w rejestrze "a(wpisz qaNqN jako liczbę, aby ją ustawić). Chodzi o to:

  • Jeśli pierwszy i ostatni bajt pasują do siebie, usuń wszystko do ostatniego znaku.
  • Jeśli pierwszy i ostatni bajt się nie zgadzają, usuń wszystkie znaki.

Następnie razy Pusunięty tekst @a.

  • lDg*: Ten manewr tworzy wyrażenie regularne pasujące do dowolnego pierwszego znaku, niezależnie od tego, czy należy go uciec, czy nie, czy to słowo, czy nie. ( *wystarczyłoby, aby poprawnie uniknąć wyrażenia regularnego, ale dodałby niechciane \<\>śmieci, jeśli byłby to znak słowny _.)
  • p^: Ostatni krok był brudny. Oczyść do pierwotnej pozycji, na początku linii.
  • v$W trybie wizualnym, $domyślnie do ruchów po zakończeniu linii.
  • ?<C-P>$<CR>hd: Jeśli poprzedni regex istnieje na końcu linii, to wyszukiwanie zostanie do niego przeniesione; w przeciwnym razie pozostań poza końcem linii. Stamtąd przejdź w lewo, a my wykonamy (nużące) usunięcie, którego potrzebujemy.
  • @aP: Uruchom powtarzanie liczb jako makro, które ma być użyte jako argument P.
udioica
źródło
1

Rubinowy, 38 bajtów

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

Myślę, że to dość oczywiste. Nadal zastanawiam się, czy istnieje bardziej zwięzły sposób na przedstawienie s[0..-2]bloku, ale jeszcze go nie znalazłem.

Lee W.
źródło
0

Java (117 bajtów)

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;}
kodowane
źródło
1
Cześć, witamy w PPCG! Hmm, opublikowałem już krótszą odpowiedź na Javę 7 . Wasz używa podejścia podobnego do tego, które miałem wcześniej. Korzystając z tego samego podejścia, możesz grać b>0;b--w golfa b-->0;. Ponadto, dlaczego b+tam jest c+=b+a.substring? Mimo to jest to świetna pierwsza odpowiedź, jeśli wymyślisz ją niezależnie. Życzymy miłego pobytu tutaj na PPCG! :) Warto również przeczytać Porady dotyczące gry w golfa w Javie .
Kevin Cruijssen