Coding Convention-Konvertierung

22

In diesem Coding Golf sollten Sie eine Codierungskonvention mit TitleCase in Kleinbuchstaben mit Unterstrichen konvertieren. Und umgekehrt!

Spezifikation

Ändern Sie das Gehäuse folgendermaßen:

  • Wenn der Unterstrich ein Begrenzer ist, ändern Sie die Groß- / Kleinschreibung in Groß- / Kleinschreibung ohne Begrenzer.
  • Wenn es mehrere Wörter ohne Trennzeichen gibt, ändern Sie die Groß- / Kleinschreibung und fügen Sie einen Unterstrich als Trennzeichen hinzu.
  • Bei nur einem Wort (oder einem Zeichen): Ändern Sie die Schreibweise in Groß- / Kleinschreibung, wenn das Wort mit Kleinbuchstaben beginnt. Ändern Sie die Schreibweise in Kleinbuchstaben, wenn das Wort mit Großbuchstaben beginnt.

Zulässige Zeichen:

  • A bis Z
  • A bis Z
  • Unterstrich ( _).

Eingaben mit gemischten Wörtern in Groß- und Kleinschreibung sind nicht zulässig. Beispiele für unzulässige Fälle:

  • Coding_Convention_Conversion
  • a_BC

Beispielfälle

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

Regeln

  • Es ist erlaubt ToUpper, ToLowerund ToTitleCaseFunktionen zu verwenden.
  • Die Verwendung von regulären Ausdrücken ist zulässig.
  • : Der kürzeste Code in Bytes gewinnt!
Dariusz Woźniak
quelle
Ist die Verwendung einer ToTitleCaseFunktion in Ordnung? Sie haben nicht angegeben, also würde ich annehmen, dass es in Ordnung ist.
Justin
@ Justin: Gute Frage in der Tat. Lass es uns mehr Spaß machen und die ToTitleCase-Funktion nicht zulassen :)
Dariusz Woźniak
Verdammt ... meine Lösung stützt sich darauf
Justin
1
@Justin: Okay - ich habe es am Anfang nicht angegeben, also in diesem Fall - lassen wir es trotzdem zu.
Dariusz Woźniak

Antworten:

4

Pyth, 25 Bytes 29 33 35 40

2 Bytes dank @Dennis gespart

4 Bytes dank @FryAmTheEggman gespart

?rIz0smrd4cz\_tsXzrG1*\_G

Probieren Sie es online aus

Downgoat
quelle
Ihr Link muss aktualisiert werden.
Isaacg
Wenn ich versuche, "abc" als Eingabe zu setzen, ergibt dies "bc" als Ausgabe. Fehler? :)
Dariusz Woźniak
Um zu beheben, was @ DariuszWoźniak bemerkt hat, können Sie Ihren Zustand von /z\_auf ändern rIz0. Ich glaube auch, dass ich eine Alternative zum Hinzufügen von Unterstrichen in gleicher Länge gefunden habe: tsXzrG1_Mcj\_G2Vielleicht kann jemand mehr Golf spielen ...
FryAmTheEggman
Ah, fand es:tsXzrG1*\_G
FryAmTheEggman
8

Jolf, 35 Bytes

Spart 1 Byte dank @ Cᴏɴᴏʀ O'Bʀɪᴇɴ . Dies ist in ISO 8859-7 kodiert.

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

Woohoo mein erstes Jolf-Programm!

Erläuterung

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

Probieren Sie es online aus

Downgoat
quelle
Sie können die Zeichenfolgentrennung am Ende verwenden, damit es wird "(?=[A-Z])'_. Der String wird automatisch geschlossen.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ oh, cool, danke!
Downgoat
7

Retina , 37

Vielen Dank an @ MartinBüttner für die Einsparung von 4 Bytes!

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

(Beachten Sie die nachstehende Zeile.)

