แปลงเป็น camelCase


34

ความท้าทาย

ฉันอ่านJava Style Guide ของ Googleเมื่อวันก่อนและสะดุดอัลกอริทึมของพวกเขาเพื่อแปลงสตริใด ๆ ให้เป็นสัญกรณ์ camelCase ในการท้าทายนี้คุณต้องใช้อัลกอริทึมนี้เนื่องจากคุณไม่ต้องการทำสิ่งนี้ทั้งหมดในหัวของคุณเมื่อคุณเขียนการส่งจาวาที่มีการแข่งขันสูงเพื่อความท้าทายของโค้ด - กอล์ฟ

หมายเหตุ: ฉันทำการปรับเปลี่ยนเล็กน้อยกับอัลกอริทึม คุณต้องใช้สิ่งที่ระบุด้านล่าง

อัลกอริทึม

คุณเริ่มต้นด้วยสตริงอินพุตที่กำหนดเองและใช้การดำเนินการต่อไปนี้กับมัน:

  1. ลบเครื่องหมายอะโพสโทรฟีทั้งหมด `'
  2. แยกผลลัพธ์ออกเป็นคำโดยแยกที่
    • อักขระที่ไม่ใช่ตัวอักษรผสมตัวเลขและไม่ใช่ตัวเลข [^a-zA-Z0-9]
    • ตัวอักษรตัวพิมพ์ใหญ่ซึ่งล้อมรอบด้วยตัวพิมพ์เล็กทั้งสองด้าน abcDefGhI jkเช่นอัตราผลตอบแทนabc Def Ghi jk
  3. พิมพ์เล็กทุกคำ
  4. ตัวพิมพ์ใหญ่ตัวแรกของทุกคำยกเว้นคำแรก
  5. เข้าร่วมทุกคำกลับมารวมกัน

หมายเหตุเพิ่มเติม

  • อินพุตจะมีเฉพาะ ASCII ที่พิมพ์ได้
  • หากตัวเลขเป็นตัวอักษรตัวแรกของคำให้ปล่อยให้เป็นไปตามที่เป็นอยู่และอย่าเพิ่มสิ่งอื่นใดในคำนี้
  • อินพุตจะมีอักขระอย่างน้อยหนึ่งตัวเสมอ

กฎระเบียบ

  • อนุญาตให้ใช้ฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • กฎเริ่มต้นสำหรับอินพุต / เอาต์พุต
  • ช่องโหว่มาตรฐานใช้
  • นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ Tiebreaker เป็นการส่งก่อนหน้า

กรณีทดสอบ

"การเขียนโปรแกรมปริศนา & รหัสกอล์ฟ" -> "การเขียนโปรแกรมพัลส์รหัสกอล์ฟ"
"คำขอ HTTP HTTP" -> "xmlHttpRequest"
"รองรับ IPv6 บน iOS" -> "supportIpv6OnIos"
"SomeThing w1th, apo'strophe และ 'punc] tuation" -> "someThingW1thApostrophesAndPuncTuation"
"ไม่มีอะไรพิเศษ" -> "nothingSpecial"
"5pecial ca5e" -> "5pecialCa5e"
"1337" -> "1337"
"1337-spEAk" -> "1337Speak"
"whatA mess" -> "whataMess"
"abcD" -> "abcd"
"a" -> "a"
"B" -> "b"

Happy Coding!


3
ที่น่าสนใจฉันไม่เคยรู้ว่าสิ่งนี้เรียกว่า "camelCase" ชื่อเหมาะสมแล้วฉันคิดว่า ...
Ashwin Gupta

4
มีมากกว่านี้: snake_case&PascalCase
Martijn

14
@ มาร์ตินsnake_caseเพราะ Python แน่นอน FORTH มีFORTHCASEและ APL ก็มีunreadable in any case
cat

กรณีทดสอบ 4 ควรมีApostropheSในผลลัพธ์
ติตัส

@ ชื่อเรื่องไม่ถูกต้อง อะพอสโทรฟีจะถูกลบออกก่อนที่จะแยกอินพุต
Denker

คำตอบ:


13

เรติน่า 56 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

T`'\`
S_`\W|_|(?<=[a-z])(?=[A-Z][a-z])
T`L`l
T`l`L`¶.
¶

ลองออนไลน์!

คำอธิบาย

สิ่งนี้นำข้อกำหนดมาใช้อย่างแท้จริง:

