Thêm tiếng chuông bò!


42

Bạn đang cung cấp hỗ trợ kỹ thuật để các Bruce Dickenson khi ông tạo ra một buổi thu âm Blue Oyster Cult. Khi anh ta yêu cầu thêm chuông , bạn có thể đưa nó cho anh ta.

Nhiệm vụ của bạn

Viết chương trình hoặc hàm lấy một chuỗi (hoặc tương đương trong ngôn ngữ của bạn) làm đầu vào và xuất ra một chuỗi có liên quan có chứa thêm một chuông.

Một chuỗi có bao nhiêu chuông?

Số lượng chuông của một chuỗi chứa bằng số lượng tối đa các bản sao riêng biệt của "chuông" có thể thu được bằng cách hoán vị các ký tự của chuỗi. Ví dụ: "bbbccceeellllllooowwwwwwwww"chứa 3 chuông, trong khi "bbccceeellllllooowwwwwwwww""bbbccceeelllllooowwwwwwwww"mỗi chuông chứa 2 chuông và "cowbel"chứa 0 chuông.

Làm thế nào đầu ra nên liên quan đến đầu vào?

Đầu ra phải bao gồm nối, theo thứ tự này, của chuỗi đầu vào và tiền tố ngắn nhất của chuỗi đầu vào cần thiết để tăng số lượng chuông.

Ví dụ, "bbbccceeelllllooowwwwwwwww"chỉ cần thêm một "l"để chứa 3 chuông thay vì 2; tiền tố ngắn nhất có chứa đó "l""bbbccceeel". Do đó, nếu đầu vào là "bbbccceeelllllooowwwwwwwww", thì đầu ra phải là "bbbccceeelllllooowwwwwwwwwbbbccceeel".

Kỹ thuật

  • Bạn có thể cho rằng đầu vào chỉ chứa các ký tự ASCII có thể in được. Nếu có một hoặc hai ký tự gây khó chịu cho quá trình xử lý chuỗi ngôn ngữ của bạn (chẳng hạn như dòng mới hoặc \), bạn có thể giả sử rằng đầu vào không chứa chúng, chỉ cần đề cập đến hạn chế này.
  • Bạn có thể giả định thêm rằng các ký tự chữ cái trong đầu vào đều là chữ thường hoặc tất cả chữ hoa. Nếu bạn chọn không giả sử một trong những điều này, hãy đếm số trường hợp không nhạy cảm.
  • Thêm nữa, bạn có thể giả định rằng các đầu vào chứa ít nhất một bản sao của mỗi nhân vật b, c, e, l, o, và w. Điều này tương đương với việc giả sử rằng một số tiền tố của chuỗi có thể được nối với nó để tạo ra một chuỗi có chứa nhiều chuông hơn. (Lưu ý rằng chính chuỗi đầu vào không cần chứa chuông.)
  • Nếu ngôn ngữ của bạn có nội dung giải quyết vấn đề này ... thì hãy sử dụng nó một cách nghiêm túc, thật tuyệt vời làm sao.

Tã mạ vàng

Vì thời gian ghi âm là đắt, mã của bạn phải càng ngắn càng tốt. Mục có ít byte nhất là người chiến thắng!

Các trường hợp thử nghiệm

( liên kết pastebin để sao chép / dán dễ dàng hơn)

Kiểm tra đầu vào số 1: "christopher walken begs for more cowbell!"

Đầu ra thử nghiệm # 1: "christopher walken begs for more cowbell!christopher wal"

Kiểm tra đầu vào số 2: "the quick brown fox jumps over the lazy dog"

Đầu ra thử nghiệm # 2: "the quick brown fox jumps over the lazy dogthe quick brown fox jumps over the l"

Kiểm tra đầu vào số 3: "cowbell"

Đầu ra thử nghiệm # 3: "cowbellcowbell"

Kiểm tra đầu vào số 4: "cowbell cowbell cowbell"

Đầu ra thử nghiệm # 4: "cowbell cowbell cowbellcowbell"

Kiểm tra đầu vào số 5: "cowbell cowbell cowbel"

Đầu ra thử nghiệm # 5: "cowbell cowbell cowbelcowbel"

Kiểm tra đầu vào số 6: "bcelow"

Đầu ra thử nghiệm # 6: "bcelowbcel"

