Tên đệm của tôi là gì?


30

Lưu ý: Câu trả lời chiến thắng sẽ được chọn vào ngày 4/12/17 người chiến thắng hiện tại là Jolf, 1 byte .

Tôi ngạc nhiên rằng chúng tôi chưa có thử thách tên đệm nào trên trang web này. Tôi đã tìm kiếm rất nhiều nhưng không tìm thấy gì. Nếu đây là bản sao, vui lòng gắn cờ như vậy.

Thử thách của bạn

Phân tích một chuỗi trông giống như Jo Jean Smithvà trở lại Jean.

Các trường hợp thử nghiệm

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 

(Cái cuối cùng là không chính xác về mặt kỹ thuật, nhưng sửa nó sẽ quá khó.)

Ghi chú:

  • Tên sẽ luôn có ít nhất 2 phần được phân tách bằng dấu cách, với tên đệm không giới hạn giữa chúng hoặc có thể là một danh sách / mảng chuỗi.
  • Tên có thể chứa bảng chữ cái (không phân biệt chữ hoa chữ thường) và - ( 0x2d)
  • Bạn có thể xuất ra một dòng mới.
  • Bạn có thể yêu cầu đầu vào để có một dòng mới.
  • Nhập từ STDIN, tham số chức năng hoặc đối số dòng lệnh được cho phép, nhưng không được phép mã hóa cứng trong đó.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đầu ra có thể là giá trị trả về của hàm, STDOUT, STDERR, v.v.
  • Không gian lưu trữ / dòng mới / tab trong đầu ra được cho phép.
  • Có câu hỏi nào không? Bình luận dưới đây!

Đây là , do đó, anwser ngắn nhất tính bằng byte sẽ thắng!


2
Đầu ra có thể là một danh sách các chuỗi?
Anthony Phạm

5
Nếu các định dạng khác ngoài chuỗi được phân tách bằng dấu cách được cho phép, vui lòng chỉnh sửa nó thành đặc tả.
Martin Ender

5
@ lập trình5000: nếu đầu vào có thể là danh sách các chuỗi, thì còn đầu ra thì sao? Là ["John", "Jacob", "Jingleheimer", "Schmidt"]-> ["Jacob", "Jingleheimer"]một giải pháp hợp lệ?
nimi

3
Là không gian hàng đầu được phép?
betseg

2
@DJ Bởi vì "Van" không phải là tên đệm của anh ấy, nó là một phần của tên cuối cùng của anh ấy. Một trường hợp đặc biệt khó chịu là David Lloyd George, tên đầu tiên là David và tên cuối cùng là Lloyd George. Mọi nỗ lực phân tích tên người thật như thế này đều bị tiêu diệt. Trên thực tế, bạn thậm chí không thể biết tên và họ là gì (nghĩ Li Shi).
David Conrad

Câu trả lời:


4

Jolf, 1 byte

Được bên trong của đầu vào. Hãy thử nó ở đây!


Dường như không thể lấy ví dụ chạy - dường như không có gì xảy ra khi tôi nhấp vào bất kỳ nút nào. Sử dụng Chrome 57.0.2987.133

@YiminRong Tôi chỉ có thể đảm bảo nó hoạt động trên firefox.
Conor O'Brien

44

Ohm , 2 byte (CP437)

Chấp nhận và trả về một danh sách các chuỗi.

()

Giải trình:

()   Main wire, arguments: a

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

10
Công cụ phù hợp cho công việc tôi đoán
Rohan Jhunjhunwala

15

Vim, 6 5 byte

dW$BD

Hãy thử trực tuyến!

(đầu ra có dấu cách)

Vì Vim tương thích ngược với V, tôi đã bao gồm một liên kết TIO cho V.

Giải trình

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, bạn đánh tôi với nó. dWWDgiúp bạn tiết kiệm một byte.
DJMcMayhem

5
@DJMcMayhem Điều đó chỉ hoạt động cho chính xác một tên đệm.
Martin Ender

Sự khác biệt giữa dW và dw là gì?
Duncan X Simpson

1
@DuncanXSimpson dWxóa cho đến khi khoảng trắng. dwxóa cho đến khi các ký tự không từ.
Vụ kiện của Quỹ Monica

14

Con trăn , 24 byte

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

Hãy thử đầu vào chuỗi trực tuyến!

Định dạng đầu vào: chuỗi


Python 2 , 16 byte

lambda n:n[1:-1]

Hãy thử nó đầu vào danh sách trực tuyến!

Định dạng đầu vào: Danh sách


