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


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í!


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

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

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


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

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


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.


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

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


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]


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

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


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


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.


/ (.+) /&&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.


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

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.



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



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


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

@ 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!


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!


¡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í .


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

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!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.