Wer hat ein Komma für einen zweiten Vornamen?

18

Ihre Herausforderung besteht darin, einen Namen (eine Zeichenfolge) als Eingabe zu verwenden

Albert Einstein

und Ausgabe:

Einstein, Albert

Pseudocode:

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

Weitere Testfälle:

John Fitzgerald Kennedy => Kennedy, John Fitzgerald
Abraham Lincoln => Lincoln, Abraham

Regeln

  • Die Eingabe stimmt immer mit dem regulären Ausdruck überein ^([A-Z][a-z]+ )+([A-Z][a-z]+)$.
  • Sie müssen nicht mit seltsamen Namen umgehen , auch wenn die Ausgabe technisch inkorrekt ist, ist sie hier in Ordnung.
  • Das nachfolgende Leerzeichen / Newline ist in Ordnung.
  • Irgendwelche Fragen? Kommentiere unten!
programmer5000
quelle
Sind nachgestellte Leerzeichen erlaubt?
Wert Tinte
Ich als Betrogene geschlossen , weil Lösungen können so ziemlich siply ersetzen lemit ,und Sie diese Frage haben
Downgoat
2
@Downgoat Diese Herausforderung spezifiziert zwei Wörter, während Lösungen dafür für beliebig viele Wörter funktionieren müssen. Soweit ich weiß, gibt von den Antworten mit TIO-Links nur die Seriously-Lösung die richtige Antwort für diese Frage, wenn sie ledurch ersetzt wird ,.
Genisis
7
@Downgoat, dass man -4 hat. Zumindest schließe das als ein Betrug davon.
Stephen
1
Sind Leerzeichen in Ordnung?
Tom Carpenter

Antworten:

10

05AB1E , 7 Bytes

Code:

',ì#Áðý

Verwendet die 05AB1E- Codierung. Probieren Sie es online!

Erläuterung:

',ì         # Prepend the input to ","
   #        # Split on spaces
    Á       # Rotate every element one position to the right (wrapping)
     ðý     # Join the array by spaces
Adnan
quelle
1
Prepend! Ich wusste, dass es einen Weg geben musste, dies in Listenform zu tun.
Emigna
9

JavaScript (ES6), 34 Byte

s=>s.replace(/(.+) (.+)/,'$2, $1')

Demo:

let f = s=>s.replace(/(.+) (.+)/,'$2, $1')

;[ 'Albert Einstein', 'John Fitzgerald Kennedy', 'Abraham Lincoln' ].forEach(
  s => console.log(`${s} => ${f(s)}`)
)

gyre
quelle
8

Netzhaut , 19 17 16 Bytes

Edit: Danke an Riker für das Speichern von 3 Bytes

(.+) (.+)
$2, $1

Probieren Sie es online!

Genisis
quelle
1
halten, (.+)funktioniert auch für beide.
24.
Ich verstehe nicht, warum Sie verwendet haben , \win erster Linie
theonlygusti
1
@theonlygusti Ich kenne mich eher mit Pattern Matching in Mathematica aus, bei dem Lazy Matching anstelle von Greedy verwendet wird.
Genisis
7

Gelee , 7 Bytes

;”,Ḳṙ-K

Probieren Sie es online!

Ich kenne Jelly nicht sehr gut, aber als ich andere Antworten las, sah es so aus, als hätten sie keinen optimalen Algorithmus verwendet ... also hier ist es:

Erläuterung

;”,Ḳṙ-K
;”,        Append a comma to the end of the string
   Ḳ       Split on spaces
    ṙ-     Rotate the array by -1 (1 time towards the right)
      K    Join with spaces
Löwe
quelle
7

Vim, 10 Bytes / Tastenanschläge

v$F dA, <esc>p

Probieren Sie es online!

DJMcMayhem
quelle
Nizza, aber ich habe mich bemüht, es zum Laufen zu bringen, <esc>taucht nicht in Ihrem Code auf. Hinweis für andere, die es versuchen möchten: Dies setzt voraus, dass der Name im Editor geschrieben ist und Sie sich im normalen Modus am Anfang der Datei befinden.
Sigvaldm
7

V / vim, 9 8 Bytes

$bD0Pa, 

Probieren Sie es online!

Ein Byte gespart dank

Beachten Sie, dass ein Leerzeichen nachgestellt ist. Hinterlässt ein Leerzeichen, das nach den Regeln zulässig ist.

Erläuterung:

$       " move the cursor to the end of the line
 b      " move the cursor to the beginning of the current word
  D     " delete to the end of the line
   0    " move the cursor to the start of the line
    P   " paste in front of the cursor.
     a  " append (enter insert mode with the cursor one character forward)
      , " Literal text, ", "
