Kodlama Sözleşmesi Dönüştürme


22

Bu Coding Golf'te, TitleCase ile bir kodlama kuralını lower_case_with_underscores'e dönüştürmelisiniz. Ve ... tam tersi!

Şartname

Muhafazayı aşağıdaki şekilde değiştirin:

  • Alt çizgi karakteri sınırlayıcıysa, gövdeyi sınırlayıcı olmadan Başlık Büyüklüğü olarak değiştirin.
  • Sınırlayıcı içermeyen birden fazla kelime varsa, büyük / küçük harfle değiştirin ve ayırıcı olarak alt çizgi karakteri ekleyin.
  • Yalnızca bir sözcük (veya bir karakter) olması durumunda: sözcük küçük harfle başlıyorsa, gövdeyi Başlık Büyüklüğü olarak değiştirin; sözcük büyük harfle başlıyorsa, gövdeyi küçük harfe değiştirin.

İzin verilen karakterler:

  • A'dan Z'ye
  • A'dan Z'ye
  • alt çizgi ( _).

Karışık kasalı kelimelerle girişe izin verilmez. İzin verilmeyen vakalara örnekler:

  • Coding_Convention_Conversion
  • a_BC

Örnek Vakalar

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

kurallar

  • Kullanımı izin verilir ToUpper, ToLowerve ToTitleCaseişlevleri.
  • Normal ifadeler kullanılmasına izin verilir.
  • : bayt cinsinden en kısa kod kazanır!

Bir ToTitleCaseişlevi kullanmak iyi mi? Siz belirtmediniz, bu yüzden iyi olduğunu varsayacağım.
Justin

@ Justin: Gerçekten iyi bir soru. Daha eğlenceli hale getirelim ve ToTitleCase işlevine izin vermeyelim :)
Dariusz Woźniak

Lanet olsun ... benim çözümüm buna bağlı
Justin

1
@Justin: Tamam - Başlangıçta belirtmedim, bu durumda - yine de izin verelim.
Dariusz Woźniak

Yanıtlar:


4

Pyth, 25 bayt 29 33 35 40

@Dennis sayesinde 2 bayt tasarruf edildi

@FryAmTheEggman sayesinde 4 bayt kaydedildi

?rIz0smrd4cz\_tsXzrG1*\_G

Çevrimiçi deneyin


Bağlantınızın güncellenmesi gerekiyor.
isaacg

Bir girdi olarak "abc" koymayı denediğimde, çıktı olarak "bc" verir. Hata? :)
Dariusz Woźniak

@ DariuszWoźniak'ın fark ettiği şeyi düzeltmek için durumunuzu 'den' olarak /z\_değiştirebilirsiniz rIz0. Ayrıca, alt çizgi programına aynı uzunlukta bir alternatif bulduğuma inanıyorum:, tsXzrG1_Mcj\_G2belki birisi daha fazla golf
oynayabilir

Ah, buldum:tsXzrG1*\_G
FryAmTheEggman

8

Jolf, 35 bayt

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ sayesinde 1 bayt tasarruf eder . Bu ISO 8859-7'de kodlanmıştır.

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

Woohoo benim ilk Jolf programım!

açıklama

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

Çevrimiçi deneyin


Sonunda dize ayırmayı kullanabilirsiniz, böylece olur "(?=[A-Z])'_. Dize otomatik olarak kapatılır.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ oh, güzel, teşekkürler!
Downgoat

7

Retina , 37

4 bayt tasarruf ettiği için @ MartinBüttner'a teşekkürler!

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

(Sondaki yeni satıra dikkat edin.)

