Zeichen in einer Zeichenfolge mischen

10

Sie müssen eine Funktion / ein Programm schreiben, die / das über die stdin/ Befehlszeilenargumente / Funktionsargumente eingibt, Zeichen in einer Zeichenfolge mischt und dann die endgültige Zeichenfolge über das ausgibt stdout.

Die Eingabe enthält zuerst eine Zeichenfolge (nicht leer oder null), ein Leerzeichen und dann eine gerade Anzahl nicht negativer Zahlen, die alle durch Leerzeichen getrennt sind. Wenn die Eingabe über Funktionsargumente erfolgt, ist die Zeichenfolge eines der Argumente, während die durch ein Leerzeichen getrennten Ganzzahlen die andere sind. Sie müssen die Zeichen der Zeichenfolge an den Indizes austauschen, die aufeinanderfolgenden Zahlenpaaren entsprechen.

Zum Beispiel:

Hello_world! 0 6

muss ergeben

wello_Horld!

Annahmen

  • Sie können zwischen 0-basierter und 1-basierter Indizierung wählen und davon ausgehen, dass die angegebenen Indizes immer im Bereich liegen.
  • Die Zeichenfolge darf nicht länger als 100 Zeichen sein und enthält nur ASCII-Zeichen im Bereich !bis ~(Zeichencodes 0x21 bis einschließlich 0x7E). Siehe ASCII-Tabelle als Referenz.
  • Die beiden Indizes in einem Paar können identisch sein (in diesem Fall wird in diesem Schritt nichts ausgetauscht).

Wertung

Dies ist Code Golf, daher gewinnt die kürzeste Übermittlung (in Bytes).

Testfälle

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~
Spikatrix
quelle
2
Lassen Sie mich für zukünftige Herausforderungen die Sandbox empfehlen, in der Sie Feedback erhalten und Ihre Herausforderung verbessern können, bevor Sie sie auf main veröffentlichen (dies minimiert das Risiko, vorhandene Antworten ungültig zu machen, wenn jemand einen schwerwiegenden Fehler in Ihrer Herausforderung entdeckt, der behoben werden muss).
Martin Ender
Warum sollte eine Eingabe in stdin erforderlich sein und nicht z. B. als Befehlszeilenargumente?
lrn
@ lrn, richtig. 2 weitere Optionen hinzugefügt.
Spikatrix
Ich sehe eine Reihe von Lösungen unten, die davon ausgehen, dass sie die Liste der Indizes als Array erhalten können, das an die von ihnen implementierte Funktion übergeben wird. So wie ich Ihre Definition gelesen habe, ist die Eingabe eine einzelne Zeichenfolge, die sowohl die Indizes als auch die Zeichenfolge enthält, mit der sie arbeiten, und das Extrahieren der Indizes aus der Eingabezeichenfolge ist Teil des Codes, der golfen muss. Können Sie klarstellen, welche Interpretation richtig ist?
Reto Koradi
@RetoKoradi, Nein. Die Eingabe ist keine vollständige Zeichenfolge. Es hat eine Zeichenfolge und dann Zahlen. Die Zahlen sind nicht in der Zeichenfolge enthalten.
Spikatrix

Antworten:

6

CJam, 11 Bytes

rr{irie\r}h

Wie es funktioniert

Dies ist ein etwas anderer Ansatz, bei dem ich einfach eine Do-While-Schleife durchführe, bis ich noch Zahlenpaare in der Eingabe habe.

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

Probieren Sie es hier online aus

Optimierer
quelle
6

Python 3, 89 86 Bytes

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

Packen Sie alle Dinge aus. (3 Bytes dank @potato gespeichert)

Sp3000
quelle
Speichern Sie ein paar Bytes und tun Sie dies: [*s],*L=input().split()Sie können die Zeile danach wegnehmen. Ich mag deine Lösung übrigens sehr, sie ist fast elegant, obwohl sie sehr gut gespielt ist.
Kartoffel
@potato Oh wow, ich wusste nicht, dass du so zwei Auspackungen zusammen haben kannst (ich dachte, du könntest das nur in 3.5 machen). Vielen Dank!
Sp3000
4

CJam, 13 Bytes

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

Testen Sie es hier.

Erläuterung

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.
Martin Ender
quelle
Whoa. Habe nicht so schnell eine Antwort erwartet!
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]);}}

Erklärung kommt ...

Argumente

T = ein Wort vom Typ char * .

V = ein Array einer geraden Anzahl von ganzzahligen Elementen.

L = Länge von V.

Ausgabe

gemischte Saite

Wie funktioniert es ? ::

Wischt die Anzahl der Arrays V umgekehrt und setzt das n-te Element der Zeichenfolge, nachdem der gesamte Fortschritt bis zum tatsächlichen Punkt verfolgt wurde. Beispiel

Eingabe = T = "Zuerst", V = {1,2,1,0,0,4}

V invers = {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 ..

Probieren Sie es hier aus

Abr001am
quelle
1
@ Agawa001, Sie können dies viel mehr Golf spielen. Der Rückgabetyp intwird nicht benötigt (kann zu unerwartetem Verhalten führen), und intVariablen, die Parameter sind, benötigen keine intVariablen, anstatt in der Schleife zu deklarieren, können an einer Stelle außerhalb der Schleife deklariert werden, putcharanstelle von printfusw.
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))

Golfen Sie mehr, indem Sie einige Variablen austauschen und ;wie in Tims Kommentar verwenden.

Ich hatte erwartet, dass es wie ein Golfspiel herauskommt, nur nicht so sehr.

