Göbek adım nedir?


30

Not: Kazanan cevap 4/12 / 17'de seçilecektir . Güncel kazanan Jolf, 1 byte .

Henüz bu sitede göbek adıma meydan okuyan bir şey olmadığına şaşırdım. Aramak çok şey yaptım ama hiçbir şey bulamadım. Bu bir dupayse, lütfen bu şekilde işaretleyin.

Senin meydan

Gibi görünen Jo Jean Smithve döndüren bir dize ayrıştırma Jean.

Test durumları

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 

(Bu sonuncusu teknik olarak yanlış, ama bunu düzeltmek çok zor olurdu.)

Notlar:

  • İsimler her zaman aralarında sınırsız orta isimler olacak şekilde en az 2 boşluk içeren parçaya sahip olacak veya dizelerin bir listesi / dizisi olabilir.
  • İsimler alfabeyi içerebilir (büyük küçük harf duyarlı) ve - ( 0x2d)
  • Sonunda yeni bir satır çıktısı alabilirsiniz.
  • Girişin sonunda yeni bir satırsonu olması gerekebilir.
  • STDIN'den giriş, bir işlev parametresi veya komut satırı argümanı izin verilir, ancak zor kodlamaya izin verilmez.
  • Standart boşluklar yasaktır.
  • Çıktı, işlev dönüş değeri, STDOUT, STDERR, vb. Olabilir.
  • Çıktıdaki izleyen boşluklara / yeni satırlara / sekmelere izin verilir.
  • Sorusu olan? Aşağıya yorum yapın!

Bu , yani bayt cinsinden en kısa cevap, kazanıyor!


2
Çıktı dizelerin bir listesi olabilir mi?
Anthony Pham

5
Boşluklu bir dizgeden başka biçimlere izin veriliyorsa, lütfen bunu belirtime göre düzenleyin.
Martin Ender

5
@ programmer5000: giriş bir dizge listesi olabilirse, çıktı ne durumda? Mı ["John", "Jacob", "Jingleheimer", "Schmidt"]> - ["Jacob", "Jingleheimer"]Geçerli bir çözüm?
nimi

3
Önde gelen alanlara izin verilir mi?
17'de

2
@DJ Çünkü "Van" göbek adı değil, soyadının bir parçası. Özellikle sinir bozucu bir dava, adı David ve soyadı Lloyd George olan David Lloyd George'dur. Gerçek insanların isimlerini bu şekilde ayrıştırma teşebbüsü mahkumdur. Aslında, ilk ve soyadlarının ne olduğunu bile söyleyemezsiniz (Li Shi'yi düşünün).
David Conrad

Yanıtlar:


4

Jolf, 1 bayt

Girişin içine alır. Burada dene!


Örnek çalışacak gibi gözükmüyor - düğmelerden herhangi birine tıkladığımda hiçbir şey olmuyor gibi görünüyor. Chrome'u Kullanma 57.0.2987.133

@YiminRong Sadece firefox'ta çalışmasını sağlayabilirim.
Conor O'Brien,

44

Ohm , 2 bayt (CP437)

Kabul eder ve dizelerin listesini döndürür.

()

Açıklama:

()   Main wire, arguments: a

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

10
Sanırım iş için doğru araç
Rohan Jhunjhunwala

15

Vim, 6 5 bayt

dW$BD

Çevrimiçi deneyin!

(sonunda boşluk olan çıkışlar)

Vim, V ile ters uyumlu olduğundan, V için bir TIO bağlantısı ekledim.

açıklama

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, beni yendin. dWWDsize bir bayt kazandırır.
DJMcMayhem

5
@DJMcMayhem Bu sadece tam bir göbek adı için işe yarar.
Martin Ender

DW ve dw arasındaki fark nedir?
Duncan X Simpson,

1
@DuncanXSimpson, dWboşluk olana kadar siler. dwsözcük olmayan karakterlere kadar siler.
Fon Monica'nın Davası

14

Python , 24 bayt

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

Çevrimiçi dize girişini deneyin!

Giriş Biçimi: string


Python 2,16 bayt

lambda n:n[1:-1]

Çevrimiçi liste girişi deneyin!

Giriş Biçimi: Liste