Kevin
quelle
Schön! Denken Sie daran, den Einfügemodus am Ende zu setzen, um unnötige Änderungen zu vermeiden <esc>. Sie können ein Byte speichern, indem Sie $bDanstelle von $diw. :)
DJMcMayhem
Vielen Dank. $bDobwohl nicht ein Zeichen Namen zu behandeln, ich habe gefragt , OP , ob das erlaubt ist.
Kevin
Sieht aus wie es ist, also Aktualisierung.
Kevin
6

Mathematica, 52 40 Bytes

StringReplace[x__~~" "~~y__:>y<>", "<>x]
Genisis
quelle
5

C 45 Bytes

EDIT: Mir ist gerade aufgefallen, dass die Eingabe möglicherweise mehr als zwei Wörter umfassen muss. Ich werde es so lassen, wie es ist, mit der Bemerkung, dass dies nur für zwei Wörter funktioniert.

EDIT: entfernt \n. Fügen Sie 2 Bytes hinzu, wenn Sie dies für erforderlich halten.

main(a,b)int**b;{printf("%s, %s",b[2],b[1]);}

Kompiliert mit gcc name.c, GCC 6.3.1. Warnungen ignorieren. Verwendung:

$./a.out Albert Einstein
Einstein, Albert

Missbrauch der Sprache:

  • Impliziter Rückgabetyp intvon mainund nichts zurückgegeben.
  • Implizite Erklärung von printf. GCC wird es trotzdem aufnehmen.
  • Falsche Art von b. Macht nichts mit%s

Vielen Dank an @ Khaled.K für die Tipps zur Verwendung von main(a,b)int**b;anstatt main(int a, int **b).

Sigvaldm
quelle
Nizza ersten Golf, willkommen auf der Website, main(a,**b){printf("%s, %s",b[2],b[1]);}ist auch 40 Bytes
Khaled.K
Danke :) Eigentlich dachte ich darüber nach, die Typen komplett wegzulassen, aber aus irgendeinem Grund würde es nicht kompilieren.
Sigvaldm
1
Dies funktioniertmain(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
Khaled.K
4

sed, 19 + 1 für -E = 20 Bytes

s/(.*) (.*)/\2, \1/

Es muss -r (GNU) oder -E (BSD, aktuelle GNUs) verwendet werden, um zu vermeiden, dass die Gruppierungsklammern verlassen werden müssen.

Wenn in der Befehlszeile geschrieben, muss in Anführungszeichen gesetzt werden, um zu vermeiden, dass die Shell mehrere Token analysiert:

sed -E 's/(.*) (.*)/\2, \1/'
Aaron
quelle
4

C 68 Bytes

Hoffe, es ist nicht falsch, einen weiteren Beitrag hinzuzufügen, aber hier ist eine etwas andere Lösung als meine zuvor veröffentlichte C-Lösung. Dieser akzeptiert eine beliebige Anzahl von Namen.

main(a,b)int**b;{for(printf("%s,",b[--a]);--a;printf(" %s",*++b));}

Kompilieren Sie mit gcc name.c(GCC 6.3.1) und ignorieren Sie Warnungen. Verwendung:

$./a.out John Fitzgerald Kennedy
Kennedy, John Fitzgerald

Vielen Dank an @ Khaled.K für die Tipps zu main(a,b)int**b;

Danke für den Tipp auf der for-Schleife an @Alkano.

Sigvaldm
quelle
1
Sie können 2 Bytes gewinnen, indem Sie für eine Weile main(a,b)int**b;{for(printf("%s,",b[--a]);++b,--a;printf(" %s",*b));}
Alkano
Das klingt verrückt, aber Sie können dies tunmain(a,b)int**b;{a&&printf("%s,"b[a-1])&&main(a-1,b);}
Khaled.K
Sehr nette Tricks :) Ich habe nie daran gedacht, main rekursiv aufzurufen. Aber es funktioniert nicht ganz. Die Ausgabe lautete "Kennedy, Fitzgerald, John, ...". Eine Teillösung wäre main(a,b)int**b;{--a&&printf("%s, ",b[a])&&main(a,b);}. Es ist 2 Bytes kürzer und stellt sicher, dass Sie den Programmnamen nicht drucken, sondern Kommas zwischen den einzelnen Namen verwenden.
Sigvaldm
3

Mathematica, 45 Bytes

#/.{a__,s=" ",b__}/;{b}~FreeQ~s->{b,",",s,a}&

Sparte ein paar Bytes über die Antwort von ngenisis, indem die Eingabe als Liste von Zeichen und nicht als Zeichenfolge vorgenommen wurde. Reine Funktion, die eine Musterersetzungsregel verwendet.

