Die Herausforderung
Ich habe neulich den Java Style Guide von Google gelesen und bin über deren Algorithmus gestolpert, um beliebige Zeichenfolgen in die CamelCase-Notation umzuwandeln. In dieser Herausforderung müssen Sie diesen Algorithmus implementieren, da Sie nicht alles im Kopf haben möchten, wenn Sie Ihre wettbewerbsfähigen Java-Einreichungen für Code-Golf-Herausforderungen schreiben.
Hinweis: Ich habe einige kleine Anpassungen am Algorithmus vorgenommen. Sie müssen das unten angegebene verwenden.
Der Algorithmus
Sie beginnen mit einer beliebigen Eingabezeichenfolge und wenden die folgenden Operationen darauf an:
- Entfernen Sie alle Apostrophe
`'
- Teilen Sie das Ergebnis in Wörter auf, indem Sie bei aufteilen
- Zeichen, die nicht alphanumerisch und keine Ziffer sind
[^a-zA-Z0-9]
- Großbuchstaben, die auf beiden Seiten von Kleinbuchstaben umgeben sind.
abcDefGhI jk
zum Beispiel Ausbeutenabc Def Ghi jk
- Zeichen, die nicht alphanumerisch und keine Ziffer sind
- Jedes Wort in Kleinbuchstaben.
- Großschreibung des ersten Zeichens jedes bis auf das erste Wort.
- Verbinde alle Wörter wieder miteinander.
Zusätzliche Bemerkungen
- Die Eingabe enthält nur druckbare ASCII-Daten.
- Wenn eine Ziffer der erste Buchstabe in einem Wort ist, lassen Sie es so, wie es ist, und markieren Sie nichts anderes in diesem Wort.
- Die Eingabe hat immer mindestens ein Zeichen.
Regeln
- Funktion oder Vollprogramm erlaubt.
- Standardregeln für die Eingabe / Ausgabe.
- Es gelten Standardlücken .
- Dies ist Code-Golf , also gewinnt die niedrigste Byte-Anzahl. Tiebreaker ist eine frühere Vorlage.
Testfälle
"Programmierpuzzles & Code Golf" -> "ProgrammierpuzzlesCodeGolf" "XML-HTTP-Anforderung" -> "xmlHttpRequest" "Unterstützt IPv6 unter iOS?" -> "supportedIpv6OnIos" "SomeThing w1th, apo'strophe's and 'punc] tuation" -> "someThingW1thApostrophesAndPuncTuation" "nichts besonderes" -> "nichts besonderes" "5pecial ca5e" -> "5pecial ca5e" 1337 -> 1337 "1337-spEAk" -> "1337Speak" "whatA mess" -> "whataMess" "abcD" -> "abcd" "a" -> "a" B -> b
Viel Spaß beim Codieren!
snake_case
&PascalCase
snake_case
wegen Python. FORTH hat auchFORTHCASE
und APL hatunreadable in any case
ApostropheS
in der Ausgabe haben.Antworten:
Netzhaut , 56 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online!
Erläuterung
Dies implementiert die Spezifikation ganz wörtlich:
Entfernen Sie Apostrophe und Backticks.
Teilen Sie die Zeichenfolge um Nicht-Wort-Zeichen (in Regex schließt dies auch Ziffern und Unterstriche aus) oder Unterstriche oder Positionen, die links einen Kleinbuchstaben und rechts einen Großbuchstaben und rechts einen Kleinbuchstaben enthalten. Dies würde einige leere Segmente erzeugen, wenn zwei Zeichen in einer Reihe stehen, die keine Buchstaben oder Ziffern sind oder am Anfang der Zeichenfolge eine größere Bedeutung haben. Wir werden die mit der
_
Option los . Hier bedeutet "Teilen", dass jedes verbleibende Teil in eine eigene Zeile gesetzt wird.Wandle alles in Kleinbuchstaben um.
Konvertieren Sie jedes Zeichen, das nach dem Zeilenvorschub auftritt, in Großbuchstaben. Dadurch wird das erste Wort übersprungen, da kein Zeilenvorschub davor steht.
Beseitigen Sie die Zeilenvorschübe, um alles wieder zusammenzufügen.
quelle
Thing
obwohl es sollte.Java,
198 bis190 Bytes+3 Byte, weil ich das vergessen habe
\W+
==[^a-zA-Z0-9_]+
und ich muss übereinstimmen[^a-zA-Z0-9]+
-11 Bytes dank user20093 -
?:
anstelle vonif
/else
Weil Java.
Dies ist ein Lambda. Rufen Sie wie folgt an:
Lesbare Version:
quelle
_
als Token-Begrenzer zu passen .JavaScript (ES6),
156154152148145141140 ByteDanke @Neil (6 Bytes), @ETHproductions (3 Bytes) und @ edc65 (7 Bytes)
Entfernt Apostrophe, ersetzt Sonderzeichen / vor umgebenen Großbuchstaben und kombiniert sie mit der richtigen Groß- und Kleinschreibung. Leider
toLowerCase()
undtoUpperCase()
sind hier ärgerlich lang und schwer zu meiden ...quelle
b.slice(i>0)
Ansatz aus dem Wasser sprengt, aber in der Zwischenzeit/[A-Z]?([a-z0-9]|[0-9A-Z]{2,})+([A-Z](?![a-z]))?/g
scheint mein Match-Regex von 2 Bytes mehr zu sparen als Ihr ansonsten genialerreplace
Ansatz.replace
direkt auf Ihrem speichern :replace(/[a-z](?=[A-Z][a-z])/g,'$& ')
match...map
kann ersetzt werdenreplace
a=>a.replace(/`|'/g,'').replace(/[a-z](?=[A-Z][a-z])/g,'$& ').replace(/[\W_]*([a-z0-9]+)[\W_]*/gi,(_,b,i)=>(i?b[0].toUpperCase():'')+b.slice(i>0).toLowerCase())
b=>a+=(a?b[0].toUpperCase():'')+b.slice(!!a).toLowerCase()
das ich glaube, spart Ihnen weitere 4 Bytes.vim,
696866vim kürzer als Perl ?! Was ist das für ein Wahnsinn?
Vielen Dank an Neil, der einen unnützen Tastendruck entdeckt hat!
quelle
:s
eine hat,%
aber warum die Inkonsistenz in den ersten beiden?:%j<cr>
ist gleichwertig und kürzer. 2. Das fügt Leerzeichen zwischen Zeilen hinzu.Mathematica 10.1, 101 Bytes
Verwendet das Undokumentierte
ToCamelCase
, das ähnlich funktioniert,Capitalize
andere Zeichen jedoch auf Kleinbuchstaben setzt.quelle
ToCamelCase[n_,m_]:=n<>Capitalize/@m
richtig Scheint so. Und warum verwenden,Prepend
wenn es#~ToCamelCase~{##2}
funktioniert?ToCamelCase::argx: ToCamelCase called with 2 arguments; 1 argument is expected.
ToCamelCase[n_]:=""<>Capitalize/@n
?Julia,
9889 BytesDies ist eine anonyme Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Der Ansatz hier ist das gleiche wie in Doorknob der Perl Antwort :
replace
Apostrophe und Backticks mit dem leeren Stringsplit
in ein Array auf einem regulären Ausdruck, der die notwendigen Fälle übereinstimmt,map
dieucfirst
Funktion über das Array die ersten Buchstaben jedes Element in Großbuchstaben,join
das Array zurück in eine Zeichenfolge undlcfirst
das Ergebnis, um das erste Zeichen in Kleinbuchstaben umzuwandeln.quelle
end
Syntax. Vielleicht benutze ich nur anonyme Funktionen für alles, dann muss ich nieend
Perl 67 + 1 = 68 Bytes
Benötigt die
-p
Flagge und-l
für mehrzeilige:Wie es funktioniert:
quelle
Perl,
878078 BytesByte für die
-p
Flagge hinzugefügt .Zuerst verwenden wir den
y///
Transliterationsoperator,d
um alle'`
Zeichen in der Eingabe zu löschen :Dann kommt das Fleisch des Codes:
(Teilen Sie die Eingabezeichenfolge
$_
an den entsprechenden Stellen auf,\K
und schließen Sie dabei den vorhergehenden Teil aus der tatsächlichen Übereinstimmung aus.)(Ordnen Sie jeden geteilten Teil der Zeichenfolge zu, und schreiben Sie die gesamte Zeichenfolge in Kleinbuchstaben. Machen Sie dann das erste Zeichen der geänderten Zeichenfolge in Großbuchstaben.)
(Fügen Sie eine leere Zeichenfolge hinzu und weisen Sie sie dem magischen Unterstrich zu
$_
, der am Ende gedruckt wird.)Schließlich setzen wir den ersten Buchstaben in Kleinbuchstaben,
indemwir ihn\l
mit Regex abgleichen undin der Ersetzungszeichenfolgeeinen eingebauten verwenden, wodurch 2 Bytes gegenüber der vorherigen Methode eingespart werden:Danke an @ MartinBüttner für 7 Bytes (
[^a-zA-Z\d]
->\W|_
)!quelle
\K
...;)Lua, 127 Bytes
Akzeptiert eine Zeichenfolge aus stdin und gibt Ergebnisse in Kamelform zurück.
Wahrscheinlich wird immer noch nach einer besseren Lösung gesucht, da sich die Speicherung in einer Variablen ineffizient anfühlt.
Aber wie auch immer, im Allgemeinen ziemlich einfach:
Das ist die Schönheit, die mir ein bisschen Bytes erspart hat. gmatch teilt die Zeichenfolge basierend auf dem Muster:
%w+
das nur alphanumerische Zeichen enthält.Danach sind es einfache Zeichenkettenoperationen. string.upper, string.lower und done.
quelle
PHP,
145122133 BytesIn Datei speichern, von CLI aus aufrufen.
Nimmt Eingaben von einem einzelnen Befehlszeilenargument entgegen; Entfliehen Sie gegebenenfalls Anführungszeichen und Leerzeichen.
Nervenzusammenbruch
lcfirst
erlaubt, dies auf einen einzigen Befehl zu reduzieren, wodurch 23 Bytes gespart werden.Das Korrigieren der Apostrophe kostet 11 Byte für den zusätzlichen Ersetzungsfall.
quelle
Kotlin , 160 Bytes
Mein Ziel war es, Scala, das andere "alternative Java", zu sein, also bin ich mit meinen Ergebnissen einigermaßen zufrieden. Ich habe den regulären Ausdruck aus der Java- Antwort gestohlen .
Teste es mit:
quelle
\W|_|(?<=[a-z])(?=[A-Z][a-z])
oder sie leicht modifiziert, z.[\W_]+
fun String.a()=replace(Regex("['`]"),"").split(Regex("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])")).joinToString(""){it.toLowerCase().capitalize()}.decapitalize()
Scala,
181170144Prüfer:
Requisiten an CAD97 und Entschuldigungen an Nathan Merrill :)
quelle
[^a-zA-Z0-9]+
mit[\\W_]+
.C 272 Zeichen
Das C-Programm übergibt den String in Anführungszeichen als Argument 1 an camelCase. In dieser Problemstellung stecken viele Fallstricke ...
quelle
#include<string.h>
fürstrlen
,strtok
undtoupper
, und#include<ctype.h>
fürisalnum
../camel "Programming Puzzles & Code Golf"
auf cygwin (kompiliert mit gcc 3.4.4) bekomme ichprogrammingPuzzlesCodeEGolf
. Gleiche Ausgabe mit 5.3.0.JavaScript, 123 Bytes
Lesbare Version
Entfernen Sie die Apostrophe, schreiben Sie das erste Zeichen in Kleinbuchstaben, das letzte in Kleinbuchstaben und gruppieren Sie mehrere Großbuchstaben. Stimmen Sie mit einer Gruppe von 1 oder mehr nicht-alphanumerischen Zeichen + 1 weiteren Zeichen überein, und ersetzen Sie sie durch das zuletzt großgeschriebene Zeichen.
[r = "replace"] Trick aus der Mrw247-Lösung.
quelle