Apa nama tengah saya?


30

Catatan: Jawaban yang menang akan dipilih pada 4/12/17 pemenang saat ini adalah Jolf, 1 byte .

Saya terkejut bahwa kami belum memiliki tantangan apa nama tengah saya di situs ini. Saya melakukan banyak pencarian tetapi tidak menemukan apa pun. Jika ini adalah dup, harap tandai seperti itu.

Tantangan anda

Mengurai string yang terlihat seperti Jo Jean Smithdan kembali Jean.

Uji kasus

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 

(Yang terakhir itu salah secara teknis, tetapi memperbaiki itu akan terlalu sulit.)

Catatan:

  • Nama akan selalu memiliki setidaknya 2 bagian yang dipisahkan oleh ruang, dengan nama tengah tak terbatas di antara mereka atau dapat berupa daftar / larik string.
  • Nama dapat berisi alfabet (tidak peka huruf besar-kecil) dan - ( 0x2d)
  • Anda dapat menampilkan baris tambahan.
  • Anda mungkin memerlukan input untuk memiliki baris tambahan.
  • Input dari STDIN, parameter fungsi, atau argumen baris perintah diizinkan, tetapi pengodean keras di dalamnya tidak diizinkan.
  • Celah standar dilarang.
  • Output dapat berupa nilai pengembalian fungsi, STDOUT, STDERR, dll.
  • Spasi spasi / baris baru / tab pada output diizinkan.
  • Ada pertanyaan? Komentar dibawah!

Ini adalah , jadi anwser terpendek yang menang akan!


2
Bisakah output menjadi daftar string?
Anthony Pham

5
Jika format selain string yang dipisahkan ruang diizinkan, harap edit ke dalam spesifikasi.
Martin Ender

5
@ programmer5000: jika input dapat berupa daftar string, bagaimana dengan output? Apakah ["John", "Jacob", "Jingleheimer", "Schmidt"]-> ["Jacob", "Jingleheimer"]solusi yang valid?
nimi

3
Apakah ruang terdepan diizinkan?
betseg

2
@ DJ Karena "Van" bukan nama tengahnya, itu bagian dari nama belakangnya. Kasus yang sangat menjengkelkan adalah David Lloyd George, yang nama depannya adalah David dan nama belakangnya adalah Lloyd George. Upaya apa pun untuk menguraikan nama orang sungguhan seperti ini akan gagal. Faktanya, Anda bahkan tidak tahu apa nama depan dan belakang (pikirkan Li Shi).
David Conrad

Jawaban:


4

Jolf, 1 byte

Mendapat bagian dalam input. Coba di sini!


Sepertinya tidak bisa menjalankan contoh - sepertinya tidak ada yang terjadi ketika saya mengklik salah satu tombol. Menggunakan Chrome 57.0.2987.133

@YiminRong Saya hanya bisa memastikannya untuk bekerja di firefox.
Conor O'Brien

44

Ohm , 2 byte (CP437)

Menerima dan mengembalikan daftar string.

()

Penjelasan:

()   Main wire, arguments: a

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

10
Alat yang tepat untuk pekerjaan itu saya kira
Rohan Jhunjhunwala

15

Vim, 6 5 byte

dW$BD

Cobalah online!

(keluaran dengan spasi tambahan)

Karena Vim kompatibel terbalik dengan V, saya telah menyertakan tautan TIO untuk V.

Penjelasan

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, kamu mengalahkan saya untuk itu. dWWDmenghemat satu byte.
DJMcMayhem

5
@DJMcMayhem Itu hanya bekerja tepat untuk satu nama tengah.
Martin Ender

Apa perbedaan antara dW dan dw?
Duncan X Simpson

1
@DuncanXSimpson dWdihapus sampai spasi. dwdihapus hingga karakter non-kata.
Dana Gugatan Monica

14

Python , 24 byte

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

Cobalah input string online!

Format Input: string


Python 2 , 16 byte

lambda n:n[1:-1]

Coba masukan daftar online!

