Qual é o meu nome do meio?


30

Nota: A resposta vencedora será selecionada em 12/04/17, o vencedor atual é Jolf, 1 byte .

Estou surpreso por ainda não termos enfrentado o desafio do meu nome do meio neste site. Eu fiz muita pesquisa, mas não encontrei nada. Se este é um dup, sinalize-o como tal.

Seu desafio

Analise uma string com aparência Jo Jean Smithe retorne Jean.

Casos de teste

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 

(Esse último está incorreto tecnicamente, mas corrigir isso seria muito difícil.)

Notas:

  • Os nomes sempre terão pelo menos duas partes separadas por espaço, com nomes intermediários ilimitados entre elas ou podem ser uma lista / matriz de cadeias.
  • Os nomes podem conter o alfabeto (sem distinção entre maiúsculas e minúsculas) e - ( 0x2d)
  • Você pode gerar uma nova linha à direita.
  • Você pode precisar de entrada para ter uma nova linha à direita.
  • A entrada de STDIN, um parâmetro de função ou argumento de linha de comando é permitida, mas a codificação não é permitida.
  • Falhas padrão proibidas.
  • A saída pode ser um valor de retorno da função, STDOUT, STDERR, etc.
  • Espaços finais / novas linhas / guias na saída são permitidos.
  • Alguma pergunta? Comente abaixo!

Isso é , então a resposta mais curta em bytes vence!


2
A saída pode ser uma lista de strings?
Anthony Pham

5
Se outros formatos que não uma sequência separada por espaço forem permitidos, edite-o na especificação.
Martin Ender

5
@ programmer5000: se a entrada puder ser uma lista de strings, que tal a saída? É ["John", "Jacob", "Jingleheimer", "Schmidt"]-> ["Jacob", "Jingleheimer"]uma solução válida?
nimi

3
Os espaços à esquerda são permitidos?
betseg

2
@ DJ Como "Van" não é o nome do meio, faz parte do sobrenome. Um caso particularmente irritante é David Lloyd George, cujo primeiro nome é David e o sobrenome é Lloyd George. Qualquer tentativa de analisar nomes de pessoas reais como essa está condenada. Na verdade, você nem consegue dizer quais são os nomes e sobrenomes (pense em Li Shi).
David Conrad

Respostas:


4

Jolf, 1 byte

Obtém o interior da entrada. Experimente aqui!


Não consigo entender o exemplo - nada parece acontecer quando clico em qualquer um dos botões. Usando o Chrome 57.0.2987.133

@YiminRong Só posso garantir que ele funcione no Firefox.
Conor O'Brien

44

Ohm , 2 bytes (CP437)

Aceita e retorna uma lista de cadeias.

()

Explicação:

()   Main wire, arguments: a

(    Remove the first element of a
 )   ...and then the last element of that
     Implicit output

10
A ferramenta certa para o palpite trabalho I
Rohan Jhunjhunwala

15

Vim, 6 5 bytes

dW$BD

Experimente online!

(saídas com um espaço à direita)

Como o Vim é compatível reversamente com o V, incluí um link TIO para V.

Explicação

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, você me venceu. dWWDeconomiza um byte.
DJMcMayhem

5
@DJMcMayhem Isso funciona apenas para exatamente um nome do meio.
Martin Ender

Qual é a diferença entre dW e dw?
Duncan X Simpson

1
@DuncanXSimpson dWexclui até o espaço em branco. dwexclui até caracteres que não sejam palavras.
Fund Monica's Lawsuit

14

Python , 24 bytes

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

Experimente a entrada de string online!

Formato de entrada: string


Python 2 , 16 bytes

lambda n:n[1:-1]

Experimente a entrada da lista online!

Formato de Entrada: Lista


Você deve editar o título com, em Pythonvez de Python 2, porque também funciona Python 3, estava prestes a publicá-lo.
Mr. Xcoder

@ L3viathan, já que o OP não mencionou o formato de saída must be a stringe, como o formato de entrada pode ser uma lista, imprimir uma lista não pode ser considerada um resultado errado!
Keerthana Prabhakaran

De acordo com os comentários sobre a pergunta, você pode inserir e enviar uma lista de strings. Salvar um monte de byteslambda n:n[1:-1]
Luke Sawczak

1
Desde que você pode ler de STDIN, pode substituir o lambda com input()(Python 3 apenas)
BallpointBen