Kiểm tra đầu vào số 7: "abcdefghijklmnopqrstuvwxyz"

Đầu ra thử nghiệm # 7: "abcdefghijklmnopqrstuvwxyzabcdefghijkl"

Kiểm tra đầu vào số 8: "cccowwwwbbeeeeelllll"

Đầu ra thử nghiệm # 8: "cccowwwwbbeeeeelllllccco"

Kiểm tra đầu vào số 9: "be well, programming puzzles & code golf"

Đầu ra thử nghiệm # 9: "be well, programming puzzles & code golfbe well, programming puzzles & c"

Kiểm tra đầu vào số 10: "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!"

Đầu ra thử nghiệm # 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"

Kiểm tra đầu vào số 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!
"

Đầu ra thử nghiệm # 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"

23
Bất cứ ai trả lời trong COW đều kiếm được mười điểm internet.
Pavel

3
Tôi nghĩ mọi người sẽ dễ dàng xử lý các trường hợp đầu vào / đầu ra hơn nếu bạn định dạng chúng trong một khối mã duy nhất. Vì nó đứng nên nó chiếm rất nhiều không gian và không sao chép rất thân thiện.
FryAmTheEggman

Liên kết pastebin được thêm vào để sao chép / dán. Nếu có một cách để ẩn / thu gọn / hiển thị các trường hợp thử nghiệm trong bài đăng này, do đó tiết kiệm không gian theo chiều dọc, tôi rất muốn tìm hiểu nó.
Greg Martin

2
Thông thường mọi người sử dụng test case -> resulttrong một khối mã được định dạng sẵn lớn. Nó đẹp hơn nhiều về mặt thẩm mỹ và dễ dàng hơn để sao chép dán.
FlipTack

1
@MatthewRoh Ngoài thực tế là có hai Ls trong từ, đây không phải là những gì thách thức yêu cầu.
Martin Ender

Câu trả lời:


13

Pip , 50 42 38 byte

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

Truyền chuỗi vào dưới dạng đối số dòng lệnh, được trích dẫn nếu cần. Hãy thử trực tuyến!

Giải trình

Tôi sẽ giải thích điều này trong hai phần: chức năng chuông và chương trình đầy đủ. Đầu tiên, đây là hàm tính toán số lượng chuông trong chuỗi:

MN{_NaM"lcowbe"}//^2

{...}định nghĩa một hàm. Nhiều toán tử Pip, khi được áp dụng cho một hàm, trả về một hàm khác; ví dụ, -{a+1}cũng giống như {-(a+1)}. Vì vậy, ở trên là tương đương với

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

hoạt động như sau:

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

Bây giờ chúng ta đã có, đây là chương trình đầy đủ:

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)

Tôi đã nhập cowbell cowbell cowbeevà đầu ra là cowbellcowbelcowbelnhưng tôi có thể đang sử dụng IDE sai (mới đối với PIP)
Albert Renshaw

@AlbertRenshaw Tôi nhận được cowbell cowbell cowbeecowbell( thử trực tuyến ). Bạn đang sử dụng TIO hoặc một bản sao địa phương?
DLosc

Ồ thật tuyệt! Tôi đã dán nó dưới trường "đầu vào" không dưới phần thêm đối số. +1
Albert Renshaw

Thực sự đẳng cấp hàng đầu. Tôi đã chuyển nó sang 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));}

Dùng thử trực tuyến


Định dạng có thể đọc + giải thích:

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)

}

Một số thủ thuật thú vị được sử dụng:

• Khi kiểm tra các ký tự tôi nhập 'w'cho char w có 3 byte, nhưng đối với các ký tự 'c''b'tôi có thể nhập các giá trị ASCII 99 và 98 của chúng tương ứng để lưu một byte mỗi lần. (Chỉnh sửa: Nhờ @Titus, tôi biết thực hiện điều này với tất cả các chữ cái COWBELL bằng cách chỉ sử dụng đầu vào chữ hoa là tất cả các giá trị ascii 2 byte số)

r=~-l/2đang r=(l-1)/2sử dụng bithifts

a[++i]Tôi nhận được ký tự ở chỉ mục (i) và lặp lại tất cả các chỉ mục cùng một lúc. Tôi chỉ bắt đầu itại i=-1thay vì i=0(Tôi làm tương tự với zvà bắt đầu nó như z=iđể tiết kiệm byte khác)