Format Input: Daftar


Anda harus mengedit judul dengan Pythonalih - alih Python 2, karena berfungsi Python 3juga, baru akan memposting itu.
Tn. Xcoder

@ L3viathan karena OP belum menyebutkan format output must be a string, dan karena format input diperbolehkan menjadi daftar, cetak daftar tidak dapat dianggap sebagai hasil yang salah!
Keerthana Prabhakaran

Menurut komentar pada pertanyaan, Anda dapat memasukkan dan mengeluarkan daftar string. Simpan banyak bytelambda n:n[1:-1]
Luke Sawczak

1
Karena Anda dapat membaca dari STDIN, dapat mengganti lambda dengan input()(hanya Python 3)
BallpointBen

Kamu benar. Terima kasih. Saya telah menambahkan hasil edit!
Keerthana Prabhakaran

13

Brain-Flak , 133 byte

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

Cobalah online!

132 byte kode, ditambah 1 byte untuk -cflag yang memungkinkan input dan output ASCII.

Sayangnya, ini mengandung banyak kode duplikat, tetapi akan sangat sulit untuk digunakan kembali. Saya akan memeriksanya nanti. Berikut penjelasannya:

#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 ketika Anda menghapus komentar. Saya menambahkan dua yang pertama dan baris terakhir. TIO
Riley

@riley Solusi keren. Jangan ragu untuk mempostingnya sendiri!
DJMcMayhem


12

Haskell, 23 , 17 9 byte

init.tail

Mengambil dan mengembalikan daftar string. Cobalah online!

Jatuhkan string pertama, jatuhkan string terakhir.

Sunting: @Nama Tampilan Umum mencatat, bahwa input dapat berupa daftar string, yang menyimpan 6 byte.

Sunting II: kembalikan daftar string alih-alih satu string


Sepertinya input sebagai daftar diizinkan, jadi letakkan kata-kata untuk -5 byte
Generic Display Name

@GenericDisplayName: Oh, tidak memperhatikan. Terima kasih!
nimi

Ohm saya menjawab dan the Mathematica menjawab kedua daftar keluaran dari string juga, jadi Anda mungkin bisa turun unwords.untuk -8 byte.
Nick Clifford

@NickClifford: ya, saya melihat sendiri dan meminta OP untuk klarifikasi.
nimi

11

Mathematica, 10 byte

Rest@*Most

Fungsi tanpa nama yang menerima dan mengembalikan daftar string.

