กระดึงเพิ่มเติม ... !


42

คุณจะให้การสนับสนุนเทคโนโลยีเพื่อบรูซเด็ตต์ขณะที่เขาผลิตเซสชั่นการบันทึกหอยนางรมสีฟ้าศาสนา เมื่อเขาขอกระดึงเพิ่มเติมคุณสามารถมอบให้เขาได้

งานของคุณ

เขียนโปรแกรมหรือฟังก์ชั่นที่รับสตริง (หรือเทียบเท่าในภาษาของคุณ) เป็นอินพุตและเอาต์พุตสตริงที่เกี่ยวข้องที่มีกระดึงอีกหนึ่งตัว

สตริงมีกระดิ่งกี่ตัว?

จำนวนของกระดึงที่มีจำนวนเท่ากับจำนวนสูงสุดของสำเนาที่แตกต่างกันของ "กระดึง" ที่สามารถรับได้โดยอนุญาตให้ตัวละครของสตริง ตัวอย่างเช่น"bbbccceeellllllooowwwwwwwww"มี 3 cowbells ในขณะที่"bbccceeellllllooowwwwwwwww"และ"bbbccceeelllllooowwwwwwwww"แต่ละคนมี 2 cowbells และ"cowbel"มี 0 cowbells

เอาต์พุตควรเกี่ยวข้องกับอินพุตอย่างไร

เอาต์พุตควรประกอบด้วยการต่อข้อมูลตามลำดับนี้ของสตริงอินพุตและส่วนนำหน้าสั้นที่สุดของสตริงอินพุตที่ต้องการเพื่อเพิ่มจำนวนของโคเบล

ตัวอย่างเช่น"bbbccceeelllllooowwwwwwwww"ต้องการเพียงหนึ่งเพิ่มเติม"l"เพื่อให้มี 3 cowbells แทน 2; คำนำหน้าสั้นที่สุดที่มีที่เป็น"l" "bbbccceeel"ดังนั้นถ้าใส่เป็นแล้วออกที่ควรจะเป็น"bbbccceeelllllooowwwwwwwww""bbbccceeelllllooowwwwwwwwwbbbccceeel"

technicalities

  • คุณอาจสมมติว่าอินพุตมีอักขระ ASCII ที่พิมพ์ได้เท่านั้น หากมีอักขระหนึ่งหรือสองตัวที่น่ารำคาญสำหรับการประมวลผลสตริงของภาษาของคุณ (เช่นการขึ้นบรรทัดใหม่หรือ\) คุณสามารถสมมติว่าอินพุตไม่ได้มีตัวอักษรเหล่านั้น - เพียงแค่พูดถึงข้อ จำกัด นี้
  • คุณอาจสันนิษฐานได้ว่าตัวอักษรในอินพุตเป็นตัวพิมพ์เล็กทั้งหมดหรือเป็นตัวพิมพ์ใหญ่ทั้งหมด หากคุณเลือกที่จะไม่รับสิ่งใดสิ่งหนึ่งเหล่านี้ให้นับโคเบลล์เป็นกรณี ๆ ไป
  • นอกจากนี้คุณยังอาจคิดว่าการป้อนข้อมูลที่มีอย่างน้อยหนึ่งสำเนาของแต่ละตัวละครb, c, e, l, และo wนี่เทียบเท่ากับการสมมติว่าคำนำหน้าบางส่วนของสตริงสามารถต่อกันเพื่อสร้างสตริงที่มีกระดึงมากขึ้น (โปรดทราบว่าสตริงอินพุตนั้นไม่จำเป็นต้องมีกระดึง)
  • หากภาษาของคุณมี builtin ที่สามารถแก้ปัญหานี้ได้ ... จากนั้นใช้มันทั้งหมดอย่างจริงจังนั่นช่างยอดเยี่ยม

ผ้าอ้อมชุบทอง

เนื่องจากเวลาในการบันทึกสตูดิโอมีราคาแพงรหัสของคุณจะต้องสั้นที่สุด รายการที่มีจำนวนไบต์น้อยที่สุดเป็นผู้ชนะ!

กรณีทดสอบ

( ลิงค์ pastebinเพื่อให้คัดลอก / วางได้ง่ายขึ้น)

