У кого есть запятая для второго имени?


18

Ваша задача - взять имя (строку) в качестве ввода, например

Albert Einstein

и вывод:

Einstein, Albert

псевдокод:

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

Больше тестовых случаев:

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

правила

  • Ввод всегда будет соответствовать регулярному выражению ^([A-Z][a-z]+ )+([A-Z][a-z]+)$.
  • Вам не нужно обрабатывать странные имена , даже если выходные данные технически некорректны, здесь все в порядке.
  • Конечный пробел / новая строка в порядке.
  • Любые вопросы? Комментарий ниже!

Разрешены ли пробелы?
Value Ink

Я закрыл , как простофиля , потому что решения могут в значительной степени siply заменить leс ,и у вас есть этот вопрос
Downgoat

2
@Downgoat Эта задача определяет два слова, в то время как решения для этого должны работать для произвольного числа слов. Насколько я могу судить, ответы с TiO ссылки, только серьезно решение дает правильный ответ на этот вопрос подставляя leс ,.
ngenisis

7
@ Купи, у кого -4. По крайней мере, закройте этот как обман этого.
Стивен

1
В конце пробелы в порядке?
Том Карпентер

Ответы:


10

05AB1E , 7 байтов

Код:

',ì#Áðý

Использует кодировку 05AB1E . Попробуйте онлайн!

Объяснение:

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

1
Prepend! Я знал, что должен быть способ сделать это в listform.
Эминья


8

Сетчатка , 19 17 16 байт

Изменить: Спасибо Riker за сохранение 3 байта

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

Попробуйте онлайн!


1
держись, (.+)работает тоже для обоих.
Rɪᴋᴇʀ

Я не понимаю, почему вы использовали \wв первую очередь
theonlygusti

1
@theonlygusti Я больше знаком с сопоставлением с образцом в Mathematica, который использует ленивое сопоставление, а не жадное.
ngenisis

7

Желе , 7 байт

;”,Ḳṙ-K

Попробуйте онлайн!

Я не очень хорошо знаю Jelly, но, читая другие ответы, казалось, что они не использовали оптимальный алгоритм ... так вот оно:

объяснение

;”,Ḳṙ-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 байт / нажатий клавиш

v$F dA, <esc>p

Попробуйте онлайн!


Хороший, но я изо всех сил пытался заставить это работать, <esc>не появляется в вашем коде. Обратите внимание на тех, кто хочет попробовать: Предполагается, что имя написано в редакторе, и вы находитесь в начале файла в обычном режиме.
sigvaldm

7

V / vim, 9 8 байт

$bD0Pa, 

Попробуйте онлайн!

Сохранено один байт благодаря

Обратите внимание, что в конце есть пробел. Оставляет завершающий пробел, который разрешен в соответствии с правилами.

Объяснение:

$       " 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, ", "

Хороший! Хорошо подумайте, вставив режим вставки в конце, чтобы избежать необходимости <esc>. Вы можете сохранить один байт, выполнив $bDвместо $diw. :)
DJMcMayhem

Благодарю. $bDне обрабатывает односимвольные имена, я спросил OP , разрешено ли это.
Кевин

Похоже, что так, обновление.
Кевин




5

C 45 байтов

РЕДАКТИРОВАТЬ: Я только сейчас заметил требование для ввода, возможно, более двух слов. Я оставлю это как есть с примечанием, что это работает только для двух слов.

РЕДАКТИРОВАТЬ: удалено \n. Добавьте 2 байта, если считаете это необходимым.

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

Компилируется с gcc name.cGCC 6.3.1. Игнорировать предупреждения. Использование:

$./a.out Albert Einstein
Einstein, Albert

Злоупотребление языком:

  • Неявный тип возврата intиз mainи ничего не возвращается.
  • Неявное объявление printf. GCC включит его в любом случае.
  • Неправильный тип b. Не имеет значения с%s

Спасибо @ Khaled.K за советы по использованию, main(a,b)int**b;а не main(int a, int **b).


Хороший первый гольф, добро пожаловать на сайт, также main(a,**b){printf("%s, %s",b[2],b[1]);}40 байтов
Khaled.K

Спасибо :) На самом деле я думал о том, чтобы полностью пропустить типы, но по какой-то причине он не скомпилируется.
sigvaldm

1
Это работаетmain(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
Khaled.K


4

sed, 19 + 1 для -E = 20 байт

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

Необходимо использовать -r (GNU) или -E (BSD, последние GNU), чтобы избежать необходимости избегать скобок группировки.

Если он записан в командной строке, он должен быть заключен в кавычки, чтобы оболочка не анализировала его как несколько токенов:

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

4

C 68 байт

Надеюсь, что нет ничего плохого в том, чтобы добавить еще один пост, но здесь решение несколько отличается от моего ранее опубликованного решения C. Этот принимает любое количество имен.

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

Компилировать с gcc name.c(GCC 6.3.1) и игнорировать предупреждения. Использование:

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

Спасибо @ Khaled.K за советы по main(a,b)int**b;

Спасибо за подсказку для цикла @Alkano.


1
Вы можете получить 2 байта, используя вместо вместо while main(a,b)int**b;{for(printf("%s,",b[--a]);++b,--a;printf(" %s",*b));}
Alkano

Это звучит безумно, но вы можете сделать этоmain(a,b)int**b;{a&&printf("%s,"b[a-1])&&main(a-1,b);}
Khaled.K

Очень хорошие трюки :) Я никогда не думал о рекурсивном вызове main. Но это не совсем работает. Вывод был "Кеннеди, Фицджеральд, Джон. / A.out", частичное решение будетmain(a,b)int**b;{--a&&printf("%s, ",b[a])&&main(a,b);} . Это на 2 байта короче, и это гарантирует, что вы не печатаете имя программы, но она по-прежнему использует запятую между каждым именем.
sigvaldm

