Votre défi est de prendre un nom (chaîne) en entrée, comme
Albert Einstein
et sortie:
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
Plus de cas de test:
John Fitzgerald Kennedy => Kennedy, John Fitzgerald
Abraham Lincoln => Lincoln, Abraham
Règles
- L'entrée correspondra toujours à l'expression régulière
^([A-Z][a-z]+ )+([A-Z][a-z]+)$
. - Vous n'avez pas besoin de gérer des noms étranges , même si la sortie est techniquement incorrecte, c'est bien ici.
- L'espace de fin / la nouvelle ligne est OK.
- Des questions? Commentaires ci-dessous!
le
par,
et vous avez cette questionle
par,
.Réponses:
05AB1E , 7 octets
Code:
Utilise l' encodage 05AB1E . Essayez-le en ligne!
Explication:
la source
JavaScript (ES6), 34 octets
Démo:
la source
Rétine ,
191716 octetsEdit: Merci à Riker pour avoir économisé 3 octets
Essayez-le en ligne!
la source
(.+)
ça marche aussi pour les deux.\w
en premier lieuGelée , 7 octets
Essayez-le en ligne!
Je ne connais pas très bien Jelly, mais en lisant d'autres réponses, il semblait qu'ils n'utilisaient pas d'algorithme optimal ... alors voici:
Explication
la source
Vim, 10 octets / touches
Essayez-le en ligne!
la source
<esc>
n'apparaît pas dans votre code. Pour avis à ceux qui veulent essayer: Cela suppose que le nom est écrit dans l'éditeur et que vous êtes actuellement au début du fichier en mode normal.V / vim,
98 octetsEssayez-le en ligne!
Un octet enregistré grâce à
Notez qu'il y a un caractère d'espace de fin. Laisse un espace de fin, ce qui est autorisé par les règles.
Explication:
la source
<esc>
. Vous pouvez enregistrer un octet en faisant$bD
au lieu de$diw
. :)$bD
ne gère pas les noms à un caractère, j'ai demandé à OP si cela est autorisé.Python 2 , 39 octets
Essayez-le en ligne!
Eh oui,
rsplit
.la source
input
lieu deraw_input
jouer au golf - voir ce méta postMathematica,
5240 octetsla source
> <> , 27 octets
Essayez-le en ligne!
la source
C, 45 octets
EDIT: Je viens de remarquer la nécessité pour l'entrée d'avoir éventuellement plus de deux mots. Je vais le laisser tel quel avec une note que cela ne fonctionne que pour deux mots.
EDIT: supprimé
\n
. Ajoutez 2 octets si vous le jugez nécessaire.Compile avec
gcc name.c
, GCC 6.3.1. Ignorez les avertissements. Usage:Abus de langage:
int
de retour implicite demain
et rien n'est retourné.printf
. GCC l'inclura de toute façon.b
. Peu importe avec%s
Merci à @ Khaled.K pour les conseils d'utilisation
main(a,b)int**b;
plutôt quemain(int a, int **b)
.la source
main(a,**b){printf("%s, %s",b[2],b[1]);}
est également de 40 octetsmain(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
Rubis , 22 octets
Essayez-le en ligne!
la source
sed, 19 + 1 pour -E = 20 octets
Doit utiliser -r (GNU) ou -E (BSD, GNU récents) pour éviter d'avoir à échapper à la parenthèse de regroupement.
S'il est écrit sur la ligne de commande, doit être placé entre guillemets pour éviter d'être analysé en tant que jetons multiples par le shell:
la source
C, 68 octets
J'espère que ce n'est pas faux d'ajouter un autre message, mais voici une solution légèrement différente de ma solution C précédemment publiée. Celui-ci accepte n'importe quel nombre de noms.
Compilez avec
gcc name.c
(GCC 6.3.1) et ignorez les avertissements. Usage:Merci à @ Khaled.K pour les conseils sur
main(a,b)int**b;
Merci pour le conseil sur la boucle for à @Alkano.
la source
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);}
. Il est plus court de 2 octets, et il s'assure que vous n'imprimez pas le nom du programme, mais il utilise toujours une virgule entre chaque nom.Mathematica, 45 octets
Enregistré quelques octets sur la réponse de ngenisis en prenant l'entrée comme une liste de caractères plutôt que comme une chaîne. Fonction pure qui utilise une règle de remplacement de modèle.
Mathematica, 49 octets
Une autre fonction pure prenant une liste de caractères en entrée et renvoyant une liste de caractères. Celui-ci ajoute
","
et" "
à l'entrée, puis fait pivoter la liste des caractères jusqu'à ce que le dernier espace soit à la fin. (Ainsi, la sortie a un espace de fin, contrairement à la première fonction ci-dessus.)la source
#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&
est4
octets plus court, mais j'ai découvert que leExcept
n'est pas nécessaire pour les modèles de chaîne, me faisant économiser des12
octets.x
dans votre réponse?C #,
7672 octetsEnregistré 4 octets avec l'aide de @KevinCruijssen
Ancienne version utilisant des sous-chaînes pour 76 octets:
la source
System.Text.RegularExpressions.Regex
c'est tellement long en C # ..s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");
n'est qu'un octet de plus.Regex
pour enregistrer 4 octetsAwk, 18 characters
Sample run:
Try it online!
la source
Jelly, 8 bytes
Try it online!
la source
05AB1E, 9 bytes
Try it online!
Explanation
la source
Pyth, 11 bytes
Explanation:
Test it online!
la source
PHP, 45 Bytes
Try it online!
la source
\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.la source
Jelly, 9 bytes
Explained, ish:
Try it online!
Try on all test cases.
la source
Python 3, 52 bytes
Very simple, could use golfing help. Just puts the last word at the front and joins them with ", ".
Testcase:
la source
Japt, 14 bytes
A port of @programmer5000's JavaScript answer.
Try it online!
la source
Java,
11062 bytesNon-static method.
-48 bytes thanks to Kevin Cruijssen
la source
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
la source
$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.
la source
-1
in the LEFT function.JS (ES6),
5244 bytesla source
MATL, 10 bytes
Try it online!
Explanation
la source
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:
la source