Kim ikinci isim için virgül kullanır?


18

Zorluğunuz girdi olarak bir ad (dize) almaktır.

Albert Einstein

ve çıktı:

Einstein, Albert

pseudocode:

set in to input
set arr to in split by " "
set last to the last element of arr
remove the last element of arr
set out to arr joined with " "
prepend ", " to out
prepend last to out
output out

Daha fazla test örneği:

John Fitzgerald Kennedy => Kennedy, John Fitzgerald
Abraham Lincoln => Lincoln, Abraham

kurallar

  • Giriş her zaman normal ifadeyle eşleşecektir ^([A-Z][a-z]+ )+([A-Z][a-z]+)$.
  • Çıktı teknik olarak yanlış olsa bile, garip isimlerle uğraşmanıza gerek yok.
  • Sondaki boşluk / satırsonu tamam.
  • Sorusu olan? Aşağıdaki yorum!

Sondaki boşluklara izin veriliyor mu?
Değer Mürekkebi

Çözümler hemen hemen siply yerini alabilir çünkü dupe olarak kapalı leolan ,ve bu soru var
Downgoat

2
@Downgoat Bu meydan okuma iki kelimeyi belirtirken, buna yönelik çözümlerin keyfi olarak birçok kelime için çalışması gerekir. Bildiğim kadarıyla söyleyebilirim, TIO bağlantıları ile cevapların yalnızca Cidden çözüm bu soru yerine doğru cevap verir leile ,.
ngenisis

7
@ Birisi -4. En azından bunu bir dupe olarak kapatın.
Stephen

1
Sondaki boşluklar iyi mi?
Tom Carpenter

Yanıtlar:


10

05AB1E , 7 bayt

Kod:

',ì#Áðý

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

',ì         # Prepend the input to ","
   #        # Split on spaces
    Á       # Rotate every element one position to the right (wrapping)
     ðý     # Join the array by spaces

1
Başına ekle! Bunu liste biçiminde yapmanın bir yolu olması gerektiğini biliyordum.
Emigna

9

JavaScript (ES6), 34 bayt

s=>s.replace(/(.+) (.+)/,'$2, $1')

Demo:

let f = s=>s.replace(/(.+) (.+)/,'$2, $1')

;[ 'Albert Einstein', 'John Fitzgerald Kennedy', 'Abraham Lincoln' ].forEach(
  s => console.log(`${s} => ${f(s)}`)
)


8

Retina , 19 17 16 bayt

Edit: Riker'a 3 bayt kaydettiği için teşekkürler

(.+) (.+)
$2, $1

Çevrimiçi deneyin!


1
bekle, (.+)her ikisi için de çalışır.
Rɪᴋᴇʀ

Neden \wilk başta kullandığınızı anlamıyorum
theonlygusti

1
@theonlygusti Mathematica'da, açgözlü olmaktan ziyade tembel eşleme kullanan desen eşleşmesine daha aşinayım.
ngenisis

7

Jöle , 7 bayt

;”,Ḳṙ-K

Çevrimiçi deneyin!

Jelly'i çok iyi tanımıyorum, ancak diğer cevapları okumak optimal bir algoritma kullanmamış gibi görünüyordu ... işte burada:

açıklama

;”,Ḳṙ-K
;”,        Append a comma to the end of the string
   Ḳ       Split on spaces
    ṙ-     Rotate the array by -1 (1 time towards the right)
      K    Join with spaces

7

Vim, 10 bayt / tuş vuruşu

v$F dA, <esc>p

Çevrimiçi deneyin!


Güzel, ama çalışmasını sağlamak için mücadele ettim <esc>, kodunuzda görünmüyor. Denemek isteyen diğer kişilere bildirimde bulunmak için: Bu, adın düzenleyicide yazıldığını ve şu anda dosyanın başında normal modda olduğunuzu varsayar.
sigvaldm

7

V / vim, 9 8 bayt

$bD0Pa, 

Çevrimiçi deneyin!

Sayesinde bir Byte tasarruf etti

Sonunda boşluk karakteri olduğunu unutmayın. Kurallara izin verilen bir boşluk bırakır.

Açıklama:

$       " move the cursor to the end of the line
 b      " move the cursor to the beginning of the current word
  D     " delete to the end of the line
   0    " move the cursor to the start of the line
    P   " paste in front of the cursor.
     a  " append (enter insert mode with the cursor one character forward)
      , " Literal text, ", "

Güzel! İhtiyaç duymamak için kesici uç modunu sonuna kadar yerleştirmek iyi bir fikirdir <esc>. Bunun $bDyerine yaparak bir bayt kaydedebilirsiniz $diw. :)
DJMcMayhem

Teşekkürler. $bDtek karakterli isimleri ele almıyorsa, OP'ye izin verilip verilmediğini sordum .
Kevin

Öyle görünüyor, bu yüzden güncelleme.
Kevin


6

Mathematica, 52 40 bayt

StringReplace[x__~~" "~~y__:>y<>", "<>x]


5

C, 45 bayt

