Lebih banyak cowbell…!

42

Anda menyediakan dukungan teknis untuk para Bruce Dickenson saat ia menghasilkan sesi rekaman Blue Oyster Cult. Ketika dia meminta lebih banyak cowbell , Anda bisa memberikannya kepadanya.

Tugas Anda

Tulis program atau fungsi yang mengambil string (atau setara dalam bahasa Anda) sebagai input, dan menghasilkan string terkait yang berisi satu cowbell lagi.

Berapa banyak cowbell yang berisi string?

Jumlah cowbell yang berisi string sama dengan jumlah maksimum salinan berbeda dari "cowbell" yang dapat diperoleh dengan meng-permutasi karakter string. Misalnya, "bbbccceeellllllooowwwwwwwww"berisi 3 lonceng, sementara "bbccceeellllllooowwwwwwwww"dan "bbbccceeelllllooowwwwwwwww"masing - masing berisi 2 lonceng, dan "cowbel"berisi 0 lonceng.

Bagaimana seharusnya output terkait dengan input?

Output harus terdiri dari rangkaian, dalam urutan ini, dari string input dan awalan terpendek dari string input yang diperlukan untuk meningkatkan jumlah cowbells.

Misalnya, "bbbccceeelllllooowwwwwwwww"hanya perlu satu tambahan "l"untuk mengandung 3 lonceng bukannya 2; awalan terpendek yang berisi bahwa "l"adalah "bbbccceeel". Karena itu, jika inputnya adalah "bbbccceeelllllooowwwwwwwww", maka outputnya seharusnya "bbbccceeelllllooowwwwwwwwwbbbccceeel".

Teknisnya

  • Anda dapat berasumsi bahwa input hanya berisi karakter ASCII yang dapat dicetak. Jika ada satu atau dua karakter yang mengganggu pemrosesan string bahasa Anda (seperti baris baru atau \), Anda dapat mengasumsikan bahwa input tidak mengandung mereka — sebutkan saja batasan ini.
  • Anda selanjutnya dapat mengasumsikan bahwa karakter alfabet dalam input semuanya huruf kecil, atau semua huruf besar. Jika Anda memilih untuk tidak mengambil salah satu dari ini, hitung cowbells case-insensitive.
  • Anda juga dapat mengasumsikan bahwa input berisi setidaknya satu salinan dari masing-masing karakter b, c, e, l, o, dan w. Ini sama dengan mengasumsikan bahwa beberapa awalan string dapat digabungkan untuk menghasilkan string yang berisi lebih banyak cowbell. (Perhatikan bahwa string input itu sendiri tidak perlu berisi cowbell.)
  • Jika bahasa Anda memiliki builtin yang memecahkan masalah ini ... maka benar-benar menggunakannya, sungguh, betapa hebatnya itu.

Popok berlapis emas

Karena waktu studio rekaman mahal, kode Anda harus sesingkat mungkin. Entri dengan byte paling sedikit adalah pemenangnya!

Uji kasus

( tautan pastebin untuk lebih mudah menyalin / menempel)

Masukan tes # 1: "christopher walken begs for more cowbell!"

Tes keluaran # 1: "christopher walken begs for more cowbell!christopher wal"

Masukan tes 2: "the quick brown fox jumps over the lazy dog"

Tes keluaran # 2: "the quick brown fox jumps over the lazy dogthe quick brown fox jumps over the l"

Masukan tes 3: "cowbell"

Tes keluaran # 3: "cowbellcowbell"

Masukan tes # 4: "cowbell cowbell cowbell"

Tes keluaran # 4: "cowbell cowbell cowbellcowbell"

Masukan tes # 5: "cowbell cowbell cowbel"

Uji output # 5: "cowbell cowbell cowbelcowbel"

Masukan tes # 6: "bcelow"

Uji keluaran # 6: "bcelowbcel"

Masukan tes # 7: "abcdefghijklmnopqrstuvwxyz"

