lwap Ona pragnie kajdan!


27

Biorąc pod uwagę listę lub łańcuch rozdzielany, wypisz listę lub łańcuch rozdzielany z pierwszym znakiem każdego słowa o jedno słowo później.

W przypadku tego wyzwania „słowo” składa się tylko ze wszystkich drukowalnych znaków ASCII, z wyjątkiem spacji, nowego wiersza i tabulacji.

Weźmy na przykład ciąg „Dzień dobry, świecie!” (rozdzielane spacjami):

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

To jest , więc wygrywa najkrótszy kod!

Przypadki testowe:

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

Czy na wyjściu jest dozwolone końcowe miejsce?
Business Cat

Czy możemy założyć, że między słowami będzie co najwyżej jedna spacja?
ćpun matematyki

z pewnymi zasadami, według których litery mogą się ze sobą łączyć, masz generator łyżek en.wikipedia.org/wiki/Spoonerism
Nazwa wyświetlana

@BusinessCat Tak.
Towarzysz SparklePony

@mathjunkie Tak.
Towarzysz SparklePony

Odpowiedzi:



8

Japt , 11 10 9 8 bajtów

Korzysta z owijania indeksów Japt i indeksowania ujemnego.

ËhUgEÉ g

Wypróbuj online


Wyjaśnienie

        :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

Myślę, że możesz również wziąć wkład jako listę, oszczędzając kolejny bajt na¸
ETHproductions

To może być odcinek, @ETHproductions, ale zapytam. EDYCJA: Potwierdzono tutaj
Kudłaty

1
Tak, na samym początku postu jest napisane: „Biorąc pod uwagę listę lub ciąg ograniczników”. Nie jestem jednak pewien, jak długo tam był (myślę, że odkąd wyzwanie zostało po raz pierwszy opublikowane).
ETHprodukcje

Niezłe! Używanie hbyło dobrym pomysłem. Wymyśliłem, £g´Y ¯1 +XÅktóra może stać się X XHUg'Y using1 przy użyciu twojej techniki.
Oliver

5

Haskell , 43 bajty

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

Wypróbuj online! Używa listy ciągów wejściowych i wyjściowych.

Zapamiętuje pierwszą literę poprzedniego słowa pi rekurencyjnie czyni ją pierwszą literą bieżącego słowa podczas wysyłania nowej pierwszej litery w dół łańcucha. Poprzednia pierwsza litera jest inicjowana jako pierwsza litera ostatniego słowa.


4

Rubinowy, 85 77 63 bajtów

Jestem pewien, że może to być znacznie krótsze.

Edycja: Dzięki za @manatwork za kolekcję -> mapę

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

Można zastąpić zarówno .collecti .eachz .map.
manatwork

1
-pflag (+1 bajt) i i=-2;gsub(r=/\b\w/){$_.scan(r)[i+=1]}dla ostatecznego golfa
Value Ink


4

CJam , 12 10 9 bajtów

Zaoszczędzono 1 bajt dzięki jimmy23013

q~Sf+:()o

Pobiera dane wejściowe jako listę słów.

Wypróbuj online!

Wyjaśnienie

     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.

Wiesz, że dane wejściowe i wyjściowe można traktować jako listę.
Towarzysz SparklePony

@ComradeSparklePony Potwierdziłeś, że po tym, jak odpowiedziałem: P Gra w golfa teraz
Business Cat

)odla 1m>.
jimmy23013

3

V , 7 bajtów

Îxjp
{P

Wypróbuj online!

Wyjaśnienie:

Î       " 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 bajtów

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

Wykorzystuje fakt, że slice(-1)zwraca ostatni element tablicy.

Skrawek


Czy możesz usunąć dołączenie? Pytanie mówi, że możesz wypisać listę. Zaoszczędziłoby to 8 bajtów
Craig Ayre

1
@CraigAyre, słodki, dzięki!
Rick Hitchcock,

3

Vim, 16 , 9 bajtów

<C-v>GdjPGD{P

7 bajtów zapisanych dzięki @Wossname!

Wymaga wprowadzenia jednego słowa w wierszu, np

Hello
world
and
good
day
to
you

Uważam, że powinno to być w porządku, ponieważ przyjmowanie danych jako listy jest dozwolone.

Wypróbuj online!


Można to zrobić w 12 naciśnięciach klawiszy, jeśli zrobisz to „ręcznie”. Nie jestem pewien, jak sformułować tę składnię tutaj, czy nawet jest to poprawne w tej układance. ^vGdjPGd$ggP (gdzie ^ v to kombinacja klawiszy [control + v], po prostu zacznij od kursora w lewym górnym rogu i
znajdź

@Wossname Ah, to świetny pomysł! Jest kilka małych rzeczy, które dodałem, aby zaoszczędzić jeszcze więcej bajtów (na przykład dd -> D, gg -> }) Dzięki za wskazówkę!
DJMcMayhem

Nie wiedziałem, że dd i gg miały krótsze wersje! Niesamowite :)
Wossname

Co powiesz na użycie „znaczników HTML w indeksie górnym” wokół litery v w kodzie zamiast „<Cv>”? To sprawiłoby, że kod wyglądałby na odpowiednią długość, gdy był widoczny w odpowiedzi. Twój kod wyglądałby więc ...
Wossname

1
Widzę, że nawiasy klamrowe przeskakują między akapitami, działa tutaj, ponieważ mamy do czynienia tylko z jednym akapitem. Fajne. Wow, dzięki czemu szybkie przewijanie dużych plików kodu jest naprawdę proste! Dzięki za tę wskazówkę. :)
Wossname

