lwap Ela está cansada!


27

Dada uma lista ou sequência delimitada, imprima uma lista ou sequência delimitada com o primeiro caractere de cada palavra uma palavra depois.

Para esse desafio, uma "palavra" consiste apenas em todos os caracteres ASCII imprimíveis, exceto no espaço, nova linha e caractere de tabulação.

Por exemplo, pegue a sequência "Boa tarde, mundo!" (delimitado por espaço):

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

Isso é , então o código mais curto vence!

Casos de teste:

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

É permitido um espaço à direita na saída?
— Business Cat

Podemos assumir que haverá no máximo um espaço entre as palavras?
— matemática viciado em

com algumas regras sobre as quais as letras podem se seguir, você teria um gerador de Spoonerism en.wikipedia.org/wiki/Spoonerism
— Exibir nome

@BusinessCat Sim.
— Camarada SparklePony

@mathjunkie Sim.
— Camarada SparklePony

Respostas:



8

Japonês , 11 10 9 8 bytes

Aproveita o empacotamento de índice do Japt e a indexação negativa.

ËhUgEÉ g

Experimente online


Explicação

        :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

Eu acho que você pode tirar a entrada como uma lista bem, economizando mais um byte na¸
— ETHproductions

Pode ser um exagero, @ETHproductions, mas vou perguntar. Edição: Confirmado aqui
— Shaggy

1
Sim, no início do post, diz "Dada uma lista ou sequência delimitada", não sei quanto tempo isso existe (acho que desde que o desafio foi publicado pela primeira vez).
— ETHproductions

Agradável! Usar hfoi uma boa ideia. Eu vim com o £g´Y ¯1 +XÅque pode se tornar £ XhUg´Y ¯1 usando sua técnica.
— Oliver

5

Haskell , 43 bytes

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

Experimente online! Usa uma lista de cadeias de caracteres para entrada e saída.

Lembra a primeira letra da palavra anterior pe a torna recursivamente a primeira letra da palavra atual enquanto envia a nova primeira letra da cadeia. A primeira letra anterior é inicializada como a primeira letra da última palavra.


4

Ruby, 85 77 63 bytes

Certamente isso pode ser muito mais curto.

Edit: Obrigado por @manatwork para coletar -> mapa

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

Você pode substituir ambos .collecte .eachcom .map.
— Manatwork 24/05

1
-pflag (+1 byte) e i=-2;gsub(r=/\b\w/){$_.scan(r)[i+=1]}para o melhor golfe
— Value Ink


4

CJam , 12 10 9 bytes

Guardado 1 byte graças a jimmy23013

q~Sf+:()o

Recebe a entrada como uma lista de palavras.

Experimente online!

Explicação

     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.

Você pode considerar a entrada e a saída como uma lista.
— Camarada SparklePony

@ComradeSparklePony Você confirmou que depois que eu respondi: P Golfing now
— Business Cat

)opara 1m>.
— jimmy23013

3

V , 7 bytes

Îxjp
{P

Experimente online!

Explicação:

Î       " 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 bytes

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

Aproveita o fato de slice(-1)retornar o último elemento de uma matriz.

Snippet


Você pode remover a junção? A pergunta afirma que você pode gerar uma lista. Isso pouparia 8 bytes
— Craig Ayre

1
@CraigAyre, doce, obrigado!
— Rick Hitchcock

3

Vim, 16 , 9 bytes

<C-v>GdjPGD{P

7 bytes salvos graças ao @Wossname!

É necessário inserir uma palavra por linha, por exemplo

Hello
world
and
good
day
to
you

Eu acredito que isso deve ser bom, uma vez que aceitar a entrada como uma lista é permitido.

Experimente online!


Isso pode ser feito com 12 pressionamentos de tecla, se você o fizer 'manualmente'. Não sei como articular essa sintaxe aqui ou se é válido fazer isso neste quebra-cabeça. ^vGdjPGd$ggP (onde ^ v é a [control + v] combinação de teclas, só não se esqueça de começar com o cursor no canto superior esquerdo e estar em modo de comando)
— Wossname

@ Wossname Ah, é uma ótima idéia! Há algumas pequenas coisas que adicionei para economizar ainda mais bytes (por exemplo dd -> D, gg -> }) Obrigado pela dica!
— DJMcMayhem

Eu não sabia que dd e gg tinham versões mais curtas! Awesome :)
— Wossname