Probieren Sie es online aus. Beachten Sie, dass dies zusätzliche m`Schritte umfasst , um einige Zeilen so zu konfigurieren, dass jede Eingabezeile separat behandelt wird, damit alle Testfälle auf einmal ausgeführt werden können. Dies ist keine Anforderung der Frage, daher werden diese nicht in der Punktzahl berücksichtigt.

  • Die Zeilen 1 und 2 werden _entweder am Anfang der Eingabe oder vor Großbuchstaben eingefügt. Alle Wörter sind jetzt _unabhängig von der Groß- und Kleinschreibung getrennt.
  • Zeile 3 tauscht die Groß- und Kleinschreibung des ersten Buchstabens in jedem Wort aus.
  • Die Zeilen 4 und 5 werden _entweder zu Beginn der Eingabe oder nach einem Großbuchstaben entfernt.
Digitales Trauma
quelle
Das spart vier Bytes: retina.tryitonline.net/…
Martin Ender
Sie können auch die nachgestellte Leerzeile vermeiden, indem Sie die letzte weglassen ?=und diese Stufe durch ersetzen $1(dies hat jedoch keinen Einfluss auf die Bytezahl).
Martin Ender
@Martin Sehr gut - danke!
Digital Trauma
5

GNU Sed, 46

Vielen Dank an @TobySpeight für das Speichern von 2 Bytes!

Punktzahl beinhaltet +1 für -E(oder -r) Option auf sed.

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

Probieren Sie es online aus.

Ziemlich unkompliziert sed:

  • Zeile 1 ersetzt den Zeilenanfang oder _, gefolgt von einem Kleinbuchstaben, durch den Großbuchstaben dieses Buchstabens. Das gFlag, sdas diese Ersetzung für jede gefundene Instanz ausführt
  • tSpringt zum :unbenannten Label, wenn Übereinstimmungen für die obige Ersetzung gefunden wurden. Diese Bezeichnung steht implizit am Ende.
  • Andernfalls werden alle Großbuchstaben durch _den Kleinbuchstaben dieses Buchstabens ersetzt
  • Dies hinterlässt einen vorangestellten _Buchstaben vor dem ersten Buchstaben. s/^_//entfernt das.
Digitales Trauma
quelle
1
@Toby Danke. -Efunktioniert in meiner GNU sed 4.2.2 (Ubuntu 14.04.3), obwohl es nicht in der Manpage ist. Ich habe irgendwo gelesen, dass -Ees sich um eine neuere Posix-Option handelt, die in einer neueren Version offiziell zu GNU Sed hinzugefügt wird, aber bereits inoffiziell vorhanden ist. Egal, -rtut das Richtige, wenn -Ees bei Ihnen nicht funktioniert.
Digital Trauma
@Toby Linien 280-282 von sed / sed.c sind /* Undocumented, for compatibility with BSD sed. */ case 'E': case 'r':.
Digitales Trauma
@ Digital - ich habe mich geirrt; meine sed nicht akzeptieren -Efür als Synonym -r. Ich habe zB ein Minimalprogramm nicht richtig bestandensed -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())

Erläuterung

Abhängig davon, welcher Teil des regulären Ausdrucks übereinstimmt, wird die Übereinstimmung durch den umgekehrten Fall ersetzt.

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

Prüfung

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>

user81655
quelle
2

Ruby, 101 87 75 Bytes

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

Leider funktioniert dies genauso wie die Retina-Lösung, da diese Methode kürzer war als alles andere, was ich mir ausgedacht habe.

Justin
quelle
2

Python 3, 130 Bytes

Schneller und schmutziger Versuch, die Kappen mit Regex zu spalten. Ziemlich brachiale Gewalt: Wenn sich jemand einen anderen Ansatz einfallen lässt, bin ich sicher, dass dies geschlagen werden kann.

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()]
Ogaday
quelle
2

PHP 160 Bytes

Nicht die kürzeste, aber der Vollständigkeit halber hier meine Lösung in PHP, $ s enthält den zu konvertierenden String:

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),'_')
Kamel
quelle
1
Willkommen beim Programmieren von Rätseln und beim Code Golf Stack Exchange. Gut gemacht, dass du etwas in einer Sprache gepostet hast, von der du wusstest, dass sie nicht gewinnen wird. Code-Golf- Herausforderungen liegen hauptsächlich in den Sprachen, daher ist es gut, eine Sprache zu verwenden, die nicht zum Golfen gehört. +1 d: -D
wizzwizz4
1

Perl 6 ,  73 72 71   68 Bytes

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

Verwendung:

# 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

Erläuterung:

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

Sie fragen sich vielleicht, warum ich die Unicode-Eigenschaften ( <:Lu>, <:Ll>) anstelle einer Zeichenklasse verwendet habe. In Perl 6 sind sie nicht mehr buchstabiert, [a-z]sondern <[a..z]>1,6-mal so groß. Die Klammern [ … ]werden stattdessen für nicht erfassende Gruppierungen verwendet, die wie (?: … )in Perl 5 geschrieben wurden.

Brad Gilbert b2gills
quelle
1

Japt, 40 Bytes

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

Online testen!

Wie es funktioniert

           // 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().
ETHproductions
quelle
1

Perl 5, 42 Bytes

40 Bytes plus 2 für -p(danke, dev-null )

s/[A-Z]/_\l$&/g||s/(^|_)(.)/\u$2/g;s/_//
msh210
quelle
Unter Windows mit Perl und MINGW32 erhalte ich keine Ausgabe. Was fehlt mir?
ChatterOne
@ChatterOne Ich weiß nicht, was MINGW32 ist, aber es hat für mich auf Strawberry Perl gut funktioniert. Verwenden Sie -Eanstelle von -e.
msh210
1

𝔼𝕊𝕄𝕚𝕟 3, 15 Zeichen / 32 Byte (nicht konkurrenzfähig)

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

Try it here (Firefox only).

v3 wurde nach dieser Herausforderung mit einer Reihe von Bugfixes und Bibliotheksaktualisierungen veröffentlicht.

Erläuterung

Dies ist nur ein Mashup von Buildins.

⟮Ѩ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
Mama Fun Roll
quelle
1

Python 3 , 86 Bytes

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

Probieren Sie es online!

Funktioniert auch in Python 2 .

Ausnutzen der günstigen Tatsache, dass der ASCII-Wert für _ (95) genau zwischen den Großbuchstaben (65-90) und Kleinbuchstaben (97-122) liegt, um einen einfachen Vergleich von Zeichenfolgen zu ermöglichen.

Jitse
quelle
1

Forth (gforth) , 129 Bytes

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

Probieren Sie es online!

Code Erklärung

: 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
reffu
quelle