Mencampur karakter dalam sebuah string

10

Anda harus menulis fungsi / program yang mengambil input melalui stdinargumen / command-line argumen / fungsi, mencampur karakter dalam string, dan kemudian output string akhir melalui stdout.

Input pertama-tama akan berisi string (bukan kosong atau null), spasi, dan kemudian angka genap non-negatif semua dipisahkan oleh spasi. Jika input diambil melalui argumen fungsi, string akan menjadi salah satu argumen sementara bilangan bulat, yang dipisahkan oleh spasi, akan menjadi yang lain. Anda harus menukar karakter string pada indeks yang sesuai dengan pasangan angka berurutan.

Contohnya:

Hello_world! 0 6

harus menghasilkan

wello_Horld!

Asumsi

  • Anda dapat memilih antara pengindeksan berbasis 0 dan 1, dan dapat mengasumsikan bahwa indeks yang diberikan akan selalu berada dalam kisaran.
  • String tidak akan lebih dari 100 karakter dan hanya akan berisi karakter ASCII dalam rentang !hingga ~(kode karakter 0x21 hingga 0x7E, inklusif). Lihat tabel ASCII untuk referensi.
  • Dua indeks dalam pasangan mungkin identik (dalam hal ini, tidak ada yang ditukar pada langkah itu).

Mencetak gol

Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang.

Uji Kasus

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
sumber
2
Untuk tantangan di masa mendatang, izinkan saya merekomendasikan kotak pasir di mana Anda bisa mendapatkan umpan balik dan memoles tantangan Anda sebelum mempostingnya di utama (ini meminimalkan risiko membatalkan jawaban yang ada jika seseorang menemukan kesalahan serius dalam tantangan Anda yang perlu diperbaiki).
Martin Ender
Mengapa memerlukan input pada stdin, dan tidak, misalnya, sebagai argumen baris perintah?
lrn
@ ln, Benar. Menambahkan 2 opsi lagi.
Spikatrix
Saya melihat banyak solusi di bawah ini yang berasumsi bahwa mereka bisa mendapatkan daftar indeks sebagai array yang diteruskan ke fungsi yang mereka implementasikan. Cara saya membaca definisi Anda, inputnya adalah string tunggal, yang berisi indeks serta string yang dioperasikannya, dan mengekstraksi indeks dari string input adalah bagian dari kode yang perlu dip Golf. Bisakah Anda memperjelas interpretasi mana yang benar?
Reto Koradi
@RetoKoradi, No. Input bukan string penuh. Ia memiliki string, dan kemudian angka. Angka-angka tidak termasuk dalam string.
Spikatrix

Jawaban:

6

CJam, 11 byte

rr{irie\r}h

Bagaimana itu bekerja

Ini adalah pendekatan yang sedikit berbeda, di mana saya hanya menjalankan loop do-while sampai saya memiliki pasangan angka yang tersisa di 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

Cobalah online di sini

Pengoptimal
sumber
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="")

Buka semua barang. (3 byte disimpan berkat @potato)

Sp3000
sumber
Simpan beberapa byte dan lakukan ini: [*s],*L=input().split()Anda kemudian dapat mengambil garis setelah itu. Saya sangat suka solusi Anda, tapi hampir elegan meskipun sangat golf.
kentang
@potato Oh wow, saya tidak tahu Anda bisa memiliki dua membongkar bersama-sama seperti itu (saya pikir Anda hanya bisa melakukannya dalam 3,5). Terima kasih!
Sp3000
4

CJam, 13 byte

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

Uji di sini.

Penjelasan

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
sumber
Wah Tidak mengharapkan jawaban secepat itu!
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]);}}

Penjelasan akan datang ...

Argumen

T = kata bertipe char * .

V = array jumlah elemen integer yang genap.

L = panjang V

Keluaran

string campuran

Bagaimana cara kerjanya ? :

menyapu jumlah array V sebaliknya, dan menempatkan elemen ke-n dari string setelah melacak semua kemajuannya hingga titik aktual. Contoh

input = T = "Pertama", V = {1,2,1,0,0,4}

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

Coba di sini

Abr001am
sumber
1
@ Agawa001, Anda bisa bermain golf lebih banyak. Jenis pengembalian inttidak diperlukan (dapat mengakibatkan perilaku tak terduga), dan intvariabel yang merupakan parameter tidak memerlukan int, variabel, alih-alih mendeklarasikan dalam loop dapat dideklarasikan di satu tempat di luar loop, gunakan putcharbukan printfdll.
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))

Golf lebih banyak dengan bertukar sekitar beberapa variabel, dan menggunakan ;seperti dalam komentar Tim.

Saya berharap itu keluar terlihat golf, hanya saja tidak sebanyak ini.

