코딩 컨벤션 변환


22

해당 코딩 골프에서 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, ToLowerToTitleCase기능.
  • 정규식 사용이 허용됩니다.
  • : 바이트 단위의 가장 짧은 코드가 승리합니다!

ToTitleCase기능을 사용하고 있습니까? 당신은 지정하지 않았으므로 괜찮습니다.
Justin

@Justin : 참 좋은 질문입니다. 하자 그것을 더 재미을하고 ToTitleCase 기능 : 허용
다리우스 워즈니악

Darn ... 내 솔루션은 그것에 의존합니다
Justin

1
@ 저스틴 : 좋아-처음에 그것을 지정하지 않았으므로 그 경우에-어쨌든 허용합시다.
Dariusz Woźniak

답변:


4

Pyth, 25 바이트 29 33 35 40

@Dennis 덕분에 2 바이트 절약

@FryAmTheEggman 덕분에 4 바이트 절약

?rIz0smrd4cz\_tsXzrG1*\_G

온라인으로 사용해보십시오


링크를 업데이트해야합니다.
isaacg

"abc"를 입력으로 사용하려고하면 "bc"가 출력으로 나타납니다. 곤충? :)
Dariusz Woźniak

@ DariuszWoźniak가 알아 낸 것을 수정하기 위해 조건을에서 (으) /z\_로 변경할 수 있습니다 rIz0. : 나는 또한이 추가 밑줄 프로그램에 같은 길이의 대안을 찾을 생각 tsXzrG1_Mcj\_G2이 더 ..., 어쩌면 누군가 캔 골프
FryAmTheEggman

Ah, 그것을 발견 :tsXzrG1*\_G
FryAmTheEggman

8

줄프, 35 바이트

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ 덕분에 1 바이트를 절약합니다 . ISO 8859-7로 인코딩되어 있습니다.

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

나의 첫번째 Jolf 프로그램을 Woohoo!

설명

   // 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])'_. 문자열이 자동으로 닫힙니다.
코너 O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 아, 멋지다, 감사합니다!
Downgoat

7

망막 , 37

4 바이트를 절약 한 @ MartinBüttner에게 감사합니다!

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

(마지막 줄 바꿈에 유의하십시오.)

온라인으로 사용해보십시오. 여기에는 m`각 테스트 라인을 한 번에 실행할 수 있도록 각 입력 라인을 개별적으로 처리하기 위해 몇 개의 라인을 구성하는 추가 기능이 포함됩니다 . 이것은 질문의 요구 사항이 아니므로 점수에 포함되지 않습니다.

  • 1 행과 2 행 _은 입력 시작시 또는 대문자 앞에 삽입 합니다. _대소 문자와 상관없이 모든 단어가 분리 되어 있습니다 .
  • 3 행은 각 단어에서 첫 글자의 대소 문자를 바꿉니다.
  • 4 행과 5 행 _은 입력이 시작될 때 또는 대문자가 나오는 경우 제거 합니다.

이렇게하면 4 바이트가 절약됩니다 : retina.tryitonline.net/…
Martin Ender

또한 마지막 줄을 생략하고 ?=해당 단계를 $1(바이트 수에 영향을 미치지 않음) 대체 하여 후행 빈 줄을 피할 수 있습니다 .
Martin Ender

@Martin 아주 좋아요-감사합니다!
Digital Trauma

5

GNU 세드, 46

2 바이트를 절약 한 @TobySpeight에 감사합니다!

에 대한 -E(또는 -r) 옵션에 +1이 포함 됩니다 sed.

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

온라인으로 사용해보십시오.

상당히 간단한 sed :

  • 1 행은 라인의 시작 또는를 대체 _하고 그 뒤에 대문자가 소문자로 바뀝니다. 발견 된 각 인스턴스에 대해이 대체 gs수행 하는 플래그
  • t 로 점프 :위의 대체와 일치 이름 없는 레이블로 . 이 레이블은 암묵적으로 끝납니다.
  • 그렇지 않으면 모든 대문자가 대체됩니다 _ 그 편지의 소문자
  • 이것은 _첫 글자 앞에 행간을 남깁니다 . s/^_//그것을 제거합니다.

1
@ 토비 감사합니다. -E맨 페이지에는 없지만 내 GNU sed 4.2.2 (Ubuntu 14.04.3)에서 작동합니다. 나는 -E새로운 릴리즈에서 공식적으로 GNU Sed에 추가 될 새로운 Posix 옵션 인 어딘가 [인용 필요]를 읽었 지만 이미 비공식적으로 존재합니다. 어쨌든, 당신에게 효과가 -r없다면 옳은 일 -E을하는 것입니다.
Digital Trauma

sed / sed.c의 @Toby 라인 280-282/* Undocumented, for compatibility with BSD sed. */ case 'E': case 'r':입니다.
Digital Trauma

@Digital-나는 착각했다; 내 나오지 않는 동의 -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())

설명

정규식의 어느 부분이 일치하는지에 따라 일치하는 항목이 다른 경우로 바뀝니다.

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

루비, 101 87 75 바이트

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

불행히도, 이것은 Retina 솔루션과 정확히 똑같습니다. 그 방법은 내가 생각해 낸 것보다 짧았습니다.


2

파이썬 3, 130 바이트

정규식을 사용하여 캡을 분할하는 빠르고 더러운 시도. 꽤 무차별 한 힘 : 만약 누군가가 다른 접근법을 생각 해낼 수 있다면 나는 이것이 이길 수 있다고 확신합니다.

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
프로그래밍 퍼즐 및 코드 골프 스택 교환에 오신 것을 환영합니다. 당신이 이길 수 없다고 알고있는 언어로 무언가를 올리는 것이 좋습니다. 코드 골프 문제는 대부분 언어 내에 있으므로 비 골프 언어를 사용하는 것이 좋습니다. +1 d : -D
wizzwizz4

1

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

왜 문자 클래스 대신 유니 코드 속성 ( <:Lu>, <:Ll>)을 사용했는지 궁금 할 것 입니다. Perl 6 에서는 더 이상 철자가 표시되지 않으며 1.6 배나 큰 [a-z]철자가 <[a..z]>표시됩니다. 대괄호 [ … ](?: … )Perl 5 와 같이 철자가 아닌 비 캡처 그룹화에 사용됩니다 .


1

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

펄 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는이 도전 이후에 수많은 버그 수정 및 라이브러리 업데이트와 함께 출시되었습니다.

설명

이것은 단지 내장의 매시업입니다.

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

넷째 (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.