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!

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

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)}`)
)


8

Netzhaut , 19 17 16 Bytes

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

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

Probieren Sie es online!


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

7

Vim, 10 Bytes / Tastenanschläge

v$F dA, <esc>p

Probieren Sie es online!


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, ", "

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]


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


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

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.


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


#/.{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(' '));

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



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

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!



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.


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.


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'


2

Java, 110 62 Bytes

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

Nicht statische Methode.

-48 Bytes dank Kevin Cruijssen


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

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.


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

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'

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.