Tes keluaran # 7: "abcdefghijklmnopqrstuvwxyzabcdefghijkl"

Masukan tes 8: "cccowwwwbbeeeeelllll"

Tes keluaran # 8: "cccowwwwbbeeeeelllllccco"

Masukan tes 9: "be well, programming puzzles & code golf"

Uji keluaran # 9: "be well, programming puzzles & code golfbe well, programming puzzles & c"

Masukan tes # 10: "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!"

Uji keluaran # 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"

Masukan tes # 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!
"

Hasil tes # 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
sumber
23
Siapa pun yang menjawab dalam KK menghasilkan sepuluh poin internet.
Pavel
3
Saya pikir akan lebih mudah bagi orang untuk menangani kasus input / output jika Anda memformatnya dalam satu blok kode. Seperti berdiri itu memakan banyak ruang dan tidak terlalu ramah copy paste.
FryAmTheEggman
Tautan pastebin ditambahkan untuk menyalin / menempel. Jika ada cara untuk menyembunyikan / menutup / menampilkan kasus uji di pos ini, sehingga menghemat ruang vertikal, saya ingin mempelajarinya.
Greg Martin
2
Yah biasanya orang menggunakan test case -> resultdalam satu blok kode besar yang telah diformat. Ini jauh lebih bagus secara estetika dan lebih mudah untuk menyalin pasta.
FlipTack
1
@ MatthewRoh Terlepas dari kenyataan bahwa ada dua Ls dalam kata, ini bukan apa yang ditanyakan oleh tantangan.
Martin Ender

Jawaban:

13

Pip , 50 42 38 byte

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

Lewati string sebagai argumen baris perintah, dikutip jika perlu. Cobalah online!

Penjelasan

Saya akan menjelaskan ini dalam dua bagian: fungsi cowbell dan program lengkap. Pertama, inilah fungsi yang menghitung jumlah cowbell dalam sebuah string:

MN{_NaM"lcowbe"}//^2

{...}mendefinisikan suatu fungsi. Banyak operator Pip, ketika diterapkan pada suatu fungsi, mengembalikan fungsi lainnya; misalnya, -{a+1}sama dengan {-(a+1)}. Jadi di atas setara dengan

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

yang berfungsi sebagai berikut:

{                    }  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

Sekarang kita memiliki itu, inilah program lengkapnya:

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
sumber
Saya masuk cowbell cowbell cowbeedan hasilnya cowbellcowbelcowbeltetapi saya mungkin menggunakan IDE yang salah (baru untuk PIP)
Albert Renshaw
@AlbertRenshaw saya dapatkan cowbell cowbell cowbeecowbell( coba online ). Apakah Anda menggunakan TIO atau salinan lokal?
DLosc
Oh bagus! Saya menempelkannya di bawah kolom "input" bukan di bawah argumen add. +1
Albert Renshaw
Kelas atas. Saya porting ke 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));}

Cobalah online


Format + penjelasan yang mudah dibaca:

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)

}

Beberapa Trik Menyenangkan yang Digunakan:

• Saat memeriksa karakter, saya mengetik 'w'karakter yang 3 byte, tetapi untuk karakter 'c'dan 'b'saya bisa mengetik nilai ASCII masing-masing 99 dan 98 untuk menghemat satu byte setiap kali. (Sunting: Terima kasih kepada @Titus, saya tahu melakukan ini dengan semua huruf COWBELL dengan menggunakan input huruf besar saja yang semuanya 2 byte nilai ascii numerik)

r=~-l/2adalah r=(l-1)/2menggunakan bitshifts

a[++i]Saya mendapatkan karakter di indeks (i) dan mengulangi indeks pada waktu bersamaan. Aku hanya mulai idi i=-1bukannya i=0(saya melakukan hal yang sama dengan zdan mulai sebagai z=iuntuk menyimpan byte lain)

