Torcendo Sentenças

17

Regras

O programa deve receber uma string / matriz de palavras como entrada. Para cada palavra na string / matriz, ela será reconstruída, colocando os caracteres de maneira alternada na frente e no verso da palavra.

12345 678 9 -> 15243 687 9.

Em seguida, reorganizará as palavras de maneira alternada entre a primeira e a última palavra que ocorrer na sequência.

15243 687 9 -> 15243 9 687

Finalmente, ele reconstruirá a string colocando os espaços, tabulações e novas linhas nos índices em que estavam inicialmente localizadas antes de gerar o resultado.

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

A saída deve ser o mesmo tipo de dados que a entrada.

As brechas padrão são proibidas

Exemplos

Entrada:
A rápida raposa marrom pula sobre o cachorro preguiçoso.
Saída:
Teh d.ogq kucil yaz bnrwo tehf xoo rvej supm

Entrada:
A rápida raposa marrom pula
sobre o cachorro preguiçoso.
Saída:
Teh d.ogq kucil yaz bnrwo
tehf xoo rvej supm

Entrada:
Aflack
saída:
Akfcla

Isso é então o código mais curto ganha

fəˈnɛtɪk
fonte
6
Parece uma duplicata. Eu juro que já vi isso antes.
Addison Crump
Portanto, apenas caracteres de tabulação, espaço e nova linha não são considerados parte de uma palavra?
Jonathan Allan
@JonathanAllan que está correto
fəˈnɛtɪk
Podemos assumir ASCII? ou Unicode?
MayorMonty 7/02
@MayorMonty Você pode assumir que os caracteres têm a forma que for mais fácil para você, desde que trate os espaços corretamente.
f Febnɛtɪk

Respostas:

3

Geléia , 15 14  8 bytes

Uma economia impressionante de 6 bytes de Dennis (movendo o achatamento e o molde dentro do link 1, não há necessidade de se dividir em dois e cabeça, e um achatamento já existe para que eles se tornem um!)

żṚFṁ
Ç€Ç

(das duas linhas:, żṚFœs2Ḣe Ç€ÇFṁ⁸)

Experimente online!

Pega uma matriz de palavras e retorna uma matriz de novas palavras. (O rodapé do TIO chama isso e junta a matriz com espaços para que ela seja impressa com perfeição.)

Nota - manipular uma única string, dividir espaços de tabulação e novas linhas e, em seguida, remontar era realmente complicado; quando vi que uma lista de palavras era uma opção, as coisas ficaram muito mais fáceis!

Quão?

Ç€Ç - 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
fonte
Isso deve funcionar. Experimente online!
Dennis
Doce salve; muito fácil esquecer essa manobra!
Jonathan Allan
2

JavaScript (ES6), 89 bytes

Pega e gera uma matriz de palavras.

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

Teste

Versão da sequência, 112 bytes

Pega e gera uma string.

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)

Teste

Arnauld
fonte
2

Perl , 77 bytes

74 bytes de código + 3 bytes para -0pasinalizadores.

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

Experimente online!

Salvo 8 bytes, graças a um velho @Ton Hospel 's pós onde eu 'roubei' s/../chop/reg. (Eu já tinha $c=y///c/2,s/.{$c}$//)

dada
fonte
0

Perl 6 , 84 bytes

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

Insere e gera uma lista de palavras.

Como funciona

Dentro do lambda, eu defini outro lambda para executar os toques de " personagens alternados de frente e de trás ":

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.

Isso funciona porque o xxoperador se parece mais com uma macro do que com uma função, na medida em que fornece uma avaliação preguiçosa mágica.

Então, na lambda principal:

                   [$_]                          # 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 bytes

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

Essa é uma variação do acima, que insere e gera uma string - preservando diferentes caracteres de espaço em branco.

smls
fonte
0

Haskell , 115 95 93 98 95 bytes

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

Ligue com (!)=<<(f=<<).f.words $ "some string". Experimente online!

Agradecemos a @nimi por apontar que eu interpretei errado o desafio anteriormente.

A função fexecuta a torção em uma lista, para que possa ser usada em strings (lista de caracteres) e uma lista de strings. a!binsere o espaço em branco da string bna string a.

(!)=<<(f=<<).f.wordsé equivalente a \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
fonte