ASCIIThenANSI
quelle
1
Sie können dies viel Golf spielen. Ändern Sie das whilein while c<len(t):line1;line2;line3.... c=c+2geht zuc+=2
Tim
@ Tim Danke für deine Hilfe!
ASCIIThenANSI
Sollte c nicht bei 0 beginnen?
Tim
@ Tim Nein. cTatsächlich wird indiziert t(die Eingabe), um die Positionen zu erhalten, die wir tauschen müssen. Aber da t[0]ist die Saite, die wir austauschen müssen, t[1]und t[2]halten Sie das erste Paar Swaps.
ASCIIThenANSI
Ahh ich verstehe ja. Entschuldigung, meine Lösung hat die Eingabe abgespalten, also habe ich vermutet, dass Sie dasselbe getan haben :)
Tim
2

C 109 107 102 Bytes

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

Hinweis: sund amuss als globale Arrays deklariert werden. sist die Zeichenfolge, die Sie austauschen möchten, und abesteht aus einem Array intmit allen Zahlenwerten.

Wenn der obige Code nicht funktioniert, versuchen Sie es mit void f(){...}anstelle vonf(){...}

Ungolfed Code:

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
}

Testen Sie es hier

Spikatrix
quelle
hmm
dein
lol wo ist die Variablendeklaration? Das ist ein betrügerischer Weg, um Ihren Code zu straffen: p
Abr001am
@ Agawa001, ich habe die Variablendeklaration nicht aufgenommen, da die Bytes mit jedem Testfall variieren würden.
Spikatrix
Dies stimmt nicht mit der im Problem definierten Eingabe überein. Die Eingabe ist eine einzelne Zeichenfolge. Sofern ich das Problem nicht völlig falsch verstanden habe, müssen Sie die Indexwerte aus der Eingabezeichenfolge extrahieren.
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))

Erläuterung:

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
Tim
quelle
1

C 70 Bytes

Da die Eingabezeichenfolge höchstens 100 ist, habe ich beschlossen, das Byte 'NULL' so anzugeben, dass das Ende des Integer-Arrays eindeutig ist 0xFF. Vermutlich zählt dies nicht als zusätzliche Eingabe, obwohl es für Kosten von (höchstens) 7 3 Bytes in eine 1-basierte Indizierung umgewandelt und '\0'als Ende des Arrays verwendet werden kann.

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

Ziemlich einfach wird regelmäßig mit einer tmp-Variablen getauscht und verwendet, dass der Komma-Operator Sequenzpunkte einführt, um ein definiertes Verhalten zu haben (im Gegensatz zu einigen Manifestationen von xor-Swaps, die eine geringere Anzahl von Zeichen haben würden, aber zu undefiniertem Verhalten führen).

Bearbeiten: Wie gewünscht können Sie es testen: http://rextester.com/OVOQ23313 .

CL-
quelle
Ich glaube nicht, dass Sie davon ausgehen können, dass Sie ein Array mit den auszutauschenden Indizes erhalten. Die Indizes sind Teil der Eingabezeichenfolge, und Sie müssen sie als Teil des veröffentlichten (und gezählten) Codes aus der Zeichenfolge heraus analysieren. Aus der Beschreibung: "Die Eingabe enthält zuerst eine Zeichenfolge, ein Leerzeichen und dann eine gerade Anzahl nicht negativer Zahlen, die alle durch Leerzeichen getrennt sind."
Reto Koradi
1

Dart - 123

Angenommen, die Eingabe in der Befehlszeile wird automatisch in Leerzeichen aufgeteilt. Andernfalls ist eine Initiale erforderlich x=x[0].split(' ');, um die Zeichenfolge in Text und Indizes aufzuteilen.

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());}

Mit mehr Leerzeichen:

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());
}

Führen Sie dies auf dartpad.dartlang.org aus / testen Sie es .

lrn
quelle
Kennen Sie Online-Compiler, bei denen ich dies testen könnte?
Spikatrix
Link zu DartPad hinzufügen.
17.
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
draegtun
quelle
Wie teste ich das? Gibt es einen Online-Compiler zum Testen?
Spikatrix
@CoolGuy - Ja, Sie können es unter try.rebol.nl testen. Die inputFunktion kann STDIN von dort nicht aufrufen. Die Problemumgehung besteht darin, einfach inputden Wert festzulegen, den Sie testen möchten. Hier ist das vollständige Beispiel des ersten Tests - 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 und klicken Sie auf Do in Rebol 3 NB. Rebol verwendet eine 1-basierte Indizierung.
Draegtun
@CoolGuy - Alternativ können Sie Rebol 3 Binärdateien von rebolsource.net herunterladen
draegtun
0

C 143 Bytes

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

Das obige Programm nimmt Eingaben von Befehlszeilenargumenten entgegen, kopiert die Zeichenfolge in ein Array, tauscht entsprechende Zeichen aus und gibt dann die geänderte Zeichenfolge aus.

Ungolfed Code:

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
}
Spikatrix
quelle
Gehen Sie davon aus, dass die Zahlen nur eine Ziffer haben? Angesichts der Tatsache, dass die Eingabe bis zu 100 Zeichen umfassen kann, denke ich nicht, dass dies gültig sein wird. Schauen Sie sich auch das dritte Beispiel an, das 10einen der Indizes hat.
Reto Koradi
@ RetoKoradi, Danke, dass du das entdeckt hast. Ich habe den Code repariert.
Spikatrix
0

JavaScript (ES6), 95

95 Bytes mit einer einzelnen Zeichenfolgeneingabe (Funktion f unten)

75 Bytes mit 2 Parametern, String und Zahlenarray (Funktion g unten)

(EcmaScript 6, nur 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>

edc65
quelle