Albert Renshaw
sumber
1
Simpan 8 byte dengan input huruf besar: semua kode ASCII di bawah 100.
Titus
@Titus Brilliant! Terima kasih Titus, sunting sekarang
Albert Renshaw
1
Kami saat ini memiliki pertanyaan mengenai pernyataan Anda "Int kedua yang didefinisikan (dalam hal ini c) selalu ditetapkan sebagai 1 [...]." Kami akan senang memiliki pernyataan Anda tentang mengapa Anda berpikir begitu di sana karena sepertinya aneh bagi sebagian dari kita.
cadaniluk
@Albert mungkinkah program Anda hanya mengandalkan c,o,w,b,euntuk diinisialisasi ke nilai yang sama, bukan 1? Karena petunjuk Anda # 2 tampaknya tidak benar, setidaknya CI tidak tahu. Bisakah Anda mengklarifikasi? SO SO
Felix Dombek
1
@FelixDombek terima kasih telah menunjukkannya juga! Itu def. perilaku tidak terdefinisi, saya hanya mensimulasikannya (diulang) pada banyak IDE dan tampaknya selalu init sebagai 0. Saya mungkin bisa meninggalkannya, meskipun logika saya dirancang untuk mengatur semuanya pada 1; fakta bahwa kasus uji bekerja dengannya pada 0 adalah kebetulan saya pikir. Cheers
Albert Renshaw
5

Python 2, 125 113 112 byte

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 menghitung jumlah lonceng


-12 byte terima kasih kepada @Rod
-1 byte terima kasih kepada @Titus

ovs
sumber
Anda tidak perlu []memahami daftar ketika itu adalah satu-satunya parameter, Anda juga dapat menjatuhkan enumerate: di min(s.count(c)/-~(c=='l')for c in"cowbel")mana -~(n=='l')cara yang lebih singkat untuk menulis1+(n=='l')
Rod
1
Bukankah >>lebih pendek dari itu /-~?
Titus
@Itus kau benar
ovs
Ada upaya edit yang akan menghapus byte dengan mengganti ruang baris baru terakhir dengan satu titik koma.
Wheat Wizard
@ Möbius Bukankah returndi loop-sementara itu?
ovs
5

Perl 6 , 91 byte

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

Mengasumsikan input huruf kecil.

Bagaimana itu bekerja

Di dalam lambda, lambda lain untuk menghitung jumlah cowbells dalam string didefinisikan sebagai berikut:

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.

Sisa kode menggunakan lambda dalam ini &cuntuk menemukan hasilnya, seperti ini:

                     [\,](.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.
seseorang
sumber
4

MATL , 38 37 byte

1 byte off berkat ide @ DLosc menggunakan string template lcowbebukancowbel

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

Karakter input semuanya huruf kecil. Jika input berisi baris baru, karakter baris baru harus dimasukkan karena kode ASCII-nya digabungkan dengan karakter normal (lihat input terakhir di tautan dengan semua kotak uji).

Cobalah online! Atau verifikasi semua kasus uji .

Luis Mendo
sumber
3

JavaScript (ES6), 106 107 113 126 141 141

Porting ke javascript jawaban Pip oleh @DLosc. Saya perlu waktu untuk memahaminya sepenuhnya, dan ini jenius.

Edit -15 byte mengikuti petunjuk oleh @Titus, langsung menambahkan karakter ke string input adan menghindari pengembalian lebih awal (jadi tidak ada for/if)

Edit 2 menghitung nilai 6 untuk fungsi Min menyimpan 13 byte lainnya

Edit 3 fungsi c yang berubah lagi. Saya pikir verbose lengthdan splitakan terlalu panjang. Saya salah.

Dengan asumsi input huruf kecil

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

Kurang golf

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

Uji

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
sumber
Saya kira itu k[x]++akan gagal karena undefined. Tapi saya cukup yakin itu for(i=0;c(a)==c(a+=a[i++]);),aberhasil.
Titus
@Itus saya tidak yakin untuk mengerti. Saya akan mencobanya
edc65
@Titus wow 15 byte disimpan, terima kasih banyak
edc65
>>!imenghemat 3 byte. Mengapa Anda tidak menggunakannya c(a+=z)?
Titus
@Itus saya gunakan c(a+=z). Bukan dalam versi yang kurang golf , seperti, Anda tahu, kurang golf. Menggunakan >>!imenghemat 1 byte (dalam versi golf). Terima kasih lagi
edc65
2

Utilitas Bash + Unix, 184 byte

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}"