1
Lưu 8 byte với đầu vào chữ hoa: tất cả các mã ASCII dưới 100.
Tít

@Titus Rực rỡ! Cảm ơn Titus, chỉnh sửa ngay bây giờ
Albert Renshaw

1
Hiện tại chúng tôi có một câu hỏi liên quan đến tuyên bố của bạn "Số int được xác định thứ hai (trong trường hợp này c) luôn được đặt là 1 [...]." Chúng tôi rất vui khi có tuyên bố của bạn về lý do tại sao bạn nghĩ như vậy ở đó bởi vì nó có vẻ kỳ lạ đối với một số người trong chúng ta.
cadaniluk

@Albert có thể là chương trình của bạn chỉ dựa vào c,o,w,b,eđể được khởi tạo với cùng một giá trị, thay vì 1? Bởi vì gợi ý số 2 của bạn dường như không đúng, ít nhất là cho CI biết. Bạn có thể làm rõ? Câu hỏi SO
Felix Dombek

1
@FelixDombek cảm ơn vì đã chỉ ra nó quá! Đó là def. hành vi không xác định, tôi chỉ mô phỏng nó (lặp) trên nhiều IDE và dường như nó luôn luôn khởi tạo int là 0. Tôi có thể để nó sau tất cả, mặc dù logic của tôi được thiết kế để đặt tất cả chúng ở mức 1; thực tế là các trường hợp thử nghiệm đang làm việc với nó ở 0 là trùng hợp ngẫu nhiên tôi nghĩ. Chúc mừng
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 đếm số lượng chuông


-12 byte nhờ @Rod
-1 byte nhờ @Titus


bạn không cần phải []hiểu danh sách khi đó là tham số duy nhất, bạn cũng có thể bỏ qua enumerate: min(s.count(c)/-~(c=='l')for c in"cowbel")đâu -~(n=='l')là cách viết ngắn hơn1+(n=='l')
Rod

1
Sẽ >>có thể ngắn hơn /-~?
Tít

@Titus bạn nói đúng
OVS

Có một chỉnh sửa đã cố gắng loại bỏ một byte bằng cách thay thế không gian dòng mới nhất bằng một dấu chấm phẩy duy nhất.
Thuật sĩ lúa mì

@ Möbius Sẽ không returncó trong vòng lặp while?
trứng

5

Perl 6 , 91 byte

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

Giả sử đầu vào chữ thường.

Làm thế nào nó hoạt động

Bên trong lambda, một lambda khác để đếm số lượng chuông trong chuỗi được định nghĩa như sau:

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.

Phần còn lại của mã sử dụng lambda bên trong này &cđể tìm kết quả, như thế này:

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

4

MATL , 38 37 byte

Giảm 1 byte nhờ ý tưởng sử dụng chuỗi mẫu lcowbecủa @ DLosc thay vìcowbel

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

Các ký tự đầu vào đều là chữ thường. Nếu đầu vào chứa dòng mới, ký tự dòng mới cần được nhập dưới dạng mã ASCII của nó được nối với các ký tự bình thường (xem đầu vào cuối cùng trong liên kết với tất cả các trường hợp kiểm tra).

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .


3

JavaScript (ES6), 106 107 113 126 141

Chuyển đến javascript của câu trả lời Pip của @DLosc. Tôi cần một chút thời gian để hiểu đầy đủ về nó, và đó là thiên tài.

Chỉnh sửa -15 byte theo gợi ý của @Titus, nối trực tiếp các ký tự vào chuỗi đầu vào avà tránh trả về sớm (vì vậy không for/if)

Chỉnh sửa 2 liệt kê 6 giá trị cho hàm Min lưu 13 byte khác

Chỉnh sửa 3 chức năng c thay đổi một lần nữa. Tôi nghĩ dài dòng lengthsplitsẽ quá dài. Tôi đã sai.

Giả sử đầu vào chữ thường

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

Ít chơi gôn

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

Kiểm tra

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


Tôi đoán rằng k[x]++sẽ thất bại do undefined. Nhưng tôi khá chắc chắn rằng nó for(i=0;c(a)==c(a+=a[i++]);),ahoạt động.
Tít

@Titus Tôi không chắc chắn để hiểu. Tôi sẽ dùng thử
edc65