ทดสอบอินพุต # 1: "christopher walken begs for more cowbell!"

ทดสอบผลลัพธ์ # 1: "christopher walken begs for more cowbell!christopher wal"

ทดสอบอินพุต # 2: "the quick brown fox jumps over the lazy dog"

ทดสอบผลลัพธ์ # 2: "the quick brown fox jumps over the lazy dogthe quick brown fox jumps over the l"

ทดสอบอินพุต # 3: "cowbell"

ทดสอบผลลัพธ์ # 3: "cowbellcowbell"

ทดสอบอินพุต # 4: "cowbell cowbell cowbell"

ทดสอบผลลัพธ์ # 4: "cowbell cowbell cowbellcowbell"

ทดสอบอินพุต # 5: "cowbell cowbell cowbel"

ทดสอบผลลัพธ์ # 5: "cowbell cowbell cowbelcowbel"

ทดสอบอินพุต # 6: "bcelow"

ทดสอบผลลัพธ์ # 6: "bcelowbcel"

ทดสอบอินพุต # 7: "abcdefghijklmnopqrstuvwxyz"

ทดสอบผลลัพธ์ # 7: "abcdefghijklmnopqrstuvwxyzabcdefghijkl"

ทดสอบอินพุต # 8: "cccowwwwbbeeeeelllll"

ทดสอบผลลัพธ์ # 8: "cccowwwwbbeeeeelllllccco"

ทดสอบอินพุต # 9: "be well, programming puzzles & code golf"

ทดสอบผลลัพธ์ # 9: "be well, programming puzzles & code golfbe well, programming puzzles & c"

ทดสอบอินพุต # 10: "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!"

ทดสอบผลลัพธ์ # 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"

ทดสอบอินพุต # 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!
"

ทดสอบผลลัพธ์ # 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
ทุกคนที่ตอบคำถามด้วยCOWจะได้รับคะแนนอินเทอร์เน็ตสิบคะแนน
Pavel

3
ฉันคิดว่ามันจะง่ายขึ้นมากสำหรับคนที่จะจัดการกับกรณีอินพุต / เอาต์พุตถ้าคุณจัดรูปแบบพวกเขาในบล็อกรหัสเดียว เนื่องจากมันใช้พื้นที่มากและไม่เป็นมิตรกับการคัดลอก
FryAmTheEggman

เพิ่มลิงก์ Pastebin สำหรับการคัดลอก / การวาง หากมีวิธีซ่อน / ยุบ / แสดงเคสทดสอบในโพสต์นี้ซึ่งช่วยประหยัดพื้นที่ในแนวตั้งฉันชอบที่จะเรียนรู้
เกร็กมาร์ติ

2
โดยปกติแล้วคนใช้test case -> resultในบล็อกโค้ดที่ฟอร์แมตแล้วขนาดใหญ่ มันสวยกว่าและคัดลอกแปะได้ง่ายกว่า
FlipTack

1
@MatthewRoh นอกเหนือจากข้อเท็จจริงที่ว่ามีสองLs ในคำนี้ไม่ใช่สิ่งที่ท้าทายถาม
Martin Ender

คำตอบ:


13

Pip , 50 42 38 ไบต์

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

ส่งผ่านสตริงในเป็นอาร์กิวเมนต์บรรทัดคำสั่งอ้างถ้าจำเป็น ลองออนไลน์!

คำอธิบาย

ฉันจะอธิบายเรื่องนี้ในสองส่วน: ฟังก์ชั่นกระดึงและโปรแกรมเต็มรูปแบบ ก่อนอื่นนี่คือฟังก์ชันที่คำนวณจำนวนกระดึงในสตริง:

MN{_NaM"lcowbe"}//^2

{...}กำหนดฟังก์ชั่น ตัวดำเนินการ Pip จำนวนมากเมื่อนำไปใช้กับฟังก์ชั่นจะส่งคืนฟังก์ชันอื่น ตัวอย่างเช่นเป็นเช่นเดียวกับ-{a+1} {-(a+1)}ดังนั้นข้างบนจึงเท่ากับ

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

ซึ่งทำงานดังนี้:

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

ตอนนี้เรามีแล้วต่อไปนี้เป็นโปรแกรมเต็มรูปแบบ:

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)

