Więcej dzwonków…

42

Jesteś zapewniając wsparcie techniczne dla tej Bruce Dickenson jak on wytwarza sesję nagraniową Blue Oyster Cult. Gdy poprosi o więcej dzwonków , możesz mu je dać.

Twoje zadanie

Napisz program lub funkcję, która pobiera ciąg (lub odpowiednik w Twoim języku) jako dane wejściowe i wyświetla powiązany ciąg zawierający jeszcze jeden dzwonek.

Ile dzwonków zawiera sznurek?

Liczba dzwonków zawiera ciąg znaków równa się maksymalnej liczbie wyraźnych kopii „dzwonka”, którą można uzyskać przez permutację znaków ciągu. Na przykład, "bbbccceeellllllooowwwwwwwww"zawiera 3 cowbells, a "bbccceeellllllooowwwwwwwww", a "bbbccceeelllllooowwwwwwwww"każdy z nich zawiera 2 cowbells i "cowbel"zawiera 0 cowbells.

W jaki sposób dane wyjściowe powinny być powiązane z danymi wejściowymi?

Dane wyjściowe powinny składać się z konkatenacji, w tej kolejności, łańcucha wejściowego i najkrótszego prefiksu łańcucha wejściowego potrzebnego do zwiększenia liczby dzwonków krowich.

Na przykład "bbbccceeelllllooowwwwwwwww"potrzebuje tylko jednego dodatkowego, "l"aby zawierał 3 dzwonki krowy zamiast 2; najkrótszy prefiks, który zawiera który "l"jest "bbbccceeel". Dlatego jeśli wejście jest "bbbccceeelllllooowwwwwwwww", to wyjście powinno być "bbbccceeelllllooowwwwwwwwwbbbccceeel".

Techniczne

  • Możesz założyć, że dane wejściowe zawierają tylko drukowalne znaki ASCII. Jeśli jeden lub dwa znaki są irytujące w przetwarzaniu napisów w Twoim języku (np. Znaki nowej linii lub \), możesz założyć, że dane wejściowe ich nie zawierają - wystarczy wspomnieć o tym ograniczeniu.
  • Możesz ponadto założyć, że wszystkie znaki alfabetu na wejściu są małe lub wszystkie wielkie. Jeśli zdecydujesz się nie zakładać jednego z nich, policz dzwonki bez rozróżniania wielkości liter.
  • Możesz dodatkowo założyć, że sygnał wejściowy zawiera co najmniej jedną kopię każdego z bohaterów b, c, e, l, o, i w. Jest to równoważne z założeniem, że jakiś prefiks łańcucha może zostać z nim połączony w celu wytworzenia łańcucha, który zawiera więcej dzwonków krowich. (Pamiętaj, że sam łańcuch wejściowy nie musi zawierać dzwonka).
  • Jeśli twój język ma wbudowane rozwiązanie, które rozwiązuje ten problem ... to używaj go całkowicie, naprawdę, jakie to niesamowite.

Pozłacane pieluchy

Ponieważ czas studia nagrań jest kosztowny, Twój kod musi być jak najkrótszy. Wpis z najmniejszą liczbą bajtów jest zwycięzcą!

Przypadki testowe

( link do wklejania dla łatwiejszego kopiowania / wklejania)

Wejście testowe nr 1: "christopher walken begs for more cowbell!"

Wyjście testowe nr 1: "christopher walken begs for more cowbell!christopher wal"

Wejście testowe nr 2: "the quick brown fox jumps over the lazy dog"

Wyjście testowe nr 2: "the quick brown fox jumps over the lazy dogthe quick brown fox jumps over the l"

Wejście testowe nr 3: "cowbell"

Wyjście testowe nr 3: "cowbellcowbell"

Wejście testowe nr 4: "cowbell cowbell cowbell"

Wyjście testowe # 4: "cowbell cowbell cowbellcowbell"

Wejście testowe nr 5: "cowbell cowbell cowbel"

Wyjście testowe nr 5: "cowbell cowbell cowbelcowbel"

Wejście testowe nr 6: "bcelow"

Wyjście testowe # 6: "bcelowbcel"

Wejście testowe nr 7: "abcdefghijklmnopqrstuvwxyz"

Wyjście testowe # 7: "abcdefghijklmnopqrstuvwxyzabcdefghijkl"

Wejście testowe nr 8: "cccowwwwbbeeeeelllll"

Wyjście testowe # 8: "cccowwwwbbeeeeelllllccco"

