Яке моє прізвище?


30

Примітка: Виграшну відповідь буде обрано 12.12.17 р., Поточний переможець - Джольф, 1 байт .

Я здивований, що у нас на цьому сайті ще не було проблеми з моїм прізвищем. Я багато шукав, але нічого не знайшов. Якщо це копія, будь ласка, позначте її як таку.

Ваше завдання

Розбираємо рядок, схожий Jo Jean Smithі повертаємося Jean.

Тестові справи

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 

(Останнє технічно неправильно, але виправити це було б занадто важко.)

Примітки:

  • Імена завжди матимуть щонайменше дві частини, розділені пробілом, з необмеженими середніми іменами між ними або можуть бути списком / масивом рядків.
  • Імена можуть містити алфавіт (нечутливий до регістру) та - ( 0x2d)
  • Ви можете вивести новий рядок.
  • Можливо, вам знадобиться введення для отримання нового рядка.
  • Введення з STDIN, параметра функції або аргументу командного рядка дозволено, але жорстке кодування в ньому заборонено.
  • Стандартні лазівки заборонені.
  • Вихідним може бути значення повернення функції, STDOUT, STDERR тощо.
  • Дозволені пробіли / нові рядки / вкладки у висновку.
  • Які-небудь питання? Прокоментуйте нижче!

Це , тому виграє найкоротший показник у байтах!


2
Чи може висновок бути списком рядків?
Ентоні Фам

5
Якщо дозволені інші формати, не розділені пробілом, будь ласка, відредагуйте їх у специфікації.
Мартін Ендер

5
@ programmer5000: якщо на вході може бути список рядків, як щодо виводу? Чи ["John", "Jacob", "Jingleheimer", "Schmidt"]-> ["Jacob", "Jingleheimer"]дійсне рішення?
німі

3
Чи дозволені провідні пробіли?
betseg

2
@DJ Оскільки "Ван" не є його прізвищем, це частина його прізвища. Особливо неприємний випадок - Девід Ллойд Джордж, ім'я якого - Девід, а прізвище - Ллойд Джордж. Будь-яка спроба розбору справжніх імен людей, як це, приречена. Насправді ви навіть не можете сказати, що таке прізвище та прізвище (подумайте Лі Ши).
Девід Конрад

Відповіді:


4

Джольф, 1 байт

Отримує внутрішню частину вводу. Спробуйте тут!


Здається, що приклад не працює, але нічого не здається, коли я натискаю будь-яку з кнопок. Використовуючи Chrome 57.0.2987.133

@YiminRong Я можу лише запевнити, що він працює на firefox.
Conor O'Brien

44

Ом , 2 байти (CP437)

Приймає та повертає список рядків.

()

Пояснення:

()   Main wire, arguments: a

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

10
Я вважаю, що правильний інструмент для роботи
Rohan Jhunjhunwala

15

Vim, 6 5 байт

dW$BD

Спробуйте в Інтернеті!

(виходи з пробілом)

Оскільки Vim зворотно сумісний з V, я включив посилання TIO для V.

Пояснення

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

Драт, ти мене до цього побив. dWWDекономить вам один байт.
DJMcMayhem

5
@DJMcMayhem Це працює лише для одного середнього імені.
Мартін Ендер

Яка різниця між dW і dw?
Данкан X Сімпсон

1
@DuncanXSimpson dWвидаляє до місця пробілу. dwвидаляє, поки символи не мають слова.
Позов по

14

Пітон , 24 байти

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

Спробуйте його введення в рядок онлайн!

Формат введення: рядок


Python 2 , 16 байт

lambda n:n[1:-1]

Спробуйте його введення в Інтернет-список!

Формат введення: Список


Ви повинні відредагувати заголовок Pythonзамість Python 2, тому що він також працює для Python 3того, що збирався опублікувати його.
Містер Xcoder

@ L3viathan, оскільки OP не згадував вихідний формат must be a string, а оскільки формат введення дозволений як список, друк списку не може вважатися неправильним результатом!
Кеертана Прабхакаран