ฉันป้อนcowbell cowbell cowbeeและผลลัพธ์ออกมาcowbellcowbelcowbelแต่ฉันอาจใช้ IDE ผิด (ใหม่สำหรับ PIP)
Albert Renshaw

@AlbertRenshaw ฉันได้รับcowbell cowbell cowbeecowbell( ลองออนไลน์ ) คุณใช้ TIO หรือสำเนาในเครื่องหรือไม่?
DLosc

ดี! ฉันติดมันภายใต้สนาม "อินพุต" ไม่ได้อยู่ภายใต้การโต้แย้งเพิ่ม +1
Albert Renshaw

ชั้นยอดจริงๆ ฉันแจ้งไปยัง 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));}

ลองออนไลน์


รูปแบบที่อ่านได้ + คำอธิบาย:

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)

}

เคล็ดลับความสนุกที่ใช้:

•เมื่อทำการตรวจสอบตัวอักษรฉันพิมพ์'w'สำหรับ char w ซึ่งคือ 3 ไบต์ แต่สำหรับตัวอักษร'c'และ'b'ฉันสามารถพิมพ์ค่า ASCII ของพวกเขา 99 และ 98 ตามลำดับเพื่อบันทึกไบต์ในแต่ละครั้ง (แก้ไข: ขอบคุณ @Titus ฉันรู้ว่าทำสิ่งนี้ด้วยตัวอักษร COWBELL ทั้งหมดโดยใช้อินพุตตัวพิมพ์ใหญ่เท่านั้นซึ่งมีค่าตัวเลข ASCII 2 ไบต์ทั้งหมด)

r=~-l/2กำลังr=(l-1)/2ใช้ bitshifts

a[++i]ฉันได้รับตัวอักษรที่ดัชนี (i) และทำซ้ำดัชนีทั้งหมดในเวลาเดียวกัน ฉันเพียงแค่เริ่มต้นiที่i=-1แทนi=0(ฉันทำเช่นเดียวกันกับzและเริ่มเป็นz=iเพื่อบันทึกไบต์อื่น)


1
บันทึก 8 ไบต์ด้วยการป้อนข้อมูลพิมพ์ใหญ่: รหัส ASCII ทั้งหมดด้านล่าง 100
ติตัส

@Titus Brilliant! ขอบคุณติตัสตอนนี้แก้ไข
Albert Renshaw

1
ขณะนี้เรามีคำถามเกี่ยวกับคำสั่งของคุณ "int ที่สองที่กำหนดไว้ (ในกรณีนี้c) จะถูกตั้งค่าเป็น 1 [... ]" เรายินดีที่จะมีคำชี้แจงของคุณว่าทำไมคุณถึงคิดเช่นนั้นเพราะมันดูเหมือนแปลกสำหรับเราบางคน
cadaniluk

@ อัลเบิร์ตเป็นไปได้ไหมว่าโปรแกรมของคุณเพียงแค่อาศัยc,o,w,b,eค่าเริ่มต้นเป็นค่าเดียวกันแทนที่จะเป็น 1? เนื่องจากคำใบ้ # 2 ของคุณดูเหมือนจะไม่จริงไม่ใช่สำหรับ CI ที่รู้อย่างน้อย คุณช่วยอธิบายได้ไหม ดังนั้นคำถาม
เฟลิกซ์ Dombek

1
@ FelixDombek ขอบคุณที่ชี้ให้เห็นด้วย! มันคือการกำหนด พฤติกรรมที่ไม่ได้กำหนดฉันเพิ่งจำลอง (วน) บน IDE หลาย ๆ ตัวและดูเหมือนว่าจะเริ่มต้น int เสมอ 0 ความจริงที่ว่ากรณีทดสอบกำลังทำงานที่ 0 นั้นเป็นเรื่องบังเอิญฉันคิดว่า ไชโย
อัลเบิร์ตเร

5

Python 2, 125 113 112 ไบต์

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 นับจำนวนกระดึง


-12 ไบต์ขอบคุณ @Rod
-1 ไบต์ขอบคุณ @Titus


คุณไม่จำเป็นต้อง[]เพื่อความเข้าใจรายการเมื่อมันเป็นพารามิเตอร์เท่านั้นยังให้คุณสามารถวางenumerate: min(s.count(c)/-~(c=='l')for c in"cowbel")ที่-~(n=='l')เป็นวิธีที่สั้นลงในการเขียน1+(n=='l')
ร็อด

