свап она жаждет!


27

Получив список или строку с разделителями, выведите список или строку с разделителями с первым символом каждого слова на одно слово позже.

Для этой задачи «слово» состоит только из всех печатаемых символов ASCII, кроме пробела, символа новой строки и символа табуляции.

Например, возьмем строку «Добрый день, мир!» (Разделенных пробелами):

1. String
"Good afternoon, World!"

2. Get the first characters:
"[G]ood [a]fternoon, [W]orld!"

3. Move the characters over. The character at the end gets moved to the beginning.
"[W]ood [G]fternoon, [a]orld!"

4. Final string
"Wood Gfternoon, aorld!"

Это , поэтому выигрывает самый короткий код!

Тестовые случаи:

Input -> output (space-delimited)

"Good afternoon, World!" -> "Wood Gfternoon, aorld!"
"This is a long sentence." -> "shis Ts i aong lentence."
"Programming Puzzles and Code Golf" -> Grogramming Puzzles Pnd aode Colf"
"Input -> output" -> "onput I> -utput"
"The quick brown fox jumped over the lazy dog." -> "dhe Tuick qrown box fumped jver ohe tazy log."
"good green grass grows." -> "good green grass grows."

Разрешается ли в конце выходной пробел?
Бизнес кошка

Можем ли мы предположить, что между словами будет не более одного пробела?
математик наркоман

с некоторыми правилами, по которым буквы могут следовать друг за другом, у вас будет генератор

@BusinessCat Да.
Товарищ SparklePony

@mathjunkie Да.
Товарищ SparklePony

Ответы:



8

Japt , 11 10 9 8 байт

Использует преимущества переноса индекса Japt и отрицательной индексации.

ËhUgEÉ g

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


объяснение

        :Implicit input of array U (each element is an individual word).
Ë       :Map over the array.
h       :Replace the first character of the current element (word) ...
Ug      :  with the word in the array at index ...
EÉ      :    current index (E) -1's ...
g       :  first character.
        :Implicit output of array of modified words

Я думаю, что вы также можете принять входные данные в виде списка, сохранив еще один байт на¸
ETHproductions

Это может быть натяжкой, @ETHproductions, но я спрошу. РЕДАКТИРОВАТЬ: Подтверждено здесь
Shaggy

1
Да, в самом начале поста написано «Задан список или строка с разделителями», хотя я не уверен, сколько времени он там был (я думаю, так как задание было впервые опубликовано).
ETHпродукция

Хороший! Использование hбыло хорошей идеей. Я придумал, £g´Y ¯1 +XÅчто может стать £ XhUg´Y ¯1, используя вашу технику.
Оливер

5

Haskell , 43 байта

p%((a:b):r)=(p:b):a%r
_%e=e
(%)=<<head.last

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

Запоминает первую букву предыдущего слова pи рекурсивно делает его первой буквой текущего слова при отправке новой первой буквы по цепочке. Предыдущая первая буква инициализируется как первая буква последнего слова.


4

Рубин, 85 77 63 байта

Уверен, это может быть намного короче.

Редактировать: Спасибо за @manatwork для сбора -> карта

a=gets.split;$><<a.zip(a.rotate -1).map{|x,y|y[0]+x[1..-1]}*' '

Вы можете заменить как .collectи .eachс .map.
manatwork

1
-pфлаг (+1 байт) и i=-2;gsub(r=/\b\w/){$_.scan(r)[i+=1]}для окончательной игры в гольф
Value Ink


4

CJam , 12 10 9 байт

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

q~Sf+:()o

Принимает ввод как список слов.

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

объяснение

     e# Example input: ["Good" "afternoon," "World!"]
q~   e# Read and eval the input.
     e# STACK: [["Good" "afternoon," "World!"]]
Sf+  e# Append a space to each word.
     e# STACK: [["Good " "afternoon, " "World! "]]
:(   e# Remove the first character from each substring.
     e# STACK: [["ood " 'G "fternoon, " 'a "orld! " 'W]]
)o   e# Remove and print the last element of the array.
     e# STACK: [["ood " 'G "fternoon, " 'a "orld! "]]
     e# Implicitly join the remaining array with no separator and output.

Знаете, вы можете использовать вход и выход в виде списка.
Товарищ SparklePony

@ComradeSparklePony Вы подтвердили это после того, как я ответил: P Гольф сейчас
Business Cat

)oдля 1m>.
jimmy23013

3

V , 7 байт

