Wyzwanie
Kiedyś czytałem Google Style Guide Google'a i potknąłem się o ich algorytm, aby przekonwertować dowolny ciąg znaków na notację camelCase. W tym wyzwaniu musisz wdrożyć ten algorytm, ponieważ nie chcesz robić tych wszystkich rzeczy w swojej głowie, gdy piszesz swoje super konkurencyjne zgłoszenia Java na wyzwania związane z golfem.
Uwaga: Wprowadziłem niewielkie poprawki w algorytmie. Musisz użyć tego określonego poniżej.
Algorytm
Zaczynasz od dowolnego ciągu wejściowego i stosujesz do niego następujące operacje:
- Usuń wszystkie apostrofy
`'
- Podziel wynik na słowa, dzieląc na
- znaki, które nie są alfanumeryczne i nie są cyframi
[^a-zA-Z0-9]
- Wielkie litery, które są otoczone małymi literami po obu stronach.
abcDefGhI jk
na przykład plonyabc Def Ghi jk
- znaki, które nie są alfanumeryczne i nie są cyframi
- Każde słowo ma małe litery.
- Wielka litera pierwszy znak każdego oprócz pierwszego słowa.
- Połącz wszystkie słowa z powrotem razem.
Dodatkowe uwagi
- Dane wejściowe będą zawierać tylko ASCII do wydruku.
- Jeśli cyfra jest pierwszą literą w słowie, pozostaw ją taką, jaka jest i nie zapisuj w tym słowie czegoś innego.
- Dane wejściowe zawsze będą miały co najmniej jeden znak.
Zasady
- Dozwolona funkcja lub pełny program.
- Domyślne reguły wejścia / wyjścia.
- Obowiązują standardowe luki .
- To jest golf golfowy , więc wygrywa najmniej bajtów. Tiebreaker to wcześniejsze zgłoszenie.
Przypadki testowe
„Programowanie zagadek i golf” -> „programowanie PuzzleCodeGolf” „Żądanie HTTP XML” -> „xmlHttpRequest” „obsługuje IPv6 na iOS?” -> „obsługujeIpv6OnIos” „SomeThing w1th, apo'strophe's i„ punc] tuation ”->„ someThingW1thApostrophesAndPuncTuation ” „nic specjalnego” -> „nic specjalnego” „5pecial ca5e” -> „5pecialCa5e” „1337” -> „1337” „1337-SPEk” -> „1337Speak” „whatA mess” -> „whataMess” „abcD” -> „abcd” „a” -> „a” „B” -> „b”
Happy Coding!
snake_case
&PascalCase
snake_case
powodu Pythona. FORTH też ma,FORTHCASE
a APL maunreadable in any case
ApostropheS
na wyjściu.Odpowiedzi:
Siatkówka , 56 bajtów
Liczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Wyjaśnienie
To implementuje specyfikację dosłownie:
Usuń apostrofy i wsteczne.
Podziel ciąg wokół znaków innych niż słowa (w wyrażeniu regularnym wyklucza to również cyfry i znaki podkreślenia) lub podkreślenia lub pozycje, które mają małe litery po lewej stronie i wielkie litery, małe litery po prawej stronie. Spowodowałoby to utworzenie niektórych pustych segmentów, gdy w wierszu znajdują się dwa nieliterowe, niecyfrowe znaki lub, co ważniejsze, na początku łańcucha. Pozbywamy się tych z
_
opcją. Tutaj „podział” oznacza umieszczenie każdej pozostałej części na osobnej linii.Konwertuj wszystko na małe litery.
Konwertuj każdy znak występujący po wysunięciu wiersza na wielkie litery. To wygodnie pominie pierwsze słowo, ponieważ przed nim nie ma linii.
Pozbądź się kanałów, aby połączyć wszystko z powrotem.
źródło
Thing
chociaż powinna.Jawa,
198190 bajtów+3 bajty, ponieważ zapomniałem, że
\W+
==[^a-zA-Z0-9_]+
i muszę dopasować[^a-zA-Z0-9]+
-11 bajtów dzięki user20093 -
?:
zamiastif
/else
Ponieważ Java.
To jest lambda. Zadzwoń tak:
Wersja do odczytu:
źródło
_
jako separator tokenów.JavaScript (ES6),
156154152148145141140 bajtówDzięki @Neil (6 bajtów), @ETHproductions (3 bajty) i @ edc65 (7 bajtów)
Usuwa apostrofy, następnie zastępuje, aby podzielić na znaki specjalne / przed otoczonymi wielkimi literami, a następnie łączy się z odpowiednią obudową. Niestety
toLowerCase()
itoUpperCase()
są denerwująco długie i trudne do uniknięcia tutaj ...źródło
b.slice(i>0)
podejście wydobywa z wody, ale w międzyczasie moje wyrażenie regularne/[A-Z]?([a-z0-9]|[0-9A-Z]{2,})+([A-Z](?![a-z]))?/g
wydaje się zaoszczędzić 2 bajty nad twoim genialnymreplace
podejściem.replace
bezpośrednio na twoim :replace(/[a-z](?=[A-Z][a-z])/g,'$& ')
match...map
można go zastąpićreplace
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()
co moim zdaniem pozwala zaoszczędzić kolejne 4 bajty.vim,
696866vim krótszy niż Perl ?! Co to za szaleństwo?
Dzięki Neil za wykrycie bezużytecznego naciśnięcia klawisza!
źródło
:s
ma,%
ale dlaczego niespójność w pierwszych dwóch?:%j<cr>
jest równoważne i krótsze. 2. To dodaje spacje między wierszami.Mathematica 10.1, 101 bajtów
Używa nieudokumentowanej
ToCamelCase
, która działa podobnie,Capitalize
ale ustawia inne znaki na małe litery.źródło
ToCamelCase[n_,m_]:=n<>Capitalize/@m
poprawne? Wygląda jak to. APrepend
po co korzystać, gdy#~ToCamelCase~{##2}
działa?ToCamelCase::argx: ToCamelCase called with 2 arguments; 1 argument is expected.
ToCamelCase[n_]:=""<>Capitalize/@n
?Julia,
9889 bajtówJest to anonimowa funkcja, która przyjmuje ciąg i zwraca ciąg. Aby go wywołać, przypisz go do zmiennej.
Podejście tutaj jest taka sama jak w klamce za Perl odpowiedziami :
replace
apostrofy i backticks z pustym ciągiem,split
do tablicy w sprawie wyrażenia regularnego, które pasuje do niezbędnych przypadków, funkcja na tablicy na wielkie pierwszą literę każdego elementu, z tyłu tablicy w ciąg, a wynik przekształca pierwszy znak na małe litery.map
ucfirst
join
lcfirst
źródło
end
składni. Może po prostu użyję anonimowych funkcji do wszystkiego, a potem nigdy nie będę musiał pisaćend
: DPerl 67 + 1 = 68 bajtów
Wymaga
-p
flagi, a-l
dla wielu linii:Jak to działa:
źródło
Perl,
878078 bajtówDodano bajt dla
-p
flagi.Najpierw używamy
y///
operatora transliteracji, abyd
usunąć wszystkie'`
znaki z wejścia:Następnie pojawia się treść kodu:
(podziel ciąg wejściowy
$_
w odpowiednich miejscach, używając fantazyjnego\K
ciągu dopasowania, aby wykluczyć część poprzedzającą go z rzeczywistego dopasowania)(odwzoruj każdą podzieloną część łańcucha i spraw, aby cały łańcuch był pisany małymi literami, a następnie uczyń pierwszy znak zmodyfikowanego łańcucha dużymi literami)
(dołącz do pustej struny i ponownie przypisz do magicznego podkreślenia
$_
, które zostanie wydrukowane na końcu)Na koniec zmniejszamy pierwszą literę małymi literami,
dopasowując jądo\l
wyrażenia regularnego i używającciągu zastępczegoz wbudowanym, co pozwala zaoszczędzić 2 bajty w stosunku do poprzedniej metody:Dzięki @ MartinBüttner za 7 bajtów (
[^a-zA-Z\d]
->\W|_
)!źródło
\K
...;)Lua, 127 bajtów
Akceptuje ciąg ze standardowego wejścia i zwraca wyniki camelized.
Prawdopodobnie nadal będzie szukać lepszego rozwiązania, ponieważ przechowywanie wszystkiego w zmiennej wydaje się nieefektywne.
Ale w każdym razie całkiem proste:
To piękno uratowało mi trochę bajtów. gmatch podzieli ciąg znaków na podstawie wzorca:
%w+
który przechwytuje tylko znaki alfanumeryczne.Potem są to proste operacje na łańcuchach. string.upper, string.lower i gotowe.
źródło
PHP,
145122133 bajtówZapisz do pliku, zadzwoń z CLI.
Pobiera dane wejściowe z jednego argumentu wiersza poleceń; w razie potrzeby unikaj cudzysłowów i białych znaków.
awaria
lcfirst
pozwolono zredukować to do jednego polecenia, oszczędzając 23 bajty.Naprawienie apostrofów kosztuje 11 bajtów dla dodatkowego przypadku zamiany.
źródło
Kotlin , 160 bajtów
Moim celem była Scala, druga „alternatywna Java”, więc jestem trochę zadowolony z moich wyników. Ukradłem wyrażenie regularne z odpowiedzi Java .
Przetestuj za pomocą:
źródło
\W|_|(?<=[a-z])(?=[A-Z][a-z])
lub nieznacznie go modyfikują np.[\W_]+
fun String.a()=replace(Regex("['`]"),"").split(Regex("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])")).joinToString(""){it.toLowerCase().capitalize()}.decapitalize()
Scala,
181170144Próbnik:
Rekwizyty do CAD97 i przeprosiny dla Nathana Merrilla :)
źródło
[^a-zA-Z0-9]+
je[\\W_]+
.C 272 znaków
Program C przekazuje ciąg znaków do camelCase w cudzysłowach jako argument 1. W opisie problemu jest wiele gotchas ...
źródło
#include<string.h>
zastrlen
,strtok
itoupper
, i#include<ctype.h>
dlaisalnum
../camel "Programming Puzzles & Code Golf"
cygwin (skompilowany z gcc 3.4.4), dostajęprogrammingPuzzlesCodeEGolf
. Ta sama wydajność z 5.3.0.JavaScript, 123 bajty
Wersja do odczytu
Usuń apostrofy, umieść pierwszy znak małymi literami, ostatni znak małymi literami i dowolną grupę wielu wielkich liter, dopasuj dowolną grupę 1 lub więcej znaków niealfanumerycznych + 1 inny znak, zamień na ostatni znak wielkimi literami.
[r = "replace"] trick z rozwiązania Mrw247.
źródło