Chuyển đổi quy ước mã hóa


22

Trong Coding Golf đó, bạn nên chuyển đổi một quy ước mã hóa với TitleCase thành low_case_with_underscores. Và ngược lại!

Đặc điểm kỹ thuật

Thay đổi vỏ theo cách sau:

  • Nếu ký tự gạch dưới là một dấu phân cách, hãy thay đổi vỏ thành Tiêu đề mà không có bất kỳ dấu phân cách nào.
  • Nếu có nhiều từ không có dấu phân cách, hãy thay đổi vỏ thành chữ thường và thêm một ký tự gạch dưới làm dấu phân cách.
  • Trong trường hợp chỉ có một từ (hoặc một ký tự): thay đổi vỏ thành Tiêu đề nếu từ bắt đầu bằng chữ thường; thay đổi vỏ thành chữ thường nếu từ bắt đầu bằng chữ in hoa.

Nhân vật được phép:

  • Từ A đến Z
  • từ A đến Z
  • gạch dưới ( _).

Đầu vào với các từ vỏ hỗn hợp không được phép. Ví dụ về các trường hợp không được phép:

  • Coding_Convention_Conversion
  • a_BC

Ví dụ trường hợp

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

Quy tắc

  • Nó được phép sử dụng ToUpper, ToLowervà các ToTitleCasechức năng.
  • Sử dụng biểu thức thông thường được cho phép.
  • : mã ngắn nhất tính bằng byte thắng!

Sử dụng một ToTitleCasechức năng có ổn không? Bạn đã không chỉ định, vì vậy tôi cho rằng nó ổn.
Justin

@Justin: Câu hỏi hay thật đấy. Hãy làm cho nó vui hơn và không cho phép chức năng ToTitleCase :)
Dariusz Woźniak

Chết tiệt ... giải pháp của tôi dựa vào nó
Justin

1
@Justin: Được rồi - Tôi đã không chỉ định nó ngay từ đầu, vì vậy trong trường hợp đó - hãy cho phép nó bằng mọi cách.
Dariusz Woźniak

Câu trả lời:


4

Bình thường, 25 byte 29 33 35 40

Đã lưu 2 byte nhờ @Dennis

Đã lưu 4 byte nhờ @FryAmTheEggman

?rIz0smrd4cz\_tsXzrG1*\_G

Dùng thử trực tuyến


Liên kết của bạn cần được cập nhật.
isaacg

Khi tôi thử đặt "abc" làm đầu vào, nó mang lại "bc" làm đầu ra. Lỗi? :)
Dariusz Woźniak

Để khắc phục những gì @ DariuszWoźniak nhận thấy, bạn có thể thay đổi tình trạng của mình từ /z\_sang rIz0. Tôi cũng tin rằng tôi đã tìm thấy một giải pháp thay thế có cùng độ dài cho chương trình thêm dấu gạch dưới : tsXzrG1_Mcj\_G2, có lẽ ai đó có thể chơi gôn nhiều hơn ...
FryAmTheEggman

À, tìm thấy rồi:tsXzrG1*\_G
FryAmTheEggman

8

Jolf, 35 byte

Tiết kiệm 1 byte nhờ @ Cᴏɴᴏʀ O'Bʀɪᴇɴ . Điều này được mã hóa theo ISO 8859-7.

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

Woohoo chương trình Jolf đầu tiên của tôi!

Giải trình

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

Dùng thử trực tuyến


Bạn có thể sử dụng tách chuỗi ở cuối, vì vậy nó trở thành "(?=[A-Z])'_. Chuỗi được đóng tự động.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ oh, tuyệt, cảm ơn!
Hạ cấp

7

Võng mạc , 37

Cảm ơn @ MartinBüttner vì đã tiết kiệm 4 byte!

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

(Lưu ý dòng mới.)