Wejście testowe nr 9: "be well, programming puzzles & code golf"

Wyjście testowe # 9: "be well, programming puzzles & code golfbe well, programming puzzles & c"

Wejście testowe nr 10: "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!"

Wyjście testowe nr 10: "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut lab"

Wejście testowe nr 11:

"c-c-b-c

i have a cow, i have a bell.
uh! bell-cow!
i have a cow, i have a cowbell.
uh! cowbell-cow!

bell-cow, cowbell-cow.
uh! cow-cowbell-bell-cow.
cow-cowbell-bell-cow!
"

Wyjście testowe # 11:

"c-c-b-c

i have a cow, i have a bell.
uh! bell-cow!
i have a cow, i have a cowbell.
uh! cowbell-cow!

bell-cow, cowbell-cow.
uh! cow-cowbell-bell-cow.
cow-cowbell-bell-cow!
c-c-b-c

i have a cow, i have a bell"
Greg Martin
źródło
23
Każdy, kto odpowiada w COW, zdobywa dziesięć punktów internetowych.
Pavel
3
Myślę, że ludziom byłoby znacznie łatwiej obsługiwać przypadki wejściowe / wyjściowe, gdyby sformatować je w jednym bloku kodu. W tej chwili zajmuje dużo miejsca i nie jest zbyt przyjazny dla kopiowania.
FryAmTheEggman
Dodano link Pastebin do kopiowania / wklejania. Jeśli istnieje sposób, aby ukryć / zwinąć / pokazać przypadki testowe w tym poście, oszczędzając w ten sposób miejsce w pionie, chciałbym się tego nauczyć.
Greg Martin
2
Zazwyczaj ludzie używają test case -> resultjednego dużego, wstępnie sformatowanego bloku kodu. Jest o wiele ładniejszy pod względem estetycznym i łatwiejszy do skopiowania.
FlipTack,
1
@MatthewRoh Oprócz faktu, że Lw słowie są dwa , nie jest to wyzwanie.
Martin Ender

Odpowiedzi:

13

Pip , 50 42 38 bajtów

