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.