Mescolare i caratteri in una stringa


10

Devi scrivere una funzione / programma che accetta l'input tramite stdin/ argomenti della riga di comando / argomenti della funzione, mescola i caratteri in una stringa e quindi emette la stringa finale tramite il stdout.

L'input conterrà prima una stringa (non vuota o null), uno spazio e quindi un numero pari di numeri non negativi tutti separati da spazi. Se l'input viene preso tramite argomenti di funzione, la stringa sarà quella degli argomenti mentre gli interi, che sono separati da uno spazio, saranno gli altri. È necessario scambiare i caratteri della stringa in corrispondenza degli indici corrispondenti a coppie consecutive di numeri.

Per esempio:

Hello_world! 0 6

deve comportare

wello_Horld!

ipotesi

  • È possibile scegliere tra indicizzazione basata su 0 e basata su 1 e assumere che gli indici indicati siano sempre nell'intervallo.
  • La stringa non sarà più lungo di 100 caratteri e conterrà solo caratteri ASCII nella gamma !di ~(codici di carattere 0x21 a 0x7E, compreso). Vedere la tabella ASCII per riferimento.
  • I due indici in una coppia possono essere identici (nel qual caso, nulla viene scambiato in quel passaggio).

punteggio

Questo è il golf del codice, quindi vince l'invio più breve (in byte).

Casi test

Hello_world! 0 6 => wello_Horld!
First 1 2 1 0 0 4 => tFisr
(Second!$$) 8 7 10 1 => ()econd$!$S
~Third~ 0 0 6 6 0 6 6 0 => ~Third~

2
Per le sfide future, lasciatemi consigliare il sandbox in cui è possibile ottenere feedback e perfezionare la sfida prima di pubblicarla in main (ciò riduce al minimo il rischio di invalidare le risposte esistenti se qualcuno scopre un grave difetto nella sfida che deve essere risolto).
Martin Ender,

Perché richiedere input su stdin e non, ad esempio, come argomenti della riga di comando?
lrn

@lrn, giusto. Aggiunte altre 2 opzioni.
Spikatrix,

Vedo un mucchio di soluzioni di seguito che presuppongono che possano ottenere l'elenco degli indici come un array che viene passato alla funzione che implementano. Il modo in cui leggo la tua definizione, l'input è una singola stringa, che contiene gli indici e la stringa su cui operano, e l'estrazione degli indici dalla stringa di input fa parte del codice che deve essere golfato. Puoi chiarire quale interpretazione è corretta?
Reto Koradi,

@RetoKoradi, No. L'input non è una stringa completa. Ha una stringa e quindi numeri. I numeri non sono inclusi nella stringa.
Spikatrix,

Risposte:


6

CJam, 11 byte

rr{irie\r}h

Come funziona

Questo è un approccio leggermente diverso, in cui eseguo semplicemente un ciclo do-while fino a quando non ho più coppie di numeri nell'input.

r                 e# Read the first string
 r                e# Read the first number of the first number pair in the input
  {      }h       e# Do a do-while loop
   i              e# Convert the first number from the pair to integer
    ri            e# Read the second number from the pair and convert to intger
      e\          e# String X Y e\ works by swapping the Xth index with the Yth index in the
                  e# String
        r         e# This is our exit condition of the do-while loop. If we still have
                  e# a number on the input left, that means there are more pairs to swap.
                  e# Otherwise, we exit the loop and the result is printed automatically

Provalo online qui


6

Python 3, 89 86 byte

[*s],*L=input().split()
while L:a,b,*L=map(int,L);s[a],s[b]=s[b],s[a]
print(*s,sep="")

Disimballare tutto. (3 byte salvati grazie a @potato)


Salva qualche byte e fai questo: [*s],*L=input().split()puoi quindi prendere la linea dopo di essa. Mi piace molto la tua soluzione tra l'altro, è quasi elegante anche se è molto giocata a golf.
Patata,

@potato Oh wow, non sapevo che avresti potuto avere due decompressi insieme in quel modo (pensavo che potessi farlo solo in 3.5). Grazie!
Sp3000,

4

CJam, 13 byte

r[q~]2/{~e\}/

Provalo qui.

Spiegazione

r             e# Read the first token, i.e. the string.
 [q~]         e# Read the rest of the input, eval it and wrap it in an array.
     2/       e# Split the array into pairs of consecutive elements.
       {   }/ e# For each pair.
        ~     e# Unwrap the array.
         e\   e# Swap the corresponding elements in the string.

Whoa. Non mi aspettavo una risposta così in fretta!
Spikatrix,

2

C (137 b)

f(char*T,int*V,int L){int C=0;for(int j=0;j<strlen(T);C=++j){for(int i=L-1;i+1;i--)if(C==V[i]){C=V[i-i%2*2+1];i-=i%2;}printf("%c",T[C]);}}

Spiegazione sta arrivando ...

argomenti

T = una parola di tipo char * .

V = una matrice di un numero pari di elementi interi.

L = lunghezza di V

Produzione

stringa mista

