Jadi tugas Anda adalah mengambil blok 3x3 di mana -
berarti ruang kosong, dan *
berarti ruang penuh, misalnya:
-**
-*-
*-*
dan mengatur ulang blok sehingga *
membentuk X, seperti ini:
*-*
-*-
*-*
Input: kotak 3x3 seperti di atas, bisa berupa 3 baris, array, atau apa pun yang Anda inginkan.
Keluaran: Jumlah gerakan tersingkat untuk disusun ulang menjadi X. Setiap gerakan membalik 2 karakter yang saling bersentuhan, dan saling horizontal, saling vertikal, atau diagonal satu sama lain. Jika tidak memungkinkan, kembalikan output yang tidak mungkin, misalnya 999
atau -4242
. 5
adalah nomor terkecil seperti itu.
Kasus uji:
1) Output: 1
-**
-*-
*-*
2) Output: -1
-*-
-*-
*-*
3) Output: 3
---
-**
***
4) Output: 0
*-*
-*-
*-*
Anda dapat mengganti karakter kosong dan non kosong tetapi pastikan untuk memasukkan yang mana dalam posting Anda
Golf kode
Ingat ini adalah kode golf kode yang paling pendek menang!
sumber
*
dan sebaliknya, atau menukar mereka?*
? Bisakah Anda menambahkan beberapa test case lagi?*
atau kurang dari 5 membuatnya tidak mungkin.-1
? Misalnya5
(tidak mungkin sebaliknya), atau melempar kesalahan?Jawaban:
Python 3 ,
10478 byteCobalah online!
Sunting: Terapkan saran @Jonathan Allan's dan @ xnor untuk secara drastis mengurangi jumlah byte.
Input adalah daftar
string denganpanjang 9 dengan nol dan satu, yang menjadi*
s.Berikut beberapa pengamatan:
Oleh karena itu, pertama-tama kami menguji apakah string memiliki lima, dan kemudian menghitung hal-hal ini:
0124
,0346
,2458
,4678
karena semua orang)n[4]
menjadi satu, lalu uji setiap ekstraksi rentang'111'
.max
bukansum
.sumber
count
s dengansum
s dan'111'
dengan[1]*3
) TIO (Saya sudah mencoba menjadi pintar dengann[i::j]>=[1]*3
loop tetapi belum menemukan yang lebih pendek).max(n,n[6:],n[::3],n[2::3])>='1'*3
.Jelly , 26 byte
Cobalah online!
Ambil daftar datar sebagai masukan.
Sayang sekali bahwa Jelly tidak memiliki "indeks kebenaran multidimensi" ...
T€ṭ€"JẎ
juga berfungsi tetapi membutuhkan 1 byte lebih.Algoritma: Ada 5 posisi blok saat ini dan 5 target (tujuan), algoritma mencoba masing-masing dari 5! cocok, dan output jumlah minimum jarak [sumber, tujuan] Chebyshev.
sumber
Haskell ,
176132126104 byteCobalah online!
Mengambil daftar bilangan bulat dengan 1 sebagai karakter non-kosong. Jumlahkan jumlah kuadrat tidak nol yang diindeks, kemudian tambahkan 1 jika ada pola gerakan ganda ditemukan (kolom tengah dan kolom tepi / baris terisi penuh). Bagian terakhir agak boros menurut saya, mungkin bisa lebih ditingkatkan dari metode brute-force ini. Mengembalikan 5 (output yang tidak mungkin) pada input yang tidak mungkin.
sumber
length
tes dapat disingkat menjadisum[1|1<-a]
. Berfungsis
ke:(1-e,n+sum[1|b>e])
yang dapat Anda sebaris untuk menyimpan byte lain. Anda dapat menggunakanotherwise
penjaga dim
untuk menyimpan sepasang()
. Akhirnya,&&
di tingkat atas di penjaga dapat digantikan oleh,
. ...sum
pemahaman daftar untuk melemparkan Boolean ke int. Cobalah online!m
. Cobalah online!a
harus tidak0
dapat Anda gunakan,sum a
bukansum[1|1<-a]
? Cobalah online!1
s kecuali pusat adalah0
, Anda dapat melakukan3<-
bukanelem 3$
. Anda juga dapat menggunakansum.map(a!!)
bukansum<$>map(a!!)
.Python 2 ,
194192 byteCobalah online!
sumber
[0,1,0,1,0,1,1,1,0]
(diharapkan: 4, aktual: 13).JavaScript (ES6), 123 byte
Mengambil input sebagai bilangan bulat 9-bit. Memecahkan teka-teki dengan menerapkan aturan secara naif, yang telah terbukti tidak menjadi pendekatan terpendek.
Cobalah online!
Berkomentar
NB : Kode ini melakukan beberapa gerakan ilegal di luar bagian atas papan ketika m dikalikan dengan 64. Tetapi mereka diabaikan, karena mereka tidak mungkin mengarah pada solusi yang lebih pendek daripada solusi hukum terbaik.
Di bawah ini adalah 9 bit swap dasar dan pola target. Pojok kiri atas adalah bit yang paling signifikan.
sumber
Jelly , 26 byte
Cobalah online!
Tautan monadik.
Bagaimana?
Terinspirasi oleh jawaban Python Bubbler ; golf sesuai dengan Jelly ...
sumber
JavaScript, 85 byte
Ini adalah port regex dari jawaban Bubbler .
Input sebagai string 0/1.
Tampilkan cuplikan kode
sumber
Stax ,
2322 byteJalankan dan debug itu
Program ini membutuhkan array
[0, 1]
sebagai input, dan mengembalikan jumlah gerakan integer, atau string kosong jika tidak ada solusi yang mungkin.Pertimbangkan indeks ini untuk kisi
1
input , maka tidak ada solusi, jadi kami tidak menghasilkan output.1
di posisi ini akan menghasilkan hasil akhir.1
dalam posisi yang salah jaraknya adalah 1 atau 2. Ini akan menjadi 2 jika itu dikelilingi oleh yang lain1
. Misalnya, jika ada1
s pada indeks [0, 1, 2, 4], maka jarak untuk yang salah1
adalah 2.Dengan mengingat hal ini, pertimbangkan kode semu ini untuk mendapatkan jarak yang berkontribusi pada hasil dengan indeks 1.
b
dari 0 menjadi 15.0 <= b <= 7
jaraknya 0. Saat8 <= b <= 14
jaraknya adalah 1. Ketikab == 15
jaraknya 2. Ini bisa dihitung menggunakan pembagian integer olehb * 2 / 15
.Jadi total jarak dapat dihitung dengan mengulangi proses ini 4 kali dan memutar grid di antaranya.
Jalankan yang ini
sumber
Excel,
8681 BytesLama: Ketika output 'tidak mungkin' adalah
-1
Penggunaan
1
untuk diisi dan0
kosong, input dalam jangkauanA1:C3
.Dimungkinkan untuk bermain golf lebih jauh jika kita dapat mengembalikan nilai selainMengembalikan-1
karena "tidak mungkin".#DIV/0!
kesalahan pada grid yang tidak mungkinBeroperasi pada logika yang sama dengan Bubbler's Python answer .
sumber