1
Wouldn't >>จะสั้นกว่า/-~?
ติตัส

@Titus คุณสิทธิกำลัง
OVS

มีความพยายามแก้ไขที่จะลบไบต์โดยแทนที่ช่องว่างบรรทัดใหม่ล่าสุดด้วยอัฒภาคเดียว
ข้าวสาลีตัวช่วยสร้าง

@ Möbiusจะไม่returnอยู่ในขณะนั้นหรือไม่
OVS

5

Perl 6 , 91 ไบต์

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

ถือว่าอินพุตเป็นตัวพิมพ์เล็ก

มันทำงานอย่างไร

ภายในแลมบ์ดาแลมบ์ดาอีกอันสำหรับนับจำนวนโคเบลล์ในสตริงถูกกำหนดเช่น:

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.

ส่วนที่เหลือของรหัสนี้ใช้แลมบ์ดาภายใน&cเพื่อค้นหาผลลัพธ์เช่นนี้:

                     [\,](.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 ไบต์

ปิด 1 ไบต์เนื่องจากแนวคิดของ @ DLosc ที่ใช้สตริงแม่แบบlcowbeแทนcowbel

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

อักขระอินพุตเป็นตัวพิมพ์เล็กทั้งหมด หากอินพุตมีการขึ้นบรรทัดใหม่อักขระขึ้นบรรทัดใหม่จำเป็นต้องป้อนเป็นรหัส ASCII ที่ต่อกับอักขระปกติ (ดูอินพุตสุดท้ายในลิงก์พร้อมกับกรณีทดสอบทั้งหมด)

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด


3

JavaScript (ES6), 106 107 113 126 141

การย้ายไปยัง javascript ของคำตอบ Pip โดย @DLosc ฉันต้องการเวลาซักหน่อยเพื่อทำความเข้าใจและเป็นอัจฉริยะ

แก้ไข -15 ไบต์ตามคำใบ้โดย @Titus ต่อท้ายตัวอักษรต่อท้ายสตริงอินพุตโดยตรงaและหลีกเลี่ยงการส่งคืนก่อนกำหนด (ไม่ต้องfor/if)

แก้ไข 2แจงนับ 6 ค่าสำหรับฟังก์ชั่นขั้นต่ำบันทึก 13 ไบต์อื่น ๆ

แก้ไข 3เปลี่ยนฟังก์ชั่น c อีกครั้ง ฉันคิดว่า verbose lengthและsplitจะยาวเกินไป ฉันผิดไป.

สมมติว่าอินพุตตัวพิมพ์เล็ก

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

น้อย golfed

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

ทดสอบ

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


ฉันเดาว่าจะล้มเหลวเนื่องจากk[x]++ undefinedแต่ฉันก็แน่ใจว่ามันfor(i=0;c(a)==c(a+=a[i++]);),aใช้ได้
ติตัส

@Titus ฉันไม่แน่ใจว่าจะเข้าใจ ฉันจะลองดู
edc65

@Titus ว้าวบันทึกไว้ 15 ไบต์ขอบคุณมาก ๆ
edc65

>>!iบันทึก 3 ไบต์ ทำไมไม่จำเป็นที่คุณใช้c(a+=z)?
ติตัส

@Titus c(a+=z)ฉันใช้ ไม่ได้อยู่ในเวอร์ชั่นที่ตีกอล์ฟน้อยกว่าอย่างที่เป็นอยู่ การใช้>>!iบันทึก 1 ไบต์ (ในเวอร์ชัน golfed) ขอขอบคุณอีกครั้ง
edc65

2

ยูทิลิตีBash + Unix ขนาด 184 ไบต์

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

ลองออนไลน์!

ขอบคุณ @AlbertRenshaw สำหรับการเล่นกอล์ฟขนาด 2 ไบต์


นี้สามารถเล่นกอล์ฟเพิ่มเติมเช่นเพียงแค่ลบช่องว่างก่อนและหลัง!=
อัลเบิร์ต Renshaw

1
@AlbertRenshaw ขอบคุณ - ฉันคิดว่าฉันได้ลองแล้วและได้รับข้อผิดพลาดทางไวยากรณ์ แต่คุณพูดถูก ส่วน awk อาจจะเล่นกอล์ฟได้เช่นกัน ฉันไม่คุ้นเคยกับ awk มาก
Mitchell Spector

ใช่ฉันไร้เดียงสาพยายามลบช่องว่างและ linebreaks อื่น ๆ ในรหัสของคุณและได้รับข้อผิดพลาดทางไวยากรณ์ แต่ในที่มันทำงาน¯_ (ツ) _ / ¯
Albert Renshaw

2

JavaScript (ES6), 124 114 ไบต์

ขอบคุณ Neil สำหรับการบันทึกไม่กี่ไบต์

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

เนื่องจากนี่ค่อนข้างแตกต่างจากคำตอบ JavaScript ที่มีอยู่แล้วและฉันใช้เวลาพอสมควรในการนี้ฉันจึงตัดสินใจสร้างคำตอบเอง

การใช้

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

เอาท์พุต

"cowbellcowbell"

.sort()[0]เป็นความคิดที่ยอดเยี่ยม evalคือความชั่วร้าย : D
ติตัส

ขอบคุณ ;-) ฉันใช้ครั้งแรกMath.min()แต่มีค่าใช้จ่ายจำนวนมากและฉันคิดว่ามันจะมีวิธีที่สั้นกว่า และใช่evalมันดีสำหรับการเล่นกอล์ฟ
ลุค

