Jalin string

34

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\nc3untuk "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 , jadi kode terpendek dalam byte untuk setiap bahasa akan menang.

Produksi ETH
sumber
11
+1 untuk DrMcMoylex. : D
DJMcMayhem
3
Anagram "Dowrgnab" menjadi "Downgrab" (͡ ° ͜ʖ ͡ °)
Mama Fun Roll
Anda harus menunjukkan secara eksplisit bahwa aturan "dalam urutan" berarti bertukar dapat dimulai dari karakter pertama atau kedua.
DLosc
@DrMcMoylex Ambil kodenya, contoh golf . Jika kita bertukar mulai dari karakter kedua, kita mendapatkan: c o d f , g o l e . Mulai dari karakter pertama: g o l e, c o d f.
DLosc

Jawaban:

14

Haskell, 37 byte

l=(,):flip(,):l
(unzip.).zipWith3($)l

Ritsleting dua string, secara bergantian bertukar karakter, lalu buka ritsletingnya.

Alternatif rekursif 37 byte:

(a:b)?(c:d)=a:d?b
e?_=e
a%b=(a?b,b?a)
Tidak
sumber
9

Python, 42 byte dengan I / O golf

def f(a,b):a[1::2],b[1::2]=b[1::2],a[1::2]

Tukar setiap karakter lain dari kedua daftar. Dibawa sebagai input dua daftar karakter , dan output dengan memodifikasi mereka .

l=list('cat')
m=list('dog')    
print l,m

def f(a,b):a[1::2],b[1::2]=b[1::2],a[1::2]

f(l,m)
print l,m

memberi

['c', 'a', 't'] ['d', 'o', 'g']
['c', 'o', 't'] ['d', 'a', 'g']
Tidak
sumber
1
Itu pintar. Apakah Anda melihat format input / output terlalu fleksibel?
ETHproduksi
@ ETHproductions Tidak yakin, itu mungkin sebagian besar khusus Python bahwa daftar jauh lebih dimanipulasi daripada string.
xnor
8

Vim, 18 , 17 byte

qqyljvPkvPll@qq@q

Cobalah online!

Ini menggunakan juru bahasa V karena kompatibilitas ke belakang. Masukan datang dalam format ini:

string1
string2

Penjelasan:

 qq                 " Start recording in register 'q'
   yl               " Yank one letter
     j              " Move down a row
      vP            " Swap the yanked letter and the letter under the cursor
        k           " Move back up a row
         vP         " Swap the yanked letter and the letter under the cursor
           ll       " Move two letters to the right. This will throw an error once we're done
             @q     " Call macro 'q' recursively
               q    " Stop recording.
                @q  " Start the recursive loop
DJMcMayhem
sumber
Potong dua huruf dengan menggunakan xbukan yldan kemudian jus Pbukan yang kedua vP:lqqxjvPkPll@qq@q
Hauleth
@ Lukasz Saya sudah mencobanya pada awalnya, tetapi untuk alasan apa pun, itu menjalankannya berkali-kali dan menukar huruf terakhir ketika seharusnya tidak. Saya akan memeriksanya lagi
DJMcMayhem
Bekerja untuk saya v.tryitonline.net/...
Hauleth
1
@ ŁukaszNiemier Tautan itu memiliki kode yang sama dengan yang saya posting. Apakah Anda menekan [save]tombol? Either way, itu tidak bekerja untuk saya . Alasan sebenarnya mengapa adalah karena ketika Anda xkarakter terakhir di telepon, itu menggerakkan kursor Anda ke kiri, mengacaukan penempatan swap.
DJMcMayhem
6

Haskell, 41 byte

(a:b)#(c:d)=(a,c):d#b
_#_=[]
(unzip.).(#)

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. unzipmembuat sepasang daftar dari daftar pasangan.

nimi
sumber
6

05AB1E , 11 10 byte

øvyNFÀ}})ø