@Titus wow đã lưu 15 byte, cảm ơn rất nhiều
edc65

>>!itiết kiệm 3 byte. Tại sao bạn không sử dụng c(a+=z)?
Tít

@Titus tôi dùng c(a+=z). Không phải trong phiên bản ít chơi gôn , như bạn thấy, ít chơi gôn hơn. Sử dụng >>!itiết kiệm 1 byte (trong phiên bản golf). Cảm ơn một lần nữa
edc65

2

Tiện ích 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}"

Hãy thử trực tuyến!

Cảm ơn @AlbertRenshaw vì đã chơi golf 2 byte.


Điều này có thể được đánh gôn hơn nữa, ví dụ như chỉ cần xóa các khoảng trống trước và sau!=
Albert Renshaw

1
@AlbertRenshaw Cảm ơn bạn - Tôi nghĩ rằng tôi đã thử điều đó và nhận được một lỗi cú pháp, nhưng bạn đã đúng. Phần awk có thể chơi golf nhiều hơn nữa; Tôi không quen thuộc lắm với awk.
Spector Mitchell

Vâng, tôi đã cố gắng loại bỏ các khoảng trắng và ngắt dòng khác trong mã của bạn và đã gặp lỗi cú pháp nhưng trên đó nó đã hoạt động _ (ツ) _ /
Albert Renshaw

2

JavaScript (ES6), 124 114 byte

Cảm ơn Neil vì đã lưu một vài byte

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

Vì điều này khá khác biệt với câu trả lời JavaScript đã có và tôi dành khá nhiều thời gian cho việc này, tôi quyết định tự tạo một câu trả lời.

Sử dụng

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

Đầu ra

"cowbellcowbell"

.sort()[0]là một ý tưởng tuyệt vời evallà xấu xa : D
Tít

Cảm ơn ;-) Lần đầu tiên tôi sử dụng Math.min(), nhưng điều đó tốn rất nhiều ký tự và tôi nghĩ rằng sẽ có một cách ngắn hơn. Và vâng, evalthực sự tốt đẹp cho việc chơi golf.
Lu-ca

Nếu chỉ .sort()[0]hoạt động, nó sẽ chỉ tốn 10 byte, nhưng không, và .sort((a,b)=>a-b)[0]tốn 20 byte nhưng Math.min(...)chỉ tốn 13.
Neil

2

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

Dùng thử trực tuyến!


1
Điều này không hoạt động khi chúng ta cần hai lgiây để hoàn thành tiếng chuông bổ sung. Ví dụ, trên đầu vào cowbell, nó không đúng cách trả cowbellcowbelhơn cowbellcowbell. (Tôi hy vọng bạn có thể sửa nó. Tôi thích thuật toán không điển hình!)
Greg Martin

@GregMartin Cảm ơn! Tôi sẽ chek nó!
rahnema1

2

CJam, 37

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

Dùng thử trực tuyến

Nếu tôi có thể loại trừ các ký tự "\ký tự thì thì

35 byte

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

Dùng thử trực tuyến

Giải trình

Mã liên tiếp nối từng ký tự của chuỗi vào chuỗi ban đầu (đi từ gốc đến nhân đôi), xác định số lượng chuông cho mỗi chuỗi (đếm số lần xuất hiện của mỗi ký tự trong "cowbel" và chia một chuỗi cho 'l' bằng 2, sau đó lấy mức tối thiểu), tìm vị trí của chuỗi đầu tiên trong đó số lượng chuông tăng thêm 1, sau đó lấy tiền tố tương ứng của đầu vào và đặt sau chuỗi đầu vào.

Để bao gồm cả chuỗi gốc (không có ký tự nào được nối thêm), mã sẽ thêm một ký tự trung tính vào chuỗi được lặp lại. Phiên bản đầu tiên có một khoảng trắng và phiên bản thứ 2 sử dụng biểu diễn chuỗi, tức là chuỗi giữa các dấu ngoặc kép.

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

Tôi ổn với bạn ngoại trừ "và \ ký tự!
Greg Martin

1

PHP, 133 byte

một cổng PHP của @ edc65 Các cổng JavaScript của câu trả lời Pip của 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;

lấy đầu vào chữ thường từ đối số dòng lệnh. Chạy với -nr.

phá vỡ

// 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.