Você está certo. Obrigado. Adicionei as edições!
Keerthana Prabhakaran

13

Flacidez Cerebral , 133 bytes

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

Experimente online!

132 bytes de código, mais 1 byte para o -c sinalizador que permite entrada e saída ASCII.

Infelizmente, isso contém muito código duplicado, mas seria muito difícil reutilizá-lo. Vou dar uma olhada mais tarde. Aqui está uma explicação:

#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 quando você remove os comentários. Eu adicionei as duas primeiras e a última linha. TIO
Riley

@riley Solução legal. Sinta-se livre para publicá-lo!
DJMcMayhem


12

Haskell, 23 , 17 9 bytes

init.tail

Pega e retorna uma lista de strings. Experimente online!

Solte a primeira string, solte a última string.

Edit: @Generic Display Name observado, que a entrada pode ser uma lista de strings, que salvou 6 bytes.

Editar II: retornar lista de strings em vez de uma única string


Parece que a entrada como uma lista é permitido, então cair as palavras para -5 bytes
Exibição nome genérico

@GenericDisplayName: Ah, não percebi. Obrigado!
N

Minha resposta Ohm e o Mathematica também respondem às listas de saída de strings, portanto, você provavelmente pode cair unwords.para -8 bytes.
Nick Clifford

@NickClifford: sim, eu mesmo vi e pedi esclarecimentos ao OP.
Nim

11

Mathematica, 10 bytes

Rest@*Most

Uma função sem nome que aceita e retorna uma lista de seqüências de caracteres.