Bạn nên chỉnh sửa tiêu đề Pythonthay vì Python 2, vì nó cũng hoạt động Python 3, chỉ là để đăng nó.
Ông Xcoder

@ L3viathan vì OP chưa đề cập đến định dạng đầu ra must be a stringvà vì định dạng đầu vào được phép là danh sách, nên việc in danh sách không thể được coi là kết quả sai!
Keerthana Mitchhakaran

Theo các ý kiến ​​về câu hỏi, bạn có thể nhập và xuất một danh sách các chuỗi. Lưu một loạt bytelambda n:n[1:-1]
Luke Sawczak

1
Vì bạn có thể đọc từ STDIN, có thể thay thế lambda bằng input()(chỉ Python 3)
BallpointBen

Bạn đúng rồi. Cảm ơn. Tôi đã thêm các chỉnh sửa!
Keerthana Mitchhakaran

13

Brain-Flak , 133 byte

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

Hãy thử trực tuyến!

132 byte mã, cộng thêm 1 byte cho -c cờ cho phép nhập và xuất ASCII.

Thật không may, điều này chứa rất nhiều mã trùng lặp, nhưng nó sẽ thực sự khó sử dụng lại. Tôi sẽ xem xét nó sau. Đây là một lời giải thích:

#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 khi bạn xóa các bình luận. Tôi đã thêm hai dòng đầu tiên và dòng cuối cùng. TIO
Riley

@riley Giải pháp mát mẻ. Hãy đăng nó cho mình!
DJMcMayhem


12

Haskell, 23 , 17 9 byte

init.tail

Đưa và trả về một danh sách các chuỗi. Hãy thử trực tuyến!

Thả chuỗi đầu tiên, thả chuỗi cuối cùng.

Chỉnh sửa: @Generic Display Name lưu ý rằng đầu vào có thể là một danh sách các chuỗi, đã lưu 6 byte.

Chỉnh sửa II: trả về danh sách các chuỗi thay vì một chuỗi


Có vẻ như đầu vào dưới dạng danh sách được cho phép, vì vậy hãy bỏ các từ cho -5 byte
Tên hiển thị chung

@GenericDisplayName: Ồ, không để ý. Cảm ơn!
nimi

Câu trả lời Ohm của tôi và Mathicala cũng trả lời cả hai danh sách đầu ra của chuỗi, vì vậy bạn có thể giảm xuống unwords.cho -8 byte.
Nick Clifford

@NickClifford: vâng, tôi đã thấy điều đó và yêu cầu OP làm rõ.
nimi

11

Toán học, 10 byte

Rest@*Most

Một hàm không tên chấp nhận và trả về một danh sách các chuỗi.

