Cara yang nyaman dan berguna untuk mewakili permukaan topologi adalah dengan poligon dasar . Setiap sisi pada poligon cocok dengan sisi lain dan dapat berupa paralel atau anti-paralel. Misalnya, ini adalah poligon dasar torus :
Untuk mengetahui mengapa ini adalah torus, kita bisa membayangkan poligon kita menjadi selembar kertas. Untuk membuat permukaan yang tepat, kami ingin menekuk kertas kami sehingga ujung-ujungnya yang sesuai sejajar dengan panahnya. Sebagai contoh torus kita, kita dapat mulai dengan menggulung kertas ke dalam silinder sehingga kedua tepi biru (berlabel b) terhubung. Sekarang kita mengambil tabung kita dan menekuknya sehingga kedua ujung merah (berlabel a) saling terhubung. Kita harus memiliki bentuk donat, juga disebut torus.
Ini bisa menjadi sedikit rumit. Jika Anda mencoba melakukan hal yang sama dengan poligon berikut ini di mana salah satu ujungnya berada di arah yang berlawanan:
Anda mungkin menemukan diri Anda dalam masalah. Ini karena poligon ini mewakili botol Klein yang tidak dapat disematkan dalam tiga dimensi. Berikut adalah diagram dari wikipedia yang menunjukkan bagaimana Anda dapat melipat poligon ini menjadi botol Klein:
Seperti yang sudah Anda tebak, tugas di sini adalah mengambil poligon dasar dan menentukan permukaannya. Untuk empat sisi poligon (satu-satunya permukaan yang Anda harus tangani) ada 4 permukaan yang berbeda.
Mereka
Torus
Botol Klein
Bola
Pesawat proyektif
Sekarang ini bukan pemrosesan gambar jadi saya tidak mengharapkan Anda untuk mengambil gambar sebagai input, sebaliknya kita akan menggunakan notasi yang mudah untuk mewakili poligon mendasar. Anda mungkin telah memperhatikan dalam dua contoh di atas bahwa saya menamai tepi yang sesuai dengan huruf yang sama (baik a atau b), dan bahwa saya memberi tanda bengkok sebagai tanda tambahan untuk menunjukkan bengkoknya. Jika kita mulai dari tepi atas dan menuliskan label untuk setiap sisi saat kita bergerak searah jarum jam kita bisa mendapatkan notasi yang mewakili setiap poligon mendasar.
Misalnya Torus yang disediakan akan menjadi abab dan Botol Klein akan menjadi ab - ab . Untuk tantangan kami, kami akan membuatnya lebih sederhana, alih-alih menandai ujung yang bengkok dengan negatif, kami malah akan membuat huruf-huruf tersebut menjadi huruf besar.
Tugas
Diberikan string menentukan apakah itu merupakan poligon dasar dan menghasilkan nilai yang sesuai dengan permukaan yang tepat itu. Anda tidak perlu memberi nama permukaan dengan tepat, Anda hanya perlu 4 nilai output yang berbeda, masing-masing mewakili salah satu dari 4 permukaan dengan nilai kelima mewakili input yang tidak tepat. Semua kasus dasar tercakup dalam bagian Tes Sederhana , setiap mobil akan isomorfik ke salah satu atau tidak valid.
Aturan
Sisi tidak akan selalu dilabeli dengan a dan b, tetapi mereka akan selalu dilabeli dengan huruf.
Masukan yang valid akan terdiri dari 4 huruf, dua dari satu jenis dan dua lainnya. Anda harus selalu menampilkan permukaan yang benar untuk input yang valid.
Anda harus menolak (bukan menampilkan salah satu dari 4 nilai yang mewakili permukaan) input yang tidak valid. Anda dapat melakukan apa saja saat menolak input, asalkan dapat dibedakan dari 4 permukaan
Ini adalah kode-golf sehingga tujuannya adalah untuk meminimalkan jumlah byte dalam kode sumber Anda.
Tes
Tes Sederhana
abab Torus
abAb Klein Bottle
abaB Klein Bottle
abAB Projective Plane
aabb Klein Bottle
aAbb Projective Plane
aabB Projective Plane
aAbB Sphere
abba Klein Bottle
abBa Projective Plane
abbA Projective Plane
abBA Sphere
Tes yang lebih rumit
ABAB Torus
acAc Klein Bottle
Emme Projective Plane
zxXZ Sphere
aaab Bad input
abca Bad input
abbaa Bad input
ab1a Bad input
sumber
abab
torus danaabb
botol Klein?abab
adalah contoh di paragraf pertama, Anda bisa mencari penjelasan di sana. Berikut adalah gambar yang menunjukkan mengapaaabb
sama denganabAb
botol Klein.Jawaban:
Retina , 123 byte
Cobalah online! Terima kasih kepada @JonathanAllen karena menunjukkan bug dalam kode saya dan juga bagaimana cara menyimpan beberapa byte; Saya juga bermain golf lebih banyak byte sendiri sehingga saya tidak bisa kredit dia untuk angka tertentu. Penjelasan:
Jika dua huruf pertama sama (mengabaikan case), pindahkan huruf pertama menjadi keempat. Ini mengurangi jumlah kasus yang perlu saya uji.
Jika tidak ada tepat empat huruf, atau dua huruf pertama sama, atau dua huruf terakhir tidak menduplikasi dua huruf pertama, maka hapus semuanya.
Torus adalah case mudah: sepasang huruf, case yang cocok berulang.
Jika salah satu dari pasangan tersebut cocok dengan kasing (dalam hal ini pasangan lainnya harus cocok dengan kasing), maka itu adalah botol Klein. Atau, jika pasangan cocok dengan case tetapi terbalik, maka itu juga merupakan botol Klein.
Jika di sisi lain pasangan terbalik, tetapi hanya satu dari pasangan yang cocok dengan huruf, maka itu adalah bidang proyektif.
Dan jika pasangan terbalik tetapi tidak cocok dengan huruf besar, maka itu adalah bola. (
i`.(.)\1.
juga akan bekerja.)Yang lainnya adalah pesawat proyektif.
sumber
Jelly ,
52 5158 byte+7 byte, saya menemukan bahwa pemetaan yang saya gunakan tidak bekerja untuk beberapa skenario perubahan kasus (misalnya).
Tautan monadik yang mengambil string dan mengembalikan lima nilai konsisten dan berbeda berikut:
[-1,-1]
- input tidak valid[0,0]
- Pesawat proyektif[1,0]
- Botol Klein[2,0]
- bola[2,1]
- TorusCobalah online! atau lihat test suite .
Bagaimana?
Setiap poligon mendasar adalah:
a
s danA
s dan / atau menukarb
s danB
s tanpa efek - karena kami ingin mencocokkan arah dengan label yang sebenarnya tidak penting.Dengan demikian ada sembilan kelas kesetaraan. Kode membuat daftar empat bilangan bulat yang masing-masing mewakili contoh dari salah satu dari sembilan kelas ekivalensi, membuat empat rotasi masing-masing, mencerminkan masing-masing dan kemudian memeriksa apakah bentuk terjemahan dari input ada di setiap daftar. Kelas diperintahkan
P,P,P,K,K,K,S,S,T
, jadi mengambil bilangan bulat indeks berbasis 0 dibagi dengan masing-masing[3,8]
menghasilkan empat output yang valid (pengindeksan adalah berbasis 1 dan atome
kembali0
untuk tidak adanya, jadi kurangi1
dan membagi bilangan bulat dengan masing-masing[3,8]
hasil[-1,-1]
untuk kasus yang tidak valid ).Catatan: 11 byte (
ŒlĠL€⁼2,2ȧ⁸
) hanya memvalidasi string input sebagai bentuk yang benar - tanpa kode ini setiap contoh kasus melewati kecuali yangab1a
dievaluasi seolah-olah itu adalahabBa
, bidang proyektif.sumber