コーディング規約の変換


22

そのコーディングゴルフでは、TitleCaseを使用した1つのコーディング規則をlower_case_with_underscoresに変換する必要があります。およびその逆!

仕様

次の方法でケーシングを変更します。

  • アンダースコア文字が区切り文字の場合、区切り文字なしで大文字小文字をタイトルケースに変更します。
  • 区切り文字のない単語が複数ある場合は、大文字小文字を小文字に変更し、アンダースコア文字を区切り文字として追加します。
  • 単語が1つ(または1文字)の場合:単語が小文字で始まる場合は、大文字小文字をタイトルケースに変更します。単語が大文字で始まる場合、大文字小文字を小文字に変更します。

許可される文字:

  • 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

ルール

  • 使用を許可されToUpperToLowerそしてToTitleCase関数の。
  • 正規表現を使用できます。
  • :バイト単位の最短コードが勝ちます!

ToTitleCase機能を使用しても大丈夫ですか?指定しなかったので、大丈夫だと思います。
ジャスティン

@ジャスティン:確かに良い質問です。それをもっと楽しくして、ToTitleCase関数を禁止しましょう:)
ダリウス

くそー...私の解決策はそれに依存している
ジャスティン

1
@ジャスティン:オーケー-最初は指定しなかったので、その場合はとにかく許可しましょう。
ダリウスウォニアック

回答:


4

Pyth、25バイト29 33 35 40

@Dennisのおかげで2バイト節約

@FryAmTheEggmanのおかげで4バイト節約

?rIz0smrd4cz\_tsXzrG1*\_G

オンラインで試す


リンクを更新する必要があります。
isaacg

入力として「abc」を入力しようとすると、出力として「bc」が生成されます。バグ?:)
ダリウスウォニアック

@DariuszWoźniakが気付いたことを修正するには、条件をから/z\_に変更できますrIz0。また、私は追加のアンダースコアプログラムに同じ長さの選択肢を発見したと信じて:tsXzrG1_Mcj\_G2、多分誰かが缶のゴルフはもっと...
FryAmTheEggman

ああ、見つけた:tsXzrG1*\_G
FryAmTheEggman

8

Jolf、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])'_ます。文字列は自動的に閉じられます。
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴああ、クール、ありがとう!
ダウンゴート

7

網膜、37

4バイトを節約してくれた@MartinBüttnerに感謝します!

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

(末尾の改行に注意してください。)

オンラインでお試しください。 これにはm`、すべてのテストケースを一度に実行できるように、各入力行を個別に処理するためのいくつかの行を構成するための追加が含まれています。これは質問の要件ではないため、これらはスコアにカウントされません。

  • 1行目と2行目_は、入力の先頭または大文字の前に挿入します。_大文字小文字に関係なく、すべての単語が分離されました。
  • 行3は、各単語の最初の文字の大文字と小文字を入れ替えます。
  • 4行目と5行目_は、入力の開始時、または大文字が続く場合に削除します。


また、最後の行を省略して?=そのステージを置き換えることにより、末尾の空行を回避できます$1(ただし、バイトカウントには影響しません)。
マーティンエンダー

@マーティン非常に良い-ありがとう!
デジタル外傷

5

GNU Sed、46

2バイトを節約してくれた@TobySpeightに感謝します!

スコアには、-E(または-r)オプションの+1が含まれていますsed

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

オンラインでお試しください。

かなり簡単なsed:

  • 行1は、行の先頭またはを置換し_、その後に小文字をその文字の大文字で置き換えます。gフラグsを行う見つかったインスタンスごとにこの置換
  • t:上記の置換に一致するものがある場合、名前のないラベルにジャンプします。このラベルは暗黙的に最後にあります。
  • それ以外の場合はすべての大文字がで置換され_、その文字の下ケース
  • これにより_、最初の文字の前に先頭が残ります。 s/^_//それを削除します。

1
@Tobyありがとう。 -EGNU sed 4.2.2(Ubuntu 14.04.3)で動作しますが、manページにはありません。どこかで読んだ[要出典]-Eました。これは新しいリリースでGNU Sedに公式に追加される新しいPosixオプションですが、すでに非公式に存在しています。とにかく、-rうまく-Eいかない場合は正しいことをします。
デジタル外傷

sed / sed.cの @Toby 行280-282/* 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())

説明

正規表現のどの部分が一致したかに応じて、一致したものが反対のケースに置き換えられます。

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

Python 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
プログラミングパズルとCode Golf Stack Exchangeへようこそ。あなたが勝つことはないと知っていた言語で何かを投稿するのはよくできました。コードゴルフの課題はほとんどが言語内にあるため、ゴルフ以外の言語を使用するのは良いことです。+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がリリースされ、多数のバグ修正とライブラリの更新が行われました。

説明

これは組み込みの単なるマッシュアップです。

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

Forth(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.