Restdescarta o último elemento, Mostdescarta o primeiro elemento, @*é a composição da função. Trocar Reste / Mostou usar a composição correta /*também funcionaria. Isso supera a indexação #[[2;;-2]]&por um byte.


10

Flacidez Cerebral , 86 bytes

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

Experimente online!

A maior parte desse código vem dessa resposta . Se você gosta da minha solução, também deve votar nessa.

#Push 2
(()())

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

  #While not a space
  {
      #Pop
      {}

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

  #Endwhile
  }

  #Pop the 0
  {}

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

#End loop twice
>)}{}

Bem feito! Eu não pensei em segurar um balcão para empurrar mais tarde, então passei muito tempo pensando em como fazer um loop em pilhas diferentes.
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(' '))

Função que identifica a primeira ocorrência do caractere de espaço e a última e extrai o meio. A sequência resultante é prefixada por um caractere de espaço (no momento da postagem, o OP não esclareceu se espaços iniciais são permitidos), que podem ser eliminados adicionando- .trim()se ao código por um custo extra de 7 bytes.

Comparado ao C #, o Java tem a vantagem de especificar o índice final em vez do comprimento da sub-cadeia, o que reduz a contagem de bytes.


7

JavaScript (ES6), 22 bytes

Pega e gera uma matriz de seqüências de caracteres.

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

Casos de teste

Versão da string (27 bytes)

Pega e gera uma string. A cadeia de saída é um espaço único se nenhum nome do meio foi encontrado ou os nomes do meio com espaços à esquerda e à direita.

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


/./.exec.bind(/ .* /)parece imitar # 2, com excepção nullpara nenhum
dandavis

7

AWK , 17 10 bytes

Guardado 7 bytes graças a @steve!

$NF=$1=x;1

Experimente online!

Explicação:

$NF=    set last word to
$1=     set first word to
x       an empty variable, ie empty string
1       default action, ie print everything

Pode ser raspada para baixo para 11 bytes,$NF=$1="";1
steve

3
Ou 10 usando$NF=$1=x;1
steve

1
@ steve o que 1faz? Eu não sou tão bom em AWK :)
betseg

1 significa apenas executar a ação padrão, ou seja, imprimir $ 0.
21417 steve

6

Groovy , 19 bytes

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

Explicação:

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

Uma função de fechamento / anônima


1
Bem-vindo ao PPCG! Você pode pegar uma lista de strings como entrada para pular o .split()?
Martin Ender

Martin Ender Sim, se você assumir que a entrada sempre será uma lista de strings, {it [1 ..- 2]} funcionaria.
Static #

5

PHP, 37 bytes

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

-4 bytes para uma saída 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

Precisa executar com a -nopção

/ (.+) /&&print$1

Experimente online!

Queria fazer algo semelhante no sed primeiro, mas, infelizmente, ele não suporta quantificadores não-gananciosos. É necessário caso o nome do meio tenha mais de uma palavra.

Editar

-9 bytes graças a Dada .

O quantificador não ganancioso não é mais necessário, entre outras coisas.


/ (.+) /&&print$1deve ser classificador. Ótimo ver novas pessoas jogando golfe com o Perl!
Dada

@ Dadá Obrigado pela dica! Na verdade, é a minha primeira vez escrevendo em Perl. Você sabe por print if s| (.+) |\1|que não funciona? Para mim, parece semelhante ao que você escreveu.
Maxim Mikhaylov

print if s| (.+) |\1|substitui a parte do meio por ... a parte do meio! (menos os espaços antes e depois), para que não funcione. Por outro lado, o que sugeri corresponde apenas à parte do meio e imprime apenas ( $1).
Dada

4

Javascript (ES6) 49 16 bytes

Editar:

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

Experimente online!

ungolfed:

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

Esqueci algumas das propriedades simples de slice, e que a entrada pode ser uma matriz. Graças a @Neil e @ fəˈnɛtɪk, consegui remover 27 bytes. Ainda não está realmente competindo.

Original:

Isso não é realmente competitivo, mas aqui está uma solução Javascript:

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

Isso cria uma função 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.
}

Como eu jogava golfe

Este é um golfe bem simples. Eu transformei a função em uma função de seta . Então eu "minifiquei" o código. Isso incluiu renomear nameem um único caractere ( aneste caso) e remover a letdecloração da variável.

Snippet

Espero que isso ajude quem está preso ao desafio.


O length -é desnecessário, pois slicejá aceita comprimentos negativos como sendo relativos ao final. Isso significa que você não precisa mais da variável intermediária, para poder transformar sua função de seta de um bloco em uma expressão.
Neil

Na verdade, o modo como funciona é -1o último, mas o necessário aqui.
Neil

Também é fatia (1, -1). fatia (1, -2) remove duas do final.
Feven'tɪk 3/04

Você também pode assumir que recebeu uma matriz para começar, o que permite executar apenas uma fatia e pronto.
fənɛtɪk

Tenho 99% de certeza de que isso foi alterado desde que o iniciei. Obrigado novamente.
David Archibald


3

Geléia , 2 bytes

ḊṖ

Experimente online!

Isso funciona como um link não embutido (ou seja, função), não como um programa completo.

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

Como um programa completo, seria 3 bytes:, ḊṖKque imprime um nome do meio separado por espaço.



3

C #, 67 bytes

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

Função anônima que identifica a primeira ocorrência do caractere de espaço e a última e extrai o meio. Também extrai um espaço à direita, que pode ser removido ao custo de 2 bytes.

Programa completo com casos de teste:

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

Solução atual devido ao usuário11599!

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

Pega a entrada de stdin, retorna cada nome do meio como uma sequência separada. Retorna character()no caso de nenhum nome do meio; isto é, um vetor de classe characterde comprimento 0.

Explicação:

Leia stdin em uma lista de strings, separadas por espaços

     scan(,'')

Remova o último elemento. headretorna os primeiros nelementos de uma lista, com o npadrão para 6. Se nfor -1, retorna tudo, exceto o último elemento.

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

Agora, remova o primeiro elemento desta lista.

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

Isso produz o (s) nome (s) do meio.


1
Ainda mais curto: cabeçalho (varredura (, ''), - 1) [- 1] 22 bytes. Observe que '' são duas aspas simples.
precisa saber é o seguinte

Se você não quiser que cada nome seja citado, use, em 27 bytes, cat (head (scan (, ''), - 1) [- 1])
user11599

Explicação: scan (, '') quebra a string em palavras, head (..., - 1) solta a última palavra, head (..., - 1) [- 1] e depois solta a primeira palavra, cat () formata a saída soltando as aspas. Para nenhum nome do meio, o resultado não é perfeito, é o caractere (0), a string vazia.
precisa saber é o seguinte

@ user11599 Uau, obrigado! Eu brincava com head()e tail(), mas não sabia que você poderia passar um número negativo como segundo argumento. Agradável!
precisa saber é o seguinte

Seu uso da digitalização (, '') me inspirou. Não pensei em me aproximar dessa maneira.
precisa saber é o seguinte

3

Ruby, 24 13 bytes

p ARGV[1..-2]

11 bytes salvos graças ao Piccolo, indicando que a saída do tipo matriz é permitida.

Leva o nome como argumentos de linha de comando separados, por exemplo:

$ ruby script.rb John Jacob Jingleheimer Schmidt

ou

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

Código anterior (gera uma sequência adequada):

puts ARGV[1..-2].join" "

@ Jordan Boa idéia - no entanto, com $><<ARGV[1..-2].join" "queixa sobre o " "inesperado, então eu teria que adicionar parênteses - o que adicionaria 1 byte no final.
Flambino 03/04/19

Ah, claro. Minha culpa.
Jordânia

O pôster original dizia que a saída pode ser uma matriz, para que você possa raspar alguns caracteres mudando seu código para puts ARGV[1..-2], apenas para que você saiba.
Piccolo

@Piccolo Huh? Eu não vejo isso em lugar algum? Se for verdade; p ARGV[1..-2]para 13 bytes - apenas parece em nada com a saída em OPs desafiar
Flambino


3

Golang , 152 81 bytes

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

Ele recebe a entrada como "Samantha Vee Hills" (com aspas duplas) e retorna o nome do meio ao stdout.

Experimente Online!

Edit: @Dada, observe que a "função como resposta é permitida" diminui meu código 71 bytes. um grande obrigado!


Bem-vindo ao site. O envio de uma função como resposta é permitido, para que você possa encurtar o seu código fazendo algo assim: Experimente online! . Dê uma olhada nas dicas para jogar golfe no Go !
Dada

obrigado @Dada por dicas e encurte meu código. Foi a minha primeira 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

Recebe uma sequência de entrada, s é dividida (pelo delimitador padrão, espaço em branco char) em uma matriz de células, a partir da qual o elemento do meio é acessado. Em seguida, os elementos do meio são concatenados ou uma string vazia é retornada.

Edit: obrigado a Luis Mendo por salvar 3 bytes!

Edit 2: Melhor solução do Ankit!


Eu não sou um homem inteligente! editado.
Owen Morgan #

Você não pode usar nnzem uma matriz celular, mas eu fiz as outras duas alterações :)
Owen Morgan

Edição sugerida por Ankit , que não tem representante suficiente 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));}

O parâmetro é uma matriz de ponteiros terminada em NULL para char.

Veja como funciona aqui .

Os argumentos da linha de comando também podem ser usados ​​com a mesma função .

C, 51 bytes

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

Um programa completo. A entrada é feita através de argumentos de linha de comando.

Veja como funciona aqui .

C, 54 bytes

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

O parâmetro é um parâmetro de entrada / saída.

Veja como funciona aqui .


Bem-vindo ao PPCG!
Martin Ender

Estou recebendo o seguinte erro ao compilar com o Visual Studio 2012: erro C2100: engano ilegal
Johan du Toit

O @JohanduToit VS não está em conformidade com C11 ou C99. Meu código é Como prova prática, o gcc e o clang compilam um programa válido.
2501

2

Python 2, 42. 19 16 bytes

lambda n:n[1:-1]

Experimente online! Obrigado a @Kritixi Lithos por salvar 23 bytes! Obrigado @math_junkie por salvar mais 3 bytes. Para entrada, coloque cada parte do nome como uma string em uma lista da seguinte maneira:

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

E sim, o OP aprovou uma lista para ser uma entrada válida.

Explicação

lambda n:n[1:-1]    # Returns only the middle elements... pretty literal here

1
print input()[1:-1]é mais curto
Kritixi Lithos 2/17/17

Slicing Primavera certeza é complicado
Anthony Pham

lambda n:n[1:-1]é ainda menor
matemática viciado em

1
Eu posso ter tentado com uma entrada errada. Mas quando tentei, com Samantha Vee Hillscomo entrada o link repl.it que você compartilhou, isso apenas imprime, o amantha Vee Hillque definitivamente não é a saída necessária.
Keerthana Prabhakaran

2
Names will always have at least 2 space-separated partsé o primeiro ponto da pergunta correta.
Keerthana Prabhakaran /

2

C ++, 91 bytes

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

Recebe a entrada como referência a uma lista de cadeias e modifica a lista diretamente.

Experimente online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.