Scambia prima le catene!


27

Dato un elenco o una stringa delimitata, genera un elenco o una stringa delimitata con il primo carattere di ogni parola una parola dopo.

Per questa sfida, una "parola" è composta solo da tutti i caratteri ASCII stampabili, tranne lo spazio, la nuova riga e il carattere di tabulazione.

Ad esempio, prendi la stringa "Buon pomeriggio, mondo!" (Delimitato da spazi):

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

Questo è , quindi vince il codice più corto!

Casi test:

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

È consentito uno spazio finale nell'output?
Business Cat,

Possiamo presumere che ci sarà al massimo uno spazio tra le parole?
drogato di matematica

con alcune regole su cui le lettere possono seguirsi, avresti un generatore di spatole en.wikipedia.org/wiki/Spoonerism
Visualizza il nome

@BusinessCat Sì.
Compagno SparklePony,

@mathjunkie Sì.
Compagno SparklePony,

Risposte:



8

Japt , 11 10 9 8 byte

Sfrutta il wrapping dell'indice di Japt e l'indicizzazione negativa.

ËhUgEÉ g

Provalo online


Spiegazione

        :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

Penso che puoi anche inserire input come elenco, salvando un ulteriore byte su¸
ETHproductions

Potrebbe essere un tratto, @ETHproductions, ma chiederò. EDIT: confermato qui
Shaggy

1
Sì, all'inizio del post dice "Dato un elenco o una stringa delimitata", non sono sicuro di quanto tempo ci sia stato (suppongo da quando la sfida è stata pubblicata per la prima volta).
ETHproductions

Ben fatto! Usare è hstata una buona idea. Mi è venuto in mente £g´Y ¯1 +XÅche può diventare £ XhUg´Y ¯1 usando la tua tecnica.
Oliver,

5

Haskell , 43 byte

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

Provalo online! Utilizza un elenco di stringhe per input e output.

Ricorda la prima lettera della parola precedente pe la rende ricorsivamente la prima lettera della parola corrente mentre invia la nuova prima lettera lungo la catena. La prima lettera precedente viene inizializzata come prima lettera dell'ultima parola.


4

Rubino, 85 77 63 byte

Abbastanza sicuro questo potrebbe essere molto più breve.

Modifica: grazie per @manatwork per raccogliere -> mappa

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

È possibile sostituire sia .collecte .eachcon .map.
arte

1
-pflag (+1 byte) e i=-2;gsub(r=/\b\w/){$_.scan(r)[i+=1]}per il golfage finale
Value Ink


4

CJam , 12 10 9 byte

Salvato 1 byte grazie a jimmy23013

q~Sf+:()o

Accetta input come un elenco di parole.

Provalo online!

Spiegazione

     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.

Puoi prendere input e output come un elenco, sai.
Compagno SparklePony,

@ComradeSparklePony Hai confermato che dopo aver risposto: P Golfing now
Business Cat

)oper 1m>.
jimmy23013,

3

V , 7 byte

