การแปลงแบบแผนการเข้ารหัส


22

ใน Coding Golf คุณควรแปลงหนึ่งการเข้ารหัสด้วย TitleCase เป็น lower_case_with_underscores และในทางกลับกัน!

สเปค

เปลี่ยนปลอกด้วยวิธีต่อไปนี้:

  • หากอักขระขีดล่างเป็นตัวคั่นให้เปลี่ยนเคสเป็นหัวเรื่องเคสโดยไม่มีตัวคั่นใด ๆ
  • หากมีหลายคำที่ไม่มีตัวคั่นให้เปลี่ยนเคสเป็นตัวพิมพ์เล็กและเพิ่มอักขระขีดล่างเป็นตัวคั่น
  • ในกรณีที่มีเพียงหนึ่งคำ (หรือหนึ่งตัวอักษร): เปลี่ยนปลอกเป็นชื่อเรื่องกรณีถ้าคำเริ่มต้นด้วยตัวพิมพ์เล็ก เปลี่ยนปลอกเป็นตัวพิมพ์เล็กหากคำเริ่มต้นด้วยตัวพิมพ์ใหญ่

อักขระที่อนุญาต:

  • A ถึง Z
  • a ถึง z
  • ขีดล่าง ( _)

การป้อนข้อมูลด้วยคำที่ใส่ซองไม่ได้รับอนุญาต ตัวอย่างของกรณีที่ไม่อนุญาต:

  • Coding_Convention_Conversion
  • a_BC

ตัวอย่างคดี

Input                        | Expected Output
===========================================================
CodingConventionConversion   | coding_convention_conversion
coding_convention_conversion | CodingConventionConversion
abc                          | Abc
Abc                          | abc
ABC                          | a_b_c
a_b_c                        | ABC
a                            | A
A                            | a

กฎระเบียบ

  • มันได้รับอนุญาตให้ใช้ToUpper, ToLowerและToTitleCaseฟังก์ชั่น
  • อนุญาตให้ใช้การแสดงออกปกติ
  • : โค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ!

การใช้ToTitleCaseฟังก์ชั่นโอเคไหม? คุณไม่ได้ระบุดังนั้นฉันคิดว่ามันโอเค
Justin

@Justin: คำถามที่ดีแน่นอน มาทำให้มันสนุกขึ้นและไม่อนุญาตฟังก์ชั่น ToTitleCase :)
Dariusz Woźniak

Darn ... ทางออกของฉันขึ้นกับมัน
Justin

1
@ จัสติน: โอเค - ฉันไม่ได้ระบุไว้ในตอนแรกดังนั้นในกรณี - ขออนุญาตต่อไป
Dariusz Woźniak

คำตอบ:


4

Pyth, 25 ไบต์29 33 35 40

บันทึก 2 ไบต์ขอบคุณ @Dennis

บันทึกแล้ว 4 ไบต์ขอบคุณ @FryAmTheEggman

?rIz0smrd4cz\_tsXzrG1*\_G

ลองออนไลน์


ลิงค์ของคุณต้องได้รับการอัพเดท
isaacg

เมื่อฉันลองใส่ "abc" เป็นอินพุตมันจะให้ "bc" เป็นเอาต์พุต ข้อผิดพลาด? :)
Dariusz Woźniak

เพื่อแก้ไขสิ่งที่ @ DariuszWoźniakสังเกตเห็นคุณสามารถเปลี่ยนสภาพของคุณจากไป/z\_ rIz0ฉันยังเชื่อว่าฉันพบทางเลือกที่มีความยาวเท่ากันกับโปรแกรมเพิ่มขีดล่าง: tsXzrG1_Mcj\_G2บางทีบางคนสามารถเล่นกอล์ฟได้มากกว่านี้ ...
FryAmTheEggman

อ่าพบแล้ว:tsXzrG1*\_G
FryAmTheEggman

8

Jolf, 35 ไบต์

บันทึก 1 ไบต์ด้วย @ CᴏɴᴏʀO'BʀɪᴇɴCᴏɴᴏʀO'Bʀɪᴇɴ นี่คือการเข้ารหัสใน ISO 8859-7

? hI'_ΜGI'_dpyH0pxRGIL0"(?=[A-Z])'_

Woohoo รายการ Jolf รายการแรกของฉัน!

คำอธิบาย

   // I = input