ASCIIThenANSI
sumber
1
Anda bisa bermain golf ini banyak. Ubah whileke while c<len(t):line1;line2;line3.... c=c+2pergi kec+=2
Tim
@Tim Terima kasih atas bantuan Anda!
ASCIIThenANSI
Bukankah seharusnya c mulai dari 0?
Tim
@Tim Nggak. csebenarnya adalah pengindeksan t(input) untuk mendapatkan posisi yang kita butuhkan untuk bertukar. Tapi karena t[0]string itu kita perlu bertukar, t[1]dan t[2]tahan pasangan swap pertama.
ASCIIThenANSI
Ahh begitu, ya. Maaf, solusi saya memisahkan input, jadi saya kira Anda akan melakukan hal yang sama :)
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);}

Catatan: sdan aperlu dinyatakan sebagai array global. sadalah string yang ingin Anda tukarkan dan amerupakan larik intdengan semua nilai angka.

Jika kode di atas tidak berfungsi, coba gunakan void f(){...}sebagai gantif(){...}

Kode tidak dikunci:

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
}

Uji di sini

Spikatrix
sumber
kode hmm ur Anda lebih kecil :)
Abr001am
lol dimana deklarasi variabel? Itulah cara curang untuk mengencangkan kode Anda: p
Abr001am
@ Agawa001, saya tidak memasukkan deklarasi variabel karena byte akan bervariasi pada setiap test case.
Spikatrix
Ini tidak cocok dengan input seperti yang didefinisikan dalam masalah. Inputnya adalah string tunggal. Kecuali saya benar-benar salah paham masalah, Anda perlu mengekstraksi nilai indeks dari string 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))

Penjelasan:

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
sumber
1

C, 70 byte

Mengingat bahwa string input paling panjang 100 saya memutuskan untuk membuat byte 'NULL' yang mengindikasikan akhir array integer menjadi tidak ambigu 0xFF. Agaknya ini tidak dihitung sebagai input tambahan, meskipun untuk biaya (paling banyak) 7 3 byte dapat dibuat menjadi pengindeksan berbasis 1 dan digunakan '\0'sebagai akhir array.

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

Cukup banyak melakukan pertukaran reguler dengan variabel tmp dan menggunakan bahwa operator koma memperkenalkan titik sekuens untuk memiliki perilaku yang didefinisikan (tidak seperti beberapa manifestasi dari x atau swap yang akan memiliki jumlah karakter yang lebih rendah tetapi mengarah pada perilaku yang tidak terdefinisi).

Sunting: Seperti yang diminta, Anda dapat mengujinya: http://rextester.com/OVOQ23313 .

CL-
sumber
Saya tidak berpikir Anda bisa berasumsi bahwa Anda mendapatkan array dengan indeks untuk ditukar. Indeks adalah bagian dari string input, dan Anda perlu menguraikannya dari string sebagai bagian dari kode yang diposting (dan dihitung). Dari uraian: "Input pertama-tama akan berisi string, spasi, dan kemudian angka genap non-negatif semua dipisahkan oleh spasi."
Reto Koradi
1

Dart - 123

Mengasumsikan input pada baris perintah secara otomatis dibagi di spasi. Kalau tidak, diperlukan inisial x=x[0].split(' ');untuk membagi string menjadi teks dan indeks.

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

Dengan lebih banyak ruang putih:

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

Jalankan / uji ini di dartpad.dartlang.org .

Tuan
sumber
Apakah Anda tahu ada kompiler online di mana saya bisa menguji ini?
Spikatrix
Tambahkan tautan ke DartPad.
lrn
1

Rebol - 71

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

Tidak Disatukan:

s: take i: split input " " 
foreach [a b] i [swap at s do a at s do b]
print s
draegtun
sumber
Bagaimana saya menguji ini? Apakah ada kompiler online untuk menguji ini?
Spikatrix
@CoolGuy - Ya, Anda dapat mengujinya di try.rebol.nl . inputFungsi ini tidak akan dapat memanggil STDIN dari sana. Solusinya adalah dengan menetapkan sederhana inputmenjadi nilai yang ingin Anda uji. Inilah contoh lengkap dari tes pertama - 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 dan klik Lakukan di Rebol 3 NB. Rebol menggunakan pengindeksan berbasis 1.
draegtun
@CoolGuy - Atau Anda dapat mengunduh rebol 3 binari dari 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);}

Program di atas mengambil input dari argumen baris perintah, menyalin string ke dalam array, menukar karakter yang sesuai dan kemudian, menghasilkan string yang dimodifikasi.

Kode tidak dikunci:

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
sumber
Apakah Anda berasumsi bahwa angka-angka itu hanya memiliki satu digit? Mengingat inputnya bisa hingga 100 karakter, saya rasa itu tidak valid. Lihat juga contoh ke-3, yang memiliki 10salah satu indeks.
Reto Koradi
@RetoKoradi, Terima kasih telah melihatnya. Saya memperbaiki kodenya.
Spikatrix
0

JavaScript (ES6), 95

95 byte dengan input string tunggal (fungsi f di bawah)

75 byte dengan 2 parameter, string dan array angka (fungsi g di bawah)

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