lwap Вона спрагу спалахує!


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

Чи дозволений простір у виході?
Ділова кішка

Чи можна припустити, що між словами буде щонайменше один пробіл?
математика наркоман

з деякими правилами, за якими листи можуть слідувати один за одним, у вас з'явиться генератор спонеризму en.wikipedia.org/wiki/Spoonerism
Відображайте ім'я

@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, але я запитую. EDIT: Підтверджено тут
Кудлатий

1
Так, на самому початку публікації написано: "З огляду на список або обмежений рядок", не впевнений, як довго це існує, хоча (я думаю, що проблема була вперше опублікована).
ETHproductions

Хороший! Використання hбуло гарною ідеєю. Я придумав, £g´Y ¯1 +XÅщо за вашою методикою можна стати £ XhUg´Y ¯1 .
Олівер

5

Хаскелл , 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.
манастирство

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 Golfing it now
Business Cat

)oдля 1m>.
jimmy23013


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 Ах, це чудова ідея! Theres пару дрібних речей , які я додав , щоб заощадити ще більше байт (наприклад, dd -> D, gg -> }) Дякую за пораду!
DJMcMayhem

Я не знав, що dd і gg у обох були коротші версії! Awesome :)
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 байт.
Ørjan Johansen

@ØrjanJohansen yes, also "b" instead of "u1" works, so -2 bytes.
Mikhail V


1

Mathematica, 59 bytes

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

Try it online!

Takes and returns a list of words.

If you prefer to take and return strings, this works for 87 bytes:

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


1

kdb+, 25 22 bytes

Solution:

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

Example:

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

Explanation:

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

Extra:

A version that takes a regular string (37 bytes):

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

Mathematica, 134 bytes

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



0

C, 106 77 bytes

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 bytes from scottinet

Modifies the string in-place.

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 version proposal (exact same code): -29 bytes
scottinet



0

Husk, 11 bytes

Foz:ṙ_1TmΓ,

Input and output as a list of strings, try it online!

(The header just transforms the input to a list of words and joins the output list with spaces.)

Explanation

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!"]

Alternative, 11 bytes

§oz:ṙ_1m←mt

Try it online!


0

AWK, 63 bytes

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

Try it online!

It seems like there should be a way to reduce the redundancy, but I'm not seeing it.

Note: the TIO link has 4 extra bytes to allow for multiline input.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.