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."
Camarada SparklePony
fonte
É 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:

10

05AB1E , 7 6 bytes

€ćÁ2ôJ

Explicação:

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

Experimente online!

Okx
fonte
Você pode considerar a entrada e a saída como uma lista.
Camarada SparklePony
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
Shaggy
fonte
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.

xnor
fonte
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]}*' '
Peter Lenkefi
fonte
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

Gelatina , 6 bytes

Ḣ€ṙ-;"

Experimente online!

Graças a Dennis por ler as regras melhor do que eu, isso retorna uma lista de palavras. Não funciona como um programa completo.

Erik, o Outgolfer
fonte
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.
Gato de negócios
fonte
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)
DJMcMayhem
fonte
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

Rick Hitchcock
fonte
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!

DJMcMayhem
fonte
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

AGourd
fonte
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

Gambá morto
fonte
@ 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.

faubi
fonte
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,' ';
user63956
fonte
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();
    }
}
TheLethalCoder
fonte
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!"]
Fatalizar
fonte
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.

user2390246
fonte
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()
Mikhail V
fonte
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
2

APL (Dyalog) , 6 bytes

Toma matriz com uma palavra por coluna.

¯1∘⌽@1

Experimente online!

¯1∘⌽ gire um passo para a direita

@ às

1 linha 1

Adão
fonte
ideia de entrada inteligente
Jonah
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@#," ",""]&
Não é uma árvore
fonte
1

Retina, 46 37 31 bytes

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

Experimente Online

Ainda sendo jogado ..

viciado em matemática
fonte
1
Você não pode largar o (.*)e $3?
Neil
@ Neil sim, obrigada #
junkie de matemática
Se você ativar o +na primeira linha a um *você virar (.* .)na terceira linha a (.*)para -2 bytes. Experimente Online!
precisa saber é o seguinte
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."
rua
fonte
1

Perl 5 , 40 bytes

39 bytes de código + 1 para -a

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

Experimente online!

Xcali
fonte
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.

Martin Ender
fonte
É 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}]])&
J42161217
fonte
0

Pitão, 12 bytes

.b+hNtY.>Q1Q

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

Tente!

KarlKastor
fonte
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!

Beluga Bashful
fonte
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
}
pizzapants184
fonte
Proposta de versão do Golfier (exatamente o mesmo código): -29 bytes
scottinet
74 bytes
ceilingcat
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!

ბიმო
fonte
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.

Robert Benson
fonte