Hãy thử trực tuyến. Lưu ý điều này bao gồm thêm m`để định cấu hình một vài dòng để xử lý riêng từng dòng đầu vào để tất cả các testcase có thể được chạy trong một lần. Đây không phải là một yêu cầu của câu hỏi, vì vậy những điều này không được tính vào điểm số.

  • Dòng 1 và 2 chèn _vào đầu nhập hoặc trước chữ in hoa. Tất cả các từ bây giờ được phân _tách, bất kể trường hợp.
  • Dòng 3 hoán đổi trường hợp của chữ cái đầu tiên trong mỗi từ.
  • Dòng 4 và 5 xóa _hoặc khi bắt đầu nhập hoặc khi theo sau là chữ in hoa.

Điều này giúp tiết kiệm bốn byte: retina.tryitonline.net/ (
Ender

Ngoài ra, bạn có thể tránh dòng trống ở cuối bằng cách bỏ qua ?=giai đoạn cuối và thay thế giai đoạn đó bằng $1(mặc dù không ảnh hưởng đến số byte).
Martin Ender

@Martin Rất tốt - cảm ơn!
Chấn thương kỹ thuật số

5

GNU Sed, 46

Cảm ơn @TobySpeight đã lưu 2 byte!

Điểm bao gồm +1 cho -E(hoặc -r) tùy chọn để sed.

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

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

Khá đơn giản sed:

  • Dòng 1 thay thế bắt đầu của dòng hoặc _, theo sau là một chữ cái viết thường với chữ hoa của chữ cái đó. Các glá cờ để sThực hiện thay này cho mỗi trường hợp tìm thấy
  • tnhảy đến :nhãn không tên nếu có bất kỳ trận đấu nào cho sự thay thế ở trên. Nhãn này là ngầm ở cuối.
  • Mặt khác, tất cả các chữ cái viết hoa được thay thế bằng chữ thường của chữ cái _đó
  • Điều này để lại một hàng đầu _trước chữ cái đầu tiên. s/^_//loại bỏ điều đó

1
@Toby Cảm ơn. -Ehoạt động trong GNU sed 4.2.2 (Ubuntu 14.04.3) của tôi, mặc dù nó không có trong trang man. Tôi đã đọc ở đâu đó [cần dẫn nguồn] đó -Elà tùy chọn Posix mới hơn sẽ chính thức được thêm vào GNU Sed trong một bản phát hành mới hơn, nhưng đã không chính thức. Bất kể, -rlàm điều đúng nếu -Ekhông làm việc cho bạn.
Chấn thương kỹ thuật số

@Toby dòng 280-282 của sed / sed.c/* Undocumented, for compatibility with BSD sed. */ case 'E': case 'r':.
Chấn thương kỹ thuật số

@ Kỹ thuật số - Tôi đã nhầm; sed của tôi không chấp nhận -Enhư một từ đồng nghĩa cho -r. Tôi đã không đi qua một cách chính xác một chương trình ví dụ tối thiểused -E -e Q
Toby Speight

4

JavaScript (ES6), 87 byte

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

Giải trình

Tùy thuộc vào phần nào của regex khớp, nó thay thế phần khớp với trường hợp ngược lại.

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

Kiểm tra

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 byte

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

Thật không may, điều này thực hiện chính xác giống như giải pháp Retina, vì phương pháp đó cuối cùng đã ngắn hơn bất kỳ thứ gì khác mà tôi nghĩ ra.


2

Python 3, 130 byte

Nỗ lực nhanh chóng và bẩn thỉu bằng cách sử dụng regex để phân chia tại các nắp. Lực lượng khá tàn bạo: nếu bất cứ ai có thể đưa ra một cách tiếp cận khác, tôi chắc chắn điều này có thể bị đánh bại.

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 byte

không phải là ngắn nhất nhưng để hoàn thiện ở đây, giải pháp của tôi trong PHP, $ s giữ chuỗi để chuyển đổi:

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
Chào mừng bạn đến với Câu đố lập trình và trao đổi mã Golf. Hoàn thành tốt việc đăng một cái gì đó bằng ngôn ngữ mà bạn biết sẽ không giành được. những thách thức về môn đánh gôn hầu hết nằm trong các ngôn ngữ, vì vậy sử dụng ngôn ngữ không chơi gôn là tốt. +1 d: -D
wizzwizz4

1

Perl 6 ,  73 72 71   68 byte

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

Sử dụng:

# 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

Giải trình:

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

Bạn có thể tự hỏi tại sao tôi sử dụng các thuộc tính Unicode ( <:Lu>, <:Ll>) thay vì chỉ một lớp ký tự. Trong Perl 6, chúng không còn được đánh vần, [a-z]chúng được đánh vần <[a..z]>lớn gấp 1,6 lần. Các dấu ngoặc [ … ]được sử dụng để phân nhóm không bắt thay vào đó được đánh vần như (?: … )trong Perl 5.


1

Japt, 40 byte

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

Kiểm tra nó trực tuyến!

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

           // 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 byte

40 byte cộng với 2 cho -p(cảm ơn, dev-null )

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

Trên Windows, sử dụng perl và MINGW32, tôi không nhận được đầu ra, tôi còn thiếu gì?
ChatterOne

@ChatterOne Tôi không biết MINGW32 là gì, nhưng nó hoạt động tốt với tôi trên Strawberry Perl. Sử dụng -Ethay vì -e.
msh210

1

3, 15 ký tự / 32 byte (không cạnh tranh)

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

Try it here (Firefox only).

v3 đã được phát hành sau thử thách này, với một loạt các lỗi và cập nhật thư viện.

Giải trình

Đây chỉ là một bản mashup của nội dung.

⟮Ѩ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 byte

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

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

Cũng hoạt động trong Python 2 .

Sử dụng một thực tế thuận tiện là giá trị ascii cho _(95) nằm ngay giữa các chữ cái viết hoa (65-90) và chữ thường (97-122), cho phép so sánh chuỗi dễ dàng.


1

Forth (gforth) , 129 byte

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

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

Giải thích mã

: 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
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.