Cobalah online!

Terima kasih kepada @AlbertRenshaw untuk bermain golf 2 byte.

Mitchell Spector
sumber
Ini dapat di-golf lebih lanjut misalnya hanya menghilangkan spasi sebelum dan sesudah!=
Albert Renshaw
1
@AlbertRenshaw Terima kasih - saya pikir saya telah mencobanya dan mendapatkan kesalahan sintaks, tetapi Anda benar. Bagian awk mungkin juga golf; Saya tidak terlalu terbiasa dengan awk.
Mitchell Spector
Ya saya secara naif mencoba menghapus spasi lain dan linebreak dalam kode Anda dan mendapatkan kesalahan sintaksis tetapi ternyata berhasil, ¯_ (ツ) _ / ¯
Albert Renshaw
2

JavaScript (ES6), 124 114 byte

Terima kasih kepada Neil untuk menghemat beberapa byte

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

Karena ini sangat berbeda dari jawaban JavaScript yang sudah ada, dan saya cukup lama membahasnya, saya memutuskan untuk membuat jawaban sendiri.

Pemakaian

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

Keluaran

"cowbellcowbell"
Luke
sumber
.sort()[0]adalah ide yang luar biasa. evalitu jahat. : D
Titus
Terima kasih ;-) Saya pertama kali menggunakan Math.min(), tapi itu membutuhkan banyak karakter, dan saya pikir akan ada cara yang lebih pendek. Dan ya, evalsangat bagus untuk bermain golf.
Luke
Jika hanya .sort()[0]bekerja, itu hanya akan menelan biaya 10 byte, tetapi tidak, dan .sort((a,b)=>a-b)[0]biaya 20 byte tetapi Math.min(...)hanya biaya 13.
Neil
2

Oktaf, 80 87 97 byte

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

Cobalah secara Online!

rahnema1
sumber
1
Ini tidak berfungsi ketika kita membutuhkan dua ls untuk menyelesaikan cowbell tambahan. Misalnya, pada input cowbell, itu salah mengembalikan cowbellcowbeldaripada cowbellcowbell. (Saya harap Anda dapat memperbaikinya — saya suka algoritma yang tidak lazim!)
Greg Martin
@GregMartin Terima kasih! Saya akan chek itu!
rahnema1
2

CJam, 37

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

Cobalah online

Jika saya dapat mengecualikan "dan \karakter, maka ...

35 byte

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

Cobalah online

Penjelasan

Kode berturut-turut menambahkan setiap karakter string ke string awal (pergi dari asli ke dua kali lipat), menentukan jumlah cowbell untuk setiap string (menghitung jumlah kemunculan setiap karakter dalam "cowbel" dan membagi satu untuk 'l' dengan 2, kemudian mengambil minimum), menemukan posisi string pertama di mana jumlah cowbell meningkat sebesar 1, kemudian mengambil awalan yang sesuai dari input dan meletakkannya setelah string input.

Untuk memasukkan string asli juga (tanpa menambahkan karakter), kode tersebut menambahkan karakter netral ke string yang sedang diulang. Versi pertama menambahkan spasi, dan versi 2 menggunakan representasi string, yaitu string antara tanda kutip ganda.

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
sumber
Saya baik-baik saja dengan Anda mengecualikan karakter "dan \!
Greg Martin
1

PHP, 133 byte

port PHP dari port JavaScript @ edc65 pada jawaban DLosc Pip.

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;

mengambil input huruf kecil dari argumen baris perintah. Jalankan dengan -nr.

kerusakan

// 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
Titus
sumber