Twisted Sentences

17

Zasady

Program powinien otrzymać ciąg / tablicę słów jako dane wejściowe. Dla każdego słowa w łańcuchu znaków / tablicy rekonstruuje ono słowo, przyjmując znaki naprzemiennie od przodu i od tyłu słowa.

12345 678 9 -> 15243 687 9.

Następnie zmieni kolejność słów w naprzemienny sposób między najwcześniejszym a ostatnim słowem występującym w ciągu.

15243 687 9 -> 15243 9 687

Na koniec zrekonstruuje ciąg, umieszczając spacje, tabulatory i znaki nowej linii w indeksach, w których początkowo się znajdowały, przed wygenerowaniem wyniku.

12345 678 9-> 15243 687 9 -> 15243 9 687 -> 15243 968 7

Dane wyjściowe powinny być tego samego typu danych co dane wejściowe.

Standardowe luki są zabronione

Przykłady

Wejście:
Szybki brązowy lis przeskakuje nad leniwym psem.
Wyjście:
Teh d.ogq kucil yaz bnrwo tehf xoo rvej supm

Wejście:
Szybki brązowy lis przeskakuje
nad leniwym psem.
Wyjście:
Teh d.ogq kucil yaz bnrwo
tehf xoo rvej supm

Dane wejściowe:
Aflack Dane
wyjściowe:
Akfcla

To jest więc wygrywa najkrótszy kod

Fəˈnɛtɪk
źródło
6
To wydaje się duplikatem. Przysięgam, że już to widziałem.
Addison Crump,
Więc tylko znaki tabulacji, spacji i nowego wiersza nie są uważane za część słowa?
Jonathan Allan
@JonathanAllan to prawda
fəˈnɛtɪk
Czy możemy założyć ASCII? czy Unicode?
MayorMonty,
@MayorMonty Możesz założyć, że postacie mają dowolną formę, która ułatwia ci to, o ile odpowiednio traktuje spacje.
fəˈnɛtɪk

Odpowiedzi:

3

Galaretka , 15 14  8 bajtów

Fest 6 bajt oszczędzania od Dennis (przesuwając rozłożonego i pleśni wewnątrz ogniwa 1 nie ma potrzeby podzielony na dwa i głowy, a Spłaszczenie jest tam już tak, że stają się jednym!)

żṚFṁ
Ç€Ç

(z dwóch wierszy: żṚFœs2Ḣi Ç€ÇFṁ⁸)

Wypróbuj online!

Pobiera tablicę słów i zwraca tablicę nowych słów. (Stopka w TIO nazywa to i łączy tablicę ze spacjami, dzięki czemu ładnie się drukuje.)

Uwaga - obsługa pojedynczego łańcucha, dzielenie spacji tabulatorami i znaków nowej linii, a następnie ponowne składanie okazało się dość trudne; kiedy zobaczyłem, że lista słów jest opcją, sprawy stały się znacznie łatwiejsze!

W jaki sposób?

Ç€Ç - Main link: list of words
Ç€  - call the last link (1) as a monad for €ach word
  Ç - call the last link (1) as a monad for the result

żṚFṁ - Link 1: Do a twist: list (here, a list of words or characters)
                            e.g. input = [A,B,C,D,E,F,G]
ż    - zip the list with                 [A,    B,    C,    D,    E,    F,    G]
 Ṛ   - the reverse of the list             [G,    F,    E,    D,    C,    B,    A]
                                        [[A,G],[B,F],[C,E],[D,D],[E,C],[F,B],[G,A]]
  F  - flatten into a single list        [A,G,  B,F,  C,E,  D,D,  E,C,  F,B,  G,A]
                                         [A,G,B,F,C,E,D,D,E,C,F,B,G,A]
   ṁ - mould like the input list         [A,G,B,F,C,E,D]
Jonathan Allan
źródło
To powinno działać. Wypróbuj online!
Dennis
Słodki save; zbyt łatwo zapomnieć o tym manewrze!
Jonathan Allan
2

