Anda memiliki larik input dengan ukuran m * n. Setiap sel dalam array diisi dengan P atau T. Satu-satunya operasi yang dapat Anda lakukan pada array adalah kolom flip. Ketika Anda membalik kolom, huruf-huruf di semua sel dari kolom itu berganti (P menjadi T dan sebaliknya). Jika Anda memiliki jumlah baris 'x' dengan huruf yang sama (mis. PPPP) maka Anda mendapat poin. Desain algoritma yang mengambil dalam array dan mengembalikan solusi (kolom mana yang flip) sehingga array yang dihasilkan memiliki jumlah poin maksimum yang mungkin.
Catatan: Jika ada beberapa solusi yang menghasilkan skor tertinggi, pilih satu dengan jumlah flips terendah. Contoh:
Input Array:
PPTPP
PPTPP
PPTTP
PPPTT
PPPTT
Keluaran:
3
Penjelasan:
Solusi yang menghasilkan poin tertinggi: Flip kolom no. 3
Maka array aslinya adalah:
PPPPP // 1 point
PPPPP // 1 point
PPPTP
PPTTT
PPTTT
//Total: 2 points
Perhatikan bahwa seseorang juga dapat membalik kolom 4 dan 5 untuk mendapatkan skor dua, tetapi itu membutuhkan flip tambahan.
Anda dapat menggunakan format input yang mudah untuk mewakili array dua dimensi, dan Anda juga dapat dua nilai yang berbeda, tetapi tetap, untuk mewakili P
danT
.
Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.
Jawaban:
APL, 37
Contoh:
Diuji di sini.
sumber
Pyth , 28
Mengambil input dalam bentuk daftar bersarang, mis
Memberikan output 0-diindeks, misalnya
^U2lhQ
: Menghasilkan semua daftar kemungkinan 0s dan 1s dengan panjang yang tepat._osZ
: Pesan daftar ini dari paling 1 hingga paling sedikit.+/QN/Qm!dN
: Menghitung berapa kali setiap daftar (N
) dan kebalikannya, 0s dan 1s bertukar (m!dN
) terjadi pada input. Yang pertama sesuai dengan serangkaian flips meninggalkan semua nol, yang kedua meninggalkan semua.eo
: Memerintahkan daftar dengan tombol di atas, dan mengambil elemen terakhirnya, yang akan menjadi hasil dengan kolom paling cocok, dan di antara mereka yang paling sedikit.f@ ... TUhQ
: Mengonversi daftar 1 dan 0 ini ke daftar indeks yang akan dibalik.Untuk pengindeksan 1, ubah
d
menjadik
, lalu masukkanmhd
di awal.sumber
CJam,
5351 byteIni membaca array dua dimensi 0s dan 1s dari STDIN. Misalnya contoh dalam pertanyaannya adalah
Uji di sini.
Ini pertama-tama mendapatkan semua himpunan bagian kolom yang mungkin, dalam urutan bertambah panjang, kemudian melakukan membalik untuk masing-masing himpunan bagian dan mengurutkannya dengan berapa banyak baris yang masih memiliki 0s dan 1s di dalamnya. Akhirnya, kami hanya mengembalikan subset pertama tersebut. Ini bergantung pada penyortiran yang stabil, sehingga urutan awal penambahan panjang menangani tie-breaker.
sumber
Haskell, 98
format input adalah daftar daftar int. Anda dapat menggunakan versi string untuk pengujian:
oh tidak, spasi! itu menyakitkan!
ini bekerja dengan mengulangi baris dan menghitung jumlah poin yang akan kita dapatkan jika kita membalik kolom sedemikian rupa sehingga baris ini memberi kita poin.
Hal pertama yang perlu diperhatikan adalah bahwa membalik baris ke semua
True
atau semuaFalse
tidak masalah, karena kisi-kisi akan menjadi kebalikan satu sama lain dan dengan demikian akan memiliki skor yang sama persis.cara kita menghitung penghitungan ketika suatu baris tertentu memperoleh satu poin adalah begitu: kita mengulangi lagi baris, dan menjumlahkan poin yang diberikan setiap baris kepada kita, menggunakan fakta bahwa mereka melakukan tepat ketika baris-baris itu identik atau sama persis terbalik.
misalnya, jika baris yang kita membalik adalah
TPPTP
dan baris saat ini yang kita iterasi adalahPTTPT
atauTPPTP
kemudian baris mendapatkan kita satu poin, tetapi ketika itu baris lain, itu tidak memberi kita poin.sumber
CJam, 37
Masukkan format:
sumber
Mathematica - 76
sumber
Python 2, 234
Input adalah daftar daftar:
Output adalah tuple of flips menggunakan pengindeksan python dari 0:
Jika output harus diindeks dari 1, maka kodenya adalah 272 karakter dengan 0 menunjukkan no flips:
sumber