Cobalah online!

Penjelasan

input = ["code", "golf"]digunakan sebagai contoh.

ø             # zip strings into list of pairs
              # STACK: ['cg', 'oo', 'dl', 'ef']
 vy           # for each pair
   NFÀ        # rotate left index times
      }}      # end-if, end-loop
              # STACK: 'cg, 'oo', 'dl', 'fe'
        )ø    # wrap in list and zip
              # OUTPUT: ['codf', 'gole']
Emigna
sumber
5

Perl, 48 byte

Bytecount mencakup 47 byte kode dan -pbendera.

say<>=~s%.\K(.)%"s/.{$-[0]}\\K(.)/$1/;\$1"%geer

Jalankan dengan -pdan -Eberi tanda. Harapkan setiap string pada baris yang berbeda:

perl -pE 'say<>=~s%.\K(.)%"s/.{$-[0]}\\K(.)/$1/;\$1"%geer' <<< "Hello
World"

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 berkat rstring dimodifikasi dikembalikan (dan kemudian dicetak berkat say).
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 $1sehingga hasilnya "s/.{$-[0]}\\K(.)/$1/;\$1"adalah karakter yang kita tangkap di regex batin.
Anda mungkin memperhatikan itu$1lihat karakter yang ingin kami ganti di kedua string (jadi dua karakter berbeda), jadi kami bermain dengan /eepengubah regex yang mengevaluasi sisi kanan regex dua kali: yang pertama akan menggantikan hanya $1yang tidak didahului oleh \.

Dada
sumber
5

Python, 55 byte

lambda a,b:[(-~len(a)/2*s)[::len(a)+1]for s in a+b,b+a]

Mengiris!

58 byte:

def f(a,b):n=len(a);print[(s*n)[:n*n:n+1]for s in a+b,b+a]

64 byte:

f=lambda a,b,s='',t='':a and f(b[1:],a[1:],s+a[0],t+b[0])or[s,t]

Secara rekursif mengakumulasikan karakter dari dua string ke sdan t, dan mengeluarkan pasangan mereka di akhir. Pergantian dilakukan dengan mengganti string input setiap panggilan rekursif. Mengeluarkan string yang dipisahkan oleh spasi sama panjangnya:

lambda a,b,s='',t=' ':a and f(b[1:],a[1:],s+a[0],t+b[0])or s+t

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)

g=lambda a,b:a and a[0]+g(b[1:],a[1:])
lambda a,b:(g(a,b),g(b,a))
Tidak
sumber
4

MATL , 11 10 9 8 byte

Berkat ETHproduk untuk 1 byte off!

"@X@YS&h

Input adalah array 2D yang berisi dua string, seperti: ['Halloween'; 'Challenge']. String output berada dalam urutan terbalik.

Cobalah online!

Penjelasan

        % Input 2D array implicitly
"       % For each column
  @     %   Push current column
  X@    %   Push iteration index, starting at 1
  YS    %   Circularly shift the column by that amount
  &h    %   Concatenate horizontally with (concatenated) previous columns
        % End implicitly
        % Display implicitly

Versi lama: 9 byte

tZyP:1&YS

Penjelasan

        % Take input implicitly
t       % Duplicate 
        % STACK: ['Halloween'; 'Challenge'], ['Halloween'; 'Challenge']
Zy      % Size
        % STACK: ['Halloween'; 'Challenge'], [2 9]
P       % Flip array
        % STACK: ['Halloween'; 'Challenge'], [9 2]
:       % Range. Uses first element of the array as input
        % STACK: ['Halloween'; 'Challenge'], [1 2 3 4 5 6 7 8 9]
