Perkenalan
Matriks Boolean 2 × n dapat direpresentasikan sebagai string dari empat karakter . ':
. String memiliki "baris atas" dan "baris bawah", dengan titik-titik mewakili 1s dan spasi kosong mewakili 0s. Misalnya, matriks 2 × 6
1 0 1 0 0 1
0 0 0 1 0 1
dapat direpresentasikan sebagai ' '. :
. Tugas Anda adalah mengambil matriks dalam "bentuk terkompresi" ini, dan memutar isinya satu langkah searah jarum jam, seperti sabuk konveyor.
Memasukkan
Input Anda adalah string tunggal di atas karakter . ':
. Panjangnya dijamin minimal 2.
Keluaran
Output Anda akan menjadi string input, tetapi dengan setiap titik diputar satu langkah ke arah searah jarum jam. Lebih eksplisit, titik-titik di baris atas lebih banyak tempat ke kanan, kecuali yang paling kanan, yang bergerak ke bawah. Titik-titik pada baris bawah bergerak satu langkah ke kiri, kecuali yang paling kiri, yang bergerak ke atas. Secara khusus, string output harus memiliki panjang yang sama dengan aslinya, dan spasi putih signifikan.
Contoh
Pertimbangkan string input :..:'.
, yang sesuai dengan matriks 2 × 6
1 0 0 1 1 0
1 1 1 1 0 1
Versi rotasi dari matriks ini adalah
1 1 0 0 1 1
1 1 1 0 1 0
yang sesuai dengan string ::. :'
.
Aturan dan penilaian
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan. Anda dapat memutuskan apakah input dan output dilampirkan dalam tanda kutip, dan satu baris tambahan juga dapat diterima di keduanya.
Uji kasus
Kasing uji ini dilampirkan dalam tanda kutip ganda.
" " -> " "
" ." -> ". "
". " -> "' "
"' " -> " '"
" '" -> " ."
": " -> "''"
"''" -> " :"
":." -> ":'"
":.'" -> ":'."
"..." -> ":. "
": :" -> "':."
"':." -> ".:'"
".:'" -> ": :"
" " -> " "
"::::" -> "::::"
":..:'." -> "::. :'"
" : .:'" -> ". '.. :"
": ''. :" -> "'' :'.."
"........" -> ":...... "
":::: " -> ":::'' "
" ::::" -> " ..:::"
" : : : : " -> ". : : : '"
".'.'.'.'.'" -> "'.'.'.'.'."
".. :: '.' :." -> ": ..'' .' :.'"
".' '.:: :.'. . ::.' '. . .::' :.'." -> "' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"
s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])
(balik 2 bagian sehingga saya dapat meningkatkan i, lebih sedikit regexp dan tes yang lebih sederhana, simpan prev c in q)Perl,
706964636160 byteTermasuk +2 untuk
-lp
Jalankan dengan string input pada STDIN, mis
rotatedots.pl
:Penjelasan
Spasi
tidak dikonversi dalam kode di atas. Untuk perhitungan
/2
dan*2
itu akan berperilaku seperti dan menjadi0
. Di posisi lain itu akan menjadi bagian dari "atau", tetapi 1 bit ruang adalah himpunan bagian dari satu bit0
dan akan memiliki efek yang sama seperti0
jika atau-ed dengan salah satu digit. Hanya jika karakter itu atau-ed dengan adalah ruang akan tetap ruang bukan menjadi0
. Tapi tidak apa-apa karena0
akan dikonversi kembali ke ruang angkasa.sumber
Retina , 66
Penjelasan
Dimulai dengan input:
4 tahap pertama membangun matriks, masing-masing menggunakan
1
/e
untuk true dan0
/f
untuk false untuk baris atas / bawah. Baris atas dan bawah saling terkait. Ini akan menghasilkan string seperti:Namun, 4 tahap ini juga secara efektif memindahkan baris bawah 1 ke kiri, hanya dengan membalik urutan huruf dan angka:
Tahap
T
ransliteration membalikkan digit hex untuk karakter pertama dan terakhir saja, yaitu menggantikan0-9a-f
denganf-a9-0
. Ini memiliki efek memindahkan karakter kiri bawah ke atas ke baris atas dan karakter kanan atas ke bawah ke baris bawah:Tahap selanjutnya kemudian menukar setiap pasangan huruf-digit, dengan demikian memindahkan baris atas 1 ke kanan. Sebelumnya ini adalah
(\D)(\d)
, tetapi ternyata itu(.)(\d)
cukup karena pergantian selalu terjadi dari kiri ke kanan sehingga dua digit terakhir tidak akan secara keliru dicocokkan dengan ini, karena karakter kedua dari belakang akan sudah diganti. Matriks sekarang telah sepenuhnya dirotasi sesuai kebutuhan:4 tahap terakhir kemudian terjemahkan kembali ke format asli:
Cobalah online.
Semua testcases, satu per baris ,
m
ditambahkan keT
baris untuk memungkinkan perlakuan terpisah dari setiap jalur input.sumber
Jelly,
323029 bytePerhatikan ruang trailing. Cobalah online! atau verifikasi semua kasus uji .
Latar Belakang
Kita mulai dengan mempertimbangkan string input (misalnya,
:..:'.
) dan kebalikannya.Untuk setiap karakter di baris atas, kami memeriksa apakah itu milik
':
, dan untuk setiap karakter dari baris bawah jika itu milik.:
. Ini memberikan array 2D Booleanyang merupakan matriks dari pertanyaan, dengan baris bawah terbalik.
Kami menghapus Boolean terakhir dari setiap baris, membalikkan urutan baris, mengubah urutan Boolean dalam urutan aslinya, dan akhirnya membalikkan baris atas.
Ini menghasilkan matriks yang diputar dari pertanyaan.
Akhirnya, kami menganggap setiap kolom Booleans nomor biner dan indeks ke dalam
'.:
untuk mendapatkan karakter yang sesuai.Bagaimana itu bekerja
sumber
Pyth,
38362 byte berkat Jakube!
Cobalah di sini atau jalankan Test Suite .
Penjelasan:
sumber
L,hb_eb
ini lebih pendek satu byte, dan.DR2T
juga menciptakan produk Cartesian dan beberapa pasangan lagi, tetapi tidak dan dalam digit dan membantu menghemat ruang..D
trik itu sangat keren!Python 3,
145141130 bytePenjelasan
Solusi golf menggunakan properti zip berikut:
zip('ABCD', 'xy') --> Ax By
jadizip(a[:l],a[l:])
dapat diganti denganzip(a,a[l:])
dan yang memungkinkan untuk menghapus definisil
Hasil
sumber
Pyth, 66 byte
Coba di sini!
Penjelasan
Ini dapat dipecah menjadi 3 bagian:
Konversi input
Ini cukup sepele. Setiap karakter dipetakan dengan cara berikut:
Yang pertama adalah spasi.
Kami mendapatkan daftar 2-tupel yang kami transpos untuk mendapatkan 2 baris matriks yang kemudian diratakan.
Kode
Memutar
Kami memiliki matriks sebagai array datar
J
dan lebar matriks dalamK
. Rotasi dapat digambarkan sebagai:Kode
Konversikan kembali
sumber
Python 3,
166154153150146138137135132127 byteEdit: Saya sudah meminjam penggunaan
zip
dari Erwan ini jawabannya Python pada akhir fungsi.dan ide mereka untuk menggunakanTernyata, pembalikan itu bukan ide yang baik untuk fungsi saya. Saya telah mengubah penggunaan saya[::-1]
pembalikan, meskipun saya memasukkan twist sendiri.format
untuk bermain golf lebih lanjut. Pindaha
danb
langsung kezip
untuk golf lebih lanjut (ungolfing tetap tidak berubah karena pemisahana
danb
ada berguna untuk menghindari kekacauan dalam penjelasan saya)Sunting: Dipinjam
(some number)>>(n)&(2**something-1)
dari jawaban ini oleh xnor pada tantangan Pemutar Interval Musik . Kekacauan yangzip(*[divmod(et cetera, 2) for i in input()])
mungkin bisa golf lebih baik, meskipun saya suka kemanfaatan yang diberikannya dari menggunakan dua tuplet
danv
.Tidak Disatukan:
sumber
Ruby,
166163 byteYuck ...
transpose
terlalu panjang.Trik yang digunakan di sini:
sprintf('%02b',x)
untuk mengkonversi"0"
,"1"
,"2"
,"3"
menjadi"00"
,"01"
,"10"
, dan"11"
masing-masing. Anehnya, argumen kedua tidak tidak harus dikonversi menjadi integer pertama.Rotasi dilakukan melalui
a[1].push a[0].pop;a[0].unshift a[1].shift;
, yang saya pikir setidaknya sedikit pintar (jika tidak terlalu bertele-tele di Ruby). Simetrinya bagus secara estetika: Psumber
->s{a=s.tr(f=" .':",'001').chars;b=s.tr(f,'0101').chars;b<<a.pop;([b.shift]+a).zip(b).map{|x|x.join.to_i 2}.join.tr'0-3',f}
.map{|x|x.join.to_i 2}.join.tr'0-3',f
→.map{|x|f[x.join.to_i 2]}*''
Javascript ES6 125 byte
Saya memetakan setiap karakter ke setara biner dua digit
dan saya menganggap mereka sebagai satu di atas yang lain
Saya menyimpannya ke n
Untuk setiap karakter (0-3) dari n, saya memeriksa tetangganya, menambahkan bit urutan tertinggi dari tetangga kiri ke bit urutan terendah dari tetangga kanan. jika saya == 0 (karakter pertama) saya menggunakan bit urutan yang lebih rendah itu sendiri daripada bit urutan yang lebih tinggi tetangga sebelah kiri.
jika n [i + 1]> - 1 itu berarti kita mendapat 0,1,2,3 jadi ketika itu salah kita menekan elemen terakhir.
Ketika itu terjadi, saya menggunakan bit urutan tertinggi karakter itu sendiri, bukan bit tetangga kanan yang lebih rendah
memetakan itu kembali ke
.':
tanah dan bergabung dengan array itu kembali bersamasumber
MATL ,
4039 byteCobalah online! Versi tertaut telah
v
diganti oleh&v
, karena perubahan bahasa setelah jawaban ini diposting .sumber
JavaScript, 311 byte
Mungkin bisa ditingkatkan banyak:
sumber
s[i-1]
? Itu bisa menghemat beberapa byte.s[i+1]
.<
alih-alih==
dapat menghemat beberapa byte. Anda mungkin juga ingin checkout Tips untuk Golf di JS dan Tips untuk golf di ES6<
sebagai ganti==
JavaScript (ES6),
237210204188182178 bytesKredit ke @Downgoat untuk menghemat 16 byte dalam revisi 188-byte
Pembaruan: Saya memiliki gelombang otak dan mengurangi operasi pertama
s
menjadi satumap
panggilan, bukan dua yang terpisahCukup Cetak & Penjelasan
sumber
s=>(r=" .':",a=[],s=[...s].map(c=>('00'+r.indexOf(c).toString(2)).slice(-2)).map(n=>(a.push(n[0]),n[1]),a.splice(0,0,s.shift()),s.push(a.pop()),a.map((v,i)=>r[parseInt(v+s[i],2)]).join``)
bekerja?Perl,
144142137131 byteByte ditambahkan untuk
-n
bendera.Algoritma yang hampir sama dengan jawaban Ruby saya , hanya lebih pendek, karena ... Perl.
Obnoxiously,
@a=(shift@b,@a)
lebih pendek dariunshift@a,shift@b
.Sayangnya, ini panjangnya sama:
Terima kasih kepada Ton Hospel untuk 5 byte dan msh210 untuk satu byte!
sumber
..@a
bukan..$#a
? (Mungkinoct
mati atau mengembalikan 0 atau sesuatu. Saya belum mencobanya.)//g
sprintf
sangat panjang.map$_%2,/./g
danmap$_/2|0,//g
hampir harus lebih pendek (belum teruji)Python 3,
294287283 byteWaaayyyyyy terlalu lama, tapi saya akan mencoba bermain golf beberapa byte:
sumber
Lua, 139 byte
Pemakaian:
sumber