Mathematica, 49 Bytes

#~Join~{","," "}~RotateLeft~Last@Position[#," "]&

Eine weitere reine Funktion, die eine Liste von Zeichen als Eingabe verwendet und eine Liste von Zeichen zurückgibt. Dieser fügt ","und " "an die Eingabe an und dreht dann die Liste der Zeichen, bis das letzte Leerzeichen am Ende ist. (Daher hat die Ausgabe im Gegensatz zur obigen ersten Funktion ein Leerzeichen am Ende.)

Greg Martin
quelle
#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&ist 4Bytes kürzer, aber ich fand heraus, dass das Exceptfür Zeichenkettenmuster unnötig ist und sparte mir 12Bytes.
Genisis
ah, wählt es automatisch die längste xin Ihrer Antwort?
Greg Martin
Ja, String-Pattern-Matching ist gierig, aber reguläres Pattern-Matching ist faul.
Genisis
nette <Wellen weiße Flagge>
Greg Martin
3

C #, 76 72 Bytes

s=>System.Text.RegularExpressions.Regex.Replace(s,"(.+) (.+)","$2, $1");

4 Bytes mit Hilfe von @KevinCruijssen gespeichert

Alte Version mit Teilstrings für 76 Bytes:

s=>s.Substring(s.LastIndexOf(' ')+1)+", "+s.Substring(0,s.LastIndexOf(' '));
TheLethalCoder
quelle
1
Schade, System.Text.RegularExpressions.Regexist so verdammt lang in C # .. s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");ist nur ein Byte mehr.
Kevin Cruijssen
1
@ KevinCruijssen Wahr, aber ich kann die statische Methode verwenden Regex, um 4 Bytes zu sparen
TheLethalCoder
3

Awk, 18 Zeichen

{$1=$NF", "$1}NF--

Probelauf:

bash-4.4$ awk '{$1=$NF", "$1}NF--' <<< 'John Fitzgerald Kennedy'
Kennedy, John Fitzgerald

Probieren Sie es online!

Mann bei der Arbeit
quelle
2

Gelee , 8 Bytes

Ḳ©Ṫ”,⁶®K

Probieren Sie es online!

HyperNeutrino
quelle
Verdammt noch mal, Ninja'd und outgolfed.
ATaco
@ATaco gg :) und das ist ein ziemlich großer Ninja.
HyperNeutrino
1
(Ich habe Golf gespielt, shhh)
ATaco
2

05AB1E , 9 Bytes

#`',«.Áðý

Probieren Sie es online!

Erläuterung