Відповідно до коментарів до питання, ви можете як вводити, так і виводити список рядків. Збережіть купу байтівlambda n:n[1:-1]
Лука Савзак

1
Оскільки ви можете читати з STDIN, можна замінити лямбда на input()(лише Python 3)
BallpointBen

Ти правий. Спасибі. Я додав зміни!
Кеертана Прабхакаран

13

Мозок-Флак , 133 байт

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

Спробуйте в Інтернеті!

132 байти коду, плюс 1 байт для -cпрапора, який дозволяє вводити та виводити ASCII.

На жаль, він містить багато дублюється коду, але повторно використовувати його було б дуже важко. Я розгляну це пізніше. Ось пояснення:

#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 байт під час видалення коментарів. Я додав перші два та останній рядок. TIO
Райлі

@riley Cool розчин. Сміливо публікуйте це самостійно!
DJMcMayhem


12

Haskell, 23 , 17 9 байт

init.tail

Бере та повертає список рядків. Спробуйте в Інтернеті!

Опустити перший рядок, опустити останній рядок.

Редагувати: @ Загальне відображуване ім'я зазначило, що вхід може бути списком рядків, в якому збережено 6 байт.

Редагувати II: повернути список рядків замість одного рядка


Схоже, що введення списку дозволено, тому киньте слова на -5 байт
Загальне відображуване ім'я

@GenericDisplayName: О, не помітив. Спасибі!
німі

Моя відповідь Ома і Mathematica відповідають і на вихідних списках рядків, так що ви, ймовірно, можете опуститись unwords.на -8 байт.
Нік Кліффорд

@ NickClifford: так, я сам це побачив і попросив ОП роз'яснити.
німі

11

Математика, 10 байт

Rest@*Most

Безіменна функція, яка приймає та повертає список рядків.

