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.