หากใช้.sort()[0]งานได้เพียงอย่างเดียวจะมีราคา 10 ไบต์ แต่ไม่และจะมี.sort((a,b)=>a-b)[0]ค่าใช้จ่าย 20 ไบต์ แต่Math.min(...)จะมีค่าใช้จ่ายเพียง 13 เท่านั้น
Neil

2

อ็อกเทฟ, 80 87 97 ไบต์

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

ลองออนไลน์!


1
สิ่งนี้ไม่ทำงานเมื่อเราต้องการสองlวินาทีเพื่อเติมกระดึงเพิ่มเติม ตัวอย่างเช่นในการป้อนข้อมูลcowbellก็ไม่ถูกต้องส่งกลับมากกว่าcowbellcowbel cowbellcowbell(ฉันหวังว่าคุณสามารถแก้ไขได้ - ฉันชอบอัลกอริทึมที่ผิดปกติ!)
Greg Martin

@ GregMartin ขอบคุณ! ฉันจะเคี้ยวมัน!
rahnema1

2

CJam, 37

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

ลองออนไลน์

หากฉันสามารถยกเว้น"และ\อักขระได้ ...

35 ไบต์

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

ลองออนไลน์

คำอธิบาย

โค้ดต่อท้ายอักขระแต่ละตัวของสตริงไปยังสตริงเริ่มต้นอย่างต่อเนื่อง (จากเดิมเป็นสองเท่า) กำหนดจำนวนของกระดึงสำหรับแต่ละสตริง (นับจำนวนการเกิดขึ้นของตัวละครแต่ละตัวใน "cowbel" และหารหนึ่งสำหรับ 'l' โดย 2 จากนั้นใช้ค่าต่ำสุด) ค้นหาตำแหน่งของสตริงแรกที่จำนวนของกระดึงเพิ่มขึ้น 1 จากนั้นนำส่วนนำหน้าที่สอดคล้องกันของอินพุตและวางหลังจากสตริงอินพุต

ในการที่จะรวมสตริงเดิมด้วย (ไม่มีอักขระต่อท้าย) รหัสจะใส่อักขระที่เป็นกลางกับสตริงที่มีการทำซ้ำ รุ่นแรกเป็นการเพิ่มช่องว่างและรุ่นที่ 2 ใช้การแทนสตริงเช่นสตริงระหว่างเครื่องหมายคำพูดคู่

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

ฉันสบายดีกับคุณยกเว้นตัวอักษร "และ \"!
Greg Martin

1

PHP, 133 ไบต์

พอร์ต PHP ของ @ edc65's พอร์ต JavaScript ของคำตอบ 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;

รับอินพุตตัวพิมพ์เล็กจากอาร์กิวเมนต์บรรทัดคำสั่ง -nrทำงานด้วย

ชำรุด

// 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.