#           # split input on spaces
 `          # push each name separately to stack
  ',«       # concatenate a comma to the last name
     .Á     # rotate stack right
       ðý   # join stack by spaces
Emigna
quelle
Ja, ich sollte mich wahrscheinlich per Space Command anschließen: p
Adnan
@Adnan: Wäre schön zu sehen, wie oft es benutzt wird :)
Emigna
2

Pyth , 11 Bytes

jd.>c+z\,d1

Erläuterung:

jd.>c+z\,d1
     +z\,      Append the "," to the input
    c+z\,d     Split the string on " "
  .>c+z\,d1    Rotate the array one element right
jd.>c+z\,d1    Join the array on " "

Online testen!

Jim
quelle
2

PHP, 45 Bytes

<?=preg_filter("#(.*) (.+)#","$2, $1",$argn);

Probieren Sie es online!

Jörg Hülsermann
quelle
1
Warum \pL+statt .+?
Kevin Cruijssen
@ KevinCruijssen Du hast Recht, der erste Teil des Regex ist gierig, also ist es egal, .oder\pL
Jörg Hülsermann
2

MATLAB / Octave , 37 Bytes

@(a)regexprep(a,'(.+) (.+)','$2, $1')

Probieren Sie es online!

Basierend auf der Retina-Antwort von @ngenisis können wir auch das Regex-Spiel sowohl in Octave als auch in MATLAB spielen und dabei ein paar Bytes mehr als bei meiner vorherigen Antwort einsparen.


Alte Antwort:

Ich werde diese Antwort auch hier belassen, da dies im Vergleich zu einem einfachen regulären Ausdruck eine einzigartigere Methode ist.

Oktave , 49 47 Bytes

@(a)[a((b=find(a==32)(end))+1:end) ', ' a(1:b)]

Alt versuchen Sie es online!

Eine anonyme Funktion zum Generieren der Ausgabe.

Grundsätzlich findet der Code zuerst das letzte Leerzeichen in der Zeichenfolge mit b=find(a==32)(end). Dann wird der Endteil der Zeichenkette (nach dem Leerzeichen) verwendet a(b+1:end), wobei bdie Ausgabe der Suche nach dem letzten Leerzeichen ist. Es nimmt auch den Anfang des Strings mit a(1:b-1)und verkettet beide zusammen mit einem ', 'dazwischen.

Ich habe schon ein paar Bytes gespart gegenüber dem typischen find(a==32,1,'last'). Ich bin mir nicht ganz sicher, ob es noch viel mehr zu sparen gibt.

Tom Carpenter
quelle
2

Gelee , 9 Bytes

ḲµṪ;⁾, ;K

Erklärt, ish:

ḲµṪ;⁾, ;K
Ḳ           # Split the input by spaces
 µ          # Separate the link into two chains. Essentially calls the right half with the split string monadically.
  Ṫ         # The last element, (The last name), modifying the array.
   ;        # Concatenated with...
    ⁾,      # The string literal; ", "
       ;    # Concatenated with...
        K   # The rest of the array, joined at spaces.

Probieren Sie es online!

Probieren Sie alle Testfälle aus.

Ein Taco
quelle
2

Python 3, 52 Bytes

lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])

Sehr einfach, könnte Golfen helfen. Schreibe einfach das letzte Wort nach vorne und verbinde sie mit ",".

Testfall:

>>> f=lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])
>>> f("Monty Python")
'Python, Monty'
>>> f("Albus Percival Wulfric Brian Dumbledore")
'Dumbledore, Albus Percival Wulfric Brian'
OldBunny2800
quelle
2

Java, 110 62 Bytes

String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}

Nicht statische Methode.

-48 Bytes dank Kevin Cruijssen

HyperNeutrino
quelle
String c(String s){int i=s.lastIndexOf(' ');return s.substring(i+1)+", "+s.substring(0,i);}ist kürzer ( 91 Bytes ).
Kevin Cruijssen
Und String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}ist noch kürzer ( 62 Bytes ).
Kevin Cruijssen
@ KevinCruijssen Oh meine Güte schön. Vielen Dank! Ich sollte lernen, Regex besser zu benutzen: P
HyperNeutrino
2

PHP , 62 59 Bytes

-3 Bytes, danke Jörg

$a=explode(' ',$argn);echo array_pop($a).', '.join(' ',$a);

Probieren Sie es online!

Alte Lösung, 63 Bytes

Funktioniert nicht, wenn die Person 3 sich wiederholende Namen hat.

<?=($a=strrchr($argv[1]," ")).", ".str_replace($a,'',$argv[1]);

Probieren Sie es online aus

MICH
quelle
Sie können $argnanstelle von$argv[1]
Jörg Hülsermann
2

Excel, 174 170 168 Bytes

2 Bytes gespart dank Wernisch

=MID(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+1,LEN(A1))&", "&LEFT(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

Das ist nicht schick oder klug. Es ist eine ziemlich einfache Methode. Es fühlt sich an, als ob es einen kürzeren Weg mit Array-Formeln geben sollte, aber ich kann keinen finden, der funktioniert.

Ingenieur Toast
quelle
Die Lösung funktioniert nur in Fällen, in denen drei Namen vorhanden sind. Behandelt zum Beispiel nicht "Albert Einstein".
Wernisch
@Wernisch Danke! Es sollte jetzt funktionieren.
Ingenieur Toast
Nachgestellte Leerzeichen sind je nach Fragestellung erlaubt. Denken Sie, Sie können 2 Bytes sparen, indem Sie das -1in der LINKEN Funktion weglassen.
Wernisch
1

JS (ES6), 52 44 Bytes

i=>(i=i.split` `,l=i.pop(),l+", "+i.join` `)
programmer5000
quelle
1

MATL , 10 Bytes

44hYb1YSZc

Probieren Sie es online!

Erläuterung

44h    % Implicitly input a string. Postpend a comma
       % STACK: 'John Fitzgerald Kennedy,'
Yb     % Split on spaces
       % STACK: {'John', 'Fitzgerald', 'Kennedy,'}
1YS    % Circularly shift 1 step to the right
       % STACK: {'Kennedy,', 'John', 'Fitzgerald'}
Zc     % Join with spaces between. Implicitly display
       % STACK: 'Kennedy, John Fitzgerald'
Luis Mendo
quelle
1

Gema, 23 Zeichen

* =@append{s; *}
\Z=,$s

Das einzig Bemerkenswerte dabei ist, wie die Herausforderung es geschafft hat, die Schwäche des Gema-Musters Nichtgier zu treffen.

Probelauf:

bash-4.4$ echo -n 'John Fitzgerald Kennedy' | gema '* =@append{s; *};\Z=,$s'
Kennedy, John Fitzgerald
Mann bei der Arbeit
quelle