Jakie jest moje drugie imię?


30

Uwaga: Zwycięska odpowiedź zostanie wybrana na dzień 12.12.17 . Aktualnym zwycięzcą jest Jolf, 1 bajt .

Dziwię się, że nie mieliśmy jeszcze wyzwania, jak brzmi moje drugie imię na tej stronie. Dużo szukałem, ale nic nie znalazłem. Jeśli jest to duplikat, oznacz go jako taki.

Twoje wyzwanie

Analizuj ciąg znaków, który wygląda Jo Jean Smithi zwraca Jean.

Przypadki testowe

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 

(Ten ostatni jest nieprawidłowy technicznie, ale jego naprawa byłaby zbyt trudna.)

Uwagi:

  • Nazwy zawsze będą miały co najmniej 2 części oddzielone spacjami, z nieograniczoną liczbą środkowych nazw między nimi lub mogą być listą / tablicą ciągów.
  • Nazwy mogą zawierać alfabet (bez rozróżniania wielkości liter) i - ( 0x2d)
  • Możesz wygenerować końcowy znak nowej linii.
  • Możesz potrzebować danych wejściowych, aby mieć końcowy znak nowej linii.
  • Dane wejściowe ze STDIN, parametru funkcji lub argumentu wiersza polecenia są dozwolone, ale nie jest dozwolone ich kodowanie na stałe.
  • Standardowe luki zabronione.
  • Wyjściem może być wartość zwracana przez funkcję, STDOUT, STDERR itp.
  • Końcowe spacje / znaki nowej linii / tabulatory w danych wyjściowych są dozwolone.
  • Jakieś pytania? Komentarz poniżej!

To jest , więc wygrywa najkrótsza odpowiedź w bajtach!


2
Czy wyjście może być listą ciągów?
Anthony Pham

5
Jeśli dozwolone są inne formaty niż łańcuch rozdzielany spacjami, edytuj to w specyfikacji.
Martin Ender

5
@ programmer5000: jeśli wejściem może być lista ciągów, co powiesz na wynik? Czy ["John", "Jacob", "Jingleheimer", "Schmidt"]-> ["Jacob", "Jingleheimer"]prawidłowe rozwiązanie?
nimi

3
Czy dozwolone są spacje wiodące?
betseg

2
@DJ Ponieważ „Van” nie jest jego drugim imieniem, jest częścią jego nazwiska. Szczególnie dokuczliwym przypadkiem jest David Lloyd George, którego imię to David, a nazwisko to Lloyd George. Każda próba parsowania prawdziwych nazwisk ludzi jest skazana na niepowodzenie. W rzeczywistości nie możesz nawet powiedzieć, jakie są imiona i nazwiska (pomyśl Li Shi).
David Conrad,

Odpowiedzi:


4

Jolf, 1 bajt

Pobiera wnętrze danych wejściowych. Wypróbuj tutaj!


Nie można uruchomić przykładu - wydaje się, że nic się nie dzieje po kliknięciu dowolnego przycisku. W przeglądarce Chrome 57.0.2987.133

@YiminRong Mogę tylko zapewnić, że będzie działać na Firefoxie.
Conor O'Brien

44

Om , 2 bajty (CP437)

Akceptuje i zwraca listę ciągów znaków.

()

Wyjaśnienie:

()   Main wire, arguments: a

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

10
Chyba właściwe narzędzie do pracy
Rohan Jhunjhunwala

15

Vim, 6 5 bajtów

dW$BD

Wypróbuj online!

(wyjścia z końcową spacją)

Ponieważ Vim jest wstecznie kompatybilny z V, dołączyłem łącze TIO dla V.

Wyjaśnienie

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, pobiłeś mnie do tego. dWWDoszczędza jeden bajt.
DJMcMayhem

5
@DJMcMayhem To działa tylko dla dokładnie jednego drugiego imienia.
Martin Ender

Jaka jest różnica między dW i dw?
Duncan X Simpson

1
@DuncanXSimpson dWusuwa się do spacji. dwusuwa aż do znaków innych niż słowa.
Pozew funduszu Moniki