1&YS    % Circularly shift each column by those amounts respectively
        % STACK: [Caallwnee';'Hhlloeegn']
        % Display implicitly
Luis Mendo
sumber
@ EHProduk Ya! Terima kasih!
Luis Mendo
4

Jelly , 5 byte

żṚż¥/

Input adalah argumen terpisah, output disatukan.

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

żṚż¥/  Main link. Left argument: s (string). Right argument: t (string)

ż      Zipwith; yield the array of pairs of corresponding characters of s and t.
   ¥   Combine the two links to the left into a dyadic chain:
 Ṛ         Reverse the chain's left argument.
  ż        Zip the result with the chain's right argument.
    /  Reduce the return value of the initial ż by the quicklink Ṛż¥.
Dennis
sumber
4

Jelly , 9 8 6 byte

Terima kasih kepada Dennis karena telah menghemat 2 byte!

Zṙ"J$Z

Menggunakan pengodean Jelly .

Cobalah online!

Adnan
sumber
Anda bisa menggunakan ṙ"J$bukan Ėṙ@/€. Juga, memisahkan string tidak diperlukan, sehingga Anda dapat menjatuhkannya Y.
Dennis
@ Dennis Ahh, itu rapi. Terima kasih! :)
Adnan
3

V , 12 byte

lòyljvPkvPll

Cobalah online!

Tidak ada yang terlalu menarik, hanya port langsung dari jawaban vim saya sehingga saya dapat bersaing dengan (tetapi tidak mengalahkan) 05AB1E.

DJMcMayhem
sumber
3

Pyke, 9 byte

