Quel est mon deuxième prénom?

30

Remarque: La réponse gagnante sera sélectionnée le 4/12/17, le gagnant actuel est Jolf, 1 octet .

Je suis surpris que nous n'ayons pas encore eu de défi pour mon deuxième prénom sur ce site. J'ai fait beaucoup de recherches mais je n'ai rien trouvé. S'il s'agit d'un dup, veuillez le signaler comme tel.

Votre défi

Analyser une chaîne qui ressemble Jo Jean Smithet retourner Jean.

Cas de test

Input: Samantha Vee Hills
Output: Vee

Input: Bob Dillinger
Output: (empty string or newline)

Input: John Jacob Jingleheimer Schmidt
Output: Jacob Jingleheimer

Input: Jose Mario Carasco-Williams
Output: Mario

Input: James Alfred Van Allen
Output: Alfred Van 

(Ce dernier est incorrect sur le plan technique, mais le corriger serait trop difficile.)

Remarques:

  • Les noms auront toujours au moins 2 parties séparées par des espaces, avec des noms intermédiaires illimités entre eux ou peuvent être une liste / tableau de chaînes.
  • Les noms peuvent contenir l'alphabet (insensible à la casse) et - ( 0x2d)
  • Vous pouvez générer une nouvelle ligne de fin.
  • Vous pouvez avoir besoin d'une entrée pour avoir une nouvelle ligne de fin.
  • L'entrée de STDIN, d'un paramètre de fonction ou d'un argument de ligne de commande est autorisée, mais le codage en dur n'est pas autorisé.
  • Failles standard interdites.
  • La sortie peut être une valeur de retour de fonction, STDOUT, STDERR, etc.
  • Les espaces / sauts de ligne / tabulations dans la sortie sont autorisés.
  • Des questions? Commentaires ci-dessous!

Il s'agit de , donc la réponse la plus courte en octets l'emporte!

programmer5000
la source
2
La sortie peut-elle être une liste de chaînes?
Anthony Pham
5
Si d'autres formats qu'une chaîne séparée par des espaces sont autorisés, veuillez le modifier dans la spécification.
Martin Ender
5
@ programmer5000: si l'entrée peut être une liste de chaînes, qu'en est-il de la sortie? Est ["John", "Jacob", "Jingleheimer", "Schmidt"]-> ["Jacob", "Jingleheimer"]une solution valable?
nimi
3
Les espaces principaux sont-ils autorisés?
betseg
2
@DJ Parce que "Van" n'est pas son deuxième prénom, il fait partie de son nom de famille. Un cas particulièrement contrariant est David Lloyd George, dont le prénom est David et le nom de famille est Lloyd George. Toute tentative d'analyse de noms de personnes réelles comme celle-ci est vouée à l'échec. En fait, vous ne pouvez même pas dire quels sont le prénom et le nom (pensez à Li Shi).
David Conrad

Réponses:

4

Jolf, 1 octet

Obtient l'intérieur de l'entrée. Essayez-le ici!

Conor O'Brien
la source
Impossible d'exécuter l'exemple - rien ne semble se produire lorsque je clique sur l'un des boutons. Utilisation de Chrome 57.0.2987.133
@YiminRong Je peux seulement lui assurer de fonctionner sur Firefox.
Conor O'Brien
44

Ohm , 2 octets (CP437)

Accepte et renvoie une liste de chaînes.

()

Explication:

()   Main wire, arguments: a

(    Remove the first element of a
 )   ...and then the last element of that
     Implicit output
Nick Clifford
la source
10
Le bon outil pour le travail, je suppose
Rohan Jhunjhunwala
15

Vim, 6 5 octets

dW$BD

Essayez-le en ligne!

(sorties avec un espace de fin)

Puisque Vim est rétrocompatible avec V, j'ai inclus un lien TIO pour V.

Explication

dW                      " Delete up to the next word (removes the first name)
$                       " Go to the end of the line
B                       " Go back one word
D                       " Delete it
Kritixi Lithos
la source
Drat, tu m'as battu. dWWDvous fait économiser un octet.
DJMcMayhem
5
@DJMcMayhem Cela ne fonctionne que pour exactement un deuxième prénom.
Martin Ender
Quelle est la différence entre dW et dw?
Duncan X Simpson
1
@DuncanXSimpson dWsupprime jusqu'à l'espace blanc. dwsupprime jusqu'à ce que les caractères non-mot.
Fund Monica's Lawsuit
14

Python , 24 octets

lambda n:n.split()[1:-1]

Essayez-le en ligne!

Format d'entrée: chaîne


Python 2 , 16 octets