Restloại bỏ phần tử cuối cùng, Mostloại bỏ phần tử đầu tiên, @*là thành phần chức năng. Thay đổi RestMosthoặc sử dụng thành phần đúng /*thay thế cũng sẽ làm việc. Nhịp đập này được lập chỉ mục thông qua #[[2;;-2]]&một byte.


10

Brain-Flak , 86 byte

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

Hãy thử trực tuyến!

Hầu hết các mã này đến từ câu trả lời này . Nếu bạn thích giải pháp của tôi, bạn cũng nên nâng cấp nó.

#Push 2
(()())

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

  #While not a space
  {
      #Pop
      {}

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

  #Endwhile
  }

  #Pop the 0
  {}

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

#End loop twice
>)}{}

Làm tốt! Tôi đã không nghĩ về việc giữ một bộ đếm để đẩy sau này, vì vậy tôi đã dành quá nhiều thời gian để suy nghĩ về cách lặp qua các ngăn xếp khác nhau.
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(' '))

Hàm xác định lần xuất hiện đầu tiên của ký tự khoảng trắng và ký tự cuối cùng và trích xuất phần giữa. Chuỗi kết quả được tiền tố bởi một ký tự khoảng trắng (tại thời điểm đăng bài, OP chưa làm rõ nếu khoảng trắng hàng đầu được cho phép), có thể được loại bỏ bằng cách thêm .trim()vào mã với chi phí thêm 7 byte.

So với C #, Java có lợi thế là chỉ định chỉ mục kết thúc thay vì độ dài chuỗi phụ, làm giảm số byte.


7

JavaScript (ES6), 22 byte

Lấy và xuất ra một chuỗi các chuỗi.

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

Các trường hợp thử nghiệm

Phiên bản chuỗi (27 byte)

Đưa và xuất ra một chuỗi. Chuỗi đầu ra là một khoảng trắng nếu không tìm thấy tên đệm hoặc tên đệm có khoảng trắng ở đầu và cuối.

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


/./.exec.bind(/ .* /)dường như bắt chước # 2, ngoại trừ nullkhông có gì
dandavis

7

AWK , 17 10 byte

Đã lưu 7 byte nhờ @steve!

$NF=$1=x;1

Hãy thử trực tuyến!

Giải trình:

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

Có thể được giảm xuống còn 11 byte,$NF=$1="";1
steve

3
Hoặc 10 bằng cách sử dụng$NF=$1=x;1
steve

1
@steve 1làm gì? Tôi không giỏi về AWK :)
betseg

1 chỉ có nghĩa là thực hiện hành động mặc định, nghĩa là, để in $ 0.
steve

6

Groovy , 19 byte

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

Giải trình:

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

Hàm đóng / ẩn danh


1
Chào mừng đến với PPCG! Bạn có thể lấy một danh sách các chuỗi làm đầu vào để bỏ qua .split()không?
Martin Ender

Martin Ender Có, nếu bạn cho rằng đầu vào sẽ luôn là một danh sách các chuỗi thì {it [1 ..- 2]} sẽ hoạt động.
tĩnh điện

5

PHP, 37 byte

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

-4 byte cho một đầu ra dưới dạng mảng

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

Perl 5 , 27 18 byte

Cần chạy với -ntùy chọn.

/ (.+) /&&print$1

Hãy thử trực tuyến!

Muốn làm một cái gì đó tương tự trong sed trước, nhưng thật không may, nó không hỗ trợ định lượng không tham lam. Nó là cần thiết trong trường hợp tên đệm nhiều hơn một từ.

Chỉnh sửa

-9 byte nhờ Dada .

Định lượng không tham lam không còn cần thiết nữa, cùng với một số thứ khác.


/ (.+) /&&print$1nên được sắp xếp Thật tuyệt khi thấy một số người mới chơi golf với Perl!
Dada

@Dada Cảm ơn vì tiền boa! Đây thực sự là lần đầu tiên tôi viết bằng Perl. Bạn có biết tại sao print if s| (.+) |\1|không làm việc? Đối với tôi nó trông giống như những gì bạn đã viết.
Maxim Mikhaylov

print if s| (.+) |\1|thay thế phần giữa bằng ... phần giữa! (trừ khoảng trắng trước và sau), vì vậy nó không hoạt động. Mặt khác, những gì tôi đề xuất chỉ khớp với phần giữa và chỉ in nó ( $1).
Dada

4

Javascript (ES6) 49 16 byte

Chỉnh sửa:

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

Hãy thử trực tuyến!

vô dụng:

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

Tôi quên một số thuộc tính đơn giản của slice, và đầu vào có thể là một mảng. Nhờ @Neil và @ fəˈnɛtɪk tôi đã có thể xóa 27 byte. Vẫn không thực sự cạnh tranh.

Nguyên:

Điều này không thực sự cạnh tranh nhưng đây là một giải pháp Javascript:

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

Điều này tạo ra một hàm ẩn danh bằng:

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

Làm thế nào tôi chơi golf

Đây là một sân golf khá đơn giản. Tôi đã biến chức năng thành một chức năng mũi tên . Sau đó, tôi "rút gọn" mã. Điều này bao gồm đổi tên namethành một ký tự ( atrong trường hợp này) và loại bỏlet suy giảm của biến.

Đoạn trích

Hy vọng điều này sẽ giúp bất cứ ai bị mắc kẹt trong thử thách.


Điều length -này là không cần thiết, vì sliceđã chấp nhận độ dài âm là tương đối đến cuối. Điều này có nghĩa là bạn không còn cần biến trung gian, vì vậy bạn có thể biến hàm mũi tên của mình từ một khối thành biểu thức.
Neil

Trên thực tế cách nó hoạt động là cái -1cuối cùng nhưng là cái bạn cần ở đây.
Neil

Nó cũng là lát (1, -1). lát (1, -2) loại bỏ hai từ cuối.
fnɛtɪk

Bạn cũng có thể giả sử rằng bạn đã được thông qua một mảng để bắt đầu, điều này cho phép bạn chỉ cần thực hiện lát và bạn đã hoàn thành.
fnɛtɪk

Tôi chắc chắn 99% đã thay đổi kể từ khi tôi bắt đầu. Cảm ơn một lần nữa.
David Archibald


3

Thạch , 2 byte

ḊṖ

Hãy thử trực tuyến!

Điều này hoạt động như một liên kết phi tuyến tính (tức là chức năng), không phải là một chương trình đầy đủ.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.