Come funziona ?:

spazza i numeri dell'array V viceversa e inserisce l'ennesimo elemento della stringa dopo aver seguito tutti i suoi progressi fino al punto effettivo. Esempio

= ingresso T = "Primo", V = {1,2,1,0,0,4}

V inverso = {4,0,0,1,2,1}

V[0] = 4th element -> index 0
0 -> 1
1->2

4th element 't' receives the second = 'r'

V[1] = 0 -> index 4
4 isnt mentionned after so , no changes

0 element='F' receives the fourth= 't'

V[3] = 1st element -> index 0
no changes

V[4] = 2 -> index 1
no changes after ..

Provalo qui


1
@ Agawa001, puoi giocare a golf molto di più. Il tipo restituito intnon è necessario (può comportare un comportamento imprevisto) e le intvariabili che sono parametri non necessitano di un int, le variabili, invece di dichiarare nel ciclo, possono essere dichiarate in un punto esterno al ciclo, usare al putcharposto di printfetc
Spikatrix

2

Python 3 - 161 149

import sys
t=sys.stdin.read().split()
q=list(t[0])
c=1
i=int
while c<len(t):n=q;a=i(t[c]);b=i(t[c+1]);n[a]=q[b];n[b]=q[a];q=n;c+=2;
print(''.join(q))

Giocare di più scambiando alcune variabili e usando ;come nel commento di Tim.

Mi aspettavo che venisse fuori con un aspetto da golf, ma non così tanto.


1
Puoi giocare a golf molto. Cambia whilein while c<len(t):line1;line2;line3.... c=c+2va ac+=2
Tim

@Tim Grazie per il tuo aiuto!
ASCIIThenANSI

Non dovresti iniziare da 0?
Tim,

@Tim Nope. cin realtà sta indicizzando t(l'input) per ottenere le posizioni che dobbiamo scambiare. Ma poiché t[0]è la stringa che dobbiamo scambiare, t[1]e t[2]tenere la prima coppia di swap.
ASCIIThenANSI

Ahh capisco, si. Mi dispiace, la mia soluzione ha diviso l'input, quindi ho immaginato che avessi fatto lo stesso :)
Tim

2

C, 109 107 102 byte

i;f(l){l=sizeof(a)/sizeof(*a);char t;for(;i<l;i+=2){t=s[a[i]];s[a[i]]=s[a[i+1]];s[a[i+1]]=t;}puts(s);}

Nota: se adeve essere dichiarato come array globale. sè la stringa che si desidera scambiare ed aè una matrice intcon tutti i valori numerici.

Se il codice sopra riportato non funziona, prova a utilizzare void f(){...}invece dif(){...}

Codice non golfato:

int a[]={1, 2, 1, 0, 0, 4};//Integer elements
char s[]="First";          //String to be swapped

i; //Auto initialized to 0 and defaults to type int
void f(l){ //Variables defaults to type int
  l=sizeof(a)/sizeof(*a); //Gets number of elements in array a
  char t;

  for(;i<l;i+=2){ 

    t=s[a[i]];
    s[a[i]]=s[a[i+1]];
    s[a[i+1]]=t;  //Swap each character

  }

  puts(s); //Print the final char array
}

Provalo qui


hmm il tuo codice è più piccolo :)
Abr001am

lol dov'è la dichiarazione variabile? questo è un modo economico per stringere il tuo codice: p
Abr001am

@ Agawa001, non ho incluso la dichiarazione delle variabili in quanto i byte potrebbero variare con ogni caso di test.
Spikatrix,

Questo non corrisponde all'input come definito nel problema. L'input è una singola stringa. A meno che non abbia frainteso completamente il problema, è necessario estrarre i valori dell'indice dalla stringa di input.
Reto Koradi,

1

Python 3, 135

x=input().split()
y=list(x[0])
z=[int(i)for i in x[1:]]
while z:p,c=y[z[0]],y[z[1]];y[z[0]],y[z[1]]=c,p;del z[0],z[0]
print(''.join(y))

Spiegazione:

x=input().split()         # Split the input into a list at each space
y=list(x[0])              # First item in list (the word) into a list of chars
z=[int(i)for i in x[1:]]  # Make the list of numbers, into integers
while z:                  # Loop untill the list z is empty
    p,c=y[z[0]],y[z[1]]   # Assign p to the first char and c to the second
    y[z[0]],y[z[1]]=c,p   # Swap around using p and c
    del z[0],z[0]         # Remove the first 2 items in the list of integers
print(''.join(y))         # Print out the altered list as a string

1

C, 70 byte

Dato che la stringa di input ha una lunghezza massima di 100 ho deciso di rendere il byte 'NULL' indicante che la fine della matrice di numeri interi fosse inequivocabile 0xFF. Presumibilmente questo non conta come input aggiuntivo, sebbene per un costo di (al massimo) 7 3 byte può essere trasformato in indicizzazione basata su 1 e utilizzato '\0'come fine dell'array.

