Tantangan Anda adalah menulis sebuah program atau fungsi yang, ketika diberi dua string dengan panjang yang sama, bertukar setiap karakter lain dan menampilkan / mengembalikan string yang dihasilkan dalam urutan mana pun.
Contohnya
"Hello," "world!" --> "Hollo!" "werld,"
"code" "golf" --> "codf" "gole"
"happy" "angry" --> "hnpry" "aagpy"
"qwerty" "dvorak" --> "qvertk" "dworay"
"1, 2, 3" "a, b, c" --> "1, b, 3" "a, 2, c"
"3.141592653589" "2.718281828459" --> "3.111291623489" "2.748582858559"
"DJMcMayhem" "trichoplax" --> "DrMcMoylex" "tJichapham"
"Doorknob" "Downgoat" --> "Doonkoot" "Dowrgnab"
"Halloween" "Challenge" --> "Hhlloeegn" "Caallwnee"
Aturan
- String hanya akan berisi karakter ASCII (32-126).
- String akan selalu memiliki panjang yang sama, dan tidak akan pernah kosong.
- Anda dapat menerima input dalam format apa pun yang sesuai: memisahkan parameter, item dalam array, dipisahkan oleh satu atau lebih baris baru, bahkan digabungkan. Satu-satunya batasan adalah bahwa satu string harus sepenuhnya sebelum yang lain (misalnya
a1\nb2\nc3
untuk"abc", "123"
tidak valid). - Outputnya mungkin dalam urutan mana pun (yaitu Anda dapat mulai bertukar dari karakter pertama atau kedua), dan dalam format apa pun yang valid yang disebutkan di atas. (Array 2-item, dipisahkan oleh baris baru, disatukan, dll.)
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek dalam byte untuk setiap bahasa akan menang.
DrMcMoylex
. : DJawaban:
Haskell, 37 byte
Ritsleting dua string, secara bergantian bertukar karakter, lalu buka ritsletingnya.
Alternatif rekursif 37 byte:
sumber
Python, 42 byte dengan I / O golf
Tukar setiap karakter lain dari kedua daftar. Dibawa sebagai input dua daftar karakter , dan output dengan memodifikasi mereka .
memberi
sumber
Vim,
18, 17 byteCobalah online!
Ini menggunakan juru bahasa V karena kompatibilitas ke belakang. Masukan datang dalam format ini:
Penjelasan:
sumber
x
bukanyl
dan kemudian jusP
bukan yang keduavP
:lqqxjvPkPll@qq@q
[save]
tombol? Either way, itu tidak bekerja untuk saya . Alasan sebenarnya mengapa adalah karena ketika Andax
karakter terakhir di telepon, itu menggerakkan kursor Anda ke kiri, mengacaukan penempatan swap.Haskell, 41 byte
Mengembalikan pasangan dengan string. Contoh penggunaan:
( (unzip.).(#) ) "Hello," "world!"
->("Hollo!","werld,")
.Pendekatan rekursif sederhana: ambil karakter pertama dari masing-masing string sebagai pasangan dan tambahkan panggilan rekursif dengan (sisa dari) string bertukar.
unzip
membuat sepasang daftar dari daftar pasangan.sumber
05AB1E ,
1110 byteCobalah online!
Penjelasan
input =
["code", "golf"]
digunakan sebagai contoh.sumber
Perl, 48 byte
Bytecount mencakup 47 byte kode dan
-p
bendera.Jalankan dengan
-p
dan-E
beri tanda. Harapkan setiap string pada baris yang berbeda:Penjelasan :
-p
: ambil input$_
dan cetak di bagian akhir. (untuk mendapatkan dan mencetak string pertama)<>
: dapatkan sederet input. (untuk mendapatkan string kedua).=~
: Menerapkan regex untuk<>
:s%%%geer
, di mana berkatr
string dimodifikasi dikembalikan (dan kemudian dicetak berkatsay
).Regex:
.\K(.)
menemukan dua karakter, dan akan menggantikan yang kedua dengan hasil evaluasi kode ini"s/.{$-[0]}\\K(.)/$1/;\$1"
:Bagian pertama,
s/.{$-[0]}\\K(.)/$1/
menerapkan regex ke$_
:.{$-[0]}
melompati karakter pertama untuk sampai ke titik yang sama dengan regex luar (karena$-[0]
berisi indeks kelompok tangkapan pertama, jadi dalam hal ini indeks karakter untuk diganti), dan kemudian kita menangkap arang dengan(.)
dan menggantinya dengan karakter regex luar ($1
). Dan kemudian kita tambahkan$1
sehingga hasilnya"s/.{$-[0]}\\K(.)/$1/;\$1"
adalah karakter yang kita tangkap di regex batin.Anda mungkin memperhatikan itu
$1
lihat karakter yang ingin kami ganti di kedua string (jadi dua karakter berbeda), jadi kami bermain dengan/ee
pengubah regex yang mengevaluasi sisi kanan regex dua kali: yang pertama akan menggantikan hanya$1
yang tidak didahului oleh\
.sumber
Python, 55 byte
Mengiris!
58 byte:
64 byte:
Secara rekursif mengakumulasikan karakter dari dua string ke
s
dant
, dan mengeluarkan pasangan mereka di akhir. Pergantian dilakukan dengan mengganti string input setiap panggilan rekursif. Mengeluarkan string yang dipisahkan oleh spasi sama panjangnya:Ini secara sempit mengalahkan strategi rekursif yang berbeda dalam mengambil karakter secara bergantian dari setiap string, dengan masing-masing dari dua string yang mungkin sebagai yang pertama. (65 byte)
sumber
MATL ,
111098 byteBerkat ETHproduk untuk 1 byte off!
Input adalah array 2D yang berisi dua string, seperti:
['Halloween'; 'Challenge']
. String output berada dalam urutan terbalik.Cobalah online!
Penjelasan
Versi lama: 9 byte
Penjelasan
sumber
Jelly , 5 byte
Input adalah argumen terpisah, output disatukan.
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Jelly ,
986 byteTerima kasih kepada Dennis karena telah menghemat 2 byte!
Menggunakan pengodean Jelly .
Cobalah online!
sumber
ṙ"J$
bukanĖṙ@/€
. Juga, memisahkan string tidak diperlukan, sehingga Anda dapat menjatuhkannyaY
.V , 12 byte
Cobalah online!
Tidak ada yang terlalu menarik, hanya port langsung dari jawaban vim saya sehingga saya dapat bersaing dengan (tetapi tidak mengalahkan) 05AB1E.
sumber
Pyke, 9 byte
Coba di sini!
sumber
JavaScript (ES6), 51
54Edit 3 byte yang disimpan thx @Neil
Berfungsi dengan input / output array
Saya suka yang ini lagi, tapi 55 (2 string dalam input, array dalam output)
Uji
sumber
replace
menghemat 3 byte:p=>p.map((w,i)=>w.replace(/./g,(c,j)=>a[i+j&1][j]))
.Pyth, 8 byte
Cobalah online: Demonstrasi
Transpos kata-kata, membalikkan setiap pasangan 'indeks saat ini'-kali, transpos lagi.
sumber
JavaScript (ES6), 55 byte
Saya ingin melakukan sesuatu yang cerdik dengan menggunakan regexp untuk mengganti karakter alternatif tetapi akhirnya mengambil
6757 byte:sumber
f=([a,...A],[b,...B])=>a?[a+f(B,A)[0],b+f(A,B)[0]]:[""]
panjang yang sama.map
, ia mencukur 10 byte dari jawaban regexp saya. Masih terlalu lama.Perl, 40 byte
Termasuk +1 untuk
-n
Berikan string sebagai garis pada STDIN
interlace.pl
sumber
Java,
132103100 byteTerima kasih kepada Kevin Cruijssen karena menyarankan mengembalikan array (di antara perbaikan lainnya) dan menghemat 29 byte! Juga Olivier Grégoire selama 3 byte!
Disebut seperti ini:
Keluaran:
Hollo,werld!
Mengambil keuntungan dari fakta bahwa input pada dasarnya dapat diformat dengan cara apa pun (dalam hal ini, array char tunggal dari Strings yang dibatasi oleh koma), dan aturan output yang cukup ringan juga.
sumber
char[]c(char[]s,int l){for(int o=l,t;o-->0;)if(l%2>0){t=s[l];s[l]=s[l+o+1];s[l+o+1]=(char)t;}return s;}
( 103 bytes ) dengan output yang dikembalikan bukannya dicetak secara langsung. Contoh inputSystem.out.println(c("Hello,world!".toCharArray(), 5));
:; Contoh output:Hollo,werld!
.Hollo!werld,
dan tidakHollo,werld!
(tanda baca salah). Saya percaya ini dapat diperbaiki dengan nilai input 6 bukannya 5.t
kechar
, mengapa Anda tidak mendeklarasikannya dalam for for secara langsung sebagaichar
? Anda akan meluangkan beberapa byte untuk melakukannya.C, 124 byte
Telepon dengan:
Panjang string dibatasi hingga 98 karakter.
sumber
Oktaf ,
6461 byteFungsi anonim yang memasukkan array char 2D dengan setiap string dalam satu baris, dan menghasilkan output dalam format yang sama.
Cobalah di Ideone .
sumber
Racket 208 byte
Tidak Disatukan:
Pengujian:
Keluaran:
Di atas adalah versi rekursif.
Versi berulang:
Tidak Disatukan:
sumber
PowerShell v2 +, 82 byte
Masih bermain golf ...Tidak. Sepertinya tidak bisa mengurangi ini tanpa menggunakan regex seperti jawaban lain (boo pada algoritma penyalinan).Jadi kami mengambil
$a
dan$b
sebagai string, mengatur indeks$i
ke0
, melemparkan$a
sebagaichar
-array, dan mengirimkannya melalui loop|%{...}
. Setiap iterasi, kami merangkai string ke$c
dan$d
dengan mengindeks ke dalam array-pilih (yaitu, sehingga bergantian bolak-balik). Kemudian, kita keluar$c
dan$d
masuk pipa, dan output melalui implisitWrite-Output
terjadi pada penyelesaian program.sumber
Lithp , 120 karakter (+3 untuk -v1 flag)
Garis terbagi 2 untuk dibaca:
Membutuhkan
-v1
bendera untukrun.js
karena beberapa fungsi belum menjadi bagian dari perpustakaan standar.Penggunaan sampel:
Sorotan semacam ini yang belum saya habiskan cukup lama di perpustakaan standar. Harus menggunakan
js-bridge/1
dua kali dan formulir regex panjang, serta memohon peta menggunakaninvoke/*
semua berkontribusi untuk ini menjadi lebih lama dari yang seharusnya.Waktu untuk bekerja di perpustakaan standar saya lebih saya kira.
sumber
PHP, 79 Bytes
PHP Versi Sebelumnya, 82 Bytes
sumber
for(...)echo$a[1+$i%2][$i];echo" $y";
(-2)for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][$i]??" $y";
adalah -2 lebih lanjut, meskipun membutuhkan php 7Notice: String offset cast occurred in Command line code on line 1
C,
5452 byteMengasumsikan output
c
sudah memiliki panjang yang diinginkan.Pemakaian:
}
Jika Anda bersikeras membuat output, berikut ini adalah solusi 91 byte :
Pemakaian:
sumber
C, 150 byte
Saya menggunakan kelalaian khas file header dan
main()
tipe pengembalian dan pernyataan pengembalian. Itu melempar peringatan, tetapi kompilasi tanpa masalah. Saya juga menggunakan trik khusus GCC yang memungkinkan deklarasi array dengan ekspresi variabel.Program mengharapkan string dari baris perintah, dan karena itu, program harus dijalankan
./a.out string1 string2
.Atau lebih tepatnya,
sumber
Mathematica, 51 byte
Mengambil input sebagai array dari dua array karakter, dengan output dalam format yang sama. Fungsi ini hanya membangun array baru menggunakan operasi (mod 2).
sumber
QBasic 4.5, 172 bytes
Aduh, yang ini terasa menyakitkan dengan ol 'QBasic ...
Fakta menyenangkan: Menggunakan
DEFSTR
byte yang disimpan lebih banyak daripada biayanya karena sekarang saya bisa menggunakannyaA
sebagai gantia$
.sumber
QBIC , 112 byte
QBIC dapat merampingkan banyak pelat baja QBasic, tetapi
MID$
mesin utama masih perlu dilakukan di QBasic karena QBIC tidak memiliki fungsi substring. Namun, hemat saya 60 byte.sumber
MIND$
=>MIN$
dalam teks.Java, 68 byte
Tidak disatukan dan diuji
sumber
APL, 12
Penjelasan: {...} mendefinisikan suatu fungsi, ⍵ adalah argumen yang tepat. Take (↑) membuat matriks dari dua string, kemudian memutar setiap kolom (⊖) n kali, di mana n adalah bagian dalam tanda kurung (⍳⍴⊃⍵). Itu didefinisikan sebagai sedikit panjang dari argumen pertama. (Mis: panjang = 5 ==> 1 2 3 4 5). Jadi kolom pertama diputar sekali, kedua dua kali (kembali ke posisi semula), kolom ketiga tiga kali, dll ...
Cobalah di tryapl.org
sumber