Îxjp
{P

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

Объяснение:

Î       " On every line:
 x      "   Delete the first character
  j     "   Move down a line
   p    "   And paste a character (into column 2)
{       " Move to the beginning of the input
 P      " And paste the last thing we deleted (into column 1)

3

JavaScript (ES6), 46 байт

s=>s.map((k,i)=>s.slice(i-1)[0][0]+k.slice(1))

Использует тот факт, что slice(-1)возвращает последний элемент массива.

отрывок


Не могли бы вы удалить присоединиться? Вопрос гласит, что вы можете вывести список. Это спасло бы 8 байтов
Крейг Эйр

1
@CraigAyre, милый, спасибо!
Рик Хичкок

3

Vim, 16 , 9 байт

<C-v>GdjPGD{P

7 байтов сохранено благодаря @Wossname!

Вводит одно слово в строку, например

Hello
world
and
good
day
to
you

Я считаю, что это должно быть хорошо, так как разрешено использование входных данных в виде списка.

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


Это может быть сделано в 12 нажатий клавиш, если вы делаете это «вручную», как это было. Не уверен, как сформулировать этот синтаксис здесь или даже допустимо ли сделать это в этой головоломке. ^vGdjPGd$ggP (где ^ v - комбинация клавиш [control + v], просто начните с курсора в левом верхнем углу и
перейдите

@ Wossname Ах, это отличная идея! Есть пара небольших вещей, которые я добавил, чтобы сохранить еще больше байтов (например dd -> D, gg -> }) Спасибо за совет!
DJMcMayhem

Я не знал, что у dd и gg были более короткие версии! Круто :)
Wossname

Как насчет использования «надстрочных тегов HTML» вокруг буквы v в коде вместо «<Cv>»? Это сделало бы код правильной длины, если смотреть в ответе. Таким образом, ваш код будет выглядеть как ... <sup> V </ sup> GdjPGD {P ..., что выглядит довольно аккуратно, когда веб-страница stackexchange форматирует его должным образом.
Wossname

1
Я вижу, фигурные скобки прыгают между абзацами, это работает здесь, потому что мы имеем дело только с одним абзацем. Круто. Ух ты, это делает прокрутку больших файлов кода очень быстрой! Спасибо за этот совет. :)
Wossname

3

> <> , 44 45 байт

90.f3+0.>&i&01.>~r&l0=?;o20.
 i:" "=?^:1+ ?!^

Предполагает разделенные пробелами слова.

Исправление Аароном добавлено 1 байт


2

Python 2, 74 байта

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

S=input().split()
print' '.join(b[0]+a[1:]for a,b in zip(S,S[-1:]+S[:-1]))

-5 байт, благодаря @Rod


@Rod Хорошее предложение, спасибо!
Мертвый Опоссум

4
S[:-1]можно сократить до S; архивирование списков разной длины автоматически обрезается в зависимости от того, что длиннее
Джулиан Вольф

2

Haskell , 50 байтов

f=zipWith(:).((:).last<*>init).map head<*>map tail

Ввод и вывод в виде списков слов.


1
Функции могут быть безымянными, поэтому вы можете опустить f=.
Ними

1
О, круто, я не знал, что для Haskell был онлайн-компилятор. Я удалю свои комментарии, так как я не прав ^^
процесс Моники


2

C #, 78 77 байтов

using System.Linq;a=>a.Select((s,i)=>a[i-->0?i:a.Count-1][0]+s.Substring(1));

Компилируется в Func<List<string>, IEnumerable<string>>полную / форматированную версию:

using System;
using System.Collections.Generic;
using System.Linq;

class P
{
    static void Main()
    {
        Func<List<string>, IEnumerable<string>> f = a =>
                a.Select((s, i) => a[i-- > 0 ? i : a.Count - 1][0] + s.Substring(1));

        Console.WriteLine(string.Join(" ", f(new List<string>() { "Good", "afternoon,", "World!" })));
        Console.WriteLine(string.Join(" ", f(new List<string>() { "This", "is", "a", "long", "sentence." })));

        Console.ReadLine();
    }
}

2

Брахилог , 12 байт

{hᵐ↻|bᵐ}ᶠzcᵐ

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

объяснение

Example input: ["Good","afternoon,","World!"]

{      }ᶠ       Find: [["W","G","a"],["ood","fternoon,","orld!"]]
 hᵐ↻              Take the head of each string, cyclically permute them
    |             (and)
     bᵐ           Get the strings without their heads
         z      Zip: [["W","ood"],["G","fternoon,"],["a","orld!"]]
          cᵐ    Map concatenate on each list: ["Wood","Gfternoon,","aorld!"]

2

R, 72 70 байт

function(x)paste0(substr(x,1,1)[c(y<-length(x),2:y-1)],substring(x,2))

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

2 байта сохранены благодаря Джузеппе.

Вход и выход являются списками. Извлекает подстроку, состоящую из первых букв, циклически выводит последнюю вперед и вставляет ее вместе с подстрокой остальной части каждого слова. Этап езды на велосипеде - убийца, но я не могу найти способ сократить его дальше.


1
Вы можете использовать 2:y-1вместо, 1:(y-1)так как :имеет приоритет над тем, -что экономит 2 байта.
Джузеппе


2

Python 2 + Numpy, 104 байта

from numpy import *
s=fromstring(input(),"b")
m=roll(s==32,1)
m[0]=1
s[m]=roll(s[m],1)
print s.tobytes()

1
Вы должны включить оператор импорта в число байтов. Классный ответ!
Товарищ SparklePony

Кроме того, вы должны иметь свой входной и выходной код в
Фелипе Нарди Батиста,

1
Я думаю, что вы можете отбросить последний перевод строки на 1 байт.
Орджан Йохансен

@ ØrjanJohansen да, также работает «b» вместо «u1», так что -2 байта.
Михаил V


1

Mathematica, 59 байт

""<>#&/@Thread@{RotateRight@#~StringTake~1,#~StringDrop~1}&

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

Принимает и возвращает список слов.

Если вы предпочитаете принимать и возвращать строки, это работает для 87 байтов:

StringRiffle[Thread@{RotateRight@#~StringTake~1,#~StringDrop~1}&@StringSplit@#," ",""]&

1

Сетчатка, 46 37 31 байт

(\S)(\S* +)
$2$1
(.* .)(.)
$2$1

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

Все еще в гольфе ..


1
Вы не можете бросить (.*)и $3?
Нил

@ Нил, да, спасибо
математик наркоман

Если вы поворачиваете +в первой строке к a, *вы поворачиваете (.* .)в третьей строке (.*)на -2 байта. Попробуйте онлайн!
PunPun1000

1

kdb +, 25 22 байта

Решение:

rotate[-1;1#'a],'1_'a:

Пример:

q)rotate[-1;1#'a],'1_'a:("The";"quick";"brown";"fox";"jumped";"over";"the";"lazy";"dog.")
"dhe"
"Tuick"
"qrown"
"box"
"fumped"
"jver"
"ohe"
"tazy"
"log."

Объяснение:

1_'a:             // (y) drop first character of each element of a
,'                // join each left with each right
rotate[-1;1#'a]   // (x) take first character of each element of a, rotate backwards 1 char

Дополнительно:

Версия, которая принимает обычную строку (37 байт):

q){" "sv rotate[-1;1#'a],'1_'a:" "vs x}"The quick brown fox jumped over the lazy dog."
"dhe Tuick qrown box fumped jver ohe tazy log."


0

Сетчатка , 25 20 байт

Количество байтов предполагает кодировку ISO 8859-1.

Om$`^.((?=.*¶))?
$#1

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

Вход и выход разделены переводом строки. Набор тестов выполняет необходимое преобразование ввода / вывода из разделения пространства.


Можно использовать разделение перевода строки.
Товарищ SparklePony

0

Mathematica, 134 байта

(w=Characters@StringSplit@#;d=Drop[w,0,1];StringRiffle[StringJoin/@Table[PrependTo[d[[i]],RotateRight[First/@w][[i]]],{i,Length@w}]])&


0

Java (OpenJDK 8) , 97 байт

for(int n=s.length,i=0,j=n-1;i<n;j%=n)System.out.print(s[j++].charAt(0)+s[i++].substring(1)+" ");

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


Это фрагмент, а не функция. Кроме того, вы должны принять всю строку в качестве одного аргумента, а также оставить запятые и вопросительные / экзаменационные метки в выводе как есть.
Кевин Круйссен,

0

C 106 77 байт

i,a,b;f(char*o){a=*o;for(i=0;o[i++];)if(o[i]==32){b=o[++i];o[i]=a;a=b;}*o=a;}

-29 байт из скоттинета

Изменяет строку на месте.

Ungolfed:

char *f(char *o){
    char a=*o,b; // start with a as the first character of the first word
    for(int i=0;++i<strlen(o);){
        // iterate through the string with i as the index
        if(o[i]==32){ // if the current character is a space, 
                      // i.e. if a word begins after this character
            b=o[++i]; // store the beginning of the next word in b
            o[i]=a; // set the beginning of the next word to a
            a=b; // set a to what the beginning of the next work used to be
        }
    }
    *o=a; 
    // set the beginning of the first word to the old beginning of the last word
}

Предложение по версии Golfier (точно такой же код): -29 байт
scottinet



0

Шелуха , 11 байт

Foz:ṙ_1TmΓ,

Ввод и вывод в виде списка строк, попробуйте онлайн!

(Заголовок просто преобразует входные данные в список слов и объединяет выходной список с пробелами.)

объяснение

F(z:ṙ_1)TmΓ,  -- example input: ["Good" "afternoon,","World!"]
         m    -- map the following (example on "Good")
          Γ   -- | pattern match head & tail: 'G' "ood"
           ,  -- | construct tuple: ('G',"ood")
              -- : [('G',"ood"),('a',"fternoon,"),('W',"orld!")]
        T     -- unzip: ("GaW",["ood","fternoon,","orld!"])
F(     )      -- apply the function to the pair
    ṙ_1       -- | rotate first argument by 1 (to right): "WGa"
  z:          -- | zip the two by (example with 'W' and "ood")
              -- | | cons/(re)construct string: "Wood"
              -- :-: ["Wood","Gfternoon,","aorld!"]

Альтернатива, 11 байт

§oz:ṙ_1m←mt

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


0

AWK , 63 байта

{for(R=substr($NF,1,1);++j<=NF;R=r)sub(r=substr($j,1,1),R,$j)}1

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

Кажется, должен быть способ уменьшить избыточность, но я этого не вижу.

Примечание: ссылка TIO имеет 4 дополнительных байта для многострочного ввода.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.