Restвідкидає останній елемент, Mostвідкидає перший елемент, @*- це функціональна композиція. Заміна Restта / Mostабо використання правильної композиції /*замість цього також працювали б. Це б'є індексацію через #[[2;;-2]]&один байт.


10

Мозок-Флак , 86 байт

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

Спробуйте в Інтернеті!

Більшість цього коду виходить з цієї відповіді . Якщо вам подобається моє рішення, ви також повинні підтримати це рішення.

#Push 2
(()())

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

  #While not a space
  {
      #Pop
      {}

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

  #Endwhile
  }

  #Pop the 0
  {}

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

#End loop twice
>)}{}

Молодці! Я не думав про те, щоб утримувати лічильник, щоб натиснути пізніше, тому я витратив занадто довго на роздуми над тим, як перебирати різні стеки.
DJMcMayhem

8

Java 7, 74 байти

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

Java 8, 49 байт

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

Функція, яка ідентифікує перше виникнення символу пробілу та останнє та витягує середину. Отриманий рядок має префікс символом пробілу (на момент публікації ОП не уточнив, чи дозволені провідні пробіли), який можна усунути, додавши .trim()до коду за додаткову вартість 7 байт.

Порівняно з C #, Java має перевагу в тому, щоб вказати індекс кінця замість довжини підрядків, що знижує кількість байтів.


7

JavaScript (ES6), 22 байти

Бере і виводить масив рядків.

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

Тестові справи

Версія рядка (27 байт)

Бере і виводить рядок. Вихідна рядок є або єдиним пробілом, якщо прізвище не знайдено, або прізвища з провідними та кінцевими пробілами.

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


/./.exec.bind(/ .* /)здається, імітує №2, за винятком nullжодного
dandavis

7

AWK , 17 10 байт

Збережено 7 байт завдяки @steve!

$NF=$1=x;1

Спробуйте в Інтернеті!

Пояснення:

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

Можна поголити до 11 байт,$NF=$1="";1
steve

3
Або 10 використовуючи$NF=$1=x;1
steve

1
@steve що робить 1? Я не дуже хороший в AWK :)
betseg

1 означає лише здійснити дію за замовчуванням, тобто надрукувати $ 0.
Стів

6

Groovy , 19 байт

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

Пояснення:

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

Функція закриття / анонімності


1
Ласкаво просимо до PPCG! Чи можете ви взяти список рядків як вхід, щоб пропустити .split()?
Мартін Ендер

Мартін Ендер Так, якщо ви припускаєте, що вхід завжди буде списком рядків, то {it [1 ..- 2]} буде працювати.
статичний метод

5

PHP, 37 байт

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

-4 байти для виведення у вигляді масиву

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

PHP, 42 байти

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

PHP, 50 байт

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

4

Сітківка , 11 байт

^\S+ |\S+$

Спробуйте в Інтернеті!

З'єднує перше слово (включаючи пробіл після нього) та останнє слово та видаляє їх обоє.

Якщо введення / виведення може бути списком, відокремленим рядковими каналами, це може бути зроблено замість 8 байтів:

A1`
G-2`

Спробуйте в Інтернеті!


4

Perl 5 , 27 18 байт

Потрібно запустити з -nопцією.

/ (.+) /&&print$1

Спробуйте в Інтернеті!

Хотів зробити щось подібне в sed, але, на жаль, він не підтримує не жадібний квантор. Він потрібен у випадку, якщо прізвище має більше одного слова.

Редагувати

-9 байт завдяки Даді .

Не жадібний кількісний показник більше не потрібен, серед інших речей.


/ (.+) /&&print$1повинні бути сортувальниками. Чудово бачити нових людей, які грають у Perl!
Дада

@Dada Дякую за пораду! Насправді я вперше писав у Perl. Чи знаєте ви, чому print if s| (.+) |\1|не працює? Для мене це схоже на те, що ви написали.
Максим Михайлов

print if s| (.+) |\1|замінює середню частину на ... середню частину! (мінус пробіли до і після), тому це не працює. З іншого боку, те, що я запропонував, відповідає лише середній частині та друкує лише його ( $1).
Дада

4

Javascript (ES6) 49 16 байт

Редагувати:

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

Спробуйте в Інтернеті!

неозорений:

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

Я забув деякі прості властивості slice, і що вхід може бути масивом. Завдяки @Neil та @ fəˈnɛtɪk мені вдалося видалити 27 байт. Все ще не дуже змагаються.

Оригінал:

Це насправді не конкурує, але ось рішення Javascript:

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

Це створює анонімну функцію, рівну:

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

Як я його гольфував

Це досить простий гольф. Я перетворив функцію на функцію стрілки . Тоді я "мінімізував" код. Це включало перейменування nameв один символ ( aу даному випадку) та видаленняlet decloration of the variable.

Знімок

Сподіваюся, це допоможе кожному, хто застряг у виклику.


Це length -зайве, оскільки sliceвже приймає негативні довжини як відносні до кінця. Це означає, що вам більше не потрібна проміжна змінна, тому ви можете перетворити функцію стрілки з блоку в вираз.
Ніл

Насправді, як це працює, -1це останній, але той, що вам тут потрібен.
Ніл

Це також зріз (1, -1). зріз (1, -2) видаляє два з кінця.
fəˈnɛtɪk

You can also assume that you were passed an array to begin with, which lets you just perform slice and you are done.
fəˈnɛtɪk

I'm 99% sure that was changed since I started it. Thanks again.
David Archibald


3

Jelly, 2 bytes

ḊṖ

Try it online!

This works as a non-inline link (i.e. function), not a full program.

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

As a full program, it would be 3 bytes: ḊṖK, which prints a space-separated middle name.



3

C#, 67 bytes

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

Anonymous function which identifies the first occurrence of the space character and the last one and extracts the middle. It also extracts a trailing space, which can be removed at the cost of 2 bytes.

Full program with test cases:

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

Current solution due to user11599!

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

Takes input from stdin, returns each middle name as a separate string. Returns character() in the case of no middle name; that is, a vector of class character of length 0.

Explanation:

Read stdin into a list of strings, separated by spaces

     scan(,'')

Remove the last element. head returns the first n elements of a list, with n defaulting to 6. If n is -1 it returns all but the last element.

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

Now, remove the first element of this list.

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

This yields the middle name(s).


1
Even shorter: head(scan(,''),-1)[-1] 22 bytes. Note that '' are two single quotes.
user11599

If you don't want each name quoted, use, at 27 bytes, cat(head(scan(,''),-1)[-1])
user11599

Explanation: scan(,'') breaks the string into words, head(...,-1) drops the last word, head(...,-1)[-1] then drops the first word, cat() formats the output dropping the quotes. For no middle name, result isn't perfect, it's character(0), the empty string.
user11599

@user11599 Wow, thanks! I had played around with head() and tail(), but I didn't know you could pass a negative number as the second argument. Nice!
rturnbull

Your use of scan(,'') inspired me. I didn't think of approaching that way.
user11599

3

Ruby, 24 13 bytes

p ARGV[1..-2]

Saved 11 bytes thanks to Piccolo pointing out that array-like output is allowed.

Takes the name as separate command line arguments, e.g.:

$ ruby script.rb John Jacob Jingleheimer Schmidt

or

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

Previous code (outputs a proper string):

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

@Jordan Good idea - however with $><<ARGV[1..-2].join" " it complains about the " " being unexpected, so I'd have to add parentheses - which would add 1 byte in the end.
Flambino

Ah, of course. My bad.
Jordan

The original poster said that the output can be an array, so you can shave some characters off by just changing your code to puts ARGV[1..-2], just so you know.
Piccolo

@Piccolo Huh? I don't see that anywhere? If true; p ARGV[1..-2] for 13 bytes - just looks nothing like the output in OPs challenge
Flambino


3

Golang, 152 81 bytes

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

It takes input as "Samantha Vee Hills" (with double quotes) and return the middle name to the stdout.

Try it Online!

Edit: @Dada, note that the "function as answer is allowed" shorten my code 71 bytes. a big thanks!


Welcome on the site. Submitting a function as answer is allowed, so you could shorten your code by doing something like this: Try it online!. Have a look at the Tips for Golfing in Go!
Dada

thank you @Dada for tips and shorten my code. It was my first code entry.
ersinakyuz

3

Matlab, 81, 79, 78, 55 Bytes

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

Takes in an input string, s, is split (by the default delimiter, whitespace char) into a cell array, from which the middle element is accessed. Then the middle elements are concatenated, or an empty string is returned.

Edit: thanks to Luis Mendo for saving 3 bytes!

Edit 2: Better solution from Ankit!


I am not a smart man! edited.
Owen Morgan

You can't use nnz on a cell array, but I did the other two changes :)
Owen Morgan

Suggested Edit by Ankit, who doesn't have enough rep to comment. (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));}

The parameter is a NULL terminated array of pointers to char.

See it work here.

The command line arguments may also be used with the same function.

C, 51 bytes

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

A full program. Input is done through command line arguments.

See it work here.

C, 54 bytes

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

The parameter is an in/out parameter.

See it work here.


Welcome to PPCG!
Martin Ender

I'm receiving the following error when compiling with Visual Studio 2012:error C2100: illegal indirection
Johan du Toit

@JohanduToit VS is not C11 or even C99 conforming. My code is. As practical proof, both gcc and clang compile a valid program.
2501

2

Python 2, 42 19 16 Bytes

lambda n:n[1:-1]

Try it online! Thanks to @Kritixi Lithos for saving 23 bytes! Thanks @math_junkie for saving 3 more bytes. For input, put each part of the name as a string within a list like so:

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

And yes, the OP has approved a list to be a valid input.

Explanation

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

1
print input()[1:-1] is shorter
Kritixi Lithos

Spring slicing sure is tricky
Anthony Pham

lambda n:n[1:-1] is even shorter
math junkie

1
I may have tried with a wrong input. But when I tried, with Samantha Vee Hills as input in repl.it link that you've shared, this just prints amantha Vee Hill which is definitely not the output required.
Keerthana Prabhakaran

2
Names will always have at least 2 space-separated parts is the first point of the question right.
Keerthana Prabhakaran

2

C++, 91 bytes

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

Takes input as a reference to a list of strings and modifies the list directly.

Try it online!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.