Twoim wyzwaniem jest przyjęcie nazwy (łańcucha) jako danych wejściowych, takich jak
Albert Einstein
i wyjście:
Einstein, Albert
Pseudo kod:
set in to input
set arr to in split by " "
set last to the last element of arr
remove the last element of arr
set out to arr joined with " "
prepend ", " to out
prepend last to out
output out
Więcej przypadków testowych:
John Fitzgerald Kennedy => Kennedy, John Fitzgerald
Abraham Lincoln => Lincoln, Abraham
Zasady
- Dane wejściowe zawsze będą pasować do wyrażenia regularnego
^([A-Z][a-z]+ )+([A-Z][a-z]+)$
. - Nie musisz radzić sobie z dziwnymi nazwami , nawet jeśli dane wyjściowe są technicznie niepoprawne, tutaj jest w porządku.
- Końcowe białe znaki / nowa linia są w porządku.
- Jakieś pytania? Komentarz poniżej!
le
z,
i masz na to pytaniele
je,
.Odpowiedzi:
05AB1E , 7 bajtów
Kod:
Wykorzystuje kodowanie 05AB1E . Wypróbuj online!
Wyjaśnienie:
źródło
JavaScript (ES6), 34 bajty
Próbny:
źródło
Retina ,
191716 bajtówEdycja: Podziękowania dla Riker za zapisanie 3 bajtów
Wypróbuj online!
źródło
(.+)
działa również dla obu.\w
Galaretka , 7 bajtów
Wypróbuj online!
Nie znam się zbyt dobrze na Jelly, ale czytając inne odpowiedzi, wyglądało to tak, jakby nie korzystali z optymalnego algorytmu ... więc oto:
Wyjaśnienie
źródło
Vim, 10 bajtów / naciśnięć klawiszy
Wypróbuj online!
źródło
<esc>
nie pojawia się w twoim kodzie. Zawiadomienie dla innych, którzy chcą spróbować: Zakłada się, że nazwa jest zapisana w edytorze i że aktualnie znajdujesz się na początku pliku w trybie normalnym.V / vim,
98 bajtówWypróbuj online!
Zapisano jeden bajt dzięki
Zauważ, że występuje spacja końcowa. Pozostawia końcowe miejsce, które jest dozwolone zgodnie z regułami.
Wyjaśnienie:
źródło
<esc>
. Możesz zapisać jeden bajt, wykonując$bD
zamiast$diw
. :)$bD
nie obsługuje nazw jednoznakowych, zapytałem OP, czy jest to dozwolone.Python 2 , 39 bajtów
Wypróbuj online!
Tak,
rsplit
.źródło
input
zamiastraw_input
gry w golfa - zobacz ten meta postMathematica,
5240 bajtówźródło
> <> , 27 bajtów
Wypróbuj online!
źródło
C, 45 bajtów
EDYCJA: Właśnie zauważyłem, że wejście może mieć więcej niż dwa słowa. Zostawię tak, jak jest, z notatką, że to działa tylko na dwa słowa.
EDYCJA: usunięta
\n
. Dodaj 2 bajty, jeśli uznasz to za konieczne.Kompiluje się z
gcc name.c
GCC 6.3.1. Zignoruj ostrzeżenia. Stosowanie:Nadużycie języka:
int
zmain
i nic nie wrócił.printf
. GCC i tak to uwzględni.b
. To nie ma znaczenia%s
Dzięki @ Khaled.K za wskazówki dotyczące używania
main(a,b)int**b;
zamiastmain(int a, int **b)
.źródło
main(a,**b){printf("%s, %s",b[2],b[1]);}
ma 40 bajtówmain(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
Ruby , 22 bajty
Wypróbuj online!
źródło
sed, 19 + 1 dla -E = 20 bajtów
Należy użyć opcji -r (GNU) lub -E (BSD, najnowsze GNU), aby uniknąć konieczności ucieczki z nawiasu grupującego.
Jeśli napisane w wierszu poleceń, muszą być ujęte w cudzysłowy, aby uniknąć parsowania przez powłokę jako wielu tokenów:
źródło
C, 68 bajtów
Mam nadzieję, że nie jest źle dodawać kolejny post, ale oto nieco inne rozwiązanie niż moje wcześniej opublikowane rozwiązanie C. Ten akceptuje dowolną liczbę nazw.
Kompiluj z
gcc name.c
(GCC 6.3.1) i ignoruj ostrzeżenia. Stosowanie:Dzięki @ Khaled.K za wskazówki dotyczące
main(a,b)int**b;
Dzięki za wskazówkę dotyczącą pętli for do @Alkano.
źródło
main(a,b)int**b;{for(printf("%s,",b[--a]);++b,--a;printf(" %s",*b));}
main(a,b)int**b;{a&&printf("%s,"b[a-1])&&main(a-1,b);}
main(a,b)int**b;{--a&&printf("%s, ",b[a])&&main(a,b);}
. Jest o 2 bajty krótszy i zapewnia, że nie drukujesz nazwy programu, ale nadal używa przecinków między każdą nazwą.Mathematica, 45 bajtów
Zapisano kilka bajtów nad odpowiedzią ngenisis, przyjmując dane wejściowe jako listę znaków, a nie ciąg znaków. Czysta funkcja korzystająca z reguły zastępowania wzorców.
Mathematica, 49 bajtów
Kolejna czysta funkcja pobierająca listę znaków jako dane wejściowe i zwracająca listę znaków. Ten dołącza
","
i" "
do wejścia, a następnie obraca listę znaków, aż ostatnia spacja znajdzie się na końcu. (W ten sposób dane wyjściowe mają spację końcową, w przeciwieństwie do pierwszej funkcji powyżej.)źródło
#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&
jest4
bajtów krótszy, ale okazało się, że nieExcept
jest potrzebny do wzorców łańcuchowych, co oszczędza mi12
bajtów.x
odpowiedź?DO#,
7672 bajtówZaoszczędź 4 bajty przy pomocy @KevinCruijssen
Stara wersja wykorzystująca podciągi dla 76 bajtów:
źródło
System.Text.RegularExpressions.Regex
jest tak cholernie długo w C # ..s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");
to tylko jeden bajt więcej.Regex
aby zaoszczędzić 4 bajtyAwk, 18 znaków
Przykładowy przebieg:
Wypróbuj online!
źródło
Galaretka , 8 bajtów
Wypróbuj online!
źródło
05AB1E , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Pyth , 11 bajtów
Wyjaśnienie:
Przetestuj online!
źródło
PHP, 45 Bytes
Try it online!
źródło
\pL+
instead of.+
?.
or\pL
MATLAB/Octave, 37 bytes
Try it online!
Based on @ngenisis' Retina answer, we can also play the regex game in both Octave and MATLAB, saving a fair few bytes over my previous answer.
Old Answer:
I'm going to leave this answer here as well considering it is a more unique way of doing it compared to a simple regex.
Octave,
4947 bytesOld try it online!
An anonymous function to generate the output.
Basically the code first finds the last space in the string using
b=find(a==32)(end)
. Then It takes the end part of the string (after the space) usinga(b+1:end)
, whereb
is the output of finding the last space. It also takes the start of the string witha(1:b-1)
, and concatenates both together with a', '
in between.I've already saved a few bytes vs the typical
find(a==32,1,'last')
. Not quite sure there is much more to save.źródło
Jelly, 9 bytes
Explained, ish:
Try it online!
Try on all test cases.
źródło
Python 3, 52 bytes
Very simple, could use golfing help. Just puts the last word at the front and joins them with ", ".
Testcase:
źródło
Japt, 14 bytes
A port of @programmer5000's JavaScript answer.
Try it online!
źródło
Java,
11062 bytesNon-static method.
-48 bytes thanks to Kevin Cruijssen
źródło
String c(String s){int i=s.lastIndexOf(' ');return s.substring(i+1)+", "+s.substring(0,i);}
is shorter (91 bytes).String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}
is even shorter (62 bytes).PHP,
6259 bytes-3 bytes, thanks Jörg
Try it online!
Old solution, 63 Bytes
Doesn't work if the person has 3 repeating names.
Try it online
źródło
$argn
instead of$argv[1]
Excel,
174170168 bytesSaved 2 bytes thanks to Wernisch
This is not fancy or clever. It's a fairly basic method. It feels like there should be a shorter way with array formulas but I can't find one that works.
źródło
-1
in the LEFT function.JS (ES6),
5244 bytesźródło
MATL, 10 bytes
Try it online!
Explanation
źródło
Gema, 23 characters
The only remarkable thing here is how the challenge managed to hit the weakness of the Gema patterns non-greediness.
Sample run:
źródło