? hI'_                              // If input contains _
       GI'_                          // Split on _
      Μ    d                         // Loop, then join
            pyH0                     // Make the first character uppercase
                                    // ELSE...
                  RGIL0"(?=[A-Z])    // Split *after* all uppercase chars
                                 '_  // join with _ 
                px                   //Make lowercase

ลองออนไลน์


"(?=[A-Z])'_คุณสามารถใช้แยกสตริงที่สิ้นสุดดังนั้นมันจะกลายเป็น สายอักขระถูกปิดโดยอัตโนมัติ
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴโอ้เยี่ยมเลยขอบคุณ!
Downgoat

7

จอตา , 37

ขอบคุณ @ MartinBüttnerสำหรับการบันทึก 4 ไบต์!

^|[A-Z]
_$0
T`Ll`lL`_.
^_|_(?=[A-Z])

(สังเกตบรรทัดใหม่ที่ตามมา)

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

  • บรรทัดที่ 1 และ 2 แทรก_ที่ตอนต้นของอินพุตหรือก่อนตัวอักษรตัวพิมพ์ใหญ่ ทุกคำ_แยกตอนนี้แล้วโดยไม่คำนึงถึงตัวพิมพ์ใหญ่ - เล็ก
  • กรณีสลับบรรทัดที่ 3 ของตัวอักษรตัวแรกในแต่ละคำ
  • บรรทัดที่ 4 และ 5 ลบ_ที่จุดเริ่มต้นของการป้อนข้อมูลหรือเมื่อตามด้วยตัวอักษรตัวพิมพ์ใหญ่

สิ่งนี้ช่วยประหยัดสี่ไบต์: retina.tryitonline.net/…
Martin Ender

นอกจากนี้คุณสามารถหลีกเลี่ยงบรรทัดว่างเปล่าที่ต่อท้ายได้ด้วยการเว้นบรรทัดสุดท้าย?=และแทนที่สเตจนั้นด้วย$1(ไม่ส่งผลกระทบต่อจำนวนไบต์)
Martin Ender

@ มาร์ตินดีมาก - ขอบคุณ!
Digital Trauma

5

GNU Sed, 46

ขอบคุณ @TobySpeight สำหรับการบันทึก 2 ไบต์!

คะแนนรวม +1 -E(หรือ-r) sedตัวเลือกที่จะ

s/(^|_)([a-z])/\u\2/g
t
s/[A-Z]/_\l&/g
s/^_//

ลองออนไลน์

sed ตรงไปตรงมาค่อนข้างเป็นธรรม:

  • บรรทัดที่ 1 ทดแทนจุดเริ่มต้นของบรรทัดหรือ_ตามด้วยตัวอักษรตัวพิมพ์เล็กด้วยตัวพิมพ์ใหญ่ของตัวอักษรนั้น การgตั้งค่าสถานะเพื่อsทำการทดแทนนี้สำหรับแต่ละอินสแตนซ์ที่พบ
  • tข้ามไปยัง:ป้ายกำกับที่ไม่มีชื่อหากมีการแข่งขันใด ๆ สำหรับการทดแทนข้างต้น ป้ายกำกับนี้จะอยู่ท้ายสุด
  • มิฉะนั้นตัวอักษรตัวพิมพ์ใหญ่ทั้งหมดจะถูกแทนที่ด้วย_ตัวพิมพ์เล็กของตัวอักษรนั้น
  • ใบนี้นำ_หน้าก่อนอักษรตัวแรก s/^_//เอาออก

1
@Toby ขอบคุณ -Eทำงานใน GNU ของฉัน sed 4.2.2 (Ubuntu 14.04.3) แม้ว่ามันจะไม่อยู่ในหน้าคน ฉันอ่านที่ไหนสักแห่ง [อ้างอิงที่จำเป็น] ที่-Eเป็นตัวเลือกใหม่ Posix ที่จะถูกเพิ่มอย่างเป็นทางการใน GNU Sed ในรุ่นที่ใหม่กว่า แต่มีอยู่แล้วอย่างไม่เป็นทางการ ไม่ว่า-rสิ่งที่ถูกต้องถ้า-Eไม่ได้ผลสำหรับคุณ
Digital Trauma

@Toby เส้น 280-282 ของ sed / sed.c/* Undocumented, for compatibility with BSD sed. */ case 'E': case 'r':มี
บาดเจ็บทางระบบดิจิตอล

@ ดิจิทัล - ฉันเข้าใจผิด sed ฉันไม่ยอมรับเป็นคำพ้องสำหรับ-E -rฉันไม่ได้ผ่านโปรแกรมขั้นต่ำอย่างถูกต้องเช่นsed -E -e Q
Toby Speight

4

JavaScript (ES6), 87 ไบต์

s=>s.replace(/[A-Z]|(^|_)(.)/g,(c,_,l,i)=>l?l.toUpperCase():(i?"_":"")+c.toLowerCase())

คำอธิบาย

ทั้งนี้ขึ้นอยู่กับส่วนของ regex ที่จับคู่มันแทนที่การจับคู่กับกรณีตรงข้าม

s.replace(
  /[A-Z]|(^|_)(.)/g,
  (c,_,l,i)=>
    l?
      (i?"_":"")+c.toLowerCase()
    :l.toUpperCase()
)

ทดสอบ

var solution = s=>s.replace(/[A-Z]|(^|_)(.)/g,(c,_,l,i)=>l?l.toUpperCase():(i?"_":"")+c.toLowerCase())
<input type="text" id="input" value="coding_convention_conversion" />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


2

Ruby, 101 87 75 ไบต์

->s{s.gsub(/^.|[A-Z]/,'_\0').gsub(/_./,&:swapcase).gsub(/_(?=[A-Z])|^_/,'')}

น่าเสียดายที่นี่ทำสิ่งเดียวกันกับโซลูชัน Retina เพราะวิธีการนั้นจบลงด้วยความสั้นกว่าสิ่งอื่นใด


2

Python 3, 130 ไบต์

ความพยายามอย่างรวดเร็วและสกปรกโดยใช้ regex แยกที่แคป แรงเดรัจฉานค่อนข้างแรง: ถ้าใครสามารถหาวิธีอื่นได้ฉันมั่นใจว่ามันจะถูกโจมตี

import re
lambda s:('_'.join(re.findall('[A-Z][a-z]*',s)).lower(),''.join([a[0].upper()+a[1:]for a in s.split('_')]))[s.islower()]

2

PHP 160 ไบต์

ไม่ใช่ที่สั้นที่สุด แต่เพื่อความสมบูรณ์ที่นี่ทางออกของฉันใน PHP, $ s ถือสตริงการแปลง:

trim(preg_replace_callback('/((^[a-z]|_[a-z])|([A-Z]))/',function($m){return empty($m[2])?'_'.strtolower($m[3]):strtoupper(str_replace('_','',$m[2]));},$s),'_')

1
ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและการแลกเปลี่ยนรหัสกองกอล์ฟ ทำได้ดีมากสำหรับการโพสต์สิ่งที่เป็นภาษาที่คุณรู้ว่าจะไม่ชนะ ความท้าทายของcode-golfส่วนใหญ่เป็นภาษาดังนั้นการใช้ภาษาที่ไม่ใช่กอล์ฟก็เป็นเรื่องดี +1 d: -D
wizzwizz4

1

Perl 6 ,  73 72 71   68 ไบต์

{.comb(/<:Lu><:Ll>*|<:Ll>+/).map({/<:Lu>/??.lc!!.tc}).join('_'x?/<:Lu>/)} # 73
{.comb(/<:Lu><:Ll>*|<:L>+/).map({/<:Lu>/??.lc!!.tc}).join('_'x?/<:Lu>/)}  # 72
{/<:Lu>/??S:g/(^)?(<:Lu>)/{$0||'_'}$1.lc()/!!S:g/[^|_](<:Ll>)/$0.tc()/}   # 71
{.comb(/<:Lu><:Ll>*|<:L>+/).map({/<:Lu>/??.lc!!.tc}).join('_'x!/_/)}      # 68

การใช้งาน:

# give it a lexical name
my &code = {...}

for <CodingConventionConversion coding_convention_conversion abc Abc ABC a_b_c a A>
{ say .&code }
coding_convention_conversion
CodingConventionConversion
Abc
abc
a_b_c
ABC
A
a

คำอธิบาย:

{
  .comb( / <:Lu><:Ll>* | <:L>+ / ) # grab the "words" only
  .map({
      /<:Lu>/ # if the word has uppercase
    ??
      .lc     # lowercase the whole word
    !!
      .tc     # otherwise titlecase the word
   })
  .join(  # join the words
    '_'   # with '_'
    x     # repeated
    !/_/  # zero times if it had a _, otherwise once
  )
}

คุณอาจสงสัยว่าทำไมฉันถึงใช้คุณสมบัติ Unicode ( <:Lu>, <:Ll>) แทนที่จะเป็นแค่คลาสอักขระ ในPerl 6พวกเขาจะไม่สะกดอีกต่อไป[a-z]พวกเขาจะสะกด<[a..z]>ซึ่งเป็น 1.6 เท่าใหญ่ วงเล็บ[ … ]จะใช้สำหรับการจัดกลุ่มที่ไม่ใช่การจับภาพแทนซึ่งถูกสะกดเช่นเดียวกับ(?: … )ใน Perl 5


1

Japt, 40 ไบต์

UfV="%A" ?UrV@'_s!Y +Xv} :Ur"^.|_."_sJ u

ทดสอบออนไลน์!

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

           // Implicit: U = input string
UfV="%A"   // Set variable V to the string "\\A", and get all matches in U.
?          // If the list is not null:
UrV@     } //  Replace each match X and its index Y with this function:
'_s!Y +Xv  //   Return "_".slice(!Y) (1 for Y=0, 0 for anything else) + X.toLowerCase().
:          // Otherwise:
Ur"^.|_."  //  Replace the char at the beginning and each char following an underscore with:
_sJ u      //   The last char of the match (the letter) .toUpperCase().

1

Perl 5, 42 ไบต์

40 ไบต์บวก 2 สำหรับ-p(ขอบคุณdev-null )

s/[A-Z]/_\l$&/g||s/(^|_)(.)/\u$2/g;s/_//

บน Windows โดยใช้ perl และ MINGW32 ฉันจะไม่ได้ผลลัพธ์ฉันจะพลาดอะไรบ้าง
ChatterOne

@ ChatterOne ฉันไม่รู้ว่า MINGW32 คืออะไร แต่มันใช้ได้ดีกับ Strawberry Perl ใช้แทน-E -e
msh210

1

𝔼𝕊𝕄𝕚𝕟 3, 15 ตัวอักษร / 32 ไบต์ (ไม่มีการแข่งขัน)

⟮ѨDZï⟯≠ï?Ⅰ:ѨȎѨƎï

Try it here (Firefox only).

v3 ได้รับการปล่อยตัวหลังจากการท้าทายนี้พร้อมด้วยการแก้ไขข้อบกพร่องมากมายและการอัปเดตห้องสมุด

คำอธิบาย

นี่เป็นเพียงแค่การรวมกันของ builtins

⟮ѨDZï⟯≠ï?Ⅰ:ѨȎѨƎï // implicit: ï=input
⟮ѨDZï⟯≠ï?        // check if ï is NOT in snake_case
       Ⅰ       // if so, then convert to snake_case
        :ѨȎѨƎï // otherwise, convert to camelCase and make the first letter UPPERCASE


1

Python 3 , 86 ไบต์

lambda s,u='_':''.join([u[i>u:]+i.lower()for i in(s<u)*s]or[u]+s.title().split(u))[1:]

ลองออนไลน์!

นอกจากนี้ยังทำงานในหลาม 2

การใช้ความจริงที่สะดวกว่าค่า ascii สำหรับ_(95) อยู่ระหว่างตัวอักษรตัวพิมพ์ใหญ่ (65-90) และตัวพิมพ์เล็ก (97-122) ซึ่งช่วยให้เปรียบเทียบสตริงได้ง่าย


1

ออกมา (gforth) , 129 ไบต์

: f bounds dup c@ 32 xor emit 1+ ?do i c@ '_ < if ." _"i c@ 32 + emit then i c@ '_ > if i 1- c@ '_ = 32 * i c@ + emit then loop ;

ลองออนไลน์!

รหัสคำอธิบาย

: f              \ start a new word definition
  bounds         \ convert string address and length to beginning and ending address
  dup c@         \ get the first character
  32 xor emit    \ convert to the opposite case and output
  1+             \ add 1 to beginning of string (skip starting char)
  ?do            \ begin counted loop over string character addresses
    i c@ '_ <    \ check if char is uppercase 
    if           \ if it is:
      ." _"      \ output underscore
      i c@       \ get current char
      32 + emit  \ convert to lowercase and output
    then         \ end if block
    i c@ '_ >    \ check if lowercase (not '_')
    if           \ if it is:
      i 1- c@    \ get the previous character
      '_ = 32 *  \ if it's an underscore, multiply by 32 (true = -1 in forth)
      i c@ +     \ add result to current char (make uppercase if previous was '_')
      emit       \ output resulting char
    then         \ end if block
  loop           \ end loop
;                \ end word definition
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.