T`'\`

ลบ apostrophes และ backticks

S_`\W|_|(?<=[a-z])(?=[A-Z][a-z])

แยกสตริงที่ล้อมรอบอักขระที่ไม่ใช่คำ (ใน regex สิ่งนี้ยังแยกตัวเลขและขีดล่าง) หรือขีดล่างหรือตำแหน่งที่มีตัวอักษรตัวพิมพ์เล็กด้านซ้ายและด้านบนและตัวพิมพ์เล็กตัวพิมพ์เล็กทางขวา สิ่งนี้จะสร้างเซกเมนต์ว่างบางส่วนเมื่อมีอักขระที่ไม่ใช่ตัวอักษรสองตัวที่ไม่ใช่ตัวเลขสองตัวในแถวหรือสำคัญกว่าตอนต้นของสตริง เรากำจัดผู้ที่มี_ตัวเลือก ที่นี่ "แยก" หมายถึงการวางแต่ละส่วนที่เหลือในบรรทัดของตัวเอง

T`L`l

แปลงทุกอย่างเป็นตัวพิมพ์เล็ก

T`l`L`¶.

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

กำจัด linefeeds เพื่อรวมทุกอย่างกลับเข้าด้วยกัน


คุณเอาชนะฉันไป ทำได้ดีนี่!
mbomb007

คำถามนี้อาจแปลกไปหน่อย แต่ ... ฉันควรโพสต์คำตอบถ้ามันสั้นกว่าของคุณและใน Retina? ฉันกำลังทำงานอยู่ก่อนที่คำตอบของคุณจะปรากฏ แต่ก็ทำแล้วและตอนนี้ฉันไม่รู้ว่าควรโพสต์หรือไม่
daavko

5
@ Daavko แน่นอนโพสต์ (ฉันมักจะตัดสินใจตามวิธีการที่แตกต่างกันคือคำตอบที่มีอยู่ ... ถ้ามันเป็นสิ่งเดียวกันแน่นอนกับ byte โกนออกที่ไหนสักแห่งโดยปกติฉันเพียงแค่แสดงความคิดเห็นในคำตอบนั้น แต่ถ้ามันสั้นกว่ามาก จากแนวทางที่แตกต่างจากนั้นฉันจะโพสต์คำตอบแยกต่างหาก)
Martin Ender

2
@daavko การค้นหาเป็นสิ่งจำเป็นแม้ว่า โปรดทราบว่าคำตอบของคุณไม่ได้เก็บไว้เป็นตัวพิมพ์ใหญ่Thingแม้ว่าควรจะเป็น
Martin Ender

1
@ MartinBüttnerโอ้ ... ฉันไม่ได้สังเกตว่า โอ้ดีฉันจะตอบคำถามอื่นได้สำเร็จ
daavko

11

Java, 198 190 ไบต์

+3 ไบต์เพราะฉันลืมนั่น\W+== [^a-zA-Z0-9_]+และฉันต้องจับคู่[^a-zA-Z0-9]+

-11 ไบต์ขอบคุณuser20093 - ?:แทนif/else

เพราะจาวา

s->{String[]a=s.replaceAll("`|'","").split("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])");s="";for(String w:a){String t=w.toLowerCase();s+=a[0]==w?t:t.toUpperCase().charAt(0)+t.substring(1);}return s;}

นี่คือแลมบ์ดา โทรเช่น:

UnaryOperator<String> op = s->{String[]a=s.replaceAll("`|'","").split("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])");s="";for(String w:a){String t=w.toLowerCase();s+=a[0]==w?t:t.toUpperCase().charAt(0)+t.substring(1);}return s;};
System.out.println(op.apply("Programming Puzzles & Code Golf"));

รุ่นที่อ่านได้:

public static String toCamelCase(String s) {
    String[] tokens = s
            .replaceAll("`|'", "") // 1. Remove all apostrophes
            .split("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])"); // 2. Split on [\W_]+ or between [a-z] and [A-Z][a-z]
    s = ""; // Reusing s for building output is cheap
    for (String token : tokens) {
        String lowercaseToken = token.toLowerCase(); // 3. Lowercase every word
        s += tokens[0].equals(token)?lowercaseToken:lowercaseToken.toUpperCase().charAt(0) + lowercaseToken.substring(1); // 4. Uppercase first char of all but first word
        // ^ 5. Join all words back together
    }
    return s;
}