14

Python , 24 bajty

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

Spróbuj wpisać ciąg znaków online!

Format wejściowy: ciąg


Python 2 , 16 bajtów

lambda n:n[1:-1]

Wypróbuj wprowadzanie listy online!

Format wejściowy: lista


Powinieneś edytować tytuł za pomocą Pythonzamiast Python 2, ponieważ on również działa Python 3, właśnie miał to opublikować.
Pan Xcoder,

@ L3viathan, ponieważ OP nie wspomniał o formacie wyjściowym must be a string, a ponieważ formatem wejściowym może być lista, wydrukowanie listy nie może być uważane za zły wynik!
Keerthana Prabhakaran

Zgodnie z komentarzami do pytania możesz zarówno wprowadzać, jak i wyprowadzać listę ciągów. Zaoszczędź sporo bajtówlambda n:n[1:-1]
Łukasz Sawczak

1
Ponieważ możesz czytać ze STDIN, możesz zastąpić lambda input()(tylko Python 3)
BallpointBen

Masz rację. Dzięki. Dodałem zmiany!
Keerthana Prabhakaran

13

Brain-Flak , 133 bajty

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

Wypróbuj online!

132 bajty kodu plus 1 bajt dla -cflagi, która umożliwia wejście i wyjście ASCII.

Niestety zawiera wiele zduplikowanych kodów, ale ponowne użycie byłoby naprawdę trudne. Zajmę się tym później. Oto wyjaśnienie:

#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 bajtów po usunięciu komentarzy. Dodałem pierwsze dwa i ostatni wiersz. TIO
Riley,

@riley Cool rozwiązanie. Możesz to opublikować samodzielnie!
DJMcMayhem


12

Haskell, 23 , 17 9 bajtów

init.tail

Pobiera i zwraca listę ciągów znaków. Wypróbuj online!

Upuść pierwszy ciąg, upuść ostatni ciąg.

Edycja: @Generic Nazwa wyświetlana zauważyła, że ​​wejściem może być lista ciągów znaków, która pozwoliła zaoszczędzić 6 bajtów.

Edycja II: zwraca listę ciągów zamiast pojedynczego ciągu


Wygląda na to, że wejście jest dozwolone jako lista, więc upuść słowa na -5 bajtów
ogólna nazwa wyświetlana

@GenericDisplayName: Och, nie zauważyłem. Dzięki!
nimi

Moja odpowiedź Ohm i Mathematica odpowiadają również na obie listy wyjściowe ciągów, więc prawdopodobnie możesz upuścić unwords.-8 bajtów.
Nick Clifford,

@NickClifford: tak, sam to widziałem i poprosiłem OP o wyjaśnienia.
nimi

11

Mathematica, 10 bajtów

Rest@*Most

Nienazwana funkcja, która przyjmuje i zwraca listę ciągów znaków.