lambda n:n[1:-1]

Essayez-le en ligne!

Format d'entrée: liste

Keerthana Prabhakaran
la source
Vous devriez éditer le titre avec Pythonau lieu de Python 2, car cela fonctionne Python 3aussi, était sur le point de publier cela.
M. Xcoder
@ L3viathan puisque OP n'a pas mentionné le format de sortie must be a string, et puisque le format d'entrée est autorisé à être une liste, imprimer une liste ne peut pas être considéré comme un mauvais résultat!
Keerthana Prabhakaran
Selon les commentaires sur la question, vous pouvez à la fois entrer et sortir une liste de chaînes. Enregistrer un tas d'octetslambda n:n[1:-1]
Luke Sawczak
1
Puisque vous pouvez lire à partir de STDIN, vous pouvez remplacer le lambda par input()(Python 3 uniquement)
BallpointBen
Vous avez raison. Merci. J'ai ajouté les modifications!
Keerthana Prabhakaran
13

Brain-Flak , 133 octets

{{}((((()()()()){}){}){}[{}](<()>)){{}{}(<(())>)}{}}{}{({}<>)<>}<>{{}((((()()()()){}){}){}[{}](<()>)){{}{}(<(())>)}{}}{}{({}<>)<>}<>

Essayez-le en ligne!

132 octets de code, plus 1 octet pour l' -cindicateur qui permet l'entrée et la sortie ASCII.

Malheureusement, cela contient beaucoup de code dupliqué, mais il serait vraiment difficile de le réutiliser. J'y reviendrai plus tard. Voici une explication:

#While True
{
    #Pop
    {}

    #Not equals 32
    ((((()()()()){}){}){}[{}](<()>)){{}{}(<(())>)}{}

#Endwhile
}

#Pop the 0
{}

#Reverse Stack
{({}<>)<>}<>

#While True
{
    #Pop
    {}

    #Not equals 32
    ((((()()()()){}){}){}[{}](<()>)){{}{}(<(())>)}{}

#Endwhile
}

#Pop the 0
{}

#Reverse Stack
{({}<>)<>}<>
DJMcMayhem
la source
86 octets lorsque vous supprimez les commentaires. J'ai ajouté les deux premiers et la dernière ligne. TIO
Riley
@riley Cool solution. N'hésitez pas à le poster vous-même!
DJMcMayhem
12

05AB1E , 2 octets

¦¨

Essayez-le en ligne!

Si la sortie d'une liste de prénoms n'est pas autorisée, je la changerai.

Erik le Outgolfer
la source
12

Haskell, 23 , 17 9 octets

init.tail

Prend et renvoie une liste de chaînes. Essayez-le en ligne!

Supprimer la première chaîne, supprimer la dernière chaîne.

Edit: @Generic Display Name a noté que l'entrée peut être une liste de chaînes, qui a sauvé 6 octets.

Edit II: retourne la liste des chaînes au lieu d'une seule chaîne

nimi
la source
Cela ressemble à une entrée car une liste est autorisée, alors supprimez les mots pour -5 octets
Nom d'affichage générique
@GenericDisplayName: Oh, je n'ai pas remarqué. Merci!
nimi
Ma réponse Ohm et Mathematica répondent également aux deux listes de sortie de chaînes, vous pouvez donc probablement laisser tomber unwords.-8 octets.
Nick Clifford
@ NickClifford: oui, je l'ai vu moi-même et j'ai demandé des éclaircissements au PO.
nimi
11

Mathematica, 10 octets

Rest@*Most

Une fonction sans nom qui accepte et renvoie une liste de chaînes.

Restjette le dernier élément, Mostjette le premier élément, @*est la composition de la fonction. L'échange Restet / Mostou l'utilisation de la bonne composition /*fonctionneraient également. Cela bat l'indexation #[[2;;-2]]&d'un octet.

Martin Ender
la source
10

Brain-Flak , 86 octets

(()()){({}[()]<{{}((((()()()()){}){}){}[{}](<()>)){{}{}(<(())>)}{}}{}{({}<>)<>}<>>)}{}

Essayez-le en ligne!

La plupart de ce code provient de cette réponse . Si vous aimez ma solution, vous devriez également voter pour celle-ci.

#Push 2
(()())

#Loop twice
{({}[()]<

  #While not a space
  {
      #Pop
      {}

      #Not equals 32
      ((((()()()()){}){}){}[{}](<()>)){{}{}(<(())>)}{}

  #Endwhile
  }

  #Pop the 0
  {}

  #Reverse Stack
  {({}<>)<>}<>

#End loop twice
>)}{}
Riley
la source
Bien joué! Je n'ai pas pensé à tenir un compteur pour pousser plus tard, j'ai donc passé trop de temps à réfléchir à la façon de boucler sur différentes piles.
DJMcMayhem
8

Java 7, 74 octets

String f(String s){return s.substring(s.indexOf(' '),s.lastIndexOf(' '));}

Java 8, 49 octets

s->s.substring(s.indexOf(' '),s.lastIndexOf(' '))

Fonction qui identifie la première occurrence du caractère espace et le dernier et extrait le milieu. La chaîne résultante est préfixée par un caractère espace (au moment de la publication, OP n'a pas précisé si les espaces de tête sont autorisés), ce qui peut être éliminé en ajoutant.trim() au code pour un coût supplémentaire de 7 octets.

Comparé à C #, Java a l'avantage de spécifier l'index de fin au lieu de la longueur de sous-chaîne, ce qui réduit le nombre d'octets.

adrianmp
la source
7

JavaScript (ES6), 22 octets

Prend et sort un tableau de chaînes.

([_,...a])=>a.pop()&&a

Cas de test

Version chaîne (27 octets)

Prend et sort une chaîne. La chaîne de sortie est soit un espace unique si aucun deuxième prénom n'a été trouvé, soit les noms intermédiaires avec des espaces de début et de fin.

s=>(/ .* /.exec(s)||' ')[0]

Arnauld
la source
/./.exec.bind(/ .* /)semble imiter le # 2, sauf nullpour aucun
dandavis
7

AWK , 17 10 octets

7 octets enregistrés grâce à @steve!

$NF=$1=x;1

Essayez-le en ligne!

Explication:

$NF=    set last word to
$1=     set first word to
x       an empty variable, ie empty string
1       default action, ie print everything
betseg
la source
Peut être réduit à 11 octets,$NF=$1="";1
Steve
3
Ou 10 utilisant$NF=$1=x;1
steve
1
@steve qu'est-ce que ça 1fait? Je ne suis pas si bon à AWK :)
betseg
1 signifie simplement prendre l'action par défaut, c'est-à-dire imprimer $ 0.
steve
6

Groovy , 19 octets

{it.split()[1..-2]}

Explication:

{        
 it                  all closures have an implicit argument called "it"
   .split()          splits by spaces by default. Returns an array of words
           [1..-2]   take the whole array from the second index (1) to the penultimate index (-2). Implicitly return
                  }

Une fonction de fermeture / anonyme

méthode statique
la source
1
Bienvenue chez PPCG! Pouvez-vous prendre une liste de chaînes en entrée pour ignorer .split()?
Martin Ender
Martin Ender Oui, si vous supposez que l'entrée sera toujours une liste de chaînes, alors {it [1 ..- 2]} fonctionnera.
staticmethod
5

PHP, 37 octets

<?=join(" ",array_slice($argv,2,-1));

-4 octets pour une sortie sous forme de tableau

print_r(array_slice($argv,2,-1));

PHP, 42 octets

echo trim(trim($argn,join(range("!",z))));

PHP, 50 octets

echo preg_filter("#(^[^\s]+ |[^\s]+$)#","",$argn);
Jörg Hülsermann
la source
4

Rétine , 11 octets

^\S+ |\S+$

Essayez-le en ligne!

Correspond au premier mot (y compris l'espace après celui-ci) et au dernier mot, et les supprime tous les deux.

Si les E / S peuvent être une liste séparée par des sauts de ligne, cela peut être fait en 8 octets à la place:

A1`
G-2`

Essayez-le en ligne!

Martin Ender
la source
4

Perl 5 , 27 18 octets

Besoin de courir avec -noption.

/ (.+) /&&print$1

Essayez-le en ligne!

Wanted to do something similar in sed first, but, unfortunately, it doesn't support non-greedy quantifier. It is needed in case middle name is more than one word.

Edit

-9 bytes thanks to Dada.

Non-greedy quantifier is not needed anymore, among with some other things.

Maxim Mikhaylov
la source
/ (.+) /&&print$1 should be sorter. Great to see some new people golfing with Perl!
Dada
@Dada Thanks for the tip! It's actually my first time ever writing in Perl. Do you know why print if s| (.+) |\1| doesn't work? To me it looks similar to what you wrote.
Maxim Mikhaylov
print if s| (.+) |\1| replaces the middle part with... the middle part! (minus the spaces before and after), so it doesn't work. On the other side, what I suggested only matches the middle part and print only it ($1).
Dada
4

Javascript (ES6) 49 16 bytes

Edit:

a=>a.slice(1,-1)

Try it online!

ungolfed:

function(name) {
  return a.slice(1, -1); //start at the second item and end at the second to last item
};

I forgot some of the simple properties of slice, and that the input can be an array. Thanks to @Neil and @fəˈnɛtɪk I was able to remove 27 bytes. Still not really competing.

Original:

This isn't really competing but here's a Javascript solution:

a=>{a=a.split(' ');return a.slice(1, a.length-1)}

This creates an anonymous function equal to:

function(name) {
  let name = name.split(' '); //first middle last -> [first, middle, last]
  return name.slice(1, name.length - 1); //get the second item to the second to last item in the array.
}

How I golfed it

This is a pretty simple golf. I turned the function into an arrow function. Then I "minified" the code. This included renaming name into a single character(a in this case) and removing the let decloration of the variable.

Snippet

Hope this helps anyone who is stuck on the challenge.

David Archibald
la source
The length - is unnecessary, as slice already accepts negative lengths as being relative to the end. This means that you no longer need the intermediate variable, so you can turn your arrow function from a block into an expression.
Neil
Actually the way it works is that -1 is the last but one that you need here.
Neil
It is also slice(1,-1). slice(1,-2) removes two from the end.
fəˈnɛtɪk
You can also assume that you were passed an array to begin with, which lets you just perform slice and you are done.
fəˈnɛtɪk
I'm 99% sure that was changed since I started it. Thanks again.
David Archibald
3

Röda, 9 bytes

{_[1:-1]}

Try it online!

Not a very interesting solution. Takes a list from the stream and returns the middle names.

21 bytes and I/O:

{[(_/" ")[1:-1]&" "]}

Try it online!

This uses / (split) and & (join).

fergusq
la source
3

Jelly, 2 bytes

ḊṖ

Try it online!

This works as a non-inline link (i.e. function), not a full program.

'John','Jacob','Jingleheimer','Schmidt''Jacob','Jingleheimer'

As a full program, it would be 3 bytes: ḊṖK, which prints a space-separated middle name.

Erik the Outgolfer
la source
3

C#, 67 bytes

s=>s.Substring(s.IndexOf(' ')+1,s.LastIndexOf(' ')-s.IndexOf(' '));

Anonymous function which identifies the first occurrence of the space character and the last one and extracts the middle. It also extracts a trailing space, which can be removed at the cost of 2 bytes.

Full program with test cases:

using System;

namespace WhatsMyMiddleName
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string, string> f =
            s=>s.Substring(s.IndexOf(' ')+1,s.LastIndexOf(' ')-s.IndexOf(' '));

            Console.WriteLine(f("Jo Jean Smith"));          // "Jean"
            Console.WriteLine(f("Samantha Vee Hills"));     // "Vee"
            Console.WriteLine(f("Bob Dillinger"));          // ""
            Console.WriteLine(f("John Jacob Jingleheimer Schmidt"));// "Jacob Jingleheimer"
            Console.WriteLine(f("Jose Mario Carasco-Williams"));    // "Mario"
            Console.WriteLine(f("James Alfred Van Allen")); // "Alfred Van"
        }
    }
}
adrianmp
la source
3

Kotlin, 39 bytes

s.filterIndexed{i,j->i!=0&&i!=s.size-1}

Try it online!

i.e.

s.filterIndexed{ index, value -> index != 0 && index != (s.size - 1) }
luminous_arbour
la source
3

VBA, 69 bytes

Sub m(n)
f=InStr(1,n," ")
Debug.?Mid(n,f+1,InStrRev(n," ")-f)
End Sub
Engineer Toast
la source
3

R, 30 27 22 bytes

Current solution due to user11599!

head(scan(,''),-1)[-1]

Takes input from stdin, returns each middle name as a separate string. Returns character() in the case of no middle name; that is, a vector of class character of length 0.

Explanation:

Read stdin into a list of strings, separated by spaces

     scan(,'')

Remove the last element. head returns the first n elements of a list, with n defaulting to 6. If n is -1 it returns all but the last element.

head(scan(,''),-1)

Now, remove the first element of this list.

head(scan(,''),-1)[-1]

This yields the middle name(s).

rturnbull
la source
1
Even shorter: head(scan(,''),-1)[-1] 22 bytes. Note that '' are two single quotes.
user11599
If you don't want each name quoted, use, at 27 bytes, cat(head(scan(,''),-1)[-1])
user11599
Explanation: scan(,'') breaks the string into words, head(...,-1) drops the last word, head(...,-1)[-1] then drops the first word, cat() formats the output dropping the quotes. For no middle name, result isn't perfect, it's character(0), the empty string.
user11599
@user11599 Wow, thanks! I had played around with head() and tail(), but I didn't know you could pass a negative number as the second argument. Nice!
rturnbull
Your use of scan(,'') inspired me. I didn't think of approaching that way.
user11599
3

Ruby, 24 13 bytes

p ARGV[1..-2]

Saved 11 bytes thanks to Piccolo pointing out that array-like output is allowed.

Takes the name as separate command line arguments, e.g.:

$ ruby script.rb John Jacob Jingleheimer Schmidt

or

$ ruby -e 'p ARGV[1..-2]' John Jacob Jingleheimer Schmidt

Previous code (outputs a proper string):

puts ARGV[1..-2].join" "
Flambino
la source
@Jordan Good idea - however with $><<ARGV[1..-2].join" " it complains about the " " being unexpected, so I'd have to add parentheses - which would add 1 byte in the end.
Flambino
Ah, of course. My bad.
Jordan
The original poster said that the output can be an array, so you can shave some characters off by just changing your code to puts ARGV[1..-2], just so you know.
Piccolo
@Piccolo Huh? I don't see that anywhere? If true; p ARGV[1..-2] for 13 bytes - just looks nothing like the output in OPs challenge
Flambino
3

Golang, 152 81 bytes

import ."strings"
func f(x string)[]string{var k=Fields(x);return k[1:len(k)-1];}

It takes input as "Samantha Vee Hills" (with double quotes) and return the middle name to the stdout.

Try it Online!

Edit: @Dada, note that the "function as answer is allowed" shorten my code 71 bytes. a big thanks!

ersinakyuz
la source
Welcome on the site. Submitting a function as answer is allowed, so you could shorten your code by doing something like this: Try it online!. Have a look at the Tips for Golfing in Go!
Dada
thank you @Dada for tips and shorten my code. It was my first code entry.
ersinakyuz
3

Matlab, 81, 79, 78, 55 Bytes

function x=a(s)
s=strsplit(s);x=strjoin(s(2:end-1));end

Takes in an input string, s, is split (by the default delimiter, whitespace char) into a cell array, from which the middle element is accessed. Then the middle elements are concatenated, or an empty string is returned.

Edit: thanks to Luis Mendo for saving 3 bytes!

Edit 2: Better solution from Ankit!

Owen Morgan
la source
I am not a smart man! edited.
Owen Morgan
You can't use nnz on a cell array, but I did the other two changes :)
Owen Morgan
Suggested Edit by Ankit, who doesn't have enough rep to comment. (55 bytes): function x=a(s) s=strsplit(s);x=strjoin(s(2:end-1));end
mbomb007
3

C, 42 bytes

f(char**b){for(;b[2];printf("%s ",*++b));}

The parameter is a NULL terminated array of pointers to char.

See it work here.

The command line arguments may also be used with the same function.

C, 51 bytes

main(a,b)char**b;{for(;b[3];printf("%s ",b++[2]));}

A full program. Input is done through command line arguments.

See it work here.

C, 54 bytes

f(char**b){*strrchr(*b=strchr(*b,32),32)=0;*b+=!!**b;}

The parameter is an in/out parameter.

See it work here.

2501
la source
Welcome to PPCG!
Martin Ender
I'm receiving the following error when compiling with Visual Studio 2012:error C2100: illegal indirection
Johan du Toit
@JohanduToit VS is not C11 or even C99 conforming. My code is. As practical proof, both gcc and clang compile a valid program.
2501
2

Python 2, 42 19 16 Bytes

lambda n:n[1:-1]

Try it online! Thanks to @Kritixi Lithos for saving 23 bytes! Thanks @math_junkie for saving 3 more bytes. For input, put each part of the name as a string within a list like so:

["Samantha", "Vee", "Hills"]

And yes, the OP has approved a list to be a valid input.

Explanation

lambda n:n[1:-1]    # Returns only the middle elements... pretty literal here
Anthony Pham
la source
1
print input()[1:-1] is shorter
Kritixi Lithos
Spring slicing sure is tricky
Anthony Pham
lambda n:n[1:-1] is even shorter
math junkie
1
I may have tried with a wrong input. But when I tried, with Samantha Vee Hills as input in repl.it link that you've shared, this just prints amantha Vee Hill which is definitely not the output required.
Keerthana Prabhakaran
2
Names will always have at least 2 space-separated parts is the first point of the question right.
Keerthana Prabhakaran
2

C++, 91 bytes

#import<list>
#import<string>
void f(std::list<std::string>&n){n.pop_front();n.pop_back();}

Takes input as a reference to a list of strings and modifies the list directly.

Try it online!

Steadybox
la source