Çevrimiçi deneyin. Bunun, m`her test satırını ayrı ayrı ele almak için birkaç satır yapılandırmak için ekstralar içerdiğini ve böylece tüm test senaryolarının tek seferde çalıştırılabileceğini unutmayın. Bu sorunun bir şartı değildir, bu nedenle puanda sayılmaz.

  • Satır 1 ve 2 _ya girişin başına ya da büyük harflerden önce eklenir. _Durumdan bağımsız olarak tüm kelimeler şimdi ayrılmıştır.
  • Satır 3, her kelimedeki ilk harfin durumunu değiştirir.
  • 4. ve 5. satırlar _giriş başlangıcında veya ardından büyük harfle kaldırılır .

Bu dört bayt tasarrufu sağlar: retina.tryitonline.net/…
Martin Ender

Ayrıca sonuncuyu atlayarak ?=ve o aşamayı değiştirerek boş satırdan kaçınabilirsiniz $1(bayt sayısını etkilemez).
Martin Ender

@Martin Çok iyi - teşekkürler!
Dijital Travma

5

GNU Sed, 46

2 bayt kaydettiği için @TobySpeight'a teşekkürler!

Puan için -E(veya -r) seçeneğine +1 dahildir sed.

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

Çevrimiçi deneyin.

Oldukça basit sed:

  • Satır 1, satırın başlangıcını veya _arkasından bu harfin büyük harfini içeren küçük harf kullanır. gBayrak sgerçekleştirir bulunan her örnek için bu ikame
  • t:yukarıdaki değişiklik için herhangi bir eşleşme varsa , adlandırılmamış etikete atlar . Bu etiketin sonunda örtülü.
  • Aksi takdirde, tüm büyük harfler _o harfin küçük harfiyle değiştirilir
  • Bu _ilk harfin önünde bir öncü bırakır . s/^_//kaldırır.

1
@Toby Teşekkürler. -EGNU sed 4.2.2 (Ubuntu 14.04.3) 'de çalışıyor, ancak man sayfasında değil. -EYeni bir sürümde GNU Sed'e resmi olarak eklenecek daha yeni Posix seçeneği olan bir yerde [alıntı gerekli] okudum , ancak gayri resmi olarak orada. Ne olursa olsun, -rsizin için -Eişe yaramazsa doğru olanı yapar.
Dijital Travma

@ Sed / sed.c'nin 280-282 satırları vardır /* Undocumented, for compatibility with BSD sed. */ case 'E': case 'r':.
Dijital Travma

@Digital - Yanılmışım; Benim sed gelmez kabul -Eeş anlamlı olarak -r. Minimal bir programı doğru bir şekilde geçirmedimsed -E -e Q
Toby Speight

4

JavaScript (ES6), 87 bayt

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

açıklama

Normal ifadenin hangi kısmının eşleştiğine bağlı olarak, maçı karşı dava ile değiştirir.

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

Ölçek

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

Yakut, 101 87 75 bayt

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

Ne yazık ki, bu Retina çözümü ile aynı şeyi yapıyor, çünkü bu yöntem ortaya koyduğum her şeyden daha kısa oldu.


2

Python 3, 130 bayt

Kapaklara ayırmak için regex kullanarak hızlı ve kirli girişim. Oldukça kaba kuvvet: eğer herkes farklı bir yaklaşımla ortaya çıkabilirse, bunun yenilebileceğinden eminim.

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 bayt

kısa değil ama bütünlük burada PHP benim çözüm, $ s dönüştürmek için dize tutar:

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
Programlama Bulmacalar ve Kod Golf Stack Exchange hoş geldiniz. Kazanamayacağınızı bildiğiniz bir dilde bir şeyler yayınlamak için iyi iş çıkardınız. kod-golf zorlukları çoğunlukla dillerdedir, bu nedenle golf dışı bir dil kullanmak iyidir. +1 d: -D
wizzwizz4

1

Perl 6 ,  73 72 71   68 bayt

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

Kullanımı:

# 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

Açıklama:

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

Neden Unicode özelliklerini kullandığımı merak ediyor olabilirsiniz ( <:Lu>,<:Ll> sadece bir karakter sınıfı yerine ) . In Perl 6 artık yazıldığından vardır [a-z]onlar yazıldığından <[a..z]>büyüklüğünde 1.6 kat olan. Parantezler [ … ]bunun yerine (?: … )Perl 5'te olduğu gibi yazılan yakalama olmayan gruplama için kullanılır .


1

Japt, 40 bayt

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

Çevrimiçi test edin!

Nasıl çalışır

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

40 bayt artı 2 için -p(teşekkürler, dev-null )

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

Windows'da perl ve MINGW32 kullanarak çıktı almıyorum, ne eksik?
ChatterOne

@ChatterOne MINGW32'nin ne olduğunu bilmiyorum, ama benim için Çilek Perl'de iyi çalıştı. Yerine -Ekullanın -e.
msh210

1

, 3,15 karakter / 32 bayt (rekabetçi değil)

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

Try it here (Firefox only).

v3 bu sorundan sonra bir sürü hata düzeltmesi ve kütüphane güncellemesi ile birlikte yayınlandı.

açıklama

Bu sadece yerleşiklerin bir karışımı.

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

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

Çevrimiçi deneyin!

Ayrıca Python 2'de çalışır .

_(95) için ascii değerinin , büyük dize (65-90) ve küçük harf (97-122) harfleri arasında doğru olduğu gerçeğini kullanarak, kolay dize karşılaştırmalarına izin verir.


1

İleri (gforth) , 129 bayt

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

Çevrimiçi deneyin!

Kod Açıklaması

: 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.