JavaScript (ES6), 89 bajtów

Pobiera i wyprowadza tablicę słów.

a=>a.map(w=>(F=([a,...b])=>a?a+(b.pop()||'')+F(b):'')(a.map(F)).slice(p,p+=w.length),p=0)

Test

Wersja łańcuchowa, 112 bajtów

Bierze i wysyła ciąg.

s=>s.replace(/\S+/g,w=>(F=([a,...b])=>a?a+(b.pop()||'')+F(b):'')(s.split(/\s/).map(F)).slice(p,p+=w.length),p=0)

Test

Arnauld
źródło
2

Perl , 77 bajtów

74 bajty kodu + 3 bajty na -0paflagi.

map{s/.\K/chop/ge,s/../chop/reg}@F;s/\S/($r||=$F[$i++].pop@F)=~s%.%%,$&/ge

Wypróbuj online!

Zapisany 8 bajtów dzięki starej @Ton Hospel „s postu gdzie«ukradł» s/../chop/reg. (Wcześniej miałem $c=y///c/2,s/.{$c}$//)

Dada
źródło
0

Perl 6 , 84 bajtów

{my &t={(|(.shift,.pop)xx*)[^$_]}
map({|t [.comb]},t [$_]).rotor($_».chars)».join}

Wprowadza i wyprowadza listę słów.

Jak to działa

Wewnątrz lambdy zdefiniowałem kolejną lambdę do wykonywania „ kręcących znaków naprzemiennie z przodu i z tyłu ” skręcając:

my &t={                        }   # Lambda, assigned to a variable.
          .shift,.pop              # Remove an element from the front an back,
                      xx*          # an infinite number of times,
        |(           )             # and make sure this infinite list is flattened.
                          [^$_]    # Take as many elements as the input had elements.

Działa to, ponieważ xxoperator bardziej przypomina makro niż funkcję, ponieważ zapewnia magiczną leniwą ocenę.

Następnie w głównej lambda:

                   [$_]                          # Create a fresh array from the input,
                 t                               # and twist it (destructively).
map({          },                                # For each element (i.e. word):
      t [.comb]                                  #   Split it into characters and twist them,
     |                                           #   and slip them into the outer list.
                        .rotor($_».chars)        # Partition this flat list of characters,
                               $_».chars         # using the original word lengths.
                                         ».join  # Turn each sub-list into a word.

Perl 6 , 87 bajtów

{my &t={(|(.shift,.pop)xx*)[^$_]}
my @a=map {|t [.comb]},t [.words];S:g/\S/{@a.shift}/}

Jest to wariant powyższego, który wprowadza i wysyła ciąg znaków - zachowując różne znaki białych znaków.

smls
źródło
0

Haskell , 115 95 93 98 95 bajtów

f(a:b)=a:f(reverse b)
f e=e
a!(y:z)|elem y" \t\n"=y:a!z|b:c<-a=b:c!z
a!z=z
(!)=<<(f=<<).f.words

Zadzwoń z (!)=<<(f=<<).f.words $ "some string". Wypróbuj online!

Dzięki @nimi za zwrócenie uwagi, że źle odczytałem wyzwanie wcześniej.

Funkcja fwykonuje skręcanie na liście, dzięki czemu można jej używać na ciągach znaków (liście znaków) i na liście ciągów znaków. a!bwstawia spację łańcucha bw łańcuch a.

(!)=<<(f=<<).f.wordsodpowiada \s0 -> (concatMap f . f . words $ s0) ! s0:

            s0 = "The quick brown fox jumps\nover the lazy dog."
      words s0 = ["The","quick","brown","fox","jumps","over","the","lazy","dog."] = s1
          f s1 = ["The","dog.","quick","lazy","brown","the","fox","over","jumps"] = s2
concatMap f s2 = "Tehd.ogqkucilyazbnrwotehfxoorvejsupm"                           = s3
       s3 ! s0 = "Teh d.ogq kucil yaz bnrwo\ntehf xoo rvej supm"
Laikoni
źródło