3

Mathematica, 45 байт

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

Сохраните несколько байтов в ответе ngenisis, приняв ввод как список символов, а не как строку. Чистая функция, которая использует правило замены шаблона.

Mathematica, 49 байтов

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

Еще одна чистая функция, принимающая список символов в качестве входных данных и возвращающая список символов. Этот добавляет ","и " "к вводу, а затем поворачивает список символов до последнего пробела в конце. (Таким образом, у выхода есть завершающий пробел, в отличие от первой функции выше.)


#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&на 4байты короче, но я обнаружил, что это Exceptне нужно для строковых шаблонов, экономя мне 12байты.
ngenisis

ах, он автоматически выбирает самый длинный xв вашем ответе?
Грег Мартин

Да, сопоставление с образцом строки жадное, но регулярное сопоставление с образцом ленивое.
ngenisis

хороший <машет белым флагом>
Грег Мартин

3

C #, 76 72 байта

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

Сохранено 4 байта с помощью @KevinCruijssen

Старая версия с использованием подстрок для 76 байт:

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

1
Жаль, System.Text.RegularExpressions.Regexчто в C # так чертовски долго ... s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");всего на один байт больше.
Кевин Круйссен

1
@KevinCruijssen Верно, но я могу использовать статический метод Regexдля сохранения 4 байтов
TheLethalCoder



2

05AB1E , 9 байтов

#`',«.Áðý

Попробуйте онлайн!

объяснение

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

Да, я, вероятно, должен сделать соединение с помощью космической команды: p
Аднан

@Adnan: Было бы неплохо увидеть, как часто он используется :)
Эминья



2

MATLAB / Октава , 37 байт

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

Попробуйте онлайн!

Основываясь на ответе Retina @ngenisis, мы также можем играть в регулярные выражения в Octave и MATLAB, сэкономив несколько байтов по сравнению с моим предыдущим ответом.


Старый ответ:

Я собираюсь оставить этот ответ и здесь, учитывая, что это более уникальный способ сделать это по сравнению с простым регулярным выражением.

Октава , 49 47 байт

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

Старый попробуйте онлайн!

Анонимная функция для генерации вывода.

В основном код сначала находит последний пробел в строке, используя b=find(a==32)(end). Затем он принимает конечную часть строки (после пробела), используя a(b+1:end), где bвывод нахождения последнего пробела. Он также берет начало строки с a(1:b-1)и объединяет оба вместе с ', 'промежуточным.

Я уже сэкономил несколько байт по сравнению с обычным find(a==32,1,'last'). Не совсем уверен, что можно сэкономить гораздо больше.


2

Желе , 9 байт

ḲµṪ;⁾, ;K

Объяснил, иш:

ḲµṪ;⁾, ;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.

Попробуйте онлайн!

Попробуйте на всех тестовых случаях.


2

Python 3, 52 байта

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

Очень просто, можно использовать помощь в гольф. Просто помещает последнее слово впереди и соединяет их с ",".

Прецедент:

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

Ява, 110 62 байта

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

Нестатический метод.

-48 байтов благодаря Кевину Круйссену


String c(String s){int i=s.lastIndexOf(' ');return s.substring(i+1)+", "+s.substring(0,i);}короче ( 91 байт ).
Кевин Круйссен

И String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}еще короче ( 62 байта ).
Кевин Круйссен

@KevinCruijssen О, черт возьми, приятно. Благодарность! Я должен научиться использовать регулярные выражения лучше: P
HyperNeutrino

2

PHP , 62 59 байт

-3 байта, спасибо Йорг

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

Попробуйте онлайн!

Старое решение, 63 байта

Не работает, если у человека есть 3 повторяющихся имени.

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

Попробуйте онлайн


Вы можете использовать $argnвместо$argv[1]
Jörg Hülsermann

2

Excel, 174 170 168 байт

Сохранено 2 байта благодаря Вернишу

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

Это не модно и не умно. Это довольно простой метод. Такое ощущение, что должен быть более короткий путь с формулами массива, но я не могу найти тот, который работает.


Решение работает только для случаев, когда есть три имени. Не относится к "Альберту Эйнштейну", например.
Верниш

@Wernisch Спасибо! Это должно работать сейчас.
Инженер Тост

Конечный пробел допускается в зависимости от вопроса. Подумайте, что вы можете сэкономить 2 байта, не используя -1функцию LEFT.
Верниш


1

MATL , 10 байт

44hYb1YSZc

Попробуйте онлайн!

объяснение

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

Гема, 23 персонажа

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

Единственная замечательная вещь здесь - это то, как вызову удалось поразить слабость ненасытности паттернов Гема.

Образец прогона:

bash-4.4$ echo -n 'John Fitzgerald Kennedy' | gema '* =@append{s; *};\Z=,$s'
Kennedy, John Fitzgerald
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.