lwap ¡Ella grita las cadenas!


27

Dada una lista o cadena delimitada, envíe una lista o cadena delimitada con el primer carácter de cada palabra una palabra más tarde.

Para este desafío, una "palabra" consta de todos los caracteres ASCII imprimibles, excepto el espacio, la nueva línea y el carácter de tabulación.

Por ejemplo, tome la cadena "¡Buenas tardes, mundo!" (delimitado por espacios):

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

Este es el , ¡el código más corto gana!

Casos de prueba:

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

¿Se permite un espacio final en la salida?
Business Cat

¿Podemos suponer que habrá como máximo un espacio entre palabras?
adicto a las matemáticas

con algunas reglas sobre las letras que se pueden seguir, tendrías un generador de cuchara en.wikipedia.org/wiki/Spoonerism
Nombre para mostrar

@BusinessCat Sí.
Camarada SparklePony

@mathjunkie Sí.
Camarada SparklePony

Respuestas:



8

Japt , 11 10 9 8 bytes

Aprovecha el ajuste de índice de Japt y la indexación negativa.

ËhUgEÉ g

Pruébalo en línea


Explicación

        :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

Creo que también puede tomar la entrada como una lista, ahorrando un byte adicional en el¸
ETHproductions

Eso podría ser exagerado, @ETHproductions, pero lo preguntaré. EDITAR: Confirmado aquí
Shaggy

1
Sí, al comienzo de la publicación dice "Dada una lista o cadena delimitada", aunque no estoy seguro de cuánto tiempo ha estado allí (supongo que desde que se publicó el desafío por primera vez).
ETHproductions

¡Buena esa! Usar hfue una buena idea. Se me ocurrió lo £g´Y ¯1 +XÅque puede convertirse en £ XhUg´Y ¯1 utilizando su técnica.
Oliver

5

Haskell , 43 bytes

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

Pruébalo en línea! Utiliza una lista de cadenas para entrada y salida.

Recuerda la primera letra de la palabra anterior. p y la convierte recursivamente en la primera letra de la palabra actual mientras envía la nueva primera letra por la cadena. La primera letra anterior se inicializa como la primera letra de la última palabra.


4

Ruby, 85 77 63 bytes

Estoy bastante seguro de que esto podría ser mucho más corto.

Editar: Gracias por @manatwork para recoger -> mapa

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

Podrías reemplazar ambos .collecty .eachcon .map.
manatwork

1
-pbandera (+1 byte) y i=-2;gsub(r=/\b\w/){$_.scan(r)[i+=1]}para el mejor golfage
Value Ink


4

CJam , 12 10 9 bytes

Guardado 1 byte gracias a jimmy23013

q~Sf+:()o

Toma entrada como una lista de palabras.

Pruébalo en línea!

Explicación

     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.

Puede tomar la entrada y salida como una lista, ya sabes.
Camarada SparklePony

@ComradeSparklePony Confirmaste eso después de que respondí: P Golfing now
Business Cat

)opara 1m>.
jimmy23013

3

V , 7 bytes

