Qual è il mio secondo nome?


30

Nota: la risposta vincente sarà selezionata il 4/12/17, il vincitore attuale è Jolf, 1 byte .

Sono sorpreso che non abbiamo ancora avuto una sfida sul mio secondo nome su questo sito. Ho fatto molte ricerche ma non ho trovato nulla. Se si tratta di un dup, contrassegnalo come tale.

La tua sfida

Analizza una stringa che assomiglia Jo Jean Smithe ritorna Jean.

Casi 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 

(Quest'ultimo non è corretto tecnicamente, ma risolverlo sarebbe troppo difficile.)

Gli appunti:

  • I nomi avranno sempre almeno 2 parti separate da spazio, con nomi secondari illimitati tra loro o possono essere un elenco / matrice di stringhe.
  • I nomi possono contenere l'alfabeto (senza distinzione tra maiuscole e minuscole) e - ( 0x2d)
  • È possibile generare una nuova riga finale.
  • Potrebbe essere necessario un input per avere una nuova riga finale.
  • È consentito l'input da STDIN, un parametro di funzione o un argomento della riga di comando, ma non è consentito codificarlo.
  • Scappatoie standard vietate.
  • L'output può essere il valore di ritorno della funzione, STDOUT, STDERR, ecc.
  • Sono consentiti spazi finali / newline / tab nell'output.
  • Qualsiasi domanda? Commenta sotto!

Questo è , quindi vince la risposta più breve in byte!


2
L'output può essere un elenco di stringhe?
Anthony Pham,

5
Se sono consentiti formati diversi da una stringa separata da spazio, modificarlo nella specifica.
Martin Ender,

5
@ programmer5000: se l'input può essere un elenco di stringhe, che ne dici dell'output? È ["John", "Jacob", "Jingleheimer", "Schmidt"]-> ["Jacob", "Jingleheimer"]una soluzione valida?
nimi,

3
Sono ammessi spazi iniziali?
Betseg,

2
@DJ Perché "Van" non è il suo secondo nome, fa parte del suo cognome. Un caso particolarmente preoccupante è David Lloyd George, il cui nome è David e il cognome è Lloyd George. Ogni tentativo di analizzare nomi di persone reali come questo è condannato. In effetti, non puoi nemmeno dire quali sono il nome e il cognome (pensa Li Shi).
David Conrad,

Risposte:


4

Jolf, 1 byte

Ottiene l'interno dell'input. Provalo qui!


Non riesco a ottenere l'esempio in esecuzione - nulla sembra accadere quando faccio clic su uno dei pulsanti. Utilizzando Chrome 57.0.2987.133

@YiminRong Posso solo assicurarmi che funzioni su Firefox.
Conor O'Brien,

44

Ohm , 2 byte (CP437)

Accetta e restituisce un elenco di stringhe.

()

Spiegazione:

()   Main wire, arguments: a

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

10
Lo strumento giusto per il lavoro credo
Rohan Jhunjhunwala,

15

Vim, 6 5 byte

dW$BD

Provalo online!

(output con uno spazio finale)

Poiché Vim è retrocompatibile con V, ho incluso un collegamento TIO per V.

Spiegazione

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, mi hai battuto. dWWDti salva un byte.
DJMcMayhem

5
@DJMcMayhem Funziona solo per un secondo nome.
Martin Ender,

Qual è la differenza tra dW e dw?
Duncan X Simpson

1
@DuncanXSimpson dWelimina fino allo spazio bianco. dwelimina fino a caratteri non di parole.
Finanzia la causa di Monica il

14

Python , 24 byte

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

Prova l'input di stringa online!

Formato di input: stringa


Python 2 , 16 byte

lambda n:n[1:-1]

Provalo input elenco online!

Formato di input: elenco


Dovresti modificare il titolo con Pythoninvece di Python 2, perché funziona anche per Python 3, stava per pubblicarlo.
Mr. Xcoder,

@ L3viathan poiché OP non ha menzionato il formato di output must be a stringe poiché il formato di input può essere un elenco, la stampa di un elenco non può essere considerata come un risultato errato!
Keerthana Prabhakaran,

In base ai commenti sulla domanda, è possibile sia immettere che produrre un elenco di stringhe. Salva un sacco di bytelambda n:n[1:-1]
Luke Sawczak,

1
Poiché puoi leggere da STDIN, puoi sostituire la lambda con input()(solo Python 3)
BallpointBen,

Hai ragione. Grazie. Ho aggiunto le modifiche!
Keerthana Prabhakaran,

13

Brain-Flak , 133 byte

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

Provalo online!

132 byte di codice, più 1 byte per il -cflag che consente input e output ASCII.

Sfortunatamente, questo contiene molti codici duplicati, ma sarebbe davvero difficile riutilizzarli. Ci penserò più tardi. Ecco una spiegazione:

#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 byte quando si rimuovono i commenti. Ho aggiunto i primi due e l'ultima riga. TIO
Riley,

@Riley Cool soluzione. Sentiti libero di postarlo tu stesso!
DJMcMayhem


12

Haskell, 23 , 17 9 byte

init.tail

Prende e restituisce un elenco di stringhe. Provalo online!

Rilascia la prima stringa, elimina l'ultima stringa.

Modifica: @Generic Display Name ha notato che l'input può essere un elenco di stringhe, che ha salvato 6 byte.

Modifica II: restituisce un elenco di stringhe anziché una singola stringa


Sembra che sia consentito inserire un elenco, quindi rilascia le parole per -5 byte
Nome visualizzato generico

@GenericDisplayName: Oh, non me ne sono accorto. Grazie!
nimi,

La mia risposta di Ohm e Mathematica rispondono anche a entrambi gli elenchi di output delle stringhe, quindi potresti probabilmente scendere unwords.per -8 byte.
Nick Clifford,

@NickClifford: sì, l'ho visto io stesso e ho chiesto chiarimenti all'OP.
nimi,

11

Mathematica, 10 byte

Rest@*Most

Una funzione senza nome che accetta e restituisce un elenco di stringhe.

Restscarta l'ultimo elemento, Mostscarta il primo elemento, @*è la composizione della funzione. Anche lo scambio Reste / Mosto l'uso della giusta composizione /*invece avrebbe funzionato. Questo batte l'indicizzazione tramite #[[2;;-2]]&di un byte.


10

Brain-Flak , 86 byte

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

Provalo online!

Gran parte di questo codice deriva da questa risposta . Se ti piace la mia soluzione, dovresti votare anche quella.

#Push 2
(()())

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

  #While not a space
  {
      #Pop
      {}

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

  #Endwhile
  }

  #Pop the 0
  {}

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

#End loop twice
>)}{}

Molto bene! Non ho pensato di tenere un contatore per spingere più tardi, quindi ho trascorso troppo tempo a pensare a come passare da una pila all'altra.
DJMcMayhem

8

Java 7, 74 byte

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

Java 8, 49 byte

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

Funzione che identifica la prima occorrenza del carattere spaziale e l'ultima ed estrae il centro. La stringa risultante è preceduta da un carattere spazio (al momento della pubblicazione, OP non ha chiarito se sono ammessi spazi iniziali), che può essere eliminato aggiungendo .trim()al codice per un costo aggiuntivo di 7 byte.

Rispetto a C #, Java ha il vantaggio di specificare l'indice finale anziché la lunghezza della sottostringa, il che riduce il conteggio dei byte.


7

JavaScript (ES6), 22 byte

Prende e genera una serie di stringhe.

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

Casi test

Versione stringa (27 byte)

Prende e genera una stringa. La stringa di output è un singolo spazio se non viene trovato il secondo nome, oppure i nomi secondari con spazi iniziali e finali.

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


/./.exec.bind(/ .* /)sembra imitare il n. 2, tranne nullnessuno
dandavis il

7

AWK , 17 10 byte

Salvato 7 byte grazie a @steve!

$NF=$1=x;1

Provalo online!

Spiegazione:

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

Può essere rasato fino a 11 byte,$NF=$1="";1
steve

3
Oppure 10 utilizzando$NF=$1=x;1
steve

1
@steve cosa fa 1? Non sono così bravo in AWK :)
betseg il

1 significa solo eseguire l'azione predefinita, ovvero stampare $ 0.
steve

6

Groovy , 19 byte

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

Spiegazione:

{        
 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 funzione di chiusura / anonima


1
Benvenuti in PPCG! Puoi prendere un elenco di stringhe come input per saltare il .split()?
Martin Ender,

Martin Ender Sì, se supponi che l'input sia sempre un elenco di stringhe, allora {it [1 ..- 2]} funzionerebbe.
staticmethod

5

PHP, 37 byte

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

-4 byte per un output come array

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

PHP, 42 byte

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

PHP, 50 byte

echo preg_filter("#(^[^\s]+ |[^\s]+$)#","",$argn);

4

Retina , 11 byte

^\S+ |\S+$

Provalo online!

Corrisponde alla prima parola (compreso lo spazio dopo) e all'ultima parola e rimuove entrambe.

Se l'I / O può essere un elenco separato da avanzamento riga, può invece essere eseguito in 8 byte:

A1`
G-2`

Provalo online!


4

Perl 5 , 27 18 byte

È necessario eseguire con l' -nopzione.

/ (.+) /&&print$1

Provalo online!

Volevo fare prima qualcosa di simile in sed, ma, sfortunatamente, non supporta quantificatori non avidi. È necessario nel caso in cui il secondo nome sia più di una parola.

modificare

-9 byte grazie a Dada .

Il quantificatore non avido non è più necessario, tra le altre cose.


/ (.+) /&&print$1dovrebbe essere più sorter. È bello vedere nuove persone giocare a golf con Perl!
Dada,

@Dada Grazie per la punta! In realtà è la prima volta che scrivo in Perl. Sai perché print if s| (.+) |\1|non funziona? A me sembra simile a quello che hai scritto.
Maxim Mikhaylov,

print if s| (.+) |\1|sostituisce la parte centrale con ... la parte centrale! (meno gli spazi prima e dopo), quindi non funziona. Dall'altro lato, ciò che ho suggerito corrisponde solo alla parte centrale e stampa solo ( $1).
Dada,

4

Javascript (ES6) 49 16 byte

Modificare:

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

Provalo online!

ungolfed:

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

Ho dimenticato alcune delle semplici proprietà di slicee che l'input può essere un array. Grazie a @Neil e @ fəˈnɛtɪk sono stato in grado di rimuovere 27 byte. Ancora non competere davvero.

Originale:

Questo non è davvero in competizione ma ecco una soluzione Javascript:

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

Questo crea una funzione anonima pari 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.
}

Come l'ho giocato a golf

Questo è un golf piuttosto semplice. Ho trasformato la funzione in una funzione freccia . Quindi ho "minimizzato" il codice. Ciò includeva la ridenominazione namein un singolo carattere ( ain questo caso) e la rimozione della letdeclorazione della variabile.

Frammento

Spero che questo aiuti chiunque sia bloccato sulla sfida.


Non length -è necessario, poiché sliceaccetta già lunghezze negative come relative alla fine. Ciò significa che non è più necessaria la variabile intermedia, quindi è possibile trasformare la funzione freccia da un blocco in un'espressione.
Neil,

In realtà il modo in cui funziona è -1l'ultimo, ma quello di cui hai bisogno qui.
Neil,

È anche slice (1, -1). slice (1, -2) ne rimuove due dalla fine.
fəˈnɛtɪk,

Puoi anche presumere che ti sia passato un array per cominciare, il che ti consente di eseguire lo slice e il gioco è fatto.
fəˈnɛtɪk,

Sono sicuro al 99% che è stato cambiato da quando l'ho avviato. Grazie ancora.
David Archibald,

3

Röda , 9 byte

{_[1:-1]}

Provalo online!

Non è una soluzione molto interessante. Prende un elenco dallo stream e restituisce i nomi secondari.

21 byte e I / O:

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

Provalo online!

Questo utilizza /(diviso) e &(unisci).


3

Gelatina , 2 byte

ḊṖ

Provalo online!

Funziona come un collegamento non in linea (cioè funzione), non un programma completo.

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

Come programma completo, sarebbe di 3 byte:, ḊṖKche stampa un secondo nome separato da spazi.



3

C #, 67 byte

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

Funzione anonima che identifica la prima occorrenza del carattere spaziale e l'ultima ed estrae il centro. Estrae anche uno spazio finale, che può essere rimosso al costo di 2 byte.

Programma completo con casi di test:

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

VBA, 69 byte

Sub m(n)
f=InStr(1,n," ")
Debug.?Mid(n,f+1,InStrRev(n," ")-f)
End Sub

3

R, 30 27 22 byte

Soluzione attuale dovuta all'utente11599!

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

Prende input da stdin, restituisce ogni secondo nome come una stringa separata. Restituisce character()in caso di non secondo nome; cioè un vettore di classe characterdi lunghezza 0.

Spiegazione:

Leggi lo stdin in un elenco di stringhe, separate da spazi

     scan(,'')

Rimuovi l'ultimo elemento. headrestituisce i primi nelementi di un elenco, con nimpostazione predefinita su 6. If nis -1restituisce tutto tranne l'ultimo elemento.

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

Ora, rimuovi il primo elemento di questo elenco.

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

Questo produce il secondo nome (i).


1
Ancora più breve: head (scan (, ''), - 1) [- 1] 22 byte. Nota che '' sono due virgolette singole.
user11599

Se non si desidera citare ciascun nome, utilizzare, a 27 byte, cat (head (scan (, ''), - 1) [- 1])
user11599

Spiegazione: scan (, '') spezza la stringa in parole, head (..., - 1) rilascia l'ultima parola, head (..., - 1) [- 1] quindi rilascia la prima parola, cat () formatta l'output rilasciando le virgolette. Per nessun secondo nome, il risultato non è perfetto, è il carattere (0), la stringa vuota.
user11599

@ user11599 Wow, grazie! Avevo giocato con head()e tail(), ma non sapevo che potresti passare un numero negativo come secondo argomento. Bello!
rturnbull,

Il tuo uso di scan (, '') mi ha ispirato. Non pensavo di avvicinarmi in quel modo.
user11599

3

Rubino, 24 13 byte

p ARGV[1..-2]

Salvato 11 byte grazie a Piccolo che sottolinea che è consentito un output simile a array.

Prende il nome come argomento separato da riga di comando, ad esempio:

$ ruby script.rb John Jacob Jingleheimer Schmidt

o

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

Codice precedente (genera una stringa corretta):

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

@Jordan Buona idea - tuttavia $><<ARGV[1..-2].join" "si lamenta del fatto di " "essere inaspettato, quindi dovrei aggiungere parentesi - che aggiungerebbe 1 byte alla fine.
Flambino,

Ah certo. Colpa mia.
Giordania,

Il poster originale diceva che l'output può essere un array, quindi puoi radere alcuni caratteri semplicemente cambiando il tuo codice in puts ARGV[1..-2], solo così sai.
Piccolo

@Piccolo Huh? Non lo vedo da nessuna parte? Se è vero; p ARGV[1..-2]per 13 byte - non assomiglia affatto all'output nella sfida OP
Flambino


3

Golang , 152 81 byte

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

Prende input come "Samantha Vee Hills" (con virgolette doppie) e restituisce il secondo nome allo stdout.

Provalo online!

Modifica: @Dada, nota che la "funzione come risposta è consentita" accorcia il mio codice di 71 byte. un grande grazie!


Benvenuti nel sito. L'invio di una funzione come risposta è consentito, quindi è possibile abbreviare il codice facendo una cosa del genere: Provalo online! . Dai un'occhiata ai suggerimenti per giocare a golf in Go !
Dada,

grazie @Dada per suggerimenti e abbrevia il mio codice. Era la mia prima voce di codice.
ersinakyuz,

3

Matlab, 81 , 79 , 78 , 55 byte

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

Accetta una stringa di input, s viene diviso (dal delimitatore predefinito, char spazi bianchi) in una matrice di celle, da cui si accede all'elemento centrale. Quindi gli elementi intermedi vengono concatenati o viene restituita una stringa vuota.

Modifica: grazie a Luis Mendo per aver salvato 3 byte!

Modifica 2: soluzione migliore da Ankit!


Non sono un uomo intelligente! modificato.
Owen Morgan,

Non è possibile utilizzare nnzsu un array di celle, ma ho fatto le altre due modifiche :)
Owen Morgan,

Modifica suggerita da Ankit , che non ha abbastanza rappresentante per commentare. (55 byte):function x=a(s) s=strsplit(s);x=strjoin(s(2:end-1));end
mbomb007,

3

C, 42 byte

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

Il parametro è un array terminato NULL di puntatori a char.

Guarda che funziona qui .

Gli argomenti della riga di comando possono anche essere usati con la stessa funzione .

C, 51 byte

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

Un programma completo. L'input viene effettuato tramite argomenti della riga di comando.

Guarda che funziona qui .

C, 54 byte

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

Il parametro è un parametro in / out.

Guardalo funziona qui .


Benvenuti in PPCG!
Martin Ender,

Ricevo il seguente errore durante la compilazione con Visual Studio 2012: errore C2100: indiretto illegale
Johan du Toit

@JohanduToit VS non è conforme a C11 o C99. Il mio codice è. Come prova pratica, sia gcc che clang compilano un programma valido.
2501,

2

Python 2, 42 19 16 byte

lambda n:n[1:-1]

Provalo online! Grazie a @Kritixi Lithos per aver salvato 23 byte! Grazie @math_junkie per aver salvato altri 3 byte. Per l'input, inserisci ogni parte del nome come stringa all'interno di un elenco in questo modo:

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

E sì, l'OP ha approvato un elenco come input valido.

Spiegazione

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

1
print input()[1:-1]è più corto
Kritixi Lithos

Il taglio di primavera è sicuramente complicato
Anthony Pham,

lambda n:n[1:-1]è ancora più breve
drogato di matematica il

1
Potrei aver provato con un input sbagliato. Ma quando ho provato, con Samantha Vee Hillscome input nel link repl.it che hai condiviso, questo stampa semplicemente amantha Vee Hillche non è sicuramente l'output richiesto.
Keerthana Prabhakaran,

2
Names will always have at least 2 space-separated partsè il primo punto della domanda giusto.
Keerthana Prabhakaran,

2

C ++, 91 byte

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

Prende l'input come riferimento a un elenco di stringhe e modifica direttamente l'elenco.

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.