Restmembuang elemen terakhir, Mostmembuang elemen pertama, @*adalah komposisi fungsi. Bertukar Restdan Mostmenggunakan komposisi yang tepat /*juga akan berhasil. Ini mengalahkan pengindeksan #[[2;;-2]]&oleh satu byte.


10

Brain-Flak , 86 byte

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

Cobalah online!

Sebagian besar kode ini berasal dari jawaban ini . Jika Anda menyukai solusi saya, Anda harus menghapusnya juga.

#Push 2
(()())

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

  #While not a space
  {
      #Pop
      {}

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

  #Endwhile
  }

  #Pop the 0
  {}

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

#End loop twice
>)}{}

Sudah selesai dilakukan dengan baik! Saya tidak berpikir tentang memegang counter untuk mendorong kemudian, jadi saya menghabiskan terlalu lama untuk berpikir tentang bagaimana untuk melewati tumpukan yang berbeda.
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(' '))

Fungsi yang mengidentifikasi kemunculan pertama karakter spasi dan yang terakhir dan mengekstrak tengah. String yang dihasilkan diawali oleh karakter spasi (pada saat posting, OP belum mengklarifikasi jika spasi terdepan diizinkan), yang dapat dihilangkan dengan menambahkan .trim()kode dengan biaya tambahan 7 byte.

Dibandingkan dengan C #, Java memiliki keuntungan menentukan indeks akhir daripada panjang sub-string, yang menurunkan jumlah byte.


7

JavaScript (ES6), 22 byte

Mengambil dan mengeluarkan array string.

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

Uji kasus

Versi string (27 byte)

Mengambil dan mengeluarkan string. String output adalah ruang tunggal jika tidak ada nama tengah yang ditemukan, atau nama tengah dengan spasi awal dan akhir.

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


/./.exec.bind(/ .* /)tampaknya meniru # 2, kecuali nulltidak ada
dandavis

7

AWK , 17 10 byte

Disimpan 7 byte berkat @steve!

$NF=$1=x;1

Cobalah online!

Penjelasan:

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

Dapat dicukur hingga 11 byte,$NF=$1="";1
steve

3
Atau 10 menggunakan$NF=$1=x;1
steve

1
@veve apa fungsinya 1? Saya tidak begitu mahir di AWK :)
betseg

1 berarti mengambil tindakan default, yaitu mencetak $ 0.
steve

6

Groovy , 19 byte

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

Penjelasan:

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

Fungsi penutupan / anonim


1
Selamat datang di PPCG! Bisakah Anda mengambil daftar string sebagai input untuk melewati .split()?
Martin Ender

Martin Ender Ya, jika Anda menganggap bahwa input akan selalu menjadi daftar string maka {it [1 ..- 2]} akan berfungsi.
staticmethod

5

PHP, 37 Bytes

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

-4 byte untuk output sebagai array

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

Retina , 11 byte

^\S+ |\S+$

Cobalah online!

Cocokkan kata pertama (termasuk spasi setelahnya) dan kata terakhir, dan hapus keduanya.

Jika I / O dapat berupa daftar yang dipisahkan dengan linefeed, itu dapat dilakukan dalam 8 byte:

A1`
G-2`

Cobalah online!


4

Perl 5 , 27 18 byte

Perlu dijalankan dengan -nopsi.

/ (.+) /&&print$1

Cobalah online!

Ingin melakukan sesuatu yang serupa di sed pertama, tetapi, sayangnya, itu tidak mendukung penjumlah non-serakah. Diperlukan jika nama tengah lebih dari satu kata.

Edit

-9 byte terima kasih kepada Dada .

Non-greedy quantifier tidak diperlukan lagi, di antara beberapa hal lainnya.


/ (.+) /&&print$1harus menjadi penyortir. Luar biasa melihat beberapa orang baru bermain golf dengan Perl!
Dada

@Dada, terima kasih atas tipnya! Ini sebenarnya pertama kalinya saya menulis di Perl. Apakah Anda tahu mengapa print if s| (.+) |\1|tidak berhasil? Bagi saya itu mirip dengan apa yang Anda tulis.
Maxim Mikhaylov

print if s| (.+) |\1|mengganti bagian tengah dengan ... bagian tengah! (minus spasi sebelum dan sesudah), jadi tidak berfungsi. Di sisi lain, apa yang saya sarankan hanya cocok dengan bagian tengah dan hanya mencetaknya ( $1).
Dada

4

Javascript (ES6) 49 16 byte

Edit:

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

Cobalah online!

ungolfed:

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

Saya lupa beberapa properti sederhana slice, dan inputnya bisa berupa array. Berkat @Neil dan @ fəˈnɛtɪk saya dapat menghapus 27 byte. Masih belum benar-benar bersaing.

Asli:

Ini tidak benar-benar bersaing tetapi inilah solusi Javascript:

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

Ini menciptakan fungsi anonim yang sama dengan:

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

Bagaimana saya memainkannya

Ini adalah golf yang cukup sederhana. Saya mengubah fungsi menjadi fungsi panah . Lalu aku "memperkecil" kodenya. Ini termasuk penggantian nama namemenjadi satu karakter ( adalam hal ini) dan menghapus letdeklorasinya dari variabel.

Potongan

Semoga ini bisa membantu siapa saja yang terjebak pada tantangan.


Tidak length -perlu, karena slicesudah menerima panjang negatif sebagai relatif terhadap akhir. Ini berarti bahwa Anda tidak lagi memerlukan variabel perantara, sehingga Anda dapat mengubah fungsi panah dari blok menjadi ekspresi.
Neil

Sebenarnya cara kerjanya adalah yang -1terakhir tetapi yang Anda butuhkan di sini.
Neil

Ini juga irisan (1, -1). slice (1, -2) menghilangkan dua dari ujung.
fəˈnɛtɪk

Anda juga dapat mengasumsikan bahwa Anda telah lulus array untuk memulai, yang memungkinkan Anda hanya melakukan slice dan Anda selesai.
fəˈnɛtɪk

Saya 99% yakin itu berubah sejak saya memulainya. Terima kasih lagi.
David Archibald

3

Röda , 9 byte

{_[1:-1]}

Cobalah online!

Bukan solusi yang sangat menarik. Mengambil daftar dari aliran dan mengembalikan nama tengah.

21 byte dan I / O:

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

Cobalah online!

Ini menggunakan /(split) dan &(gabung).


3

Jelly , 2 byte

ḊṖ

Cobalah online!

Ini berfungsi sebagai tautan non-inline (yaitu fungsi), bukan program lengkap.

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

Sebagai program penuh, itu akan menjadi 3 byte:, ḊṖKyang mencetak nama tengah yang dipisahkan oleh ruang.



3

C #, 67 byte

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

Fungsi anonim yang mengidentifikasi kemunculan pertama karakter spasi dan yang terakhir dan mengekstrak tengah. Ini juga mengekstraksi ruang trailing, yang dapat dihapus dengan biaya 2 byte.

Program lengkap dengan uji kasus:

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

Solusi saat ini karena pengguna11599!

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

Mengambil input dari stdin, mengembalikan setiap nama tengah sebagai string yang terpisah. Mengembalikan character()dalam kasus tanpa nama tengah; yaitu, vektor kelas characterpanjang 0.

Penjelasan:

Baca stdin menjadi daftar string, dipisahkan oleh spasi

     scan(,'')

Hapus elemen terakhir. headmengembalikan nelemen pertama dari daftar, dengan ndefault ke 6. Jika nini -1ia mengembalikan semua tapi elemen terakhir.

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

Sekarang, hapus elemen pertama dari daftar ini.

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

Ini menghasilkan nama tengah.


1
Bahkan lebih pendek: head (scan (, ''), - 1) [- 1] 22 byte. Perhatikan bahwa '' adalah dua kutipan tunggal.
user11599

Jika Anda tidak ingin setiap nama dikutip, gunakan, pada 27 byte, cat (head (scan (, ''), - 1) [- 1])
user11599

Penjelasan: scan (, '') memecah string menjadi kata-kata, head (..., - 1) menjatuhkan kata terakhir, head (..., - 1) [- 1] lalu menjatuhkan kata pertama, cat () memformat output dengan menjatuhkan tanda kutip. Tanpa nama tengah, hasilnya tidak sempurna, itu karakter (0), string kosong.
user11599

@ user11599 Wow, terima kasih! Saya telah bermain-main dengan head()dan tail(), tetapi saya tidak tahu Anda bisa melewati angka negatif sebagai argumen kedua. Bagus!
rturnbull

Penggunaan pemindaian Anda (, '') menginspirasi saya. Saya tidak berpikir untuk mendekati itu.
user11599

3

Ruby, 24 13 byte

p ARGV[1..-2]

Disimpan 11 byte berkat Piccolo menunjukkan bahwa output seperti array diperbolehkan.

Mengambil nama sebagai argumen baris perintah terpisah, misalnya:

$ ruby script.rb John Jacob Jingleheimer Schmidt

atau

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

Kode sebelumnya (menghasilkan string yang tepat):

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

@ Jordan Ide bagus - namun dengan $><<ARGV[1..-2].join" "itu mengeluh tentang " "yang tak terduga, jadi saya harus menambahkan tanda kurung - yang akan menambah 1 byte pada akhirnya.
Flambino

Ah, tentu saja. Salahku.
Jordan

Poster asli mengatakan bahwa output bisa berupa array, sehingga Anda dapat mencukur beberapa karakter dengan hanya mengubah kode Anda puts ARGV[1..-2], supaya Anda tahu.
Piccolo

@Piccolo Hah? Saya tidak melihat itu di mana pun? Jika benar; p ARGV[1..-2]untuk 13 byte - hanya terlihat tidak seperti output dalam tantangan
OPs


3

Golang , 152 81 byte

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

Dibutuhkan input sebagai "Samantha Vee Hills" (dengan tanda kutip ganda) dan mengembalikan nama tengah ke stdout.

Cobalah secara Online!

Sunting: @Dada, perhatikan bahwa "fungsi sebagai jawaban diizinkan" mempersingkat kode saya 71 byte. terima kasih banyak!


Selamat datang di situs ini. Mengirimkan fungsi sebagai jawaban diperbolehkan, sehingga Anda dapat mempersingkat kode Anda dengan melakukan sesuatu seperti ini: Coba online! . Lihat Tips untuk Golf di Go !
Dada

terima kasih @Dada untuk tips dan perpendek kode saya. Itu adalah entri kode pertama saya.
ersinakyuz

3

Matlab, 81 , 79 , 78 , 55 Bytes

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

Dibawa dalam string input,, sdipecah (oleh pembatas default, spasi spasi) ke dalam array sel, dari mana elemen tengah diakses. Kemudian elemen-elemen tengah digabungkan, atau string kosong dikembalikan.

Sunting: terima kasih kepada Luis Mendo karena telah menghemat 3 byte!

Sunting 2: Solusi yang lebih baik dari Ankit!


Saya bukan orang yang pintar! diedit.
Owen Morgan

Anda tidak dapat menggunakan nnzarray sel, tetapi saya melakukan dua perubahan lainnya :)
Owen Morgan

Disarankan Edit oleh Ankit , yang tidak memiliki cukup perwakilan untuk berkomentar. (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));}

Parameternya adalah array pointer yang diakhiri NULL untuk char.

Lihat berhasil di sini .

Argumen baris perintah juga dapat digunakan dengan fungsi yang sama .

C, 51 byte

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

Program lengkap. Input dilakukan melalui argumen baris perintah.

Lihat berhasil di sini .

C, 54 byte

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

Parameter adalah parameter masuk / keluar.

Lihat berhasil di sini .


Selamat datang di PPCG!
Martin Ender

Saya menerima kesalahan berikut ketika kompilasi dengan Visual Studio 2012: kesalahan C2100: tipuan ilegal
Johan du Toit

@JohanduToit VS tidak sesuai C11 atau bahkan C99. Kode saya adalah. Sebagai bukti praktis, baik gcc dan dentang mengkompilasi program yang valid.
2501

2

Python 2, 42 19 16 Bytes

lambda n:n[1:-1]

Cobalah online! Berkat @Kritixi Lithos untuk menghemat 23 byte! Terima kasih @math_junkie karena telah menyimpan 3 byte lebih banyak. Untuk input, letakkan setiap bagian nama sebagai string dalam daftar seperti:

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

Dan ya, OP telah menyetujui daftar untuk menjadi input yang valid.

Penjelasan

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

1
print input()[1:-1]lebih pendek
Kritixi Lithos

Mengiris musim semi memang sulit
Anthony Pham

lambda n:n[1:-1]bahkan lebih pendek
pecandu matematika

1
Saya mungkin telah mencoba dengan input yang salah. Tetapi ketika saya mencoba, dengan Samantha Vee Hillssebagai input di link repl.it yang telah Anda bagikan, ini hanya mencetak amantha Vee Hillyang jelas bukan output yang diperlukan.
Keerthana Prabhakaran

2
Names will always have at least 2 space-separated partsadalah poin pertama dari pertanyaan yang benar.
Keerthana Prabhakaran

2

C ++, 91 byte

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

Mengambil input sebagai referensi ke daftar string dan memodifikasi daftar secara langsung.

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.