EDIT: Şimdi muhtemelen ikiden fazla kelime olan girdi gereksinimi fark ettim. Bunu olduğu gibi bir notla bırakacağım, bunun sadece iki kelime için işe yaradığını.

EDIT: kaldırıldı \n. Gerekli olduğunu düşünüyorsanız 2 bayt ekleyin.

main(a,b)int**b;{printf("%s, %s",b[2],b[1]);}

İle derler gcc name.c, GCC 6.3.1. Uyarıları yoksay. Kullanımı:

$./a.out Albert Einstein
Einstein, Albert

Dilin kötüye kullanılması:

  • Örtülü dönüş tipi intarasında mainve hiçbir şey geri döndü.
  • Dolaylı açıklaması printf. GCC yine de dahil edecektir.
  • Yanlış tip b. Önemli değil%s

İle ilgili ipuçları için @ Khaled.K sayesinde main(a,b)int**b;ziyade main(int a, int **b).


Güzel ilk golf, web sitesine hoş geldiniz, ayrıca main(a,**b){printf("%s, %s",b[2],b[1]);}40 bayt
Khaled.K

Teşekkürler :) Aslında türleri tamamen atlamayı düşündüm, ama nedense derlemezdim.
sigvaldm

1
Bu çalışıyormain(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
Khaled.K


4

sed, -E = 20 bayt için 19 + 1

s/(.*) (.*)/\2, \1/

Gruplama parantezinden kaçmak zorunda kalmamak için -r (GNU) veya -E (BSD, son GNU'lar) kullanılmalıdır.

Komut satırında yazılırsa, kabuk tarafından birden fazla jeton olarak ayrıştırılmaması için tırnak işaretleri içine alınmalıdır:

sed -E 's/(.*) (.*)/\2, \1/'

4

C, 68 bayt

Umarım başka bir yazı eklemek yanlış olmaz, ancak daha önce yayınladığım C çözümümden biraz farklı bir çözüm. Bu, herhangi bir sayıda ismi kabul eder.

main(a,b)int**b;{for(printf("%s,",b[--a]);--a;printf(" %s",*++b));}

gcc name.c(GCC 6.3.1) ile derleyin ve uyarıları dikkate almayın. Kullanımı:

$./a.out John Fitzgerald Kennedy
Kennedy, John Fitzgerald

İçin ipuçları için @ Khaled.K'ye teşekkürler main(a,b)int**b;

@Alkano'ya for döngüsündeki ipucu için teşekkürler.


1
süre yerine kullanarak 2 bayt kazanabilirsiniz main(a,b)int**b;{for(printf("%s,",b[--a]);++b,--a;printf(" %s",*b));}
Alkano

Bu çılgınca geliyor, ama bunu yapabilirsinizmain(a,b)int**b;{a&&printf("%s,"b[a-1])&&main(a-1,b);}
Khaled.K

Çok güzel hileler :) Asla tekrar tekrar ana arama düşündüm. Ama pek işe yaramıyor. Çıktısı "Kennedy, Fitzgerald, John,. / A.out" idi main(a,b)int**b;{--a&&printf("%s, ",b[a])&&main(a,b);}. Kısmi bir çözüm olurdu . 2 bayt daha kısadır ve program adını yazdırmamanızı sağlar, ancak yine de her ad arasında virgül kullanır.
sigvaldm

3

Mathematica, 45 bayt

#/.{a__,s=" ",b__}/;{b}~FreeQ~s->{b,",",s,a}&

Girdiyi karakter dizisi yerine karakter listesi olarak alarak ngenisis'in cevabı üzerine birkaç bayt kaydetti . Desen değiştirme kuralı kullanan saf işlev.

Mathematica, 49 bayt

#~Join~{","," "}~RotateLeft~Last@Position[#," "]&

Karakter listesini giriş olarak alan ve karakter listesini döndüren bir başka saf işlev. Bu , girişe ekler ","ve " "son boşluk sonuna kadar karakter listesini döndürür. (Bu nedenle, yukarıdaki ilk işlevden farklı olarak çıktının sonunda bir boşluk vardır.)


#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&olduğu 4kısa bayt ama öğrendim Exceptbeni kurtaran, dize kalıpları için gereksizdir 12bayt.
ngenisis

ah, does it automatically choose the longest x in your answer?
Greg Martin

Yep, string pattern matching is greedy but regular pattern matching is lazy.
ngenisis

nice <waves white flag>
Greg Martin

3

C#, 76 72 bytes

s=>System.Text.RegularExpressions.Regex.Replace(s,"(.+) (.+)","$2, $1");

Saved 4 bytes with the help of @KevinCruijssen

Old version using substrings for 76 bytes:

s=>s.Substring(s.LastIndexOf(' ')+1)+", "+s.Substring(0,s.LastIndexOf(' '));

1
Too bad System.Text.RegularExpressions.Regex is so damn long in C#.. s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1"); is just one byte more.
Kevin Cruijssen

1
@KevinCruijssen True but I can use the static method on Regex to save 4 bytes
TheLethalCoder

3

Awk, 18 characters

{$1=$NF", "$1}NF--

Sample run:

bash-4.4$ awk '{$1=$NF", "$1}NF--' <<< 'John Fitzgerald Kennedy'
Kennedy, John Fitzgerald

Try it online!



2

05AB1E, 9 bytes

#`',«.Áðý

Try it online!

Explanation

#           # split input on spaces
 `          # push each name separately to stack
  ',«       # concatenate a comma to the last name
     .Á     # rotate stack right
       ðý   # join stack by spaces

Yeah, I should probably make a join by space command :p
Adnan

@Adnan: Would be nice seeing how often it's used :)
Emigna

2

Pyth, 11 bytes

jd.>c+z\,d1

Explanation:

jd.>c+z\,d1
     +z\,      Append the "," to the input
    c+z\,d     Split the string on " "
  .>c+z\,d1    Rotate the array one element right
jd.>c+z\,d1    Join the array on " "

Test it online!



2

MATLAB/Octave, 37 bytes

@(a)regexprep(a,'(.+) (.+)','$2, $1')

Try it online!

Based on @ngenisis' Retina answer, we can also play the regex game in both Octave and MATLAB, saving a fair few bytes over my previous answer.


Old Answer:

I'm going to leave this answer here as well considering it is a more unique way of doing it compared to a simple regex.

Octave, 49 47 bytes

@(a)[a((b=find(a==32)(end))+1:end) ', ' a(1:b)]

Old try it online!

An anonymous function to generate the output.

Basically the code first finds the last space in the string using b=find(a==32)(end). Then It takes the end part of the string (after the space) using a(b+1:end), where b is the output of finding the last space. It also takes the start of the string with a(1:b-1), and concatenates both together with a ', ' in between.

I've already saved a few bytes vs the typical find(a==32,1,'last'). Not quite sure there is much more to save.


2

Jelly, 9 bytes

ḲµṪ;⁾, ;K

Explained, ish:

ḲµṪ;⁾, ;K
Ḳ           # Split the input by spaces
 µ          # Separate the link into two chains. Essentially calls the right half with the split string monadically.
  Ṫ         # The last element, (The last name), modifying the array.
   ;        # Concatenated with...
    ⁾,      # The string literal; ", "
       ;    # Concatenated with...
        K   # The rest of the array, joined at spaces.

Try it online!

Try on all test cases.


2

Python 3, 52 bytes

lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])

Very simple, could use golfing help. Just puts the last word at the front and joins them with ", ".

Testcase:

>>> f=lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])
>>> f("Monty Python")
'Python, Monty'
>>> f("Albus Percival Wulfric Brian Dumbledore")
'Dumbledore, Albus Percival Wulfric Brian'


2

Java, 110 62 bytes

String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}

Non-static method.

-48 bytes thanks to Kevin Cruijssen


String c(String s){int i=s.lastIndexOf(' ');return s.substring(i+1)+", "+s.substring(0,i);} is shorter (91 bytes).
Kevin Cruijssen

And String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");} is even shorter (62 bytes).
Kevin Cruijssen

@KevinCruijssen Oh geez nice. Thanks! I should learn to use regex better :P
HyperNeutrino

2

PHP, 62 59 bytes

-3 bytes, thanks Jörg

$a=explode(' ',$argn);echo array_pop($a).', '.join(' ',$a);

Try it online!

Old solution, 63 Bytes

Doesn't work if the person has 3 repeating names.

<?=($a=strrchr($argv[1]," ")).", ".str_replace($a,'',$argv[1]);

Try it online


You can use $argn instead of $argv[1]
Jörg Hülsermann

2

Excel, 174 170 168 bytes

Saved 2 bytes thanks to Wernisch

=MID(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+1,LEN(A1))&", "&LEFT(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

This is not fancy or clever. It's a fairly basic method. It feels like there should be a shorter way with array formulas but I can't find one that works.


Solution only works for cases where there three names. Does not handle "Albert Einstein" for example.
Wernisch

@Wernisch Thanks! It should work now.
Engineer Toast

Trailing whitespace is allowed according to question. Think you can save 2 bytes by leaving out the the -1 in the LEFT function.
Wernisch


1

MATL, 10 bytes

44hYb1YSZc

Try it online!

Explanation

44h    % Implicitly input a string. Postpend a comma
       % STACK: 'John Fitzgerald Kennedy,'
Yb     % Split on spaces
       % STACK: {'John', 'Fitzgerald', 'Kennedy,'}
1YS    % Circularly shift 1 step to the right
       % STACK: {'Kennedy,', 'John', 'Fitzgerald'}
Zc     % Join with spaces between. Implicitly display
       % STACK: 'Kennedy, John Fitzgerald'

1

Gema, 23 characters

* =@append{s; *}
\Z=,$s

The only remarkable thing here is how the challenge managed to hit the weakness of the Gema patterns non-greediness.

Sample run:

bash-4.4$ echo -n 'John Fitzgerald Kennedy' | gema '* =@append{s; *};\Z=,$s'
Kennedy, John Fitzgerald
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.