Que tal usar as "tags HTML sobrescritas" ao redor da letra v no código em vez de "<Cv>"? Isso faria o código parecer o comprimento certo quando visto na resposta. Portanto, seu código se pareceria com ... <sup> V </sup> GdjPGD {P ... que parece bem legal quando a página da web stackexchange o formata corretamente.
— Wossname

1
Entendo, os suspensórios pulam entre parágrafos, funciona aqui porque estamos lidando apenas com um parágrafo. Legal. Oh uau, isso facilita muito a rolagem rápida de arquivos de código grandes! Obrigado por essa dica. :)
— Wossname

3

> <> , 44 45 bytes

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

Assume palavras separadas por espaço.

Correction by Aaron adicionou 1 byte


2

Python 2, 74 bytes

Experimente online

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

-5 bytes, graças a @Rod


@ Rod Boa sugestão, obrigado!
— Gambá morto

4
S[:-1]pode ser reduzido para S; fechando listas de diferentes comprimentos Truncates automaticamente o que for maior
— Julian Lobo

2

Haskell , 50 bytes

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

Entrada e saída são como listas de palavras.


1
As funções podem não ter nome, para que você possa omitir o f=.
— nimi

1
Oh, legal, eu não sabia que havia um compilador online para Haskell. Excluirei meus comentários, pois estou errado ^^
— Fund Monica's Lawsuit

2

PHP, 62 bytes

$c=end($_GET);foreach($_GET as$g)echo$g|$g[0]=$c^$g^$c=$g,' ';

2

C #, 78 77 bytes

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

Compila para uma Func<List<string>, IEnumerable<string>>versão completa / formatada:

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

Braquilog , 12 bytes

{hᵐ↻|bᵐ}ᶠzcᵐ

Experimente online!

Explicação

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 bytes

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

Experimente online

2 bytes salvos graças a Giuseppe.

Entrada e saída são listas. Pega uma subcadeia que consiste nas primeiras letras, alterna a última para a frente e cola com uma subcadeia do restante de cada palavra. O passo do ciclismo é um assassino, mas não consigo descobrir uma maneira de reduzi-lo ainda mais.


1
você pode usar em 2:y-1vez de, 1:(y-1)desde que :tenha precedência sobre o -que economiza 2 bytes.
— Giuseppe


2

Python 2 + Numpy, 104 bytes

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
Você precisa incluir a instrução de importação na contagem de bytes. Resposta legal!
— Camarada SparklePony

Além disso, você precisa ter a sua entrada e código de saída na contagem de bytes
— Felipe Nardi Batista

1
Eu acho que você pode descartar a nova linha final por 1 byte.
— Ørjan Johansen

@ ØrjanJohansen sim, também "b" em vez de "u1" funciona, então -2 bytes.
— Mikhail V


1

Mathematica, 59 bytes

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

Experimente online!

Pega e retorna uma lista de palavras.

Se você preferir pegar e retornar cadeias, isso funciona para 87 bytes:

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


1

kdb +, 25 22 bytes

Solução:

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

Exemplo:

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

Explicação:

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

Extra:

Uma versão que usa uma sequência regular (37 bytes):

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

Retina , 25 20 bytes

A contagem de bytes assume a codificação ISO 8859-1.

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

Experimente online!

Entrada e saída são separadas por alimentação de linha. O conjunto de testes executa a conversão de E / S necessária da separação de espaço.


É bom usar a separação de alimentação de linha.
— Camarada SparklePony

0

Mathematica, 134 bytes

(w=Characters@StringSplit@#;d=Drop[w,0,1];StringRiffle[StringJoin/@Table[PrependTo[d[[i]],RotateRight[First/@w][[i]]],{i,Length@w}]])&

0

Pitão, 12 bytes

.b+hNtY.>Q1Q

Pega uma lista de palavras e retorna uma lista de palavras.

Tente!


0

Java (OpenJDK 8) , 97 bytes

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

Experimente online!


Este é um trecho, não uma função. Além disso, você deve considerar a String inteira como um argumento e também manter vírgulas e pontos de interrogação / exame na saída como está.
— Kevin Cruijssen

0

C, 106 77 bytes

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 bytes de scottinet

Modifica a sequência no local.

Ungolfed:

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
}

Proposta de versão do Golfier (exatamente o mesmo código): -29 bytes
— scottinet



0

Casca , 11 bytes

Foz:ṙ_1TmΓ,

Entrada e saída como uma lista de strings, experimente online!

(O cabeçalho apenas transforma a entrada em uma lista de palavras e une a lista de saída com espaços.)

Explicação

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

Alternativa, 11 bytes

§oz:ṙ_1m←mt

Experimente online!


0

AWK , 63 bytes

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

Experimente online!

Parece que deve haver uma maneira de reduzir a redundância, mas não estou vendo.

Nota: o link TIO possui 4 bytes extras para permitir a entrada de várias linhas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.