1
ไม่ใช่ Swift ...
เครื่องคิดเลข

2
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! นี่เป็นคำตอบแรกที่ดี!
Alex A.

1
@CatsAreFluffy อะไร
แมว

ถ้าคุณแทนที่คำสั่งแบบมีเงื่อนไข (ถ้า / อื่น ๆ ) ด้วยการแสดงออกตามเงื่อนไข (? :) คุณสามารถบันทึกประมาณ 9 ไบต์
user902383

ไม่ทราบว่าฉันพลาด @ user902383 ไปที่ -11 ไบต์ได้อย่างไร น่าเสียดายที่ฉันต้องเพิ่ม 3 ตัวเพื่อจับคู่_เป็นตัวคั่นโทเค็น
CAD97

10

JavaScript (ES6), 156 154 152 148 145 141 140 ไบต์

ขอบคุณ @Neil (6 ไบต์), @ETHproductions (3 ไบต์) และ @ edc65 (7 ไบต์)

a=>a[r='replace'](/`|'/g,a='')[r](/[a-z](?=[A-Z][a-z])/g,'$& ')[r](/[^\W_]+/g,b=>a+=(a?b[0].toUpperCase():'')+b.slice(!!a).toLowerCase())&&a

ลบเครื่องหมายอัญประกาศเดี่ยวจากนั้นทำการแทนที่เพื่อแยกอักขระพิเศษ / ก่อนพิมพ์ล้อมรอบเมืองหลวงจากนั้นรวมกับปลอกที่เหมาะสม น่าเสียดายtoLowerCase()และtoUpperCase()น่ารำคาญและยากที่จะหลีกเลี่ยงที่นี่ ...


1
ฉันกำลังทำงานในแนวทางที่แตกต่างกันซึ่งวิธีการของคุณb.slice(i>0)ออกมาจากน้ำ แต่ในเวลาเดียวกันการแข่งขันของฉัน/[A-Z]?([a-z0-9]|[0-9A-Z]{2,})+([A-Z](?![a-z]))?/gจะปรากฏขึ้นเพื่อประหยัด 2 ไบต์จากreplaceวิธีการอันชาญฉลาดของคุณ
Neil

1
หรือฉันสามารถบันทึก 2 ไบต์ลงบนตัวคุณreplaceโดยตรง:replace(/[a-z](?=[A-Z][a-z])/g,'$& ')
Neil

1
โดยปกติmatch...mapจะถูกแทนที่ด้วยreplace
edc65

1
@ edc65 ฉันได้รับขั้นต่ำ 160 ไบต์ด้วยวิธีการนั้น:a=>a.replace(/`|'/g,'').replace(/[a-z](?=[A-Z][a-z])/g,'$& ').replace(/[\W_]*([a-z0-9]+)[\W_]*/gi,(_,b,i)=>(i?b[0].toUpperCase():'')+b.slice(i>0).toLowerCase())
ETHproductions

2
ในทางกลับกันฉันอยากจะเสนอb=>a+=(a?b[0].toUpperCase():'')+b.slice(!!a).toLowerCase()สิ่งที่ฉันเชื่อว่าช่วยให้คุณประหยัดอีก 4 ไบต์
Neil

7

เป็นกลุ่ม, 69 68 66

:s/[`']//g<cr>:s/[a-z]\zs\ze[A-Z][a-z]\|\W\|_/\r/g<cr>o<esc>guggj<C-v>GgU:%s/\n<cr>

เป็นกลุ่มที่สั้นกว่า Perl! ความบ้าคลั่งนี้คืออะไร?

:s/[`']//g<cr>           remove ` and '
:s/                      match...
 [a-z]\zs\ze[A-Z][a-z]   right before a lowercase-surrounded uppercase letter
 \|\W\|_                 or a non-word char or underscore
 /\r/g<cr>               insert newlines between parts
o<esc>                   add an extra line at the end, necessary later...
gugg                     lowercasify everything
j                        go to line 2 (this is why we added the extra line)
<C-v>G                   visual select the first char of all-but-first line
gU                       uppercase
:%s/\n<cr>               join all lines into one

ขอบคุณNeilสำหรับการกดแป้นพิมพ์ที่ไร้ประโยชน์!


ฉันเห็นได้ว่าทำไมคนสุดท้ายถึง:sได้%แต่ทำไมความไม่ลงรอยกันในสองคนแรก
Neil

@ Neil Bah หน่วยความจำของกล้ามเนื้อ ขอบคุณ!
Doorknob

5
การจัดการจะสามารถอ่านได้น้อยกว่า Perl เช่นกัน +1
cat

ฉันกำลังเพิ่มสิ่งนี้ลงใน. vimrc ของฉัน
moopet

1
@fruglemonkey 1. :%j<cr>เทียบเท่าและสั้นกว่า 2. เพิ่มช่องว่างระหว่างบรรทัด
Doorknob

5

Mathematica 10.1, 101 ไบต์

""<>(ToCamelCase@{##2}~Prepend~ToLowerCase@#&@@StringCases[StringDelete[#,"`"|"'"],WordCharacter..])&

ใช้เอกสารที่ไม่มีเอกสารToCamelCaseซึ่งทำงานคล้ายกับCapitalizeแต่ตั้งค่าอักขระอื่นเป็นตัวพิมพ์เล็ก


ไม่ใช่ใน 10.3.0 ..
ซิมมอนส์มี

คือToCamelCase[n_,m_]:=n<>Capitalize/@mถูกต้องหรือไม่ ดูเหมือนว่ามัน และทำไมต้องใช้Prependเมื่อ#~ToCamelCase~{##2}ทำงาน
CalculatorFeline

@CatsAreFluffy นั้นให้ฉันToCamelCase::argx: ToCamelCase called with 2 arguments; 1 argument is expected.
LegionMammal978

CamelCase ทำงานอย่างไร เพียงแค่ToCamelCase[n_]:=""<>Capitalize/@n?
CalculatorFeline

@CatsAreFluffy ดูนี้
LegionMammal978

5

Julia, 98 89 ไบต์

s->lcfirst(join(map(ucfirst,split(replace(s,r"['`]",""),r"[a-z]\K(?=[A-Z][a-z])|\W|_"))))

นี่คือฟังก์ชันที่ไม่ระบุชื่อที่ยอมรับสตริงและส่งคืนสตริง หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

วิธีการที่นี่เป็นเช่นเดียวกับใน Doorknob ของPerl คำตอบ : replaceapostrophes และ backticks กับสตริงว่างsplitลงในอาร์เรย์ในการแสดงออกปกติที่ตรงกับกรณีที่จำเป็นให้ฟังก์ชั่นในช่วงอาร์เรย์เป็นตัวพิมพ์ใหญ่ตัวอักษรตัวแรกของแต่ละองค์ประกอบอาร์เรย์กลับ เป็นสตริงและผลลัพธ์ในการแปลงอักขระตัวแรกเป็นตัวพิมพ์เล็กmapucfirstjoinlcfirst


ฉันชอบ Julia ในฐานะ Python ที่มีประโยชน์มากกว่าและน่าสนใจกว่า แต่ฉันเกลียดendไวยากรณ์ บางทีฉันอาจจะใช้ฟังก์ชั่นที่ไม่ระบุชื่อสำหรับทุกสิ่งจากนั้นฉันก็ไม่ต้องพิมพ์end: D
cat

4

Perl 67 + 1 = 68 ไบต์

y/'`//d;s/([a-z](?=[A-Z][a-z]))|\W|_/$1 /g;$_=lc;s/^ +| +(.)/\u$1/g

ต้องการ-pแฟล็กและ-lสำหรับหลายบรรทัด:

$ perl -pl camelCase.pl input.txt
programmingPuzzlesCodeGolf
xmlHttpRequest
supportsIpv6OnIos:
someThingW1thApostrophesAndPuncTuation
nothingSpecial
5pecialCa5e
1337
1337Speak
abcd

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

y/'`//d;                            # Remove ' and `
s/([a-z](?=[A-Z][a-z]))|\W|_/$1 /g; # Replace according to '2. Split...' this will create
                                    #   a space separated string.
$_=lc;                              # lower case string
s/^ +| +(.)/\u$1/g                  # CamelCase the space separated string and remove any
                                    #   potential leading spaces.

2

Perl, 87 80 78 ไบต์

y/'`//d;$_=join'',map{ucfirst lc}split/[a-z]\K(?=[A-Z][a-z])|\W|_/,$_;lcfirst

ไบต์เพิ่มสำหรับ-pธง

อันดับแรกเราใช้y///โอเปอเรเตอร์การทับศัพท์เพื่อลบอักขระdทั้งหมด'`ในอินพุต:

y/'`//d;

จากนั้นเนื้อของรหัส:

                         split/[a-z]\K(?=[A-Z][a-z])|\W|_/,$_;

(แยกสตริงอินพุต$_ในตำแหน่งที่เหมาะสมโดยใช้แฟนซี\Kในสตริงการแข่งขันเพื่อแยกส่วนที่อยู่ก่อนหน้าจากการแข่งขันจริง)

          map{ucfirst lc}

(แผนที่เหนือแต่ละส่วนแยกของสตริงและทำให้สตริงตัวพิมพ์เล็กทั้งหมดจากนั้นสร้างอักขระตัวแรกของสตริงตัวพิมพ์ใหญ่ที่แก้ไข)

$_=join'',

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

ในที่สุดเราพิมพ์ตัวอักษรตัวเล็กลงโดยจับคู่ regex และใช้\lในสตริงการแทนที่ด้วย builtin ซึ่งช่วยประหยัด 2 ไบต์ผ่านวิธีการก่อนหน้านี้:

lcfirst

ขอบคุณ@ MartinBüttnerเป็นเวลา 7 ไบต์ ( [^a-zA-Z\d]-> \W|_)!


1
ฉันอิจฉาได้อย่างไร\K... ;)
Martin Ender

2

Lua, 127 ไบต์

t=''l=t.lower z=io.read()for x in z:gmatch('%w+')do t=t..(t==''and l(x:sub(1,1))or x:sub(1,1):upper())..l(x:sub(2))end return t

ยอมรับสตริงจาก stdin และส่งคืนผลลัพธ์ที่ถูก camelized

อาจจะยังคงมองหาทางออกที่ดีกว่าในขณะที่เก็บทุกอย่างในตัวแปรรู้สึกไม่มีประสิทธิภาพ

แต่โดยทั่วไปแล้วค่อนข้างเรียบง่าย:

 z:gmatch('%w+')

นี่คือความงามที่ช่วยฉันสักเล็กน้อย gmatch จะแยกสตริงตามรูปแบบ: %w+ซึ่งคว้าตัวอักษรและตัวเลขเท่านั้น

หลังจากนั้นมันเป็นการดำเนินการสตริงที่เรียบง่าย string.upper, string.lower และเสร็จสิ้น


2

PHP, 145 122 133 ไบต์

<?=join(split(" ",lcfirst(ucwords(strtolower(preg_replace(["#`|'#","#\W|_#","#([a-z])([A-Z][a-z])#"],[""," ","$1 $2"],$argv[1]))))));

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

ทำให้พังถล่ม

<?=                 // 9. print result
join(split(" ",     // 8. remove spaces
    lcfirst(        // 7. lowercase first character
    ucwords(        // 6. uppercase first character in every word
    strtolower(     // 5. lowercase everything
    preg_replace(
        ["#`|'#",   "#\W|_#",   "#([a-z])([A-Z][a-z])#"],
        ["",        " ",        "$1 $2"],
        // 2. replace apostrophes with empty string (remove them)
                    // 3. replace non-word characters with space
                                // 4. insert space before solitude uppercase
        $argv[1]    // 1. take input from command line
    ))))
));

lcfirstได้รับอนุญาตให้ลดสิ่งนี้เป็นคำสั่งเดียวประหยัด 23 ไบต์
การซ่อมแซมเครื่องหมายอัญประกาศเดี่ยวมีค่าใช้จ่าย 11 ไบต์สำหรับกรณีการแทนที่เพิ่มเติม


1

Kotlin , 160 ไบต์

fun a(s: String)=s.replace(Regex("['`]"),"").split(Regex("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])")).map{it.toLowerCase().capitalize()}.joinToString("").decapitalize()

เป้าหมายของฉันคือ Scala, "Java ทางเลือก" อื่น ๆ ดังนั้นฉันค่อนข้างพอใจกับผลลัพธ์ของฉัน ฉันขโมย regex จากคำตอบJava

ทดสอบด้วย:

fun main(args: Array<String>) {
    val testCases = arrayOf(
            "Programming Puzzles & Code Golf",
            "XML HTTP request",
            "supports IPv6 on iOS?",
            "SomeThing w1th, apo'strophe's and' punc]tuation",
            "nothing special",
            "5pecial ca5e",
            "1337",
            "1337-spEAk",
            "abcD",
            "a",
            "B")
    testCases.forEach { println(a(it)) }

}

ณ จุดนี้ฉันคิดว่าทุกคน "ยืม" regex ที่ดีที่สุด\W|_|(?<=[a-z])(?=[A-Z][a-z])หรือปรับเปลี่ยนเล็กน้อยเช่น [\W_]+
CAD97

คุณสามารถบันทึกบางอย่างเกี่ยวกับแผนที่และฟังก์ชั่นการขยายfun String.a()=replace(Regex("['`]"),"").split(Regex("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])")).joinToString(""){it.toLowerCase().capitalize()}.decapitalize()
แคลอรี่

1

สกาลา, 181 170 144

def f(s:String)={val l=s.replaceAll("'|`","")split("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])")map(_.toLowerCase);l(0)+l.tail.map(_.capitalize).mkString}

Tester:

val testCases = List(
  "Programming Puzzles & Code Golf" -> "programmingPuzzlesCodeGolf",
  "XML HTTP request" -> "xmlHttpRequest"
  // etc
)
println(testCases.map(t=>if(t._2!=f(t._1))s"FAIL:${f(t._1)}"else"PASS").mkString("\n"))

อุปกรณ์ประกอบฉากเพื่อCAD97และขอโทษที่Nathan Merrill :)


1
คุณสามารถบันทึก 6 ไบต์โดยการแทนที่ด้วย[^a-zA-Z0-9]+ [\\W_]+
CAD97

0

C 272 ตัวอักษร

โปรแกรม C ส่งสตริงไปที่ camelCase ในเครื่องหมายคำพูดเป็นอาร์กิวเมนต์ 1 มีจำนวนมากของ gotchas ในคำสั่งปัญหานี้ ...

#define S strlen(t)
#define A isalnum(t[i])
j=0;main(i,v)char**v;{char*p=v[1],*t;char o[99]={0};while(t=strtok(p," [{(~!@#$%^*-+=)}]")){i=0;p+=S+1;while((!A)&&i<S)i++;if(i!=S){o[j]=((j++==0)?tolower(t[i++]):toupper(t[i++]));while(i<S){if(A)o[j++]=t[i];i++;}}}puts(o);}

คุณจำเป็นต้อง#include<string.h>สำหรับstrlen, strtokและtoupperและสำหรับ#include<ctype.h> isalnum
Mego

ฉันไม่ต้องการใช้ gcc 3.4.4 ใน cygwin พวกเขาจะต้องเชื่อมโยงโดยอัตโนมัติในสมมติว่า int ภายนอก
cleblanc

ด้วย./camel "Programming Puzzles & Code Golf"ใน Cygwin (รวบรวมกับ GCC 3.4.4) programmingPuzzlesCodeEGolfผมได้รับ เอาต์พุตเดียวกันกับ 5.3.0
Mego

อึ. ฉันด้วย. ฉันต้องสร้างข้อผิดพลาดขณะเล่นกอล์ฟ ฉันกำลังดูอยู่ตอนนี้ ...
cleblanc

ปัญหาคือฉันเพิ่มสาย tokenizer อื่น ๆ หลังจากเล่นกอล์ฟและทดสอบไม่ดีพอ หากคุณลบ '&' ออกจากการโทร strtok มันจะทำงานกับอินพุตนั้น
cleblanc

0

JavaScript, 123 ไบต์

v=>v[r="replace"](/[`']/g,"")[r](/^.|.$|[A-Z][^a-z]+/g,x=>x.toLowerCase())[r](/[^a-z0-9]+./ig,x=>x.slice(-1).toUpperCase())

เวอร์ชันที่อ่านได้

v=>
  v.replace(/[`']/g,"")
  .replace(/^.|.$|[A-Z][^a-z]+/g,x=>x.toLowerCase())
  .replace(/[^a-z0-9]+./ig,x=>x.slice(-1).toUpperCase())

ลบเครื่องหมายอัญประกาศเดี่ยว, ทำให้อักษรตัวเล็กตัวแรก, ตัวอักษรตัวเล็กตัวสุดท้าย, และการจัดกลุ่มของอักขระตัวพิมพ์ใหญ่หลายตัว, จับคู่กลุ่มใด ๆ ของอักขระที่ไม่ใช่ตัวอักษรและตัวเลข 1 ตัวหรือมากกว่าแทนที่อักขระตัวสุดท้ายตัวพิมพ์ใหญ่

[r = "แทนที่"] เคล็ดลับจากโซลูชันของ Mrw247

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