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."
Towarzyszu SparklePony
źródło
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:

10

05AB1E , 7 6 bajtów

€ćÁ2ôJ

Wyjaśnienie:

€ć      Extract head of each
  Á     Rotate to the right
    2ô  Split into pieces of length two
      J Join

Wypróbuj online!

Okx
źródło
Wiesz, że dane wejściowe i wyjściowe można traktować jako listę.
Towarzysz SparklePony
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
Kudłaty
źródło
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.

xnor
źródło
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]}*' '
Peter Lenkefi
źródło
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.
Business Cat
źródło
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)
DJMcMayhem
źródło
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

Rick Hitchcock
źródło
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!

DJMcMayhem
źródło
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

AGourd
źródło
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

Dead Possum
źródło
@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.

faubi
źródło
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

PHP, 62 bajty

$c=end($_GET);foreach($_GET as$g)echo$g|$g[0]=$c^$g^$c=$g,' ';
użytkownik63956
źródło
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();
    }
}
TheLethalCoder
źródło
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!"]
Fatalizować
źródło
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ć.

użytkownik2390246
źródło
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()
Michaił V.
źródło
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
2

APL (Dyalog) , 6 bajtów

Zajmuje macierz z jednym słowem na kolumnę.

¯1∘⌽@1

Wypróbuj online!

¯1∘⌽ obróć jeden krok w prawo

@ w

1 rząd 1

Adám
źródło
sprytny pomysł na wprowadzanie danych
Jonah
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@#," ",""]&
Nie drzewo
źródło
1

Retina, 46 37 31 bajtów

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

Wypróbuj online

Wciąż gra w golfa ..

ćpun matematyki
źródło
1
Nie możesz upuścić (.*)i $3?
Neil
@Neil tak, dzięki
matematyka
Jeśli zamienisz +pierwszy wiersz na a, *zmienisz (.* .)trzeci wiersz (.*)na -2 bajty. Wypróbuj online!
PunPun1000,
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."
streetster
źródło
1

Perl 5 , 40 bajtów

39 bajtów kodu + 1 dla -a

$F[-1]=~/./;$a=$&,s/./$a/ for@F;say"@F"

Wypróbuj online!

Xcali
źródło
0

Siatkówka , 25 20 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

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

Wypróbuj online!

Wejścia i wyjścia są oddzielone od linii. Zestaw testowy wykonuje niezbędną konwersję I / O z separacji przestrzeni.

Martin Ender
źródło
Można stosować separację linii.
Towarzysz SparklePony,
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}]])&
J42161217
źródło
0

Pyth, 12 bajtów

.b+hNtY.>Q1Q

Pobiera listę słów i zwraca listę słów.

Spróbuj!

KarlKastor
źródło
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!

Lękliwa Beluga
źródło
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
}
pizzapanty184
źródło
Propozycja wersji Golfiera (dokładnie ten sam kod): -29 bajtów
scottinet,
74 bajty
ceilingcat
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!

ბიმო
źródło
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.

Robert Benson
źródło