T$<(MN{_NaM"lcowbe"}//^2M[aYa@<i])++iy

Przekaż ciąg jako argument wiersza polecenia, w razie potrzeby cytowany. Wypróbuj online!

Wyjaśnienie

Wyjaśnię to w dwóch częściach: funkcja dzwonka i pełny program. Po pierwsze, oto funkcja, która oblicza ilość dzwonka w ciągu:

MN{_NaM"lcowbe"}//^2

{...}definiuje funkcję. Wielu operatorów Pip po zastosowaniu do funkcji zwraca inną funkcję; na przykład -{a+1}jest taki sam jak {-(a+1)}. Więc powyższe jest równoważne z

{MN(_NaM"lcowbe")//^2}

który działa w następujący sposób:

{                    }  Function, in which a is the 1st argument (the string)
    _Na                 Lambda fn: returns number of times its argument occurs in a
       M"lcowbe"        Map that function to the characters of "lcowbe"
                   ^2   A devious way to get [2]: split the scalar 2 into characters
   (            )//     Int-divide the list of character counts by [2]
                        Since the lists are not the same length, this divides the first
                          element (# of l's) by 2 and leaves the others alone
 MN                     Take the min of the resulting list

Teraz, kiedy to mamy, oto pełny program:

T$<(MN{_NaM"lcowbe"}//^2M[aYa@<i])++iy
                                        a is 1st cmdline arg, i is 0 (implicit)
T                                       Loop till condition is true:
                            a@<i        Slice leftmost i characters of a
                           Y            Yank that into y variable
                         [a     ]       List containing a and that value
                        M               To that list, map...
    MN{_NaM"lcowbe"}//^2                ... the cowbell function
                                        Result: a list containing the amount of cowbell
                                        in the original string and the amount in the slice
 $<(                             )      Fold on less-than: true if the first element is
                                        less than the second, otherwise false
                                  ++i   In the loop, increment i
                                     y  Once the loop exits, print y (the latest slice)
DLosc
źródło
Wszedłem cowbell cowbell cowbeei wynik był, cowbellcowbelcowbelale być może źle używam IDE (nowy w PIP)
Albert Renshaw
@AlbertRenshaw I get cowbell cowbell cowbeecowbell( spróbuj online ). Czy używasz TIO lub kopii lokalnej?
DLosc
Och, miło! Trzymałem go pod polem „input”, a nie pod argumentem add. +1
Albert Renshaw
Naprawdę najwyższej klasy. Przeniesiłem go do javascript.
edc65
6

C 511 488 474 470 463 454

void f(char*a){char*s;int i=-1,c,o,w,b,e=b=w=o=c=1,l=3,n,r,z=i;for(;s=a[++i];c+=s==67,o+=s==79,w+=s==87,b+=s==66,e+=s==69,l+=s==76);r=~-l/2;n=c<o?c:o;n=w<n?w:n;n=b<n?b:n;n=e<n?e:n;n=r<n?r:n;c=c==n;o=o==n;w=w==n;b=b==n;e=e==n;if(l=r==n?l:0)if(l%2)l=2;else l=1,c=o=w=b=e=0;else l+=l%2;n=c+o+w+b+e+l;for(printf("%s",a);s=n?a[++z]:0;s==67&&c?n--,c--:0,s==79&&o?n--,o--:0,s==87&&w?n--,w--:0,s==66&&b?n--,b--:0,s==69&&e?n--,e--:0,s==76&&l?n--,l--:0,putchar(s));}

Wypróbuj online


Czytelny format + objaśnienie:

void f(char*a){
//a = input

    char*s;

    int i=-1,c,o,w,b,e=b=w=o=c=1,l=3,n,r,z=i;//c,o,w,b,e all start at 1; L starts at 3

    for(;s=a[++i];c+=s==67,o+=s==79,w+=s==87,b+=s==66,e+=s==69,l+=s==76);
    //loop to obtain number of times each character C,O,W,B,E,L is found in string (using the ASCII numeric values of each letter)

    //to get an extra cowbell we need to increment C,O,W,B,E by 1 and L by 2 (two Ls in cowbell); except we don't have to because we already did that by starting them at c=1, o=1, w=1, b=1, e=1, L=3 when we declared them. 

    r=~-l/2;
    //r is half of (1 less the number of times L is in string (+ init value))

    n=c<o?c:o;n=w<n?w:n;n=b<n?b:n;n=e<n?e:n;n=r<n?r:n;
    //n is the number of times that the least occouring character appears in the string, (use R instead of L since cowbell has two L's in it and we just need ~-l/2)

    c=c==n;o=o==n;w=w==n;b=b==n;e=e==n;
    //convert c,o,w,b,e to BOOL of whether or not we need 1 more of that letter to create one more cowbell (logic for L handled below since it's trickier)

    if(l=r==n?l:0)//if L-1/2 is [or is tied for] least occurring character do below logic, else set l to 0 and skip to `else`
        if(l%2)//if l is divisible by 2 then we need 2 more Ls
            l=2;
        else //otherwise we just need 1 more l and no other letters
            l=1,c=o=w=b=e=0;
    else //add 1 to L if it's divisible by 2 (meaning just 1 more L is needed in addition to possibly other C,O,W,B,E letters) (*Note: L count started at 3, so a count of 4 would be divisible by 2 and there is only 1 L in the string)
        l+=l%2;

    n=c+o+w+b+e+l;
    //n = number of specific characters we need before we reach 1 more cowbell

    for(printf("%s",a);s=n?a[++z]:0;s==67&&c?n--,c--:0,s==79&&o?n--,o--:0,s==87&&w?n--,w--:0,s==66&&b?n--,b--:0,s==69&&e?n--,e--:0,s==76&&l?n--,l--:0,putchar(s));
    //loop starts by printing the original string, then starts printing it again one character at a time until the required number of C,O,W,B,E,L letters are reached, then break (s=n?a[++z]:0) will return 0 when n is 0. Each letter subtracts from n only when it still requires letters of its type (e.g. b?n--,b--:0)

}

Niektóre zastosowane sztuczki:

• Podczas sprawdzania znaków 'w'wpisuję znak, który ma 3 bajty, ale dla znaków 'c'i 'b'mogę wpisać ich wartości ASCII odpowiednio 99 i 98, aby za każdym razem zapisać bajt. (Edycja: Dzięki @Titus wiem, że robię to ze wszystkimi literami COWBELL, używając tylko wielkich liter, które są dwubajtowymi numerycznymi wartościami ascii)

r=~-l/2jest r=(l-1)/2za pomocą bitshifts

a[++i]Otrzymuję znak w indeksie (i) i iteruję indeks w tym samym czasie. Po prostu zaczynam iod i=-1zamiast i=0(robię to samo z zi uruchamiam, z=iaby zapisać kolejny bajt)

Albert Renshaw
źródło
1
Zaoszczędź 8 bajtów, wpisując wielkie litery: wszystkie kody ASCII poniżej 100.
Tytus
@Titus Brilliant! Dziękuję Tytusowi, redaguję teraz
Albert Renshaw
1
Obecnie mamy pytanie dotyczące Twojego stwierdzenia „Drugi zdefiniowany int (w tym przypadku c) jest zawsze ustawiony na 1 [...]”. Cieszymy się z twojego oświadczenia, dlaczego tak myślisz, ponieważ niektórym z nas wydaje się to dziwne.
cadaniluk
@Albert, czy to możliwe, że Twój program polega na c,o,w,b,ezainicjowaniu tej samej wartości zamiast 1? Ponieważ twoja wskazówka nr 2 wydaje się nieprawdziwa, nie dla CI przynajmniej wiem. Możesz wyjaśnić? Pytanie SO
Felix Dombek
1
@ FelixDombek dziękuję za zwrócenie uwagi! To jest def. niezdefiniowane zachowanie, po prostu symulowałem (zapętlono) na wielu IDE i wydaje się, że zawsze inicjuje int jako 0. Prawdopodobnie mógłbym w końcu to zostawić, chociaż moja logika została zaprojektowana tak, aby wszystkie miały wartość 1; myślę, że przypadki testowe pracują z tym przy 0. Na zdrowie
Albert Renshaw,
5

Python 2, 125 113 112 bajtów

n=lambda s:min(s.count(c)>>(c=='l')for c in "cowbel")
def f(s,i=0):
 while n(s)==n(s+s[:i]):i+=1
 return s+s[:i]

n liczy liczbę dzwonków krowich


-12 bajtów dzięki @Rod
-1 bajtów dzięki @Titus

ovs
źródło
nie jest potrzebne []zrozumienie listy, gdy jest to jedyny parametr, można też upuścić enumerate: min(s.count(c)/-~(c=='l')for c in"cowbel")gdzie -~(n=='l')jest krótszy sposób pisania1+(n=='l')
Rod
1
Czy nie >>będzie krótszy niż /-~?
Tytus
@Titus masz rację
2017
Podjęto próbę edycji, która usunęłaby bajt, zastępując ostatnią przestrzeń nowego wiersza pojedynczym średnikiem.
Wheat Wizard
@ Möbius Czy nie returnbyłoby wtedy w pętli while?
ovs
5

Perl 6 , 91 bajtów

{my &c={.comb.Bag.&{|.<c o w b e>,.<l>div 2}.min}
first *.&c>.&c,($_ X~[\,](.comb)».join)}

Zakłada wprowadzanie małych liter.

Jak to działa

Wewnątrz lambda inna lambda do zliczania liczby dzwonków w łańcuchu jest zdefiniowana jako taka:

my &c={                                        }  # Lambda, assigned to a variable.
       .comb                                      # Split the string into characters.
            .Bag                                  # Create a Bag (maps items to counts).
                .&{                       }       # Transform it into:
                   |.<c o w b e>,                 #   The counts of those letters, and
                                 .<l>div 2        #   half the count of "l" rounded down.
                                           .min   # Take the minimum count.

Reszta kodu używa tej wewnętrznej lambdy &cdo znalezienia wyniku, jak poniżej:

                     [\,](.comb)».join   # All prefixes of the input,
               ($_ X~                 )  # each appended to the input.
first         ,                          # Return the first one for which:
      *.&c>                              #   The cowbell count is greater than
           .&c                           #   the cowbell count of the input.
smls
źródło
4

MATL , 38 37 bajtów

1 bajt off dzięki pomysłowi @ DLosc na użycie ciągu szablonu lcowbezamiastcowbel

n`Gt@q:)hXK!'lcowbe'=s32BQ/kX<wy-Q]xK

Wszystkie znaki wejściowe są pisane małymi literami. Jeśli dane wejściowe zawierają znaki nowej linii, znak nowej linii należy wprowadzić, ponieważ jego kod ASCII jest połączony ze zwykłymi znakami (patrz ostatnie wejście w łączu ze wszystkimi przypadkami testowymi).

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Luis Mendo
źródło
3

JavaScript (ES6), 106 107 113 126 141

Przeniesienie do javascript odpowiedzi Pip przez @DLosc. Potrzebowałem trochę czasu, aby to w pełni zrozumieć, a to genialne.

Edytuj -15 bajtów zgodnie ze wskazówkami @Titus, bezpośrednio dodając znaki do łańcucha wejściowego ai unikając wczesnego powrotu (więc nie for/if)

Edycja 2, wyliczając wartość 6 dla funkcji Min, zapisuje pozostałe 13 bajtów

Edytuj 3 ponownie zmieniłem funkcję c. Myślałem, że gadatliwy lengthi splitbędzie zbyt długi. Myliłem się.

Zakładając małe litery

a=>[...a].some(z=>c(a+=z)>b,c=a=>Math.min(...[...'lcowbe'].map((c,i)=>~-a.split(c).length>>!i)),b=c(a))&&a

Mniej golfa

a=>{
  c=a=>{ // cowbell functions - count cowbells
    k = [... 'lcowbe'].map((c,i) => 
          (a.split(c).length - 1) // count occurrences of c in a
           / (!i + 1) // divide by 2 if first in list ('l')
    );
    return Math.min(...k);
  };
  b = c(a); // starting number of cowbells
  [...a].some(z => ( // iterate for all chars of a until true
    a += z,
    c(a) > b // exit when I have more cowbells
  ));
  return a;
}

Test

f=
a=>[...a].some(z=>c(a+=z)>b,c=a=>Math.min(...[...'lcowbe'].map((c,i)=>~-a.split(c).length>>!i)),b=c(a))&&a

;["christopher walken begs for more cowbell!"
,"the quick brown fox jumps over the lazy dog"
,"cowbell"
,"cowbell cowbell cowbell"
,"cowbell cowbell cowbel"
,"bcelow"
,"abcdefghijklmnopqrstuvwxyz"
,"cccowwwwbbeeeeelllll"
,"be well, programming puzzles & code golf"
,"lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!"
,`c-c-b-c
 
i have a cow, i have a bell.
uh! bell-cow!
i have a cow, i have a cowbell.
uh! cowbell-cow!
 
bell-cow, cowbell-cow.
uh! cow-cowbell-bell-cow.
cow-cowbell-bell-cow!
`].forEach(x=>console.log(x+'\n\n'+f(x)))

edc65
źródło
Myślę, że to k[x]++by się nie udało z powodu undefined. Ale jestem pewien, że to for(i=0;c(a)==c(a+=a[i++]);),adziała.
Tytus
@Titus Nie jestem pewien, czy rozumiem. Spróbuję
edc65
@Titus wow Zapisano 15 bajtów, dzięki bardzo
edc65
>>!ioszczędza 3 bajty. Dlaczego nie używasz c(a+=z)?
Tytus
@Titus używam c(a+=z). Nie w wersji mniej golfowej , ponieważ jest mniej golfa. Korzystanie >>!izapisuje 1 bajt (w wersji golfowej).
Jeszcze
2

Narzędzia Bash + Unix, 184 bajty

f()(tr -cd cowbel<<<"$1"|sed 's/\(.\)/\1\
/g'|sort|uniq -c|awk '{print int($1/(($2=="l")?2:1))}'|sort -n|head -1)
for((m=1;`f "$1${1:0:m}"`!=$[`f "$1"`+1];m++)){ :;}
echo "$1${1:0:$m}"

Wypróbuj online!

Dzięki @AlbertRenshaw za grę w golfa o 2 bajty.

Mitchell Spector
źródło
Można to jeszcze pograć w golfa, na przykład usuwając spacje przed i po!=
Albert Renshaw
1
@AlbertRenshaw Dziękuję - myślałem, że próbowałem tego i dostałem błąd składniowy, ale masz rację. Część awk może być bardziej golfowa; Nie znam się na awk.
Mitchell Spector
Tak, naiwnie próbowałem usunąć inne spacje i podziały wierszy w kodzie i otrzymywałem błędy składniowe, ale na tym zadziałało ¯_ (ツ) _ / ¯
Albert Renshaw
2

JavaScript (ES6), 124 114 bajtów

Dzięki Neil za zaoszczędzenie kilku bajtów

a=>eval("for(c=0,d=a;(A=$=>Math.min([...'cowbel'].map(_=>($.split(_).length-1)>>(_=='l'))))(a)==A(d+=a[c++]););d")

Ponieważ różni się to od już istniejącej odpowiedzi JavaScript i poświęciłem temu sporo czasu, postanowiłem sam stworzyć odpowiedź.

Stosowanie

f=a=>eval("for(c=0,d=a;(A=$=>Math.min([...'cowbel'].map(_=>($.split(_).length-1)>>(_=='l'))))(a)==A(d+=a[c++]););d")
f("cowbell")

Wynik

"cowbellcowbell"
Łukasz
źródło
.sort()[0]to wspaniały pomysł. evaljest zły. : D
Tytus
Dzięki ;-) Po raz pierwszy użyłem Math.min(), ale to kosztowało wiele postaci i pomyślałem, że będzie krótszy sposób. I tak, evaljest naprawdę fajny do gry w golfa.
Łukasz
Gdyby tylko .sort()[0]działał, kosztowałby tylko 10 bajtów, ale tak nie jest i .sort((a,b)=>a-b)[0]kosztuje 20 bajtów, ale Math.min(...)kosztuje tylko 13.
Neil
2

Oktawa, 80 87 97 bajtów

s=input('');k=1;do;until(x=@(A)min(fix(sum('cowbel'==A')./('111112'-48))))(b=[s s(1:++k)])>x(s);b

Wypróbuj online!

rahnema1
źródło
1
To nie działa, gdy potrzebujemy dwóch ls, aby ukończyć dodatkowy dzwonek. Na przykład podczas wprowadzania cowbellniepoprawnie zwraca, cowbellcowbela nie cowbellcowbell. (Mam nadzieję, że możesz to naprawić - podoba mi się nietypowy algorytm!)
Greg Martin
@GregMartin Thanks! Sprawdzę to!
rahnema1
2

CJam, 37 lat

q___S\+{+"cowbel"1$fe=)2/+:e<\}%()#)<

Wypróbuj online

Jeśli mogę wykluczyć znaki "i \, to…

35 bajtów

q___`{+"cowbel"1$fe=)2/+:e<\}%()#)<

Wypróbuj online

Wyjaśnienie

Kod sukcesywnie dołącza każdy znak łańcucha do łańcucha początkowego (od oryginalnego do podwojonego), określa liczbę dzwonków krowich dla każdego łańcucha (licząc liczbę wystąpień każdego znaku w „cowbel” i dzieląc jeden dla „l” o 2, a następnie przyjmując minimum), znajduje pozycję pierwszego ciągu, w którym liczba dzwonków krowy wzrasta o 1, a następnie pobiera odpowiedni prefiks wejścia i umieszcza go po ciągu wejściowym.

Aby uwzględnić również oryginalny ciąg (bez dołączanego znaku), kod wstawia znak neutralny do łańcucha, który jest iterowany. Pierwsza wersja poprzedza spację, a druga wersja wykorzystuje ciąg znaków, czyli ciąg między podwójnymi cudzysłowami.

q___          read input and make 3 more copies: one for output, one for prefix,
               one for appending and one for iterating
S\+           prepend a space to the iterating string
              or
`             get the string representation
{…}%          map each character of the string
  +           append the character to the previous string
  "cowbel"    push this string
  1$          copy the appended string
  fe=         get the number of occurrences of each "cowbel" character
  )2/+        take out the last number, divide by 2 and put it back
  :e<         find the minimum
  \           swap with the appended string
(             take out the first number (cowbells in the initial string)
)#            increment and find the index of this value in the array
)             increment the index (compensating for taking out one element before)
<             get the corresponding prefix
              another copy of the input is still on the stack
              and they are both printed at the end
aditsu
źródło
Nie mam nic przeciwko wykluczeniu znaków „i \!”
Greg Martin
1

PHP, 133 bajty

port PHP @ JavaScript portu @ edc65 odpowiedzi Pip DLosc.

function f($s){for(;$c=lcowbe[$i];)$a[$c]=substr_count($s,$c)>>!$i++;return min($a);}for($s=$argv[1];f($s)==f($s.=$s[$i++]););echo$s;

pobiera małe litery z argumentu wiersza poleceń. Uruchom z -nr.

awaria

// function to count the cowbells:
function f($s)
{
    for(;$c=lcowbe[$i];)            # loop through "cowbel" characters
        $a[$c]=substr_count($s,$c)  # count occurences in $s
            >>!$i++;                # divide by 2 if character is "l" (first position)
        return min($a);             # return minimum value
}
for($s=$argv[1];    # copy input to $s, loop:
    f($s)               # 1. count cowbells in $s
    ==                  # 3. keep looping while cowbell counts are equal
    f($s.=$s[$i++])     # 2. append $i-th character of $s to $s, count cowbells
;);
echo$s;             # print $s
Tytus
źródło