Saya baru-baru ini bermain melalui ' The Weaver ' dan saya pikir ini menyajikan tantangan yang menarik untuk golf kode .
Tempat:
Weaver adalah gim di mana Anda diberikan sejumlah pita yang datang dari jarak 2 arah 90 derajat dan tujuan Anda adalah menukarnya di persimpangan tertentu untuk mencapai hasil yang diinginkan.
Seperti ini: Ini swap: Ini bukan:
Memasukkan:
3 array:
- Pita atas (kiri ke kanan)
- Pita kiri (atas ke bawah)
- Koordinat persimpangan untuk bertukar
Keluaran:
2 array:
- Pita bawah (kiri ke kanan)
- Pita kanan (atas ke bawah)
Contoh:
Saya akan menggunakan gambar di atas sebagai contoh pertama:
Memasukkan: [r, y, b], [r, y, b], [(0, 1), (2, 1), (2, 2)]
Apa yang terjadi:
r y b
r y b
r r r r•y y y y
r r b
y y y y y y y y
r r b
b b b b•r r•b b
r b r
r b r
Dimana •
merupakan swap.
Keluaran: [r, b, r], [y, y, b]
Memasukkan: [a, b, c], [d, e, f], [(0, 0), (2, 1)]
Apa yang terjadi:
a b c
a b c
d d•a a a a a a
d b c
e e e e e e e e
d b c
f f f f•b b b b
d f c
d f c
Keluaran: [d, f, c], [a, e, b]
Memasukkan: [a, b], [a, b, c], [(0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 1)]
Apa yang terjadi:
a b
a b
a a a a•b b
a a
b b•a a•a a
b a
c c•b b•a a
c b
c b
Keluaran: [c, b], [b, a, a]
Catatan:
- Contoh menunjukkan koordinat yang diberikan seolah-
(row, column)
olah Anda dapat mengambilnya sebagai(column, row)
. - Baris atas dan kolom kiri mungkin memiliki pita dengan warna yang sama
- Papan bisa berbentuk persegi panjang
- Semua koordinat akan menjadi non-negatif (
>=0
) (atau sangat positif (>=1
) jika Anda memilih 1-pengindeksan) - Abaikan swap yang ada di luar papan
- Anda dapat memilih untuk bekerja dengan huruf (
[a-zA-Z]
), bilangan bulat ([0-9]
) atau keduanya - Pita dalam output Anda harus cocok dengan pita di input persis (
a -> a
) - Anda dapat mengasumsikan daftar swap disortir dengan cara apa pun yang Anda inginkan, asalkan konsisten (jika ya, sebutkan bagaimana itu harus diurutkan)
- Anda dapat mengambil koordinat swap sebagai 0 atau 1-diindeks
- Celah default dilarang
Lebih banyak contoh:
Input:
[b], [r], []
Output:
[b], [r]
Input:
[b], [r], [(0, 0)]
Output:
[r], [b]
Input:
[r, p, y], [r, y, p], [(0, 0), (1, 2), (2, 1), (3, 2)]
Output:
[r, p, y], [r, y, p]
Input:
[b, y, o, r],
[r, o, b, y],
[(0, 0), (2, 0), (3, 2)]
Output:
[b, y, y, r],
[b, o, r, o]
Contoh terakhir terkait dengan kasus ini (jika itu membuatnya lebih mudah untuk divisualisasikan):
Ini adalah kode-golf sehingga jawaban terpendek dalam byte untuk setiap bahasa menang.
sumber
Jawaban:
Python 3 , 74 byte
Cobalah online!
Harus
l
disortir dalam urutan leksikografis.a
danb
merupakan daftar karakter yang mewakili (pita kiri, pita atas).Kembali dengan mengubah daftar
a
danb
.sumber
Jelly ,
373530 byteCobalah online!
Program Dyadic, ambil daftar indeks indeks swap 0 sebagai indeks kiri (diurutkan dalam urutan leksikografis terbalik) dan (pita kiri, pita atas) sebagai argumen kanan. Pengembalian (pita kanan, pita bawah).
Jelly adalah bahasa diam-diam. Ada (hampir) tidak ada variabel untuk dikerjakan, jadi melakukan sesuatu melibatkan lebih dari dua variabel sekaligus yang berantakan.
Tautan pertama menggunakan
[l,t]
argumen kiri,[x,y]
(pengindeksan 0) sebagai argumen kanan, dan kembali[l,t]
denganl[x]
danr[y]
dipertukarkan.Jadi pada dasarnya "di
U1¦
bawahṙ"z0
".Tautan kedua cukup memfilter indeks OoB (
<Ạ¥Ðf L€
), menambahkan argumen kedua (⁹ṭ
), membalikkan (Ṛ
), dan mengurangi lebihç
(mirip dengan Haskellfoldl
)sumber
Python 2 , 193 byte
Cobalah online!
Membawa koordinat swap 1-diindeks
sumber
APL (Dyalog Classic) ,
3130 byteCobalah online!
Argumen kiri adalah sepasang vektor karakter - pita kiri dan pita atas. Argumen yang tepat adalah vektor pasangan koordinat - lokasi swap. Mengembalikan sepasang pita kanan dan bawah. (Perhatikan bahwa tidak seperti pada contoh, saya menggunakan urutan kiri-atas dan kanan-bawah untuk pita agar konsisten dengan urutan sumbu baris-col dalam koordinat.)
Swap harus disortir sehingga swap ke kiri atas yang lain datang
sebelumsetelah itu. Jika dua swap ke kiri bawah / kanan atas satu sama lain, urutannya tidak masalah.EDIT: disimpan satu byte (
⌽
) dengan meminta urutan swap terbalik pada inputsumber
Javascript,
877662 byteCobalah online!
Algoritma trivial yang sama dengan jawaban Python 3. Menggunakan array sebagai koordinat tupel. Membutuhkan warna pita ditetapkan oleh nilai-nilai kebenaran. Memerlukan koordinat untuk dipesan sebagian sehingga
x1,y1
datang sebelumx2,y2
jika salah satux1 < x2 && y1 = y2
ataux1 = x2 && y1 < y2
. Kembali dengan memodifikasi array input.sumber
;return[r,c]
dan menyebutnya pengembalian dengan modifikasiif(r[i]&&c[j])
akan menghemat lebih banyak byte.x1=1,x2=2,y1=2,y2=1
. Karenax1<x2
,(x1,y1)
datang sebelumnya(x2,y2)
; tetapi karenay2<y1
,(x2,y2)
datang sebelumnya(x1,y1)
. Saya pikir "x1 < x2
dany1 < y2
" sudah cukup.Ruby ,
5654 byteCobalah online!
Port Python 3 dari user202729 menjawab dengan beberapa trik ruby
Koordinat harus diurutkan secara leksikografis
sumber