Sen ile başlığı düzenlemek gerekir Pythonyerine Python 2bunun için çalışır, çünkü Python 3, hem de hemen hemen o post oldu.
Bay Xcoder

@ L3viathan, OP çıkış biçiminden bahsetmediğinden must be a stringve giriş biçiminin bir liste olmasına izin verildiğinden, bir listeyi yazdırmak yanlış sonuç olarak kabul edilemez!
Keerthana Prabhakaran

Soruyla ilgili yorumlara göre, bir dize listesine hem girdi hem de çıktı alabilirsiniz. Bir sürü bayttan lambda n:n[1:-1]
tasarruf edin

1
STDIN'den okuyabildiğiniz için, lambda'yı input()(sadece Python 3) ile değiştirebilir
BallpointBen

Haklısın. Teşekkürler. Düzenlemeleri ekledim!
Keerthana Prabhakaran

13

Brain-Flak , 133 bayt

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

Çevrimiçi deneyin!

132 bayt kod, artı 1 bayt -c ASCII giriş ve çıkışına izin veren bayrak .

Ne yazık ki, bu çok sayıda yinelenmiş kod içeriyor, ancak tekrar kullanmak gerçekten zor olacak. Daha sonra inceleyeceğim. İşte bir açıklama:

#While True
{
    #Pop
    {}

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

#Endwhile
}

#Pop the 0
{}

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

#While True
{
    #Pop
    {}

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

#Endwhile
}

#Pop the 0
{}

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

Yorumları kaldırdığınızda 86 bayt. İlk iki ve son satırı ekledim. TIO
Riley

@riley Cool çözümü. Kendiniz göndermek için çekinmeyin!
DJMcMayhem


12

Haskell, 23 , 17 9 bayt

init.tail

Dizelerin bir listesini alır ve döndürür. Çevrimiçi deneyin!

İlk dizeyi bırak, son dizeyi bırak.

Düzenleme: @Generic Display Name, girişin 6 baytlık bir dizi listesi olabileceğini belirtti.

II'yi Düzenle: tek bir dize yerine dizelerin listesini döndür


Bir listeye izin verildiği halde girişe benziyor, bu nedenle -5 bayt için sözcükleri bırak
Jenerik Display Name

@GenericDisplayName: Oh, farketmedi. Teşekkürler!
nimi

Ohm cevabım ve Mathematica, dizgelerin her ikisinin de çıkış listelerini yanıtlıyor, böylece muhtemelen unwords.-8 baytlık bir değere düşebiliyorsunuz .
Nick Clifford

@NickClifford: evet, kendim gördüm ve açıklama için OP’i istedim.
nimi

11

Mathematica, 10 bayt

Rest@*Most

Dizelerin listesini kabul eden ve döndüren adsız bir işlev.