,Fo2%I_(,

Coba di sini!

          - o = 0
,         -   transpose(input)
 F     (  -  for i in ^:
  o2%     -    (o++ %2)
     I_   -   if ^: i = reverse(i)
        , - transpose(^)
Biru
sumber
3

JavaScript (ES6), 51 54

Edit 3 byte yang disimpan thx @Neil

Berfungsi dengan input / output array

p=>p.map((w,i)=>w.replace(/./g,(c,j)=>p[i+j&1][j]))

Saya suka yang ini lagi, tapi 55 (2 string dalam input, array dalam output)

(a,b)=>[...a].reduce(([p,q],c,i)=>[q+c,p+b[i]],['',''])

Uji

f=
p=>p.map((w,i)=>w.replace(/./g,(c,j)=>p[i+j&1][j]))

function go() {
  var a=A.value, b=B.value
  if (a.length == b.length)
    O.textContent = f([a,b]).join('\n')
  else
    O.textContent = '- different length -'
    
}

go()
<input id=A value='Hello,'><input id=B value='world!'>
<button onclick='go()'>go</button><pre id=O></pre>

edc65
sumber
replacemenghemat 3 byte: p=>p.map((w,i)=>w.replace(/./g,(c,j)=>a[i+j&1][j])).
Neil
2

Pyth, 8 byte

C.e_FbkC

Cobalah online: Demonstrasi

Transpos kata-kata, membalikkan setiap pasangan 'indeks saat ini'-kali, transpos lagi.

Jakube
sumber
2

JavaScript (ES6), 55 byte

f=([c,...s],[d,...t],o="",p="")=>c?f(t,s,o+c,p+d):[o,p]

Saya ingin melakukan sesuatu yang cerdik dengan menggunakan regexp untuk mengganti karakter alternatif tetapi akhirnya mengambil 67 57 byte:

a=>a.map((s,i)=>a[+!i].replace(/.(.?)/g,(_,c,j)=>s[j]+c))
Neil
sumber
Bagus. Saya memiliki f=([a,...A],[b,...B])=>a?[a+f(B,A)[0],b+f(A,B)[0]]:[""]panjang yang sama.
ETHproduksi
Saya berharap untuk melakukan jauh lebih baik, tetapi tidak mungkin, hanya 1 kurang. Saatnya mengirim jawaban yang tidak rekursif
edc65
@ edc65 Ide bagus untuk digunakan map, ia mencukur 10 byte dari jawaban regexp saya. Masih terlalu lama.
Neil
2

Perl, 40 byte

Termasuk +1 untuk -n

Berikan string sebagai garis pada STDIN

interlace.pl
hello
world
^D

interlace.pl

#!/usr/bin/perl -n
s/./${1&$.+pos}[pos]=$&/seg}{print@0,@1
Ton Hospel
sumber
2

Java, 132 103 100 byte

Terima kasih kepada Kevin Cruijssen karena menyarankan mengembalikan array (di antara perbaikan lainnya) dan menghemat 29 byte! Juga Olivier Grégoire selama 3 byte!

char[]c(char[]s,int l){for(int o=l;o-->0;)if(o%2>0){char t=s[o];s[o]=s[l+o+1];s[l+o+1]=t;}return s;}

Disebut seperti ini:

public static void main(String[] args) {
    System.out.println(c("Hello,world!".toCharArray(), 5)); // 5 is the length of each "String"
}

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.

Hypino
sumber
Hai, format input asli yang Anda punya di sana. Anda dapat melakukan golf lagi: 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 input System.out.println(c("Hello,world!".toCharArray(), 5));:; Contoh output: Hollo,werld!.
Kevin Cruijssen
Cukup benar, saya tidak mempertimbangkan hanya mengembalikan array char untuk beberapa alasan. Itu keren!
Hypino
Hasilnya harus Hollo!werld,dan tidak Hollo,werld!(tanda baca salah). Saya percaya ini dapat diperbaiki dengan nilai input 6 bukannya 5.
Olivier Grégoire
Karena Anda dilemparkan tke char, mengapa Anda tidak mendeklarasikannya dalam for for secara langsung sebagai char? Anda akan meluangkan beberapa byte untuk melakukannya.
Olivier Grégoire
Sayangnya Anda tidak dapat mendeklarasikan char di dalam inisialisasi loop, tetapi Anda mengilhami saya untuk memeriksa apakah mendeklarasikan char secara terpisah akan lebih pendek dari para pemain dan memang dengan 1 byte.
Hypino
1

C, 124 byte

main(c,v)char**v;{char a[99],b[99];for(c=0;v[1][c]^0;++c){a[c]=v[1+c%2][c];b[c]=v[2-c%2][c];}a[c]=0;b[c]=0;puts(a);puts(b);}

Telepon dengan:

program.exe string1 string2

Panjang string dibatasi hingga 98 karakter.

Steadybox
sumber
1

Oktaf , 64 61 byte

@(x)reshape(x((t=1:end)+(2*mod(t,2)-1).*(mod(t-1,4)>1)),2,[])

Fungsi anonim yang memasukkan array char 2D dengan setiap string dalam satu baris, dan menghasilkan output dalam format yang sama.

Cobalah di Ideone .

Luis Mendo
sumber
1

Racket 208 byte

(let((sl string->list)(ls list->string)(r reverse))(let p((s(sl s))(t(sl t))(u'())(v'())(g #t))(if(null? s)
(list(ls(r u))(ls(r v)))(p(cdr s)(cdr t)(cons(car(if g s t))u)(cons(car(if g t s))v)(if g #f #t)))))

Tidak Disatukan:

(define (f s t)
  (let ((sl string->list)                ; create short names of fns
        (ls list->string)
        (r reverse))
    (let loop ((s (sl s))                ; convert string to lists
               (t (sl t))
               (u '())                   ; create empty new lists
               (v '())
               (g #t))                   ; a boolean flag
      (if (null? s)                      ; if done, return new lists converted back to strings
          (list (ls (r u))
                (ls (r v)))
          (loop (rest s)
                (rest t)                 ; keep adding chars to new lists alternately
                (cons (first (if g s t)) u) 
                (cons (first (if g t s)) v)
                (if g #f #t))            ; alternate the boolean flag
          ))))

Pengujian:

(f "abcdef" "123456")

Keluaran:

'("a2c4e6" "1b3d5f")

Di atas adalah versi rekursif.

Versi berulang:

(let*((sl string->list)(ls list->string)(r reverse)(s(sl s))(t(sl t))(l'())(k'())(p(λ(a b g)(set! l(cons(if g a b)l))
(set! k(cons(if g b a)k)))))(for((i s)(j t)(n(in-naturals)))(p i j(if(= 0(modulo n 2)) #t #f)))(list(ls(r l))(ls(r k))))

Tidak Disatukan:

(define (f s t)
  (let* ((sl string->list)              ; create short form of fn names
         (ls list->string)
         (r reverse)

         (s (sl s))                     ; convert strings to lists
         (t (sl t))

         (l '())                        ; create empty lists for new sequences
         (k '())

         (p (λ(a b g)                   ; fn to add chars to one or other list
              (set! l (cons (if g a b) l))
              (set! k (cons (if g b a) k)))))

    (for ((i s)(j t)(n (in-naturals)))  ; loop with both strings
          (p i j                        ; add to new lists alternately
             (if (= 0 (modulo n 2)) #t #f)))

    (list (ls (r l))                  ; convert reversed lists to strings
          (ls (r k)))))
juga
sumber
1

PowerShell v2 +, 82 byte

param($a,$b)$i=0;[char[]]$a|%{$c+=($_,$b[$i])[$i%2];$d+=($b[$i],$_)[$i++%2]};$c;$d

Masih bermain golf ... Tidak. Sepertinya tidak bisa mengurangi ini tanpa menggunakan regex seperti jawaban lain (boo pada algoritma penyalinan).

Jadi kami mengambil $adan $bsebagai string, mengatur indeks $ike 0, melemparkan $asebagai char-array, dan mengirimkannya melalui loop |%{...}. Setiap iterasi, kami merangkai string ke $cdan $ddengan mengindeks ke dalam array-pilih (yaitu, sehingga bergantian bolak-balik). Kemudian, kita keluar $cdan $dmasuk pipa, dan output melalui implisit Write-Outputterjadi pada penyelesaian program.

AdmBorkBork
sumber
1

Lithp , 120 karakter (+3 untuk -v1 flag)

Garis terbagi 2 untuk dibaca:

#P::((invoke P "map" (js-bridge #W,I::(replace W (regex "." "g")
     (js-bridge #C,J::(index (index P (& (+ I J) 1)) J))))))

Membutuhkan -v1 bendera untukrun.js karena beberapa fungsi belum menjadi bagian dari perpustakaan standar.

Penggunaan sampel:

(
    (def f #P::((invoke P "map" (js-bridge #W,I::(replace W (regex "." "g")
                (js-bridge #C,J::(index (index P (& (+ I J) 1)) J)))))))
    (print (f (list "Hello," "world!")))
)

Sorotan semacam ini yang belum saya habiskan cukup lama di perpustakaan standar. Harus menggunakan js-bridge/1dua kali dan formulir regex panjang, serta memohon peta menggunakan invoke/*semua berkontribusi untuk ini menjadi lebih lama dari yang seharusnya.

Waktu untuk bekerja di perpustakaan standar saya lebih saya kira.

Andrakis
sumber
1

PHP, 79 Bytes

for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][+$i]??" $y";

PHP Versi Sebelumnya, 82 Bytes

for(;$i<strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])$x.=$a[1+$i%2][$i];echo"$x $y";
Jörg Hülsermann
sumber
for(...)echo$a[1+$i%2][$i];echo" $y";(-2)
Titus
membangun komentar Titus 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 7
user59178
@ user59178 bagus tapi kamu butuh 1 Byte lagi
Jörg Hülsermann
Apakah kamu? itu bekerja untuk saya, Anda baru saja mendapatkanNotice: String offset cast occurred in Command line code on line 1
user59178
@ user59178 Ya untuk mencetak huruf pertama dari kata pertama
Jörg Hülsermann
1

C, 54 52 byte

f(char*a,char*b,char*c){while(*c++=*a++,*c++=*b++);}

Mengasumsikan output c sudah memiliki panjang yang diinginkan.

Pemakaian:

main(){
 char a[]="123456";
 char b[]="abcdef";
 char c[sizeof(a)+sizeof(b)-1];
 f(a,b,c);
 puts(c);

}

Jika Anda bersikeras membuat output, berikut ini adalah solusi 91 byte :

char*g(char*a,char*b){char*c=malloc(2*strlen(a)),*d=c;while(*c++=*a++,*c++=*b++);return d;}

Pemakaian:

main(){
 char a[]="123456";
 char b[]="abcdef";
 puts(g(a,b));
}
Karl Napf
sumber
0

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.

main(int a,char**v){int x=strlen(v[1]);char s[x],t[x],c;strcpy(s,v[1]);strcpy(t,v[2]);for(a=0;a<x;++a)if(a%2)c=s[a],s[a]=t[a],t[a]=c;puts(s),puts(t);}

Atau lebih tepatnya,

main(int a,char**v){
    int x=strlen(v[1]);
    char s[x],t[x],c;
    strcpy(s,v[1]);strcpy(t,v[2]);
    for(a=0;a<x;++a)
        if(a%2)c=s[a],s[a]=t[a],t[a]=c;
    puts(s),puts(t);
}
James Murphy
sumber
0

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

Table[#[[Mod[j+i,2]+1,j]],{i,2},{j,Length@#[[1]]}]&
Greg Martin
sumber
0

QBasic 4.5, 172 bytes

Aduh, yang ini terasa menyakitkan dengan ol 'QBasic ...

DEFSTR A-D:INPUT A,B
IF LEN(A)MOD 2=1 THEN A=A+" ":B=B+" "
FOR x=1 TO LEN(A) STEP 2
C=C+MID$(A,x,1)+MID$(B,x+1,1):D=D+MID$(B,x,1)+MID$(A,x+1,1):NEXT:?RTRIM$(C),RTRIM$(D)

Fakta menyenangkan: Menggunakan DEFSTRbyte yang disimpan lebih banyak daripada biayanya karena sekarang saya bisa menggunakannya Asebagai ganti a$.

steenbergh
sumber
0

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.

;;_LA|~a%2=1|A=A+@ | B=B+C][1,a,2|X=X+$MID$(A$,b,1)+MID$(B$,b+1,1):Y$=Y$+MID$(B$,b,1)+MID$(A$,b+1,1)|]?_tX|,_tY|
steenbergh
sumber
MIND$=> MIN$dalam teks.
Bukan Charles
0

Java, 68 byte

(a,b)->{for(int i=a.length;--i>0;){char t=a[--i];a[i]=b[i];b[i]=t;}}

Tidak disatukan dan diuji

import java.util.Arrays;
import java.util.Collection;
import java.util.function.BiConsumer;

public class Main {

  static BiConsumer<char[], char[]> func = (left, right) -> {
      for (int i = left.length; --i > 0;) {
        char temp = left[--i];
        left[i] = right[i];
        right[i] = temp;
      }
    };

  public static void main(String[] args) {
    test("Hello,","world!", "Hollo!", "werld,");
    test("code", "golf", "codf", "gole");
    test("happy", "angry", "hnpry", "aagpy");
  }

  private static void test(String left, String right, String x, String y) {
    char[] leftChars = left.toCharArray();
    char[] rightChars = right.toCharArray();
    func.accept(leftChars, rightChars);
    Collection mixed = Arrays.asList(new String(leftChars), new String(rightChars));
    if (mixed.containsAll(Arrays.asList(x, y))) {
      System.out.println("OK");
    } else {
      System.out.printf("NOK: %s, %s -> %s%n", left, right, mixed);
    }
  }
}
Olivier Grégoire
sumber
0

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

Moris Zucca
sumber