Îxjp
{P

Pruébalo en línea!

Explicación:

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

Aprovecha el hecho de que slice(-1)devuelve el último elemento de una matriz.

Retazo


¿Podrías eliminar unirse? La pregunta indica que puede generar una lista. Ahorraría 8 bytes
Craig Ayre

1
@ CraigAyre, dulce, gracias!
Rick Hitchcock

3

Vim, 16 , 9 bytes

<C-v>GdjPGD{P

¡7 bytes guardados gracias a @Wossname!

Toma entrada una palabra por línea, por ejemplo

Hello
world
and
good
day
to
you

Creo que esto debería estar bien ya que tomar la entrada como una lista está permitida.

Pruébalo en línea!


Se puede hacer en 12 pulsaciones de teclas si lo hace 'a mano' por así decirlo. No estoy seguro de cómo articular esa sintaxis aquí o si es válido hacerlo en este rompecabezas. ^vGdjPGd$ggP (donde ^ v es la combinación de teclas [control + v], solo asegúrese de comenzar con el cursor en la
esquina

@Wossname Ah, esa es una gran idea Hay un par de cosas pequeñas que agregué para guardar aún más bytes (por ejemplo dd -> D, gg -> }) ¡Gracias por el consejo!
DJMcMayhem

¡No sabía que dd y gg tenían versiones más cortas! Impresionante :)
Wossname

¿Qué tal usar las "etiquetas HTML superíndice" alrededor de la letra v en el código en lugar de "<Cv>"? Eso haría que el código se vea de la longitud correcta cuando se ve en la Respuesta. Entonces, su código se vería como ... <sup> V </sup> GdjPGD {P ... que se ve muy bien cuando la página web stackexchange lo formatea correctamente.
Wossname

1
Ya veo, las llaves se saltan entre los párrafos, funciona aquí porque solo estamos tratando con un párrafo. Guay. ¡Vaya, eso hace que desplazarse rápidamente por archivos de código grandes sea realmente fácil! Gracias por ese consejo. :)
Wossname

3

> <> , 44 45 bytes

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

Asume palabras separadas por espacios.

Corrección de Aaron agregó 1 byte


2

Python 2, 74 bytes

Pruébalo en línea

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

-5 bytes, gracias a @Rod


@ Rod Buena sugerencia, gracias!
Dead Possum

44
S[:-1]se puede acortar a S; las listas de compresión de diferentes longitudes se truncan automáticamente, lo que sea más largo
Julian Wolf

2

Haskell , 50 bytes

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

La entrada y la salida son como listas de palabras.


1
Las funciones pueden ser sin nombre, por lo que puede omitir el f=.
nimi

1
Oh, genial, no me di cuenta de que había un compilador en línea para Haskell. Eliminaré mis comentarios, ya que estoy equivocado ^^
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 a una Func<List<string>, IEnumerable<string>>versión completa / formateada:

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

Brachylog , 12 bytes

{hᵐ↻|bᵐ}ᶠzcᵐ

Pruébalo en línea!

Explicación

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))

Pruébalo en línea

2 bytes guardados gracias a Giuseppe.

Entrada y salida son listas. Toma una subcadena que consta de las primeras letras, alterna la última al frente y la pega junto con una subcadena del resto de cada palabra. El paso en bicicleta es un asesino, pero no puedo encontrar una manera de reducirlo más.


1
podría usar en 2:y-1lugar de 1:(y-1)ya que :tiene prioridad sobre lo -que le ahorra 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
Debe incluir la declaración de importación en el recuento de bytes. Buena respuesta!
Camarada SparklePony

además, debe tener su código de entrada y salida en el recuento de bytes
Felipe Nardi Batista,

1
Creo que puedes soltar la nueva línea final por 1 byte.
Ørjan Johansen

@ ØrjanJohansen sí, también funciona "b" en lugar de "u1", por lo que -2 bytes.
Mikhail V


1

Mathematica, 59 bytes

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

Pruébalo en línea!

Toma y devuelve una lista de palabras.

Si prefiere tomar y devolver cadenas, esto funciona para 87 bytes:

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


1

kdb +, 25 22 bytes

Solución:

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

Ejemplo:

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

Explicación:

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:

Una versión que toma una cadena 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

El recuento de bytes asume la codificación ISO 8859-1.

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

Pruébalo en línea!

La entrada y la salida están separadas por salto de línea. El conjunto de pruebas realiza la conversión de E / S necesaria desde la separación de espacios.


Está bien usar separación de salto de línea.
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

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

Pruébalo en línea!


Este es un fragmento, no una función. Además, debe tomar la Cadena completa como un argumento, y también mantener las comas y los signos de interrogación / examen en el resultado tal cual.
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 desde scottinet

Modifica la cadena en el lugar.

Sin golf:

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
}

Propuesta de versión Golfier (exactamente el mismo código): -29 bytes
scottinet



0

Casco , 11 bytes

Foz:ṙ_1TmΓ,

Entrada y salida como una lista de cadenas, ¡ pruébelo en línea!

(El encabezado simplemente transforma la entrada en una lista de palabras y une la lista de salida con espacios).

Explicación

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

Pruébalo en línea!


0

AWK , 63 bytes

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

Pruébalo en línea!

Parece que debería haber una forma de reducir la redundancia, pero no lo veo.

Nota: el enlace TIO tiene 4 bytes adicionales para permitir la entrada multilínea.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.