Restson elemanı Mostatar, ilk elemanı atar @*, fonksiyon bileşimidir. Bunun yerine takas etmek Restve / Mostveya doğru kompozisyonu /*kullanmak da işe yarayacaktır. Bu #[[2;;-2]]&, bir bayt tarafından endeksleme atıyor .


10

Brain-Flak , 86 bayt

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

Çevrimiçi deneyin!

Bu kodun çoğu bu cevaptan geliyor . Benim çözümümden hoşlanıyorsan, bunu da değiştirmelisin.

#Push 2
(()())

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

  #While not a space
  {
      #Pop
      {}

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

  #Endwhile
  }

  #Pop the 0
  {}

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

#End loop twice
>)}{}

Aferin! Daha sonra itmek için bir sayaç tutmayı düşünmedim, bu yüzden farklı yığınlar arasında nasıl dolaşacağımı düşünmek için çok uzun zaman geçirdim.
DJMcMayhem

8

Java 7, 74 bayt

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

Java 8, 49 bayt

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

Boşluk karakterinin ilk oluşumunu ve sonuncusunu tanımlayan ve ortayı ayıklayan işlev. Sonuçta ortaya çıkan dize boşluk karakteri (ön ek alanlara izin veriliyorsa OP açıklığa kavuşturulmamıştır) ile eklenir..trim() kod 7 baytlık ek bir ücret karşılığında .

C # ile karşılaştırıldığında, Java, bayt sayısını azaltan alt dize uzunluğu yerine son dizini belirtme avantajına sahiptir.


7

JavaScript (ES6), 22 bayt

Bir dizi diziyi alır ve çıkarır.

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

Test durumları

Dize sürümü (27 bayt)

Bir dizeyi alır ve çıkarır. Çıktı dizgisi, hiçbir orta ad bulunmazsa tek bir boşluk veya baştaki ve sondaki boşlukların bulunduğu orta adlardır.

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


/./.exec.bind(/ .* /)nullhiçbiri dışında # 2'yi taklit ediyor gibi gözüküyor
dandavis

7

AWK , 17 10 bayt

@Steve sayesinde 7 bayt kaydedildi!

$NF=$1=x;1

Çevrimiçi deneyin!

Açıklama:

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

11 byte'a kadar tıraş edilebilir,$NF=$1="";1
steve

3
Veya 10 kullanarak$NF=$1=x;1
steve

1
@ steve ne yapar 1? AWK :) 'de o kadar iyi değilim :)
15

1, varsayılan işlemin yapılması anlamına gelir; yani, $ 0 yazdırmak.
Steve

6

Groovy , 19 bayt

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

Açıklama:

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

Bir kapatma / anonim işlev


1
PPCG'ye Hoşgeldiniz! Atlamak için girdi olarak dizelerin bir listesini alabilir misiniz .split()?
Martin Ender

Martin Ender Evet, girişin her zaman bir dizeler listesi olacağını varsayarsanız, {o [1 ..- 2]} çalışacaktır.
staticmethod

5

PHP, 37 Bayt

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

Dizi olarak bir çıktı için -4 bayt

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

PHP, 42 Bayt

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

PHP, 50 Bayt

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


4

Perl 5 , 27 18 bayt

-nSeçeneği ile çalıştırmak gerekir .

/ (.+) /&&print$1

Çevrimiçi deneyin!

Önce sed'de benzer bir şey yapmak istedi, ancak ne yazık ki açgözlü olmayan miktar belirleyiciyi desteklemiyor. Orta adın birden fazla kelime olması durumunda gerekir.

Düzenle

Dada sayesinde -9 bayt .

Açgözlü olmayan miktar belirleyiciye, başka şeylerin yanı sıra, artık gerekli değildir.


/ (.+) /&&print$1sıralayıcı olmalı. Perl ile golf oynayan yeni insanlar görmek harika!
Dada

@Dada Bahşiş için teşekkürler! Aslında benim ilk defa Perl'de yazıyorum. Neden print if s| (.+) |\1|işe yaramadığını biliyor musunuz ? Bana göre yazdıklarına benziyor.
Maxim Mikhaylov

print if s| (.+) |\1|orta kısmı ile değiştirir ... orta kısmı! (önce ve sonra boşluk eksi), bu yüzden işe yaramaz. Diğer tarafta, önerdiğim şey sadece orta kısım ile eşleşiyor ve sadece onu yazdırıyor ( $1).
Dada

4

Javascript (ES6) 49 16 bayt

Düzenle:

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

Çevrimiçi deneyin!

ungolfed:

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

Basit özelliklerinden bazılarını unuttum sliceve giriş bir dizi olabilir. @Neil ve @ fəˈnɛtɪk sayesinde 27 byte'ı çıkarmayı başardım. Hala gerçekten rekabet etmiyor.

Original:

This isn't really competing but here's a Javascript solution:

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

This creates an anonymous function equal to:

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

How I golfed it

This is a pretty simple golf. I turned the function into an arrow function. Then I "minified" the code. This included renaming name into a single character(a in this case) and removing the let decloration of the variable.

Snippet

Hope this helps anyone who is stuck on the challenge.


The length - is unnecessary, as slice already accepts negative lengths as being relative to the end. This means that you no longer need the intermediate variable, so you can turn your arrow function from a block into an expression.
Neil

Actually the way it works is that -1 is the last but one that you need here.
Neil

It is also slice(1,-1). slice(1,-2) removes two from the end.
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

Röda, 9 bytes

{_[1:-1]}

Try it online!

Not a very interesting solution. Takes a list from the stream and returns the middle names.

21 bytes and I/O:

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

Try it online!

This uses / (split) and & (join).


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

VBA, 69 bytes

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

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!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.