Îxjp
{P

Provalo online!

Spiegazione:

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

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

Sfrutta il fatto che slice(-1)restituisce l'ultimo elemento di un array.

Frammento


Potresti rimuovere join? La domanda afferma che è possibile generare un elenco. Avrebbe risparmiato 8 byte
Craig Ayre,

1
@CraigAyre, dolce grazie!
Rick Hitchcock,

3

Vim, 16 , 9 byte

<C-v>GdjPGD{P

7 byte salvati grazie a @Wossname!

Accetta una parola per riga, ad es

Hello
world
and
good
day
to
you

Credo che questo dovrebbe andare bene poiché è consentito prendere l'input come elenco.

Provalo online!


Può essere fatto in 12 sequenze di tasti se lo fai "a mano" per così dire. Non sono sicuro di come articolare questa sintassi qui o se è anche valido farlo in questo puzzle. ^vGdjPGd$ggP (dove ^ v è la combinazione di tasti [control + v], assicurati solo di iniziare con il cursore in alto a sinistra e di essere in modalità comando)
Wossname

@Wossname Ah, è un'ottima idea! Ci sono un paio di piccole cose che ho aggiunto per salvare ancora più byte (ad esempio dd -> D, gg -> }) Grazie per il suggerimento!
DJMcMayhem

Non sapevo che dd e gg avessero entrambe versioni più brevi! Fantastico :)
Wossname

Che ne dici di usare i "tag HTML in apice" attorno alla lettera v nel codice anziché "<Cv>"? Ciò farebbe apparire il codice della giusta lunghezza se visto nella risposta. Quindi il tuo codice sembrerebbe ... <sup> V </sup> GdjPGD {P ... che sembra abbastanza pulito quando la pagina web di stackexchange lo formatta correttamente.
Wossname

1
Vedo, le parentesi graffe saltano tra i paragrafi, funziona qui perché abbiamo a che fare solo con un paragrafo. Freddo. Oh wow, questo rende davvero semplice lo scorrimento rapido di file di codice di grandi dimensioni! Grazie per quel suggerimento. :)
Wossname

3

> <> , 44 45 byte

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

Presuppone parole separate da spazi.

La correzione di Aaron ha aggiunto 1 byte


2

Python 2, 74 byte

Provalo online

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

-5 byte, grazie a @Rod


@Rod Buon suggerimento, grazie!
Dead Possum,

4
S[:-1]può essere abbreviato in S; elenchi zippati di diverse lunghezze tronca automaticamente quello che è più lungo
Julian Wolf,

2

Haskell , 50 byte

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

Input e output sono come elenchi di parole.


1
Le funzioni possono essere senza nome, quindi puoi omettere il f=.
nimi,

1
Oh, bello, non mi ero reso conto che esistesse un compilatore online per Haskell. Eliminerò i miei commenti, poiché mi sbaglio ^^
Fund Monica's Lawsuit

2

PHP, 62 byte

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

2

C #, 78 77 byte

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

Compila per una Func<List<string>, IEnumerable<string>>versione completa / formattata:

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 byte

{hᵐ↻|bᵐ}ᶠzcᵐ

Provalo online!

Spiegazione

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 byte

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

Provalo online

2 byte salvati grazie a Giuseppe.

Input e output sono elenchi. Prende una sottostringa composta dalle prime lettere, sposta l'ultima in primo piano e la incolla insieme a una sottostringa del resto di ogni parola. Il passaggio in bicicletta è un assassino, ma non riesco a trovare un modo per ridurlo ulteriormente.


1
è possibile utilizzare al 2:y-1posto di 1:(y-1)poiché :ha la precedenza sul -quale si risparmiano 2 byte.
Giuseppe,


2

Python 2 + Numpy, 104 byte

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
Devi includere l'istruzione import nel conteggio dei byte. Bella risposta!
Compagno SparklePony,

inoltre, devi avere il tuo codice di input e output nel conteggio dei byte
Felipe Nardi Batista,

1
Penso che puoi rilasciare la nuova riga finale per 1 byte.
Ørjan Johansen,

@ ØrjanJohansen sì, anche "b" invece di "u1" funziona, quindi -2 byte.
Mikhail V


1

Mathematica, 59 byte

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

Provalo online!

Prende e restituisce un elenco di parole.

Se preferisci prendere e restituire stringhe, questo funziona per 87 byte:

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


1

kdb +, 25 22 byte

Soluzione:

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

Esempio:

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

Spiegazione:

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 versione che accetta una stringa normale (37 byte):

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 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

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

Provalo online!

Ingresso e uscita sono separati dall'alimentazione di linea. La suite di test esegue la conversione I / O necessaria dalla separazione dello spazio.


Va bene usare la separazione dell'alimentazione di linea.
Compagno SparklePony,

0

Mathematica, 134 byte

(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 byte

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

Provalo online!


Questo è uno snippet, non una funzione. Inoltre, dovresti prendere l'intera stringa come un argomento e mantenere anche virgole e punti di domanda / esame nell'output così com'è.
Kevin Cruijssen,

0

C, 106 77 byte

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 byte da scottinet

Modifica la stringa sul posto.

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 di versione golfista (stesso identico codice): -29 byte
scottinet,



0

Buccia , 11 byte

Foz:ṙ_1TmΓ,

Input e output come un elenco di stringhe, provalo online!

(L'intestazione trasforma semplicemente l'input in un elenco di parole e unisce l'elenco di output con spazi.)

Spiegazione

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 byte

§oz:ṙ_1m←mt

Provalo online!


0

AWK , 63 byte

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

Provalo online!

Sembra che ci dovrebbe essere un modo per ridurre la ridondanza, ma non la vedo.

Nota: il collegamento TIO ha 4 byte extra per consentire l'input multilinea.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.