Salah satu mainan favorit anak saya adalah satu set seperti ini . Sebenarnya ini salah satu mainan favorit saya - saya sudah bermain dengannya dan memberi saya beberapa ide tantangan PPCG. Ini dia:
Tulis program atau fungsi yang menggunakan gambar garis ASCII sebagai input dan memutuskan apakah melipat menjadi kubus atau tidak.
Memasukkan
Input akan terdiri dari tepat satu hexomino yang dibangun dari kotak seperti ini:
+-+
| |
+-+
Misalnya input heximino yang valid adalah:
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
| |
+-+
Keluaran
- Nilai kebenaran jika hexomino dapat dilipat menjadi kubus, atau
- Nilai falsey sebaliknya.
Untuk menghemat sedikit kerja, wikipedia memiliki grafik yang bagus:
- Semua 35 hexomino:
- Semua 11 hexominoes yang dilipat menjadi kubus:
Catatan
- Input hexomino dapat memiliki rotasi atau refleksi, tidak hanya yang ditunjukkan pada gambar di atas
- Input hexomino mungkin memiliki ruang utama, tetapi akan disejajarkan dengan benar sehubungan dengan diri mereka sendiri
- Hexomino input mungkin memiliki spasi tambahan di ujung baris dan tertinggal baris baru di akhir input
code-golf
ascii-art
kolmogorov-complexity
geometry
Trauma Digital
sumber
sumber
Jawaban:
PMA / Siput , 130
atau lebih "mudah dibaca",
Tidak seperti biasanya, muncul masalah yang dapat diatasi dengan terbatasnya fitur yang diimplementasikan sejauh ini. The
!(z\ )
pola menentukan bahwa posisi saat ini di ruang di tengah alun-alun menggunakan pernyataan negatif bahwa ada ruang di beberapa "octilinear" arah. Ide umumnya adalah untuk memeriksa pola yang menempatkan kuadrat di masing-masing dari 5 lokasi yang diperlukan relatif terhadap kuadrat tempat pertandingan dimulai. Juga, perlu memeriksa bahwa itu tidak dalam blok 2x2 kotak. Sebelum program bekerja, saya harus memperbaiki bug dengan parsing tanda kurung.Jika hexomino tidak memetakan kubus,
0
dicetak. Jika ya, beberapa bilangan bulat positif dicetak (jumlah kecocokan).Saya mengadaptasi generator polyomino ini untuk membuat semua test case yang mungkin:
sumber
Ruby,
173 148 145143 bytePerubahan terbaru:
/2
di sisi kanan<
diganti dengan*2
di sisi kiri. Mengizinkan penghapusan satu set()
Penjelasan
Kode ini dalam dua bagian: fungsi tanpa nama utama yang melakukan parsing, dan fungsi tanpa nama tambahan ditugaskan ke variabel
h
yang melakukan pengecekan.Fungsi utama memindai bytewise melalui string, menambahkan koordinat x dan y
i,j
dari semua+
simbol yang ditemukan kex[]
dany[]
. Itu kemudian memanggilh
dua kali. Pertama kali mengasumsikan hexomino adalah horisontal (x[]
berisi panjang dany[]
lebar) dan kedua kali menganggap hexomino adalah vertikal.Fungsi
h
mengambil koordinat memanjang dalam arrayb
kemudian koordinat memanjang dalam arrayc
. Ini menghitung panjang (dalam kotak) dengan ekspresi(b.max.b.min)/2
. Jika ini kurang dari atau sama dengan 3, hexomino harus dievaluasi ke arah lain sehinggah
kembalifalse
.Pemeriksaan hexominos akan menunjukkan bahwa jika panjangnya 4, hexominos yang akan dilipat menjadi kubus tidak memiliki lebih dari 2 kotak (3
+
simbol) di baris pertama dan terakhir . Sebagian besar kotak terkonsentrasi di baris tengah, yang akan menjadi khatulistiwa kubus. Kondisi ini ternyata diperlukan dan cukup untuk heksomino dengan panjang 4 yang akan dilipat menjadi kubus.Hanya ada satu hexomino dengan panjang 5 yang akan dilipat menjadi kubus. Ini memiliki 3 kotak (4
+
simbol) di baris pertama dan terakhir. Semua hexominos lainnya dengan panjang 5 memiliki 5 atau lebih+
simbol di baris pertama atau terakhir.Hanya ada satu hexomino dengan panjang 6. Ini memiliki 7
+
simbol di setiap baris.Menyatukan semua ini, cukup untuk memeriksa bahwa panjang hexomino lebih besar dari 3, dan jumlah
+
simbol pada baris pertama dan terakhir (mana yang lebih tinggi) kurang dari panjangnya.Tidak digabungkan dalam program uji
sumber
JavaScript (ES6), 443
431Edit perbaikan bug, masalah saat input parse, hapus kolom kosong
Itu sangat panjang, dan bahkan lebih lama karena input parsing adalah bagian besar dari tugas.
Apa yang saya lakukan adalah verifyng jika input yang diberikan adalah salah satu dari 11 hexomino yang dapat dilipat.
Setiap hexomino yang dapat dilipat dapat dipetakan ke beberapa bitmap 5x5 (hingga 8 bit berbeda, dengan simetri dan rotasi). Mengambil bitmap sebagai angka 25bit, saya telah menemukan nilai min untuk 11 hexomino yang tercatat, menggunakan kode berikut (dengan format input yang sangat sederhana)
Itu memberi
[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056]
Jadi, mengingat string input, saya harus melakukan hal yang sama untuk menemukan bitmap min, kemudian mengembalikan true jika nomor ini ada dalam daftar precalc saya.
Jalankan cuplikan untuk menguji di Firefox
Tampilkan cuplikan kode
sumber
,\nt=t
dari akhir baris kedua / awal baris ketiga?