3

> <> , 44 45 bajtów

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

Zakłada słowa oddzielone spacją.

Korekta Aarona dodała 1 bajt


2

Python 2, 74 bajty

Wypróbuj online

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

-5 bajtów, dzięki @Rod


@Rod Dobra sugestia, dziękuję!
Dead Possum

4
S[:-1]można skrócić do S; kompresowanie list o różnych długościach automatycznie obcinane jest w zależności od tego, który jest dłuższy
Julian Wolf

2

Haskell , 50 bajtów

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

Dane wejściowe i wyjściowe są jak listy słów.


1
Funkcje mogą być nienazwane, więc możesz je pominąć f=.
nimi

1
Och, spoko, nie zdawałem sobie sprawy, że jest kompilator online dla Haskell. Skasuję swoje komentarze, ponieważ się mylę ^^
Pozew Fund Moniki


2

C #, 78 77 bajtów

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

Kompiluje do wersji Func<List<string>, IEnumerable<string>>pełnej / sformatowanej:

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

Brachylog , 12 bajtów

{hᵐ↻|bᵐ}ᶠzcᵐ

Wypróbuj online!

Wyjaśnienie

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 bajtów

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

Wypróbuj online

2 bajty zapisane dzięki Giuseppe.

Dane wejściowe i wyjściowe są listami. Pobiera podciąg składający się z pierwszych liter, przesuwa cyklicznie ostatnią do przodu i wkleja razem z podłańcem reszty każdego słowa. Krok na rowerze jest zabójcą, ale nie mogę znaleźć sposobu, aby go zmniejszyć.


1
możesz użyć 2:y-1zamiast tego, 1:(y-1)ponieważ :ma pierwszeństwo przed tym, -co oszczędza 2 bajty.
Giuseppe,


2

Python 2 + Numpy, 104 bajty

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
Musisz dołączyć instrukcję importu do liczby bajtów. Fajna odpowiedź!
Towarzysz SparklePony

ponadto musisz mieć swój kod wejściowy i wyjściowy w liczbie bajtów
Felipe Nardi Batista

1
Myślę, że możesz upuścić ostatnią nową linię na 1 bajt.
Ørjan Johansen

@ ØrjanJohansen tak, działa również „b” zamiast „u1”, więc -2 bajty.
Michaił V


1

Mathematica, 59 bajtów

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

Wypróbuj online!

Pobiera i zwraca listę słów.

Jeśli wolisz pobierać i zwracać ciągi, działa to dla 87 bajtów:

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


1

kdb +, 25 22 bajtów

Rozwiązanie:

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

Przykład:

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

Wyjaśnienie:

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

Dodatkowy:

Wersja, która pobiera zwykły ciąg (37 bajtów):

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 bajty

(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 bajtów

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)+" ");

Wypróbuj online!


To jest fragment kodu, a nie funkcja. Powinieneś również wziąć cały ciąg jako jeden argument, a także zachować przecinki i znaki zapytania / badania w postaci, w jakiej są.
Kevin Cruijssen

0

C, 106 77 bajtów

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 bajtów z scottinet

Modyfikuje ciąg w miejscu.

Nie golfowany:

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
}

Propozycja wersji Golfiera (dokładnie ten sam kod): -29 bajtów
scottinet,



0

Łuska , 11 bajtów

Foz:ṙ_1TmΓ,

Dane wejściowe i wyjściowe jako lista ciągów, spróbuj online!

(Nagłówek po prostu przekształca dane wejściowe w listę słów i łączy listę wyników ze spacjami.)

Wyjaśnienie

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

Alternatywnie, 11 bajtów

§oz:ṙ_1m←mt

Wypróbuj online!


0

AWK , 63 bajty

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

Wypróbuj online!

Wydaje się, że powinien istnieć sposób na zmniejszenie nadmiarowości, ale nie widzę tego.

Uwaga: łącze TIO ma 4 dodatkowe bajty, aby umożliwić wprowadzenie danych wielowierszowych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.