f(s,i,t)char*s,*i;{for(;~*i;)t=s[*i],s[*i]=s[*++i],s[*i++]=t;puts(s);}

Praticamente scambia regolarmente con una variabile tmp e usa l'operatore virgola che introduce i punti di sequenza per avere un comportamento definito (a differenza di alcune manifestazioni di xor swap che avrebbero un numero di caratteri inferiore ma porterebbero a un comportamento indefinito).

Modifica: come richiesto, puoi provarlo: http://rextester.com/OVOQ23313 .


Non credo che si possa presumere che si ottenga un array con gli indici da scambiare. Gli indici fanno parte della stringa di input ed è necessario analizzarli dalla stringa come parte del codice pubblicato (e conteggiato). Dalla descrizione: "L'input conterrà prima una stringa, uno spazio e quindi un numero pari di numeri non negativi tutti separati da spazi".
Reto Koradi,

1

Dardo - 123

Presuppone che l'input nella riga di comando venga automaticamente suddiviso negli spazi. Altrimenti ha bisogno di un'iniziale x=x[0].split(' ');per dividere la stringa in testo e indici.

main(x,{c,i:1,a,t}){c=x[0].split("");n()=>a=int.parse(x[i++]);for(;i<x.length;t=c[n()],c[a]=c[n()],c[a]=t);print(c.join());}

Con più spazi bianchi:

main(x,{c,i:1,a,t}){
  c=x[0].split("");
  n()=>a=int.parse(x[i++]);
  for(;i<x.length;t=c[n()],c[a]=c[n()],c[a]=t);
  print(c.join());
}

Esegui / prova questo su dartpad.dartlang.org .


Conosci qualche compilatore online in cui ho potuto provare questo?
Spikatrix,

Aggiungi link a DartPad.
lnn

1

Rebol - 71

s: take i: split input" "foreach[a b]i[swap at s do a at s do b]print s

Ungolfed:

s: take i: split input " " 
foreach [a b] i [swap at s do a at s do b]
print s

Come posso provarlo? Esiste un compilatore online per testarlo?
Spikatrix,

@CoolGuy - Sì, puoi provarlo su try.rebol.nl La inputfunzione non sarà in grado di chiamare STDIN da lì. Per risolvere il problema, è sufficiente impostare inputil valore che si desidera verificare. Ecco l'esempio completo del primo test input: "hello_World 1 7" s: take i: split input" "foreach[a b]i[swap at s do a at s do b]print s e fai clic su Esegui in Rebol 3 NB. Rebol utilizza l'indicizzazione basata su 1.
Draegtun,

@CoolGuy - In alternativa puoi scaricare i file binari di Rebol 3 da rebolsource.net
draegtun

0

C, 143 byte

main(a,v,i)char** v;{i=2;char s[101],t;strcpy(s,v[1]);for(;i<a;i+=2){t=s[atoi(v[i])];s[atoi(v[i])]=s[atoi(v[i+1])];s[atoi(v[i+1])]=t;}puts(s);}

Il programma precedente prende input dagli argomenti della riga di comando, copia la stringa in un array, scambia i caratteri corrispondenti e quindi emette la stringa modificata.

Codice non golfato:

main(int a,char** v,int i){ //Arguments of main 
  i = 2;
  char s[101],t;

  strcpy(s,v[1]); //Copy string literal into an array

  for(;i<a;i+=2){
    t=s[atoi(v[i])];
    s[atoi(v[i])]=s[atoi(v[i+1])];
    s[atoi(v[i+1])]=t;  //Swap each character
  }

  puts(s); // Output the final string
}

Supponete che i numeri abbiano solo una cifra? Considerando che l'input può contenere fino a 100 caratteri, non credo che sarà valido. Guarda anche il terzo esempio, che ha10 come uno degli indici.
Reto Koradi,

@RetoKoradi, grazie per averlo individuato. Ho corretto il codice.
Spikatrix,

0

JavaScript (ES6), 95

95 byte con un singolo input di stringa (funzione f in basso)

75 byte con 2 parametri, stringa e array di numeri (funzione g in basso)

(EcmaScript 6, solo Firefox)

f=i=>
(
  n=i.split(' '),
  s=[...n.shift()],
  n.map((v,i)=>i&1?[s[v],s[w]]=[s[w],s[v]]:w=v),
  s.join('')
)

g=(s,n)=>
  n.map((v,i)=>i&1?[s[v],s[w]]=[s[w],s[v]]:w=v,s=[...s])
  &&s.join('')

// TEST
out=x=>O.innerHTML+=x+'\n'

;[['Hello_world! 0 6', 'wello_Horld!']
,['First 1 2 1 0 0 4','tFisr']
,['(Second!$$) 8 7 10 1','()econd$!$S']
,['~Third~ 0 0 6 6 0 6 6 0','~Third~']]
.forEach(t=>{
  u=f(t[0]),
  ok=u==t[1],
  out('Test '+(ok?'OK: ':'FAIL: ')+t[0]+'\n Result:' +u + '\n Check: '+t[1]+'\n')
})
<pre id=O></pre>

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.