Restodrzuca ostatni element, Mostodrzuca pierwszy element, @*jest składnikiem funkcji. Działa również zamiana Resti / Mostlub użycie właściwej kompozycji /*. To bije indeksowanie #[[2;;-2]]&o jeden bajt.


10

Brain-Flak , 86 bajtów

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

Wypróbuj online!

Większość tego kodu pochodzi z tej odpowiedzi . Jeśli podoba ci się moje rozwiązanie, również go poprzyj.

#Push 2
(()())

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

  #While not a space
  {
      #Pop
      {}

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

  #Endwhile
  }

  #Pop the 0
  {}

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

#End loop twice
>)}{}

Dobra robota! Nie myślałem o trzymaniu licznika do pchania później, więc zbyt długo zastanawiałem się, jak ominąć różne stosy.
DJMcMayhem

8

Java 7, 74 bajty

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

Java 8, 49 bajtów

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

Funkcja, która identyfikuje pierwsze wystąpienie znaku spacji i ostatnią i wyodrębnia środek. Powstały ciąg jest poprzedzony znakiem spacji (w momencie księgowania OP nie wyjaśnił, czy dozwolone są spacje wiodące), co można wyeliminować przez dodanie.trim() do kodu dodatkowy koszt 7 bajtów.

W porównaniu do C #, Java ma tę zaletę, że określa indeks końcowy zamiast długości podciągu, co zmniejsza liczbę bajtów.


7

JavaScript (ES6), 22 bajty

Pobiera i wyświetla tablicę ciągów.

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

Przypadki testowe

Wersja łańcuchowa (27 bajtów)

Bierze i wysyła ciąg. Łańcuch wyjściowy jest albo pojedynczą spacją, jeśli nie znaleziono drugiego imienia, albo imionami środkowymi ze spacjami wiodącymi i końcowymi.

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


/./.exec.bind(/ .* /)zdaje się naśladować # 2, z wyjątkiem nullżadnego
dandavis,

7

AWK , 17 10 bajtów

Zaoszczędź 7 bajtów dzięki @steve!

$NF=$1=x;1

Wypróbuj online!

Wyjaśnienie:

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

Można go ogolić do 11 bajtów,$NF=$1="";1
Steve

3
Lub 10 za pomocą$NF=$1=x;1
Steve

1
@steve co robi 1? Nie jestem zbyt dobry w AWK :)
betseg

1 oznacza po prostu domyślną akcję, czyli wydrukowanie 0 USD.
Steve,

6

Groovy , 19 bajtów

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

Wyjaśnienie:

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

Funkcja zamknięcia / anonimowości


1
Witamy w PPCG! Czy możesz wziąć listę ciągów jako dane wejściowe, aby pominąć .split()?
Martin Ender,

Martin Ender Tak, jeśli założymy, że wejście zawsze będzie listą łańcuchów, wtedy {it [1 ..- 2]} zadziała.
staticmethod

5

PHP, 37 bajtów

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

-4 bajty dla wyjścia w postaci tablicy

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

PHP, 42 bajty

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

PHP, 50 bajtów

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


4

Perl 5 , 27 18 bajtów

Musisz uruchomić z -nopcją.

/ (.+) /&&print$1

Wypróbuj online!

Chciałem najpierw zrobić coś podobnego w sed, ale niestety nie obsługuje on nie chciwego kwantyfikatora. Jest potrzebny, jeśli drugie imię to więcej niż jedno słowo.

Edytować

-9 bajtów dzięki Dadzie .

Nie chciwy kwantyfikator nie jest już potrzebny, między innymi z innymi rzeczami.


/ (.+) /&&print$1powinien być lepszy. Wspaniale jest zobaczyć nowych ludzi grających w golfa z Perlem!
Dada,

@Dada Dzięki za wskazówkę! To właściwie mój pierwszy raz w Perlu. Czy wiesz dlaczego print if s| (.+) |\1|nie działa? Dla mnie wygląda podobnie do tego, co napisałeś.
Maxim Mikhaylov

print if s| (.+) |\1|zamienia środkową część na ... środkową część! (minus spacje przed i po), więc to nie działa. Z drugiej strony to, co zasugerowałem, pasuje tylko do środkowej części i wypisuję tylko to ( $1).
Dada,

4

JavaScript (ES6) 49 16 bajtów

Edytować:

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

Wypróbuj online!

bez golfa:

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

Zapomniałem niektórych prostych właściwości slicei że dane wejściowe mogą być tablicą. Dzięki @Neil i @ fəˈnɛtɪk udało mi się usunąć 27 bajtów. Wciąż mało konkurencyjny.

Oryginalny:

To nie jest tak naprawdę konkurencyjne, ale oto rozwiązanie JavaScript:

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

To tworzy anonimową funkcję równą:

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

Jak to grałem w golfa

To całkiem prosty golf. Przekształciłem funkcję w funkcję strzałki . Następnie „zminimalizowałem” kod. Obejmowało to zmianę nazwy namena pojedynczy znak ( aw tym przypadku) i usunięcie letodbarwienia zmiennej.

Skrawek

Mam nadzieję, że pomoże to każdemu, kto utknął na wyzwaniu.


Jest length -to niepotrzebne, ponieważ slicejuż przyjmuje ujemne długości w stosunku do końca. Oznacza to, że nie potrzebujesz już zmiennej pośredniej, więc możesz zmienić funkcję strzałki z bloku na wyrażenie.
Neil,

Właściwie to działa tak, że -1jest to przedostatni, którego potrzebujesz tutaj.
Neil,

Jest to również plasterek (1, -1). wycinek (1, -2) usuwa dwa z końca.
fəˈnɛtɪk

Możesz również założyć, że na początku przekazano Ci tablicę, co pozwala po prostu wykonać wycięcie i gotowe.
fəˈnɛtɪk

Jestem 99% pewien, że to się zmieniło, odkąd go uruchomiłem. Dzięki jeszcze raz.
David Archibald


3

Galaretka , 2 bajty

ḊṖ

Wypróbuj online!

Działa to jako nieliniowy link (tj. Funkcja), a nie pełny program.

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

Jako pełny program będzie to 3 bajty:, ḊṖKktóre wypisuje drugie imię oddzielone spacją.



3

C #, 67 bajtów

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

Anonimowa funkcja, która identyfikuje pierwsze wystąpienie znaku spacji i ostatnią i wyodrębnia środek. Wyodrębnia również końcowe miejsce, które można usunąć kosztem 2 bajtów.

Pełny program z przypadkami testowymi:

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 bajtów

Aktualne rozwiązanie dla użytkownika11599!

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

Pobiera dane wejściowe ze standardowego wejścia, zwraca każde drugie imię jako osobny ciąg. Zwraca character()w przypadku braku drugiego imienia; to jest wektor klasy characterdługości 0.

Wyjaśnienie:

Wczytaj stdin w listę ciągów znaków, oddzielonych spacjami

     scan(,'')

Usuń ostatni element. headzwraca pierwsze nelementy listy, z ndomyślną wartością 6. Jeśli njest -1zwracane wszystkie oprócz ostatniego elementu.

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

Teraz usuń pierwszy element z tej listy.

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

Daje to drugie imię (imiona).


1
Jeszcze krótszy: head (scan (, ''), - 1) [- 1] 22 bajty. Zauważ, że „” to dwa pojedyncze cudzysłowy.
user11599

Jeśli nie chcesz, aby każde imię było cytowane, użyj, w 27 bajtach, cat (head (scan (, ''), - 1) [- 1])
user11599

Objaśnienie: scan (, '') dzieli ciąg na słowa, head (..., - 1) upuszcza ostatnie słowo, head (..., - 1) [- 1], a następnie upuszcza pierwsze słowo, cat () formatuje dane wyjściowe, usuwając cudzysłowy. W przypadku drugiego imienia wynik nie jest doskonały, to znak (0), pusty ciąg znaków.
user11599

@ user11599 Wow, dzięki! Bawiłem się head()i tail(), ale nie wiedziałem, że możesz podać liczbę ujemną jako drugi argument. Miły!
rturnbull

Twoje zastosowanie skanu („”) zainspirowało mnie. Nie myślałem o takim podejściu.
user11599

3

Rubin, 24 13 bajtów

p ARGV[1..-2]

Zapisano 11 bajtów dzięki Piccolo wskazującemu, że dane wyjściowe podobne do tablicy są dozwolone.

Traktuje nazwę jako osobne argumenty wiersza poleceń, np .:

$ ruby script.rb John Jacob Jingleheimer Schmidt

lub

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

Poprzedni kod (wyświetla prawidłowy ciąg):

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

@Jordan Dobry pomysł - jednak z $><<ARGV[1..-2].join" "tym narzeka na " "to, że jest nieoczekiwany, więc musiałbym dodać nawiasy - które w końcu dodałyby 1 bajt.
Flambino,

Ach, oczywiście. Mój błąd.
Jordan

W oryginalnym plakacie powiedziano, że wyjściem może być tablica, więc możesz ogolić niektóre znaki, po prostu zmieniając kod na puts ARGV[1..-2], żebyś wiedział.
Piccolo,

@Piccolo Huh? Nigdzie tego nie widzę? Jeśli prawda; p ARGV[1..-2]na 13 bajtów - po prostu nie przypomina wyjścia w wyzwaniu PO
Flambino


3

Golang , 152 81 bajtów

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

Pobiera dane wejściowe jako „Samantha Vee Hills” (z podwójnymi cudzysłowami) i zwraca drugie imię na standardowe wyjście.

Wypróbuj online!

Edycja: @Dada, zauważ, że „funkcja jako odpowiedź jest dozwolona” skraca mój kod 71 bajtów. wielkie dzięki!


Witamy na stronie. Podanie funkcji jako odpowiedzi jest dozwolone, abyś mógł skrócić swój kod, wykonując coś takiego: Wypróbuj online! . Zobacz Porady dotyczące gry w golfa w Go !
Dada

dziękuję @Dada za wskazówki i skracam mój kod. To był mój pierwszy wpis kodu.
ersinakyuz

3

Matlab, 81 , 79 , 78 , 55 bajtów

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

Pobiera ciąg wejściowy, s , jest dzielony (przez domyślny separator, biały znak) na tablicę komórkową, z której można uzyskać dostęp do środkowego elementu. Następnie środkowe elementy są łączone lub zwracany jest pusty ciąg.

Edycja: podziękowania dla Luisa Mendo za zapisanie 3 bajtów!

Edycja 2: Lepsze rozwiązanie z Ankit!


Nie jestem mądrym człowiekiem! edytowane.
Owen Morgan,

Nie możesz użyć nnzna tablicy komórek, ale ja zrobiłem dwie pozostałe zmiany :)
Owen Morgan,

Sugerowana edycja przez Ankita , który nie ma wystarczającej liczby przedstawicieli, aby móc komentować. (55 bajtów):function x=a(s) s=strsplit(s);x=strjoin(s(2:end-1));end
mbomb007

3

C, 42 bajty

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

Ten parametr to tablica wskaźników zakończonych znakiem NULL na char.

Zobacz, jak to działa tutaj .

Argumentów wiersza poleceń można również używać z tą samą funkcją .

C, 51 bajtów

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

Pełny program. Wprowadzanie odbywa się za pomocą argumentów wiersza poleceń.

Zobacz, jak to działa tutaj .

C, 54 bajty

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

Ten parametr jest parametrem wejścia / wyjścia.

Zobacz, jak to działa tutaj .


Witamy w PPCG!
Martin Ender

Otrzymuję następujący błąd podczas kompilacji z Visual Studio 2012: error C2100: nielegalną zadnie
Johan du Toit

@JohanduToit VS nie jest zgodny z C11 ani nawet C99. Mój kod to. Jako praktyczny dowód, zarówno gcc, jak i clang kompilują poprawny program.
2501

2

Python 2, 42 19 16 bajtów

lambda n:n[1:-1]

Wypróbuj online! Dzięki @Kritixi Lithos za oszczędność 23 bajtów! Dzięki @math_junkie za oszczędność 3 dodatkowych bajtów. W celu wprowadzenia umieść każdą część nazwy jako ciąg na liście w taki sposób:

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

I tak, PO zatwierdził listę jako prawidłowy wkład.

Wyjaśnienie

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

1
print input()[1:-1]jest krótszy
Kritixi Lithos

Wiosenne krojenie na pewno jest trudne
Anthony Pham

lambda n:n[1:-1]jest jeszcze krótszy
ćpun matematyki

1
Mogłem spróbować z niewłaściwym wejściem. Ale kiedy próbowałem, z Samantha Vee Hillsudostępnionym przez ciebie linkiem do repl.it, to po prostu drukuje, amantha Vee Hillco zdecydowanie nie jest wymagane.
Keerthana Prabhakaran

2
Names will always have at least 2 space-separated partsjest pierwszym punktem właściwego pytania.
Keerthana Prabhakaran

2

C ++, 91 bajtów

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

Pobiera dane wejściowe jako odniesienie do listy ciągów i bezpośrednio modyfikuje listę.

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.