¿Cuál es mi segundo nombre?

30

Nota: La respuesta ganadora se seleccionará el 12/04/17, el ganador actual es Jolf, 1 byte .

Me sorprende que todavía no hayamos tenido un desafío para mi segundo nombre en este sitio. Hice mucha búsqueda pero no encontré nada. Si se trata de un duplicado, márquelo como tal.

Tu reto

Analiza una cadena que se parece Jo Jean Smithy regresa Jean.

Casos de prueba

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 

(Ese último es incorrecto técnicamente, pero arreglarlo sería demasiado difícil).

Notas:

  • Los nombres siempre tendrán al menos 2 partes separadas por espacios, con nombres intermedios ilimitados entre ellos o pueden ser una lista / matriz de cadenas.
  • Los nombres pueden contener el alfabeto (no distingue entre mayúsculas y minúsculas) y - ( 0x2d)
  • Puede generar una nueva línea final.
  • Es posible que necesite una entrada para tener una nueva línea final.
  • Se permite la entrada de STDIN, un parámetro de función o un argumento de línea de comandos, pero no se permite codificarlo.
  • Lagunas estándar prohibidas.
  • La salida puede ser el valor de retorno de la función, STDOUT, STDERR, etc.
  • Se permiten espacios finales / líneas nuevas / pestañas en la salida.
  • ¿Alguna pregunta? ¡Comenta abajo!

Este es el , por lo que gana la respuesta más corta en bytes.

programador 5000
fuente
2
¿Puede la salida ser una lista de cadenas?
Anthony Pham el
55
Si se permiten otros formatos que no sean cadenas separadas por espacios, edítelo en la especificación.
Martin Ender
55
@ programmer5000: si la entrada puede ser una lista de cadenas, ¿qué tal la salida? ¿Es ["John", "Jacob", "Jingleheimer", "Schmidt"]-> ["Jacob", "Jingleheimer"]una solución válida?
nimi
3
¿Se permiten espacios iniciales?
betseg
2
@DJ Porque "Van" no es su segundo nombre, es parte de su apellido. Un caso particularmente irritante es David Lloyd George, cuyo primer nombre es David y apellido es Lloyd George. Cualquier intento de analizar los nombres de personas reales como este está condenado. De hecho, ni siquiera se puede saber cuáles son los nombres y apellidos (piense en Li Shi).
David Conrad el

Respuestas:

4

Jolf, 1 byte

Obtiene el interior de la entrada. Pruébalo aquí!

Conor O'Brien
fuente
Parece que no puedo ejecutar el ejemplo; parece que no sucede nada cuando hago clic en cualquiera de los botones. Uso de Chrome 57.0.2987.133
@YiminRong Solo puedo asegurar que funcione en firefox.
Conor O'Brien
44

Ohm , 2 bytes (CP437)

Acepta y devuelve una lista de cadenas.

()

Explicación:

()   Main wire, arguments: a

(    Remove the first element of a
 )   ...and then the last element of that
     Implicit output
Nick Clifford
fuente
10
La herramienta adecuada para el trabajo, supongo
Rohan Jhunjhunwala
15

Vim, 6 5 bytes

dW$BD

Pruébalo en línea!

(salidas con un espacio final)

Como Vim es inversamente compatible con V, he incluido un enlace TIO para V.

Explicación

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
fuente
Drat, me ganaste. dWWDte ahorra un byte.
DJMcMayhem
55
@DJMcMayhem Eso solo funciona exactamente para un segundo nombre.
Martin Ender
¿Cuál es la diferencia entre dW y dw?
Duncan X Simpson
1
@DuncanXSimpson se dWelimina hasta el espacio en blanco. dwelimina hasta caracteres que no sean palabras.
Financia la demanda de Mónica el
14

Python , 24 bytes

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

Pruébelo en línea de entrada de cadena!

Formato de entrada: cadena


Python 2 , 16 bytes

lambda n:n[1:-1]

¡Pruébelo en línea de entrada!

Formato de entrada: Lista

Keerthana Prabhakaran
fuente
Debería editar el título con en Pythonlugar de Python 2, porque también funciona Python 3, estaba a punto de publicar eso.
Sr. Xcoder
@ L3viathan ya que OP no ha mencionado el formato de salida must be a string, y dado que el formato de entrada puede ser una lista, ¡imprimir una lista no puede considerarse como un resultado incorrecto!
Keerthana Prabhakaran
De acuerdo con los comentarios sobre la pregunta, puede ingresar y generar una lista de cadenas. Ahorre un montón de byteslambda n:n[1:-1]
Luke Sawczak
1
Como puede leer desde STDIN, puede reemplazar el lambda con input()(solo Python 3)
BallpointBen
Tienes razón. Gracias. ¡He agregado las ediciones!
Keerthana Prabhakaran
13

Brain-Flak , 133 bytes

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

Pruébalo en línea!

132 bytes de código, más 1 byte para el -c indicador que permite la entrada y salida ASCII.

Desafortunadamente, esto contiene muchos códigos duplicados, pero sería realmente difícil de reutilizar. Lo investigaré más tarde. Aquí hay una explicación:

#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
fuente
86 bytes cuando eliminas los comentarios. Agregué los dos primeros y la última línea. TIO
Riley
@riley Solución genial. ¡No dudes en publicarlo tú mismo!
DJMcMayhem
12

Haskell, 23 , 17 9 bytes

init.tail

Toma y devuelve una lista de cadenas. Pruébalo en línea!

Soltar la primera cuerda, soltar la última cuerda.

Editar: @Generic Display Name señaló, que la entrada puede ser una lista de cadenas, que ahorró 6 bytes.

Edición II: devuelve la lista de cadenas en lugar de una sola cadena

nimi
fuente
Parece una entrada ya que se permite una lista, por lo tanto, suelte las palabras para -5 bytes
Nombre de visualización genérico
@GenericDisplayName: Oh, no me di cuenta. ¡Gracias!
nimi
Mi respuesta de Ohm y la respuesta de Mathematica también responden a ambas listas de cadenas de salida, por lo que probablemente podría eliminar unwords.-8 bytes.
Nick Clifford
@NickClifford: sí, lo vi y le pedí al OP una aclaración.
nimi
11

Mathematica, 10 bytes

Rest@*Most

Una función sin nombre que acepta y devuelve una lista de cadenas.

Restdescarta el último elemento, Mostdescarta el primer elemento, @*es composición de funciones. Cambiar Resty / Mosto usar la composición correcta en su /*lugar también funcionaría. Esto supera la indexación a través #[[2;;-2]]&de un byte.

Martin Ender
fuente
10

Brain-Flak , 86 bytes

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

Pruébalo en línea!

La mayor parte de este código proviene de esta respuesta . Si te gusta mi solución, también deberías votarla.

#Push 2
(()())

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

  #While not a space
  {
      #Pop
      {}

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

  #Endwhile
  }

  #Pop the 0
  {}

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

#End loop twice
>)}{}
Riley
fuente
¡Bien hecho! No pensé en sostener un mostrador para empujar más tarde, así que pasé demasiado tiempo pensando en cómo recorrer diferentes pilas.
DJMcMayhem
8

Java 7, 74 bytes

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

Java 8, 49 bytes

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

Función que identifica la primera aparición del carácter de espacio y la última y extrae el medio. La cadena resultante tiene como prefijo un carácter de espacio (en el momento de la publicación, OP no ha aclarado si se permiten espacios iniciales), que se pueden eliminar agregando.trim() al código un costo adicional de 7 bytes.

En comparación con C #, Java tiene la ventaja de especificar el índice final en lugar de la longitud de la subcadena, lo que reduce el recuento de bytes.

adrianmp
fuente
7

JavaScript (ES6), 22 bytes

Toma y emite una serie de cadenas.

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

Casos de prueba

Versión de cadena (27 bytes)

Toma y emite una cadena. La cadena de salida es un espacio único si no se encontró un segundo nombre, o los segundos nombres con espacios iniciales y finales.

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

Arnauld
fuente
/./.exec.bind(/ .* /)parece imitar # 2, excepto nullpor ninguno
dandavis
7

AWK , 17 10 bytes

Guardado 7 bytes gracias a @steve!

$NF=$1=x;1

Pruébalo en línea!

Explicación:

$NF=    set last word to
$1=     set first word to
x       an empty variable, ie empty string
1       default action, ie print everything
Betseg
fuente
Puede reducirse a 11 bytes,$NF=$1="";1
steve
3
O 10 usando$NF=$1=x;1
steve
1
@steve, ¿qué hace 1? No soy tan bueno en AWK :)
betseg
1 solo significa tomar la acción predeterminada, es decir, imprimir $ 0.
Steve
6

Groovy , 19 bytes

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

Explicación:

{        
 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
                  }

Una función de cierre / anónimo

método estático
fuente
1
Bienvenido a PPCG! ¿Puedes tomar una lista de cadenas como entrada para omitir el .split()?
Martin Ender
Martin Ender Sí, si supone que la entrada siempre será una lista de cadenas, entonces {it [1 ..- 2]} funcionaría.
staticmethod
5

PHP, 37 bytes

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

-4 bytes para una salida como matriz

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

PHP, 42 bytes

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

PHP, 50 bytes

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

Retina , 11 bytes

^\S+ |\S+$

Pruébalo en línea!

Coincide con la primera palabra (incluido el espacio después) y la última palabra, y elimina ambas.

Si la E / S puede ser una lista separada por salto de línea, puede hacerse en 8 bytes:

A1`
G-2`

Pruébalo en línea!

Martin Ender
fuente
4

Perl 5 , 27 18 bytes

Necesito correr con -nopción.

/ (.+) /&&print$1

Pruébalo en línea!

Quería hacer algo similar en sed primero, pero, desafortunadamente, no admite un cuantificador no codicioso. Es necesario en caso de que el segundo nombre sea más de una palabra.

Editar

-9 bytes gracias a Dada .

El cuantificador no codicioso ya no es necesario, entre otras cosas.

Maxim Mikhaylov
fuente
/ (.+) /&&print$1Debería ser clasificador. ¡Es genial ver a gente nueva jugando golf con Perl!
Dada
@Dada Gracias por el consejo! De hecho, es la primera vez que escribo en Perl. ¿Sabes por qué print if s| (.+) |\1|no funciona? Para mí, se parece a lo que escribiste.
Maxim Mikhaylov
print if s| (.+) |\1|reemplaza la parte del medio con ... la parte del medio! (menos los espacios antes y después), por lo que no funciona. Por otro lado, lo que sugerí solo coincide con la parte media e imprime solo ( $1).
Dada
4

Javascript (ES6) 49 16 bytes

Editar:

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

Pruébalo en línea!

sin golf:

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

Olvidé algunas de las propiedades simples de slice, y que la entrada puede ser una matriz. Gracias a @Neil y @ fəˈnɛtɪk pude eliminar 27 bytes. Todavía no compite realmente.

Original:

Esto no es realmente competitivo, pero aquí hay una solución Javascript:

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

Esto crea una función anónima igual a:

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

Cómo lo jugué

Este es un golf bastante simple. Convertí la función en una función de flecha . Luego "minifiqué" el código. Esto incluyó renombrar nameen un solo carácter (a en este caso) y eliminar la letdecoloración de la variable.

Retazo

Espero que esto ayude a cualquiera que esté atrapado en el desafío.

David Archibald
fuente
El length -es innecesario, sliceya que acepta longitudes negativas como relativas al final. Esto significa que ya no necesita la variable intermedia, por lo que puede convertir su función de flecha de un bloque en una expresión.
Neil
En realidad, la forma en que funciona es que -1es la última pero que necesitas aquí.
Neil
También es rebanada (1, -1). rebanada (1, -2) elimina dos del final.
fəˈnɛtɪk
También puede suponer que se le pasó una matriz para empezar, lo que le permite realizar un corte y listo.
fəˈnɛtɪk
Estoy 99% seguro de que ha cambiado desde que lo comencé. Gracias de nuevo.
David Archibald
3

Röda , 9 bytes

{_[1:-1]}

Pruébalo en línea!

No es una solución muy interesante. Toma una lista de la secuencia y devuelve los segundos nombres.

21 bytes y E / S:

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

Pruébalo en línea!

Esto usa /(dividir) y &(unir).

fergusq
fuente
3

Jalea , 2 bytes

ḊṖ

Pruébalo en línea!

Esto funciona como un enlace no en línea (es decir, función), no como un programa completo.

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

Como programa completo, sería de 3 bytes: ḊṖKque imprime un segundo nombre separado por espacios.

Erik el Outgolfer
fuente
3

C #, 67 bytes

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

Función anónima que identifica la primera aparición del carácter de espacio y la última y extrae el medio. También extrae un espacio final, que puede eliminarse a costa de 2 bytes.

Programa completo con casos de prueba:

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
fuente
3

Kotlin , 39 bytes

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

Pruébalo en línea!

es decir

s.filterIndexed{ index, value -> index != 0 && index != (s.size - 1) }
puerto_luminosa
fuente
3

VBA, 69 bytes

Sub m(n)
f=InStr(1,n," ")
Debug.?Mid(n,f+1,InStrRev(n," ")-f)
End Sub
Tostadas de ingeniero
fuente
3

R, 30 27 22 bytes

¡Solución actual debido al usuario 11599!

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

Toma la entrada de stdin, devuelve cada segundo nombre como una cadena separada. Devuelve character()en el caso de que no haya segundo nombre; es decir, un vector de clase characterde longitud 0.

Explicación:

Leer stdin en una lista de cadenas, separadas por espacios

     scan(,'')

Eliminar el último elemento. headdevuelve los primeros nelementos de una lista, con el valor npredeterminado de 6. Si nes -1, devuelve todo menos el último elemento.

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

Ahora, elimine el primer elemento de esta lista.

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

Esto produce el segundo nombre (s).

rturnbull
fuente
1
Aún más corto: head (scan (, ''), - 1) [- 1] 22 bytes. Tenga en cuenta que '' son dos comillas simples.
user11599
Si no desea que se cite cada nombre, use, a 27 bytes, cat (head (scan (, ''), - 1) [- 1])
user11599
Explicación: scan (, '') divide la cadena en palabras, head (..., - 1) suelta la última palabra, head (..., - 1) [- 1] luego suelta la primera palabra, cat () formatea la salida dejando caer las comillas. Para ningún segundo nombre, el resultado no es perfecto, es el carácter (0), la cadena vacía.
user11599
@ user11599 Wow, gracias! Había jugado con head()y tail(), pero no sabía que podías pasar un número negativo como segundo argumento. ¡Agradable!
rturnbull
Su uso del escaneo ('') me inspiró. No pensé en acercarme de esa manera.
user11599
3

Ruby, 24 13 bytes

p ARGV[1..-2]

Ahorró 11 bytes gracias a Piccolo que señala que se permite una salida tipo matriz

Toma el nombre como argumentos de línea de comando separados, por ejemplo:

$ ruby script.rb John Jacob Jingleheimer Schmidt

o

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

Código anterior (genera una cadena adecuada):

puts ARGV[1..-2].join" "
Flambino
fuente
@ Jordania Buena idea, sin embargo, con $><<ARGV[1..-2].join" "eso se queja de " "ser inesperado, por lo que tendría que agregar paréntesis, lo que agregaría 1 byte al final.
Flambino
Ah, por supuesto. Mi error.
Jordania
El póster original decía que la salida puede ser una matriz, por lo que puede eliminar algunos caracteres simplemente cambiando su código a puts ARGV[1..-2], para que lo sepa.
Piccolo
@Piccolo ¿Eh? ¿No veo eso en ningún lado? Si es verdad; p ARGV[1..-2]de 13 bytes - sólo se parece en nada a la producción en los PO poner en entredicho
Flambino
3

Golang , 152 81 bytes

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

Toma la entrada como "Samantha Vee Hills" (con comillas dobles) y devuelve el segundo nombre al stdout.

Pruébalo en línea!

Editar: @Dada, tenga en cuenta que la "función como respuesta está permitida" acorta mi código 71 bytes. muchas gracias!

ersinakyuz
fuente
Bienvenido al sitio. Enviar una función como respuesta está permitido, por lo que puede acortar su código haciendo algo como esto: ¡ Pruébelo en línea! . Echa un vistazo a los consejos para jugar golf en Go !
Dada
gracias @Dada por consejos y acortar mi código. Fue mi primera entrada de código.
ersinakyuz
3

Matlab, 81 , 79 , 78 , 55 bytes

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

Toma una cadena de entrada, s , se divide (por el delimitador predeterminado, espacio en blanco char) en una matriz de celdas, desde la cual se accede al elemento central. Luego, los elementos intermedios se concatenan o se devuelve una cadena vacía.

Editar: gracias a Luis Mendo por guardar 3 bytes!

Edición 2: ¡Mejor solución de Ankit!

Owen Morgan
fuente
¡No soy un hombre inteligente! editado
Owen Morgan
No se puede usar nnzen una matriz de celdas, pero hice los otros dos cambios :)
Owen Morgan
Edición sugerida por Ankit , que no tiene suficiente representante para comentar. (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));}

El parámetro es una matriz terminada en NULL de punteros a char.

Míralo funcionar aquí .

Los argumentos de la línea de comando también se pueden usar con la misma función .

C, 51 bytes

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

Un programa completo La entrada se realiza a través de argumentos de línea de comando.

Míralo funcionar aquí .

C, 54 bytes

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

El parámetro es un parámetro de entrada / salida.

Véalo funcionar aquí .

2501
fuente
Bienvenido a PPCG!
Martin Ender
Recibo el siguiente error al compilar con Visual Studio 2012: error C2100: indirección ilegal
Johan du Toit
@JohanduToit VS no es C11 o incluso C99 conforme. Mi código es Como prueba práctica, tanto gcc como clang compilan un programa válido.
2501
2

Python 2, 42 19 16 bytes

lambda n:n[1:-1]

Pruébalo en línea! ¡Gracias a @Kritixi Lithos por guardar 23 bytes! Gracias @math_junkie por guardar 3 bytes más. Para la entrada, coloque cada parte del nombre como una cadena dentro de una lista así:

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

Y sí, el OP ha aprobado una lista para ser una entrada válida.

Explicación

lambda n:n[1:-1]    # Returns only the middle elements... pretty literal here
Anthony Pham
fuente
1
print input()[1:-1]es más corto
Kritixi Lithos
El corte de primavera seguro es complicado
Anthony Pham
lambda n:n[1:-1]es aún más corto
drogadicto de matemáticas
1
Puede que haya intentado con una entrada incorrecta. Pero cuando lo intenté, con Samantha Vee Hillscomo entrada en el enlace repl.it que has compartido, esto simplemente imprime, amantha Vee Hillque definitivamente no es la salida requerida.
Keerthana Prabhakaran
2
Names will always have at least 2 space-separated partsEs el primer punto de la pregunta correcta.
Keerthana Prabhakaran
2

C ++, 91 bytes

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

Toma la entrada como referencia a una lista de cadenas y modifica la lista directamente.

Pruébalo en línea!

Steadybox
fuente