Conversione convenzione di codifica


22

In quel Coding Golf, dovresti convertire una convenzione di codifica con TitleCase in lower_case_with_underscores. E viceversa!

specificazione

Sostituire l'involucro nel modo seguente:

  • Se il carattere di sottolineatura è un delimitatore, cambia il case in Title Case senza alcun delimitatore.
  • Se ci sono più parole senza delimitatore, cambia il case in minuscolo e aggiungi un carattere di sottolineatura come delimitatore.
  • Nel caso di una sola parola (o un solo carattere): cambia il case in Title Case se la parola inizia con lettere minuscole; cambia il case in minuscolo se la parola inizia con il maiuscolo.

Personaggi ammessi:

  • Dalla A alla Z
  • dalla A alla Z
  • trattino basso ( _).

Gli input con parole maiuscole miste non sono consentiti. Esempi di casi non consentiti:

  • Coding_Convention_Conversion
  • a_BC

Casi di esempio

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

Regole

  • E 'consentito l'uso ToUpper, ToLowere ToTitleCasele funzioni.
  • È consentito l'uso di espressioni regolari.
  • : vince il codice più corto in byte!

L'uso di una ToTitleCasefunzione va bene? Non hai specificato, quindi immagino che vada bene.
Justin il

@Justin: bella domanda davvero. Rendiamolo più divertente e non consentire la funzione ToTitleCase :)
Dariusz Woźniak,

Accidenti ... la mia soluzione si basa su di essa
Justin il

1
@Justin: Okay - Non l'ho specificato all'inizio, quindi in quel caso - consentiamolo comunque.
Dariusz Woźniak, il

Risposte:


4

Pyth, 25 byte 29 33 35 40

Salvato 2 byte grazie a @Dennis

Salvato 4 byte grazie a @FryAmTheEggman

?rIz0smrd4cz\_tsXzrG1*\_G

Provalo online


Il tuo link deve essere aggiornato.
Isaacg,

Quando provo a inserire "abc" come input, produce "bc" come output. Bug? :)
Dariusz Woźniak il

Per risolvere ciò che ha notato @DariuszWoźniak, puoi cambiare le tue condizioni da /z\_a rIz0. Credo anche di aver trovato un'alternativa della stessa lunghezza all'aggiunta del programma di sottolineatura: tsXzrG1_Mcj\_G2forse qualcuno può giocare a golf di più ...
FryAmTheEggman

Ah, l'ho trovato:tsXzrG1*\_G
FryAmTheEggman il

8

Jolf, 35 byte

Salva 1 byte grazie a @ Cᴏɴᴏʀ O'Bʀɪᴇɴ . Questo è codificato in ISO 8859-7.

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

Woohoo il mio primo programma Jolf!

Spiegazione

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

Provalo online


Puoi usare la separazione delle stringhe alla fine, così diventa "(?=[A-Z])'_. La stringa si chiude automaticamente.
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ oh, bello, grazie!
Downgoat,

7

Retina , 37

Grazie a @ MartinBüttner per aver salvato 4 byte!

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

(Nota la nuova riga finale.)

Provalo online. Si noti che questo include extra m`per configurare un paio di righe per trattare ciascuna riga di input separatamente in modo che tutti i test possano essere eseguiti in una volta sola. Questo non è un requisito della domanda, quindi questi non vengono conteggiati nel punteggio.

  • Le righe 1 e 2 vengono inserite _all'inizio dell'input o prima delle lettere maiuscole. Tutte le parole sono ora _separate, indipendentemente dal caso.
  • La riga 3 scambia il caso della prima lettera in ogni parola.
  • Le righe 4 e 5 rimuovono _all'inizio dell'input o quando sono seguite da una lettera maiuscola.

Ciò consente di risparmiare quattro byte: retina.tryitonline.net/…
Martin Ender il

Inoltre, puoi evitare la riga vuota finale omettendo l'ultima ?=e sostituendo quella fase con $1(non influisce sul conteggio dei byte).
Martin Ender,

@Martin Molto bene - grazie!
Trauma digitale il

5

GNU Sed, 46

Grazie a @TobySpeight per aver salvato 2 byte!

Il punteggio include +1 per -E(o -r) l'opzione a sed.

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

Provalo online.

Sed abbastanza semplice:

  • La riga 1 sostituisce l'inizio della riga o _, seguita da una lettera minuscola con il maiuscolo di quella lettera. Il gflag per seseguire questa sostituzione per ogni istanza trovata
  • tpassa :all'etichetta senza nome se sono presenti corrispondenze per la sostituzione precedente. Questa etichetta è implicitamente alla fine.
  • Altrimenti tutte le lettere maiuscole vengono sostituite con _le lettere minuscole di quella lettera
  • Questo lascia un vantaggio _prima della prima lettera. s/^_//lo rimuove.

1
@Toby Grazie. -Efunziona nella mia GNU sed 4.2.2 (Ubuntu 14.04.3), sebbene non sia nella pagina man. Ho letto da qualche parte [citazione necessaria] che -Eè la più recente opzione Posix che verrà ufficialmente aggiunta a GNU Sed in una versione più recente, ma è già lì ufficiosamente. Indipendentemente da ciò, -rfa la cosa giusta se -Enon funziona per te.
Trauma digitale il

@Toby linee 280-282 di sed / sed.c sono /* Undocumented, for compatibility with BSD sed. */ case 'E': case 'r':.
Digital Trauma,

@Digital - mi sono sbagliato; il mio sed non accetta -Ecome sinonimo di -r. Non stavo passando correttamente un programma minimo, ad essed -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())

Spiegazione

A seconda della parte del regex abbinata, sostituisce l'incontro con il caso opposto.

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

Test

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

Rubino, 101 87 75 byte

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

Sfortunatamente, questo fa esattamente la stessa cosa della soluzione Retina, dato che quel metodo ha finito per essere più breve di qualsiasi altra cosa mi sia venuta in mente.


2

Python 3, 130 byte

Tentativo veloce e sporco utilizzando regex per dividere i tappi. Forza piuttosto bruta: se qualcuno riesce a trovare un approccio diverso, sono sicuro che questo può essere battuto.

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

non il più breve ma per completezza qui la mia soluzione in PHP, $ s contiene la stringa da convertire:

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
Benvenuti in Puzzle di programmazione e scambio di code golf stack. Ben fatto per aver pubblicato qualcosa in una lingua che sapevi non avrebbe vinto. le sfide del code-golf sono principalmente all'interno delle lingue, quindi è bene usare una lingua non golf. +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

Uso:

# 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

Spiegazione:

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

Forse ti starai chiedendo perché ho usato le proprietà Unicode ( <:Lu>, <:Ll>) anziché solo una classe di caratteri. In Perl 6 non vengono più scritti, [a-z]ma sono <[a..z]>1,6 volte più grandi. Le parentesi [ … ]vengono utilizzate per il raggruppamento non acquisito invece che è stato scritto come (?: … )in Perl 5.


1

Japt, 40 byte

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

Provalo online!

Come funziona

           // 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 più 2 per -p(grazie, dev-null )

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

Su Windows, usando perl e MINGW32, non ottengo alcun output, cosa mi sto perdendo?
ChatterOne

@ChatterOne Non so cosa sia MINGW32, ma ha funzionato bene per me su Strawberry Perl. Usa -Einvece di -e.
msh210,

1

𝔼𝕊𝕄𝕚𝕟 3, 15 caratteri / 32 byte (non competitivo)

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

Try it here (Firefox only).

v3 è stato rilasciato dopo questa sfida, con un sacco di correzioni di bug e aggiornamenti della libreria.

Spiegazione

Questo è solo un mashup di builtin.

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

Provalo online!

Funziona anche in Python 2 .

Facendo uso del fatto conveniente che il valore ASCII per _(95) è proprio tra quelli delle lettere maiuscole (65-90) e minuscole (97-122), che consente un facile confronto delle